TPV/TPV_PRV.CPP
2021-09-08 21:44:52 +02:00

1530 lines
55 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <io.h>
#include <alloc.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <graphics.h>
#include "c:\program\src_dos\libs\make_bot\make_bot.h"
#include "c:\program\src_dos\libs\bdatos\bdatos.hh"
#include "tpv_def.h"
#define NLINEAS_PROV 9
BDatos BProv; // Base de datos de Proveedores
INFO_PROVEEDORES SProv; // Estructura de Proveedores
/*************************************\
| |
| Parte Principal del M¢dulo |
| |
\*************************************/
void DuplicaBaseProveedores(void);
void MuestraDatosVProv( int linea);
void MuestraDatosProv( long RowStart );
void MuestraAyudaProv( char columna );
int CompruebaPulsosEstrellas( void );
void EditItemProv( char columna, int linea );
void ProvNuevoRegistro( INFO_PROVEEDORES *MSProv );
void MuestraProv( char columna, int linea, char como );
void ObtenCoordenadasProv( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 );
/*************************************\
| |
| Parte Secundaria del M¢dulo |
| |
| Secci¢n de Busqueda de proveedores |
| |
\*************************************/
void ObtenCoordenadasMatchProv( char Row, int *X0, int *Y0, int *X1, int *Y1 );
void MatchDrawProv( char Row, INFO_PROVEEDORES MProv, char como );
void BuscaProv( char TipoBusqueda, char *CurrRow, long *CurrProv );
int Match_Prov( INFO_PROVEEDORES *A, INFO_PROVEEDORES *B );
void EditMatchProv( char Row, INFO_PROVEEDORES * MProv );
int ObtenMatchProv( INFO_PROVEEDORES *MProv );
/*************************************\
| |
| Parte Tercera del M¢dulo |
| |
| Secci¢n para la impresi¢n |
| |
\*************************************/
void MuestraImpresionesProv( void );
void ImprimeProveedores( char como );
void ImprimeCabeceraProv( char como, FILE *file_out );
// ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
// Û Parte principal del m¢dulo Û
// ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
/**************************************************************************\
|* *|
|* DuplicaBaseProveedores *|
|* *|
|* Descripci¢n: *|
|* Dado que he elegido un sistema rigido para tratar a los *|
|* proveedores, me veo obligado una vez al a¤o a clonar la *|
|* base de datos de los proveedores... *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void DuplicaBaseProveedores(void)
{
long Regs;
BDatos BPtmp;
char buffer[80];
// Base a clonar
sprintf( buffer, "datos\\%s\\info_prv.%03d", NEmpresa, ( (FechaGestionActual.da_year-1) - ((FechaGestionActual.da_year-1)/1000)*1000 ) );
if ( BPtmp.AbrirReg( buffer, sizeof( INFO_PROVEEDORES ) ) == ERROR )
Error(0x01, BPtmp.cError);
// Base clonada
sprintf( buffer, "datos\\%s\\info_prv.%03d", NEmpresa, ( FechaGestionActual.da_year - (FechaGestionActual.da_year/1000)*1000 ) );
if ( BProv.AbrirReg( buffer, sizeof( INFO_PROVEEDORES ) ) == ERROR )
Error(0x01, BProv.cError);
for( Regs = 0; Regs < BPtmp.Registros(); Regs++ )
{
if ( BPtmp.LeeReg( (void *)&SProv, Regs ) == ERROR )
Error(0x01, BPtmp.cError);
if ( BProv.InsReg( (void *)&SProv, BProv.Registros(), ARRIBA ) == ERROR )
Error(0x01, BProv.cError);
}
BProv.CerrarReg();
BPtmp.CerrarReg();
}
/**************************************************************************\
|* *|
|* InfoProveedores *|
|* *|
|* Descripci¢n: *|
|* Controla la introduccion de datos y muestreo asi como todo *|
|* el interfaz de usuario... *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void InfoProveedores(void)
{
char buffer[100], ok = 0;
int BPush, key;
char oldCol = -1;
char CurrRow; // Linea sobre la que estamos
char CurrCol; // Columna sobre la que estamos
long CurrProv; // Producto sobre el que estamos posicionados a golpes
// Rellenamos la pantalla con un fondo atractivo...
setfillstyle( Config.FillBgS, Config.FillBgC ); bar( 0, 0, 640, 480 );
Imprime_Estaticos( 30, "systm\\Tpv.img"); // Imprime botones estaticos 'Seccion 30'
sprintf( buffer, "datos\\%s\\info_prv.%03d", NEmpresa, ( FechaGestionActual.da_year - (FechaGestionActual.da_year/1000)*1000 ) );
// Este a¤o no existe la base de datos, pero quizas exista el a¤o anterior
if ( access( buffer, 0 ) != 0 )
{
sprintf( buffer, "datos\\%s\\info_prv.%03d", NEmpresa, ( (FechaGestionActual.da_year-1) - ((FechaGestionActual.da_year-1)/1000)*1000 ) );
if ( access( buffer, 0 ) == 0 )
{
Optar( ENCUADRE, "Generando clon de Proveedores", "Atenci¢n se detecto un nuevo", "a¤o y se esta generando un", "clon de la base anterior.", NULL );
DuplicaBaseProveedores();
Optar( ENCUADRE, "Generando clon de Proveedores", "Atenci¢n se detecto un nuevo", "a¤o y se esta generando un", "clon de la base anterior.", NULL );
}
}
sprintf( buffer, "datos\\%s\\info_prv.%03d", NEmpresa, ( FechaGestionActual.da_year - (FechaGestionActual.da_year/1000)*1000 ) );
if ( BProv.AbrirReg( buffer, sizeof( INFO_PROVEEDORES ) ) == ERROR )
Error(0x01, BProv.cError);
// Si no hay registros, creamos uno almenos.
if ( BProv.Registros() == 0 )
{
ProvNuevoRegistro( &SProv );
if ( BProv.InsReg( (void *)&SProv, BProv.Registros(), ARRIBA ) == ERROR )
Error(0x01, BProv.cError);
}
CurrProv = 0; CurrRow = 0;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosProv( CurrRow + CurrProv );
if ( BProv.LeeReg( (void *)&SProv, 0 ) == ERROR )
Error(0x01, BProv.cError);
MuestraDatosVProv( CurrRow );
CurrCol = 0;
do {
if ( CurrCol != oldCol )
{
oldCol = CurrCol; MuestraAyudaProv( CurrCol );
}
MuestraProv( CurrCol, CurrRow, INTENSO );
BPush = Comprueba_Secuencia( 2, NULL );
MuestraProv( CurrCol, CurrRow, NORMAL );
switch ( BPush )
{
case 0: // No se pulso ningun BOTON
while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER
if ( ( BPush = CompruebaPulsosEstrellas() ) != 0 )
{
MuestraProv( BPush, CurrRow, INTENSO );
if ( BProv.EscribeReg( (void *)&SProv, (CurrRow + CurrProv) ) == ERROR )
Error(0x01, BProv.cError);
}
break;
case -2: // Hay una tecla normal en BUFFER
#ifndef DEMOSTRACION
if ( VisualMode == OK )
{
while( kbhit() ) getch();
} else {
if ( ( key = getch() ) != 27 )
{
if ( key != 13 )
ungetch( key );
EditItemProv( CurrCol, CurrRow );
if ( BProv.EscribeReg( (void *)&SProv, (CurrRow + CurrProv) ) == ERROR )
Error(0x01, BProv.cError);
MuestraProv( CurrCol, CurrRow, NORMAL );
CurrCol++; if ( CurrCol > 14 ) CurrCol = 14;
}
}
#else
while( kbhit() ) getch();
Optar( 0, "VERSION DEMOSTRACION", "En esta versi¢n no se", "permiten m¢dificar los campos,", "de los proveedores...", NULL );
#endif
break;
case -1: // Hay una tecla especial en BUFFER
switch( getch() )
{
// Flecha Izquierda
case 75:
case 15:
CurrCol--; if ( CurrCol < 0 ) CurrCol = 14;
break;
// Flecha Derecha
case 77:
case 9:
CurrCol++; if ( CurrCol > 14 ) CurrCol = 0;
break;
// Flecha Arriba
case 72:
if ( CurrCol < 4 )
{
if ( (CurrRow + CurrProv) > 0 )
{
if ( ( CurrRow ) <= 0 )
{
CurrRow = NLINEAS_PROV - 1; CurrProv -= NLINEAS_PROV;
if ( CurrProv < 0 ) CurrProv = 0;
while( ( CurrRow + CurrProv ) >= BProv.Registros() && CurrRow > 0 ) CurrRow--;
while( ( CurrRow + CurrProv ) >= BProv.Registros() && CurrProv > 0 ) CurrProv++;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosProv( CurrProv );
} else {
CurrRow --; if ( CurrRow < 0 ) CurrRow = 0;
}
}
if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR )
Error(0x01, BProv.cError);
MuestraDatosVProv( CurrRow );
} else {
CurrCol--; if ( CurrCol < 0 ) CurrCol = 14;
}
break;
// Flecha Abajo
case 80:
if ( CurrCol < 4 )
{
if ( ( CurrRow + CurrProv ) < BProv.Registros() - 1 )
{
if ( ( CurrRow ) >= NLINEAS_PROV - 1 )
{
CurrRow = 0; CurrProv += NLINEAS_PROV;
while ( (CurrProv + CurrRow) >= BProv.Registros() ) CurrProv--;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosProv( CurrProv );
} else
CurrRow++;
}
if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR )
Error(0x01, BProv.cError);
MuestraDatosVProv( CurrRow );
} else {
CurrCol++; if ( CurrCol > 14 ) CurrCol = 0;
}
break;
// Inicio
case 71:
CurrRow = 0;
if ( CurrProv != 0 )
{
CurrProv = 0;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosProv( CurrProv );
}
if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR )
Error(0x01, BProv.cError);
MuestraDatosVProv( CurrRow );
break;
// Fin
case 79:
CurrRow = 0;
if ( CurrProv != BProv.Registros() - NLINEAS_PROV )
{
CurrProv = BProv.Registros() - NLINEAS_PROV;
if ( CurrProv < 0 )
{
CurrProv = 0;
CurrRow = BProv.Registros()-1;
}
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosProv( CurrProv );
}
if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR )
Error(0x01, BProv.cError);
MuestraDatosVProv( CurrRow );
break;
}
break;
// Imprimir Proverencias
case 1:
MuestraImpresionesProv();
break;
// Menu Principal
case 2:
ok = 1;
break;
#ifndef DEMOSTRACION
// Eliminar
case 3:
if ( VisualMode == OK )
{
while( kbhit() ) getch();
} else {
if ( Optar( 1, "ATENCION", "Eliminar el proveedor", "provoc ra la perdida de datos", "para los informaes!!!", NULL ) )
{
if ( BProv.DelReg( CurrProv + CurrRow ) == ERROR )
Error(0x01, BProv.cError);
if ( BProv.Registros() == 0 )
{
ProvNuevoRegistro( &SProv );
if ( BProv.InsReg( (void *)&SProv, BProv.Registros(), ARRIBA ) == ERROR )
Error(0x01, BProv.cError);
CurrRow = 0;
} else
// Si he borrado el £ltimo registro subo una linea
if ( (CurrProv+CurrRow) >= ( BProv.Registros() - 2 ) )
{
if ( (CurrRow + CurrProv) > 0 )
{
if ( ( CurrRow ) <= 0 )
{
CurrRow = NLINEAS_PROV - 1; CurrProv -= NLINEAS_PROV;
if ( CurrProv < 0 ) CurrProv = 0;
while( ( CurrRow + CurrProv ) >= BProv.Registros() && CurrRow > 0 ) CurrRow--;
while( ( CurrRow + CurrProv ) >= BProv.Registros() && CurrProv > 0 ) CurrProv++;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosProv( CurrProv );
} else {
CurrRow --; if ( CurrRow < 0 ) CurrRow = 0;
}
}
if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR )
Error(0x01, BProv.cError);
MuestraDatosVProv( CurrRow );
}
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosProv( CurrProv );
if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR )
Error(0x01, BProv.cError);
MuestraDatosVProv( CurrRow );
}
}
break;
// Insertar
case 4:
if ( VisualMode == OK )
{
while( kbhit() ) getch();
} else {
ProvNuevoRegistro( &SProv );
if ( BProv.InsReg( (void *)&SProv, (CurrProv + CurrRow), ARRIBA ) == ERROR )
Error(0x01, BProv.cError);
if ( ( CurrRow + CurrProv ) < BProv.Registros() - 1 )
{
if ( ( CurrRow ) >= NLINEAS_PROV - 1 )
{
CurrRow = 0; CurrProv += NLINEAS_PROV;
while ( (CurrProv + CurrRow) >= BProv.Registros() ) CurrProv--;
} else
CurrRow++;
}
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosProv( CurrProv );
if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR )
Error(0x01, BProv.cError);
MuestraDatosVProv( CurrRow );
}
break;
#else
// insertar//eliminar
case 3:
case 4:
Optar( 0, "VERSION DEMOSTRACION", "En esta versi¢n no se", "permiten eliminar ni insertar", "nuevos registros...", NULL );
break;
#endif
// Retroceso R pido
case 5:
#ifndef DEMOSTRACION
CurrRow = NLINEAS_PROV - 1; CurrProv -= NLINEAS_PROV;
if ( CurrProv < 0 ) CurrProv = 0;
while( ( CurrRow + CurrProv ) >= BProv.Registros() && CurrRow > 0 ) CurrRow--;
while( ( CurrRow + CurrProv ) >= BProv.Registros() && CurrProv > 0 ) CurrProv++;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosProv( CurrProv );
if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR )
Error(0x01, BProv.cError);
MuestraDatosVProv( CurrRow );
#endif
break;
// Busqueda Atras
case 6:
BuscaProv( ATRAS, &CurrRow, &CurrProv );
break;
// Buscar
case 7:
BuscaProv( NUEVA_BUSQUEDA, &CurrRow, &CurrProv );
break;
// Busqueda Adelante
case 8:
BuscaProv( ADELANTE, &CurrRow, &CurrProv );
break;
// AvanceR pido
case 9:
#ifndef DEMOSTRACION
CurrRow = 0; CurrProv += NLINEAS_PROV;
while ( (CurrProv + CurrRow) >= BProv.Registros() ) CurrProv--;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosProv( CurrProv );
if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR )
Error(0x01, BProv.cError);
MuestraDatosVProv( CurrRow );
#endif
break;
default:
break;
}
} while( !ok );
BProv.CerrarReg();
}
/**************************************************************************\
|* *|
|* MuestraDatosProv *|
|* *|
|* Descripci¢n: *|
|* Dado un registro, se muestran sucesivamente este y todos *|
|* los que hay por debajo de l, hasta que se agote la base *|
|* o no quepan mas en la pantalla. *|
|* *|
|* Entradas: Registro por el que comenzar *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MuestraDatosProv( long RowStart )
{
int linea, campo;
char dev;
int X0, Y0, X1, Y1;
// Imprimo la NLINEAS_PROV que caben en la pantalla
dev = OK;
for ( linea=0; linea < NLINEAS_PROV && (RowStart + linea) < BProv.Registros()/*dev == OK*/; linea++ )
{
dev = BProv.LeeReg( (void *)&SProv, RowStart + linea );
if ( dev == OK )
// Por cada linea hay 4 campos, ehhh!!!
for ( campo=0; campo < 4; campo++ )
MuestraProv( campo, linea, NORMAL );
}
// Ahora limpio los restantes huecos si los hay
if ( linea < NLINEAS_PROV ) //dev != OK )
{
//linea--;
setfillstyle( SOLID_FILL, Config.TxtBgN );
for ( ; linea < NLINEAS_PROV; linea++ )
for ( campo=0; campo < 4; campo++ )
{
ObtenCoordenadasProv( campo, linea, &X0, &Y0, &X1, &Y1 );
bar( X0, Y0, X1, Y1 );
}
}
}
void MuestraDatosVProv( int linea )
{
int campo;
// Mostramos los campos que faltan, ( 1¦ Linea )
// mas 5 que pertenecen a las estrellas
for ( campo=4; campo < 18+5; campo++ )
MuestraProv( campo, linea, NORMAL );
}
/**************************************************************************\
|* *|
|* MuestraProv *|
|* *|
|* Descripci¢n: *|
|* Reescribe el campo dado, seg£n la fila, y la intensidad *|
|* *|
|* Entradas: *|
|* columna campo ha mostar *|
|* linea linea en la que nos encontramos *|
|* como intensidad del texto (NORMAL/INTENSO) *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MuestraProv( char columna, int linea, char como )
{
char buffer[80], draw;
char buffer1[80], i;
int X0, Y0, X1, Y1;
ObtenCoordenadasProv( columna, linea, &X0, &Y0, &X1, &Y1 );
draw = 1;
switch( columna )
{
// Codigo
case 0:
sprintf ( buffer, " %09lu", SProv.CodigoR );
break;
// Nombre del proveedor
case 1:
sprintf ( buffer, "%30s", SProv.ActividadProveedor );
break;
// N§ de Telefono
case 2:
sprintf ( buffer, "%15s", SProv.Telefono1 );
break;
// Fax
case 3:
sprintf ( buffer, "%15s", SProv.Fax );
break;
// Codigo
case 4:
sprintf ( buffer, "%09lu", SProv.CodigoR );
break;
// NIF / CIF
case 5:
sprintf ( buffer, "%10s", SProv.Cif );
break;
// Nombre Proveedor
case 6:
sprintf ( buffer, "%29s", SProv.Proveedor );
break;
// Actividad Proveedor
case 7:
sprintf ( buffer, "%29s", SProv.ActividadProveedor );
break;
// Direccion
case 8:
sprintf ( buffer, " %30s", SProv.Direccion );
break;
// Localidad
case 9:
sprintf ( buffer, "%15s", SProv.Poblacion );
break;
// Provincia
case 10:
sprintf ( buffer, "%15s", SProv.Provincia );
break;
// Codigo Postal
case 11:
formatea_long( SProv.CodPost, buffer1 );
sprintf ( buffer, "%7s", buffer1 );
break;
// Telefono
case 12:
sprintf ( buffer, " %15s", SProv.Telefono1 );
break;
// Fax
case 13:
sprintf ( buffer, "%15s", SProv.Fax );
break;
// Comentario
case 14:
draw = 0;
setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI );
bar( X0, Y0, X1, Y1 );
settextstyle( SMALL_FONT, HORIZ_DIR, 4 );
setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI );
for ( i = 0; i < 4; i++ )
outtextxy( X0, Y0 + 14*i, SProv.Notas[i] );
settextstyle( SMALL_FONT, HORIZ_DIR, 5 );
break;
// Estellas
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
if ( ( SProv.Estrellas & ( 0x01 << (columna - 15) ) ) >> (columna - 15 ) )
ponicono( X0+5, Y0+5, led_on, 1 );
else
ponicono( X0+5, Y0+5, led_off, 1 );
// En las estrellas no hay que imprimir nada
draw = 0;
break;
}
if ( draw )
{
setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI );
bar( X0, Y0, X1, Y1 );
setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI );
outtextxy( X0+2, Y0, buffer );
}
}
/**************************************************************************\
|* *|
|* MuestraAyudaProv *|
|* *|
|* Descripci¢n: *|
|* Muestra una peque¤a descripcion del contenido para el campo *|
|* *|
|* Entradas: *|
|* columna campo ha mostar su ayuda *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MuestraAyudaProv( char columna )
{
char buffer1[80];
switch( columna )
{
// Codigo
case 0:
sprintf ( buffer1, "Introduzca el codigo que desea asignar al proveedor" );
break;
// Nombre del proveedor
case 1:
sprintf ( buffer1, "Actividad del proveedor" );
break;
// Telefono
case 2:
sprintf ( buffer1, "N£mero de telfono del proveedor" );
break;
// N§ de Fax
case 3:
sprintf ( buffer1, "N£mero de Fax (necesario para enviarlos)" );
break;
// Codigo
case 4:
sprintf ( buffer1, "C¢digo de proveedor" );
break;
// Nif / Cif
case 5:
sprintf ( buffer1, "N.I.F. o C.I.F. del proveedor" );
break;
// Nombre del proveedor
case 6:
sprintf ( buffer1, "Nombre del proveedor" );
break;
// Actividad del proveedor
case 7:
sprintf ( buffer1, "Actividad del Proveedor" );
break;
// Direccion
case 8:
sprintf ( buffer1, "Direccion completa del proveedor" );
break;
// Poblacion
case 9:
sprintf ( buffer1, "Localidad del proveedor" );
break;
// Provincia
case 10:
sprintf ( buffer1, "Provincia" );
break;
// C¢digo postal
case 11:
sprintf ( buffer1, "C¢digo Postal" );
break;
// Telefono
case 12:
sprintf ( buffer1, "N£mero de telfono del proveedor" );
break;
// Fax
case 13:
sprintf ( buffer1, "Fax o segundo telfono del proveedor" );
break;
case 14:
sprintf ( buffer1, "Breves notas sobre el proveedor" );
break;
}
// Ayuda reducida
setfillstyle( SOLID_FILL, EGA_BLACK ); bar( 7, 457, 498, 473 );
// Imprime la ayudita
setcolor( EGA_WHITE ); outtextxy( 7, 457, buffer1 );
}
#ifndef DEMOSTRACION
/**************************************************************************\
|* *|
|* EditItemProv *|
|* *|
|* Descripci¢n: *|
|* Se encarga de editar y validar el campo. *|
|* *|
|* Entradas: *|
|* columna campo ha editar *|
|* linea linea en la que nos encontramos *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void EditItemProv( char columna, int linea )
{
char buffer[80];
int X0, Y0, X1, Y1;
ObtenCoordenadasProv( columna, linea, &X0, &Y0, &X1, &Y1 );
switch( columna )
{
// Codigo Real
case 0:
case 4:
sprintf ( buffer, "%lu", SProv.CodigoR );
if ( !( InputCadenaG( buffer, 1, 9, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
SProv.CodigoR = atol( buffer );
MuestraProv( 0, linea, NORMAL );
MuestraProv( 4, linea, NORMAL );
break;
// Nombre del proveedor
// case 1:
case 6:
strcpy ( buffer, SProv.Proveedor );
if ( !( InputCadenaG( buffer, 0, 29, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
strcpy ( SProv.Proveedor, buffer );
MuestraProv( 1, linea, NORMAL );
MuestraProv( 6, linea, NORMAL );
break;
// Telefono
case 2:
case 12:
sprintf ( buffer, "%s", SProv.Telefono1 );
if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
strcpy ( SProv.Telefono1, buffer );
MuestraProv( 2, linea, NORMAL );
MuestraProv( 12, linea, NORMAL );
break;
// Fax
case 3:
case 13:
sprintf ( buffer, "%s", SProv.Fax );
if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
strcpy ( SProv.Fax, buffer );
MuestraProv( 3, linea, NORMAL );
MuestraProv( 13, linea, NORMAL );
break;
// CIF / NIF
case 5:
sprintf ( buffer, "%s", SProv.Cif );
if ( !( InputCadenaG( buffer, 0, 10, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
strcpy ( SProv.Cif, buffer );
break;
// Actividad proveedor
case 1:
case 7:
sprintf ( buffer, "%s", SProv.ActividadProveedor );
if ( !( InputCadenaG( buffer, 0, 29, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
strcpy ( SProv.ActividadProveedor, buffer );
break;
// Direccion
case 8:
sprintf ( buffer, "%s", SProv.Direccion );
if ( !( InputCadenaG( buffer, 0, 30, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
strcpy ( SProv.Direccion, buffer );
break;
// Poblaci¢n
case 9:
sprintf ( buffer, "%s", SProv.Poblacion );
if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
strcpy ( SProv.Poblacion, buffer );
break;
// Provincia
case 10:
sprintf ( buffer, "%s", SProv.Provincia );
if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
strcpy ( SProv.Provincia, buffer );
break;
// C¢digo Postal
case 11:
sprintf ( buffer, "%lu", SProv.CodPost );
if ( !( InputCadenaG( buffer, 0, 5, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
SProv.CodPost = atol ( buffer );
break;
// Comentario
case 14:
settextstyle( SMALL_FONT, HORIZ_DIR, 4 );
EditComentario( (char *)(&SProv.Notas[0][0]), 3, 37, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1, 14 );
settextstyle( SMALL_FONT, HORIZ_DIR, 5 );
break;
}
}
#endif
/**************************************************************************\
|* *|
|* ObtenCoordenadasProv *|
|* *|
|* Descripci¢n: *|
|* Obtiene las coordenadas de acotacion para el campo pedido *|
|* *|
|* Entradas: *|
|* columna campo del que obtener las coordenadas *|
|* linea linea en la que nos encontramos *|
|* X0 Y0 X1 Y1 Punteros para devolver las coordenadas *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void ObtenCoordenadasProv( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 )
{
// Calculamos la Y0, Y1 para la linea dada ( SOLO columna < 6 )
*Y0 = 264 + 19*linea;
*Y1 = *Y0 + 17;
switch( columna )
{
case 0:
*X0 = 7; *X1 = 98;
break;
case 1:
*X0 = 107; *X1 = 358;
break;
case 2:
*X0 = 367; *X1 = 495;
break;
case 3:
*X0 = 505; *X1 = 633;
break;
case 4:
*X0 = 67; *Y0 = 37;
*X1 = 148; *Y1 = 58;
break;
case 5:
*X0 = 247; *Y0 = 37;
*X1 = 388; *Y1 = 58;
break;
case 6:
*X0 = 152; *Y0 = 62;
*X1 = 390; *Y1 = 83;
break;
case 7:
*X0 = 152; *Y0 = 87;
*X1 = 390; *Y1 = 108;
break;
case 8:
*X0 = 92; *Y0 = 112;
*X1 = 388; *Y1 = 133;
break;
case 9:
*X0 = 92; *Y0 = 137;
*X1 = 223; *Y1 = 158;
break;
case 10:
*X0 = 312; *Y0 = 137;
*X1 = 438; *Y1 = 158;
break;
case 11:
*X0 = 522; *Y0 = 137;
*X1 = 598; *Y1 = 158;
break;
case 12:
*X0 = 92; *Y0 = 162;
*X1 = 245; *Y1 = 183;
break;
case 13:
*X0 = 255; *Y0 = 162;
*X1 = 388; *Y1 = 183;
break;
case 14:
*X0 = 402; *Y0 = 165;
*X1 = 633; *Y1 = 221;
break;
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
*X0 = 90 + 30 * ( columna - 15 ); *Y0 = 190;
*X1 = *X0 + 25; *Y1 = 215;
break;
}
*X0 += 2;
*X1 -= 2;
}
/**************************************************************************\
|* *|
|* ProvNuevoRegistro *|
|* *|
|* Descripci¢n: *|
|* Limpia el buffer, para un nuevo registro. *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void ProvNuevoRegistro( INFO_PROVEEDORES *NSProv )
{
char i, j;
NSProv -> CodigoR = 0; // Codigos asiignados a los proveedores
strcpy( NSProv -> Proveedor, "" ); // Nombre del proveedor
// Nombre del proveedor
strcpy( NSProv -> ActividadProveedor, "" );
strcpy( NSProv -> Telefono1, "" ); // Telfono y fax del proveedor
strcpy( NSProv -> Fax, "" ); //
strcpy( NSProv -> Direccion, "" ); // Direccion
strcpy( NSProv -> Numero, "" ); // Numero
strcpy( NSProv -> Poblacion, "" ); // Poblacion
strcpy( NSProv -> Provincia, "" ); // Provincia
NSProv -> CodPost = 0; // C¢digo Postal
NSProv -> Estrellas = 0; // Estrellas ( lo que imagina el cliente )
for ( i = 0; i < 12; i++ )
for ( j = 0; j < 31; j++ )
NSProv -> Compras[i][j] = 0;
for ( i = 0; i < 4; i++ )
SProv.Notas[i][0] = '\0';
}
int CompruebaPulsosEstrellas(void)
{
char enc, i;
enc = 0;
for ( i=0; i < 8; i++ )
{
if ( y_raton > 190 && y_raton < 215 &&
x_raton > ( 90 + 30 * i ) && x_raton < ( 90 + 30 * i + 25 ) )
{
if ( SProv.Estrellas & ( 0x01 << i ) )
SProv.Estrellas -= ( 0x01 << i );
else
SProv.Estrellas += ( 0x01 << i );
enc = 15 + i;
break;
}
}
Anclar_Raton();
return enc;
}
// ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
// Û Parte secundaria del m¢dulo Û
// Û Û
// Û Secci¢n de Busqueda de refecencias Û
// ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
/**************************************************************************\
|* *|
|* BuscaProv *|
|* *|
|* Descripci¢n: *|
|* Busca una referencia por su n§ o descripcion *|
|* *|
|* Entradas: *|
|* ATRAS Busca otra coincidencia hacia atras *|
|* NUEVA_BUSQUEDA Inicia una nueva busqueda *|
|* ADELANTE Busca otra coincidencia hacia delante *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void BuscaProv( char TipoBusqueda, char *CurrRow, long *CurrProv )
{
static INFO_PROVEEDORES MProv;
char enc; long i;
switch ( TipoBusqueda )
{
case NUEVA_BUSQUEDA:
if ( ObtenMatchProv( &MProv ) != OK )
return;
i = 0;
break;
case ATRAS:
case ADELANTE:
i = ( *CurrRow + *CurrProv ) + TipoBusqueda;
break;
}
Optar( ENCUADRE, "Comando: Buscar", "Ahora se inica", "la busqueda elegida", NULL );
enc = 0;
while ( i < BProv.Registros() && !enc )
{
if ( BProv.LeeReg( (void *)&SProv, i ) == ERROR )
Error( 0x01, BProv.cError);
if ( Match_Prov( &SProv, &MProv ) )
enc = 1;
else
i++;
}
Optar( ENCUADRE, NULL );
if ( enc )
{
*CurrRow = 0; *CurrProv = i;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosProv( *CurrRow + *CurrProv );
if ( BProv.LeeReg( (void *)&SProv, *CurrProv ) == ERROR )
Error(0x01, BProv.cError);
MuestraDatosVProv( *CurrRow );
} else
switch( TipoBusqueda )
{
case NUEVA_BUSQUEDA:
Optar( 0, "Comando: Buscar", "No se encontr¢", "ninguna coincidencia", NULL );
break;
case ATRAS:
case ADELANTE:
Optar( 0, "Comando: Buscar", "No se encontr¢", "ninguna coincidencia", NULL );
break;
}
if ( BProv.LeeReg( (void *)&SProv, (*CurrRow + *CurrProv) ) == ERROR )
Error( 0x01, BProv.cError);
}
/**************************************************************************\
|* *|
|* Match_Prov *|
|* *|
|* Descripci¢n: *|
|* Compara dos registros y devuelve la posible coincidencia *|
|* *|
|* Entradas: *|
|* Registros a comparar *|
|* *|
|* Salidas: *|
|* Resultado de la comparaci¢n *|
|* *|
\**************************************************************************/
int Match_Prov( INFO_PROVEEDORES *A, INFO_PROVEEDORES *B )
{
if ( B -> CodigoR != 0 )
return (A -> CodigoR == B -> CodigoR);
if ( B -> Proveedor[0] != '\0' )
return ( strncmpi( A -> Proveedor, B -> Proveedor, strlen( B -> Proveedor ) ) == 0 );
if ( B -> Direccion[0] != '\0' )
return ( strncmpi( A -> Direccion, B -> Direccion, strlen( B -> Direccion ) ) == 0 );
if ( B -> Telefono1[0] != '\0' )
return ( strncmpi( A -> Telefono1, B -> Telefono1, strlen( B -> Telefono1 ) ) == 0 );
return 0;
}
/**************************************************************************\
|* *|
|* ObtenMatchProv *|
|* *|
|* Descripci¢n: *|
|* Obtine los patrones de busqueda necesarios *|
|* *|
|* Entradas: *|
|* Estructura donde guardar el patron de busqueda *|
|* *|
|* Salidas: *|
|* OK La entrada es correcta *|
|* ERROR El usuario interrumpio la busqueda *|
|* *|
\**************************************************************************/
int ObtenMatchProv( INFO_PROVEEDORES *MProv )
{
char Row, ok, i;
int BPush, key, DEV;
struct textsettingstype texttypeinfo;
gettextsettings( &texttypeinfo );
Optar( ENCUADRE, "Comando: Buscar", NULL );
Imprime_Estaticos( 31, "systm\\tpv.img" );
ok = 0; Row = 0;
ProvNuevoRegistro( MProv );
do
{
MatchDrawProv(Row, *MProv, INTENSO);
BPush = Comprueba_Secuencia( SEC_OPTAR, NULL );
MatchDrawProv(Row, *MProv, NORMAL);
switch ( BPush )
{
case 0: // No se pulso ningun BOTON
while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER
case -2:
if ( ( key = getch() ) != 13 && key != 27 )
ungetch( key );
EditMatchProv( Row, MProv );
for ( i=0; i < 4; i++ )
MatchDrawProv(i, *MProv, NORMAL);
break;
case -1:
switch ( getch() )
{
// Flecha Izquierda
case 75:
case 15:
// Flecha Arriba
case 72:
Row--; if ( Row < 0 ) Row = 3;
break;
// Flecha Derecha
case 77:
case 9:
// Flecha Abajo
case 80:
Row++; if ( Row > 4 ) Row = 0;
break;
}
break;
case 1:
DEV = OK; ok = 1;
break;
case 2:
DEV = ERROR; ok = 1;
break;
}
} while ( !ok );
Optar( ENCUADRE, NULL );
settextstyle( texttypeinfo.font, texttypeinfo.direction, texttypeinfo.charsize );
return DEV;
}
/**************************************************************************\
|* *|
|* EditMatchProv *|
|* *|
|* Descripci¢n: *|
|* Edita el patron de busqueda *|
|* *|
|* Entradas: *|
|* Campo a editar, y lugar donde almacenarlo *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void EditMatchProv( char Row, INFO_PROVEEDORES * MProv )
{
int X0, Y0, X1, Y1;
char buffer[80];
ObtenCoordenadasMatchProv( Row, &X0, &Y0, &X1, &Y1 );
switch( Row )
{
case 0:
sprintf( buffer, "%lu", MProv -> CodigoR );
if ( !( InputCadenaG( buffer, 1, 9, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
{
ProvNuevoRegistro( MProv );
MProv -> CodigoR = atol(buffer);
}
break;
case 1:
sprintf( buffer, "%s", MProv -> Proveedor );
if ( !( InputCadenaG( buffer, 0, 25, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
{
ProvNuevoRegistro( MProv );
strcpy ( MProv -> Proveedor, buffer );
}
break;
case 2:
sprintf( buffer, "%s", MProv -> Direccion );
if ( !( InputCadenaG( buffer, 0, 25, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
{
ProvNuevoRegistro( MProv );
strcpy ( MProv -> Direccion, buffer );
}
break;
case 3:
sprintf( buffer, "%s", MProv -> Telefono1 );
if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
{
ProvNuevoRegistro( MProv );
strcpy ( MProv -> Telefono1, buffer );
}
break;
}
}
/**************************************************************************\
|* *|
|* MatchDrawProv *|
|* *|
|* Descripci¢n: *|
|* Escribe los distintos campos seg£n se le indique *|
|* *|
|* Entradas: *|
|* Campo a mostrar, lugar donde se encuentra, y como mostrarlo *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MatchDrawProv( char Row, INFO_PROVEEDORES MProv, char como )
{
int X0, Y0, X1, Y1;
char buffer[80];
ObtenCoordenadasMatchProv( Row, &X0, &Y0, &X1, &Y1 );
switch( Row )
{
case 0:
sprintf( buffer, " %9lu", MProv.CodigoR );
break;
case 1:
strncpy( buffer, MProv.Proveedor, 25 );
buffer[26] = '\0';
break;
case 2:
strncpy( buffer, MProv.Direccion, 25 );
buffer[26] = '\0';
break;
case 3:
strncpy( buffer, MProv.Telefono1, 15 );
buffer[15] = '\0';
break;
}
setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI );
bar( X0, Y0, X1, Y1 );
setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI );
outtextxy( X0+2, Y0, buffer );
}
/**************************************************************************\
|* *|
|* MatchDrawProv *|
|* *|
|* Descripci¢n: *|
|* Obtiene las coordenadas relativas al campo dado. *|
|* *|
|* Entradas: *|
|* Campo a obtener las coordenadas, y coordenadas de salida *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void ObtenCoordenadasMatchProv( char Row, int *X0, int *Y0, int *X1, int *Y1 )
{
switch( Row )
{
case 0:
*X0 = 265; *X1 = 365;
*Y0 = 200; *Y1 = 220;
break;
case 1:
*X0 = 265; *X1 = 465;
*Y0 = 225; *Y1 = 245;
break;
case 2:
*X0 = 265; *X1 = 465;
*Y0 = 250; *Y1 = 275;
break;
case 3:
*X0 = 265; *X1 = 465;
*Y0 = 280; *Y1 = 305;
break;
case 4:
*X0 = 385; *X1 = 465;
*Y0 = 250; *Y1 = 275;
break;
case 5:
*X0 = 330; *X1 = 365;
*Y0 = 275; *Y1 = 300;
break;
}
(*X0) ++; (*Y0) ++;
(*X1) --; (*Y1) --;
}
// ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
// Û Parte secundaria del m¢dulo Û
// Û Û
// Û Secci¢n de Busqueda de refecencias Û
// ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
/**************************************************************************\
|* *|
|* MuestraImpresiones *|
|* *|
|* Descripci¢n: *|
|* Muestra un cuadro con las distintas opciones de impresi¢n *|
|* *|
|* Entradas:(ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MuestraImpresionesProv(void)
{
void far *fondo;
struct textsettingstype texttypeinfo;
char ok, dev;
if ( ( fondo = farmalloc ( JD_imagesize( 170, 165, 470, 315 ) ) ) != NULL )
{
gettextsettings( &texttypeinfo );
getimage( 170, 165, 470, 315, fondo );
Imprime_Estaticos( 22, "systm\\tpv.img" );
settextstyle( texttypeinfo.font, texttypeinfo.direction, texttypeinfo.charsize );
ok = 0;
do {
switch( Comprueba_Secuencia( 3, NULL ) )
{
case 0:
case -1:
case -2:
while( kbhit() ) getch();
break;
// Cancelar
case 1:
dev = 0;
ok = 1;
break;
// Listado r pido
case 2:
dev = 1;
ok = 1;
break;
// Listado completo
case 3:
dev = 2;
ok = 1;
break;
// Codigos de barra
case 4:
dev = 3;
ok = 1;
break;
}
} while( !ok );
putimage( 170, 165, fondo, COPY_PUT );
farfree( fondo );
ImprimeProveedores( dev );
}
}
/**************************************************************************\
|* *|
|* ImprimeProveedores *|
|* *|
|* Descripci¢n: *|
|* Imprime todas las referencias seg£n se le indique *|
|* *|
|* Entradas: *|
|* Como imprimir las referencias *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void ImprimeProveedores( char como )
{
long i, old_reg;
FILE *file_out;
old_reg = BProv.RegActual();
if ( !Config.Impresora.Printer )
{
if ( ( file_out = fopen( Config.Impresora.PrintTo, "w" ) ) == NULL )
return;
} else
file_out = stdprn;
ImprimeCabeceraProv(como, file_out);
for ( i=0; i<BProv.Registros(); i++ )
{
BProv.LeeReg( (void *)&SProv, i );
switch( como )
{
// Listado R pido
case 1:
fprintf( file_out, "%9lu %-30s %-15s %-15s\n\r", SProv.CodigoR, SProv.Proveedor, SProv.Telefono1, SProv.Fax );
break;
// Listado Completo
case 2:
fprintf( file_out, "\n\r" );
fprintf( file_out, "\n\r" );
fprintf( file_out, "N§ Proveedor: %9lu\n\r", SProv.CodigoR );
fprintf( file_out, "\n\r" );
fprintf( file_out, "Nombre Proveedor: %s\n\r", SProv.Proveedor );
fprintf( file_out, "\n\r" );
fprintf( file_out, "Telefono: %-15s Fax: %-15s\n\r", SProv.Telefono1, SProv.Fax );
fprintf( file_out, "\n\r" );
fprintf( file_out, "Direccion: %s %s%s\n\r", SProv.Direccion, SProv.Numero[0] == '\0' ? "" : ", n§ ", SProv.Numero );
fprintf( file_out, "\n\r" );
fprintf( file_out, "\n\r" );
break;
// C¢digos de barra
case 3:
break;
}
}
if ( !Config.Impresora.Printer )
fclose( file_out );
BProv.LeeReg( (void *)&SProv, old_reg );
}
void ImprimeCabeceraProv( char como, FILE *file_out )
{
switch( como )
{
// Listado R pido
case 1:
fprintf( file_out, "Codigo Provvedor Telfono Fax\n\r");
break;
// Listado Completo
case 2:
// C¢digos de barra
case 3:
break;
}
}