#include #include #include #include #include #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_REF 15 BDatos BRef; // Base de datos de Referencias INFO_PRODUCTOS SRef; // Estructura de referencias // Empresa a la que se le realizan las gestiones extern char EmpresaActual[9]; /*************************************\ | | | Parte Principal del M¢dulo | | | \*************************************/ void ReinicializarStock( void ); void MuestraDatosVRef( int linea); void MuestraDatosRef( long RowStart ); void MuestraAyudaRef( char columna ); void EditItemRef( char columna, int linea ); void RefNuevoRegistro( INFO_PRODUCTOS *MSRef ); void MuestraRef( char columna, int linea, char como ); void ObtenCoordenadasRef( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 ); /*************************************\ | | | Parte Secundaria del M¢dulo | | | | Secci¢n de Busqueda de Productos | | | \*************************************/ void ObtenCoordenadasMatch( char Row, int *X0, int *Y0, int *X1, int *Y1 ); void MatchDrawRef( char Row, INFO_PRODUCTOS MRef, char como ); int BuscaRef( char TipoBusqueda, char *CurrRow, long *CurrRef ); int Match_Ref( INFO_PRODUCTOS A, INFO_PRODUCTOS B ); void EditMatchRef( char Row, INFO_PRODUCTOS * MRef ); int ObtenMatchRef( INFO_PRODUCTOS *MRef ); /*************************************\ | | | Parte Tercera del M¢dulo | | | | Secci¢n para la impresi¢n | | | \*************************************/ void MuestraImpresionesRed( void ); void ImprimeReferencias( char como ); void ImprimeCabeceraRef( char como, FILE *file_out ); // ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß // Û Parte principal del m¢dulo Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ /**************************************************************************\ |* *| |* InfoProducto *| |* *| |* Descripci¢n: *| |* Controla la introduccion de datos y muestreo asi como todo *| |* el interfaz de usuario... *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void InfoProductos(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 CurrRef; // 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( 20, "systm\\Tpv.img"); // Imprime botones estaticos 'Seccion 1' sprintf( buffer, "datos\\%s\\info_ref.dbf", NEmpresa ); if ( BRef.AbrirReg( buffer, sizeof( INFO_PRODUCTOS ) ) == ERROR ) Error( 1, BRef.cError); // Si no hay registros, creamos uno almenos. if ( BRef.Registros() == 0 ) { RefNuevoRegistro( &SRef ); if ( BRef.InsReg( (void *)&SRef, BRef.Registros(), ARRIBA ) == ERROR ) Error( 1, BRef.cError); } CurrRef = 0; CurrRow = 0; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosRef( CurrRow + CurrRef ); if ( BRef.LeeReg( (void *)&SRef, 0 ) == ERROR ) Error( 1, BRef.cError); MuestraDatosVRef( CurrRow ); CurrCol = 0; do { if ( CurrCol != oldCol ) { oldCol = CurrCol; MuestraAyudaRef( CurrCol ); } MuestraRef( CurrCol, CurrRow, INTENSO ); BPush = Comprueba_Secuencia( 2, NULL ); MuestraRef( CurrCol, CurrRow, NORMAL ); switch ( BPush ) { case 0: // No se pulso ningun BOTON while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER break; case -2: // Hay una tecla normal en BUFFER if ( ( key = getch() ) != 13 && key != 27 ) ungetch( key ); EditItemRef( CurrCol, CurrRow ); if ( BRef.EscribeReg( (void *)&SRef, (CurrRow + CurrRef) ) == ERROR ) Error( 1, BRef.cError); MuestraRef( CurrCol, CurrRow, NORMAL ); CurrCol++; if ( CurrCol > 20 ) CurrCol = 20; break; case -1: // Hay una tecla especial en BUFFER switch( getch() ) { // Flecha Izquierda case 75: case 15: CurrCol--; if ( CurrCol < 0 ) CurrCol = 20; break; // Flecha Derecha case 77: case 9: CurrCol++; if ( CurrCol > 20 ) CurrCol = 0; break; // Flecha Arriba case 72: if ( CurrCol >= 7 && CurrCol < 21 ) { CurrCol--; if ( CurrCol < 7 ) CurrCol = 7; } else { if ( (CurrRow + CurrRef) > 0 ) { if ( ( CurrRow ) <= 0 ) { CurrRow = NLINEAS_REF - 1; CurrRef -= NLINEAS_REF; if ( CurrRef < 0 ) CurrRef = 0; while( ( CurrRow + CurrRef ) >= BRef.Registros() && CurrRow > 0 ) CurrRow--; while( ( CurrRow + CurrRef ) >= BRef.Registros() && CurrRef > 0 ) CurrRef++; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosRef( CurrRef ); } else { CurrRow --; if ( CurrRow < 0 ) CurrRow = 0; } } if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR ) Error( 1, BRef.cError); MuestraDatosVRef( CurrRow ); } break; // Flecha Abajo case 80: if ( CurrCol >= 7 && CurrCol < 21 ) { CurrCol++; if ( CurrCol > 20 ) CurrCol = 20; } else { if ( ( CurrRow + CurrRef ) < BRef.Registros() - 1 ) { if ( ( CurrRow ) >= NLINEAS_REF - 1 ) { CurrRow = 0; CurrRef += NLINEAS_REF; while ( (CurrRef + CurrRow) >= BRef.Registros() ) CurrRef--; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosRef( CurrRef ); } else CurrRow++; } if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR ) Error( 1, BRef.cError); MuestraDatosVRef( CurrRow ); } break; // Inicio case 71: CurrRow = 0; if ( CurrRef != 0 ) { CurrRef = 0; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosRef( CurrRef ); } if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR ) Error( 1, BRef.cError); MuestraDatosVRef( CurrRow ); break; // Fin case 79: CurrRow = 0; if ( CurrRef != BRef.Registros() - NLINEAS_REF ) { CurrRef = BRef.Registros() - NLINEAS_REF; if ( CurrRef < 0 ) { CurrRef = 0; CurrRow = BRef.Registros()-1; } // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosRef( CurrRef ); } if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR ) Error( 1, BRef.cError); MuestraDatosVRef( CurrRow ); break; } break; // Imprimir Referencias case 1: MuestraImpresionesRed(); break; // Menu Principal case 2: ok = 1; break; #ifndef DEMOSTRACION // Eliminar case 3: if ( Optar( 1, "ATENCION", "Eliminar una Ref. provocar ", "la eliminaci¢n de su stock", "y enlaces antiguos...", NULL ) ) { if ( BRef.DelReg( CurrRef + CurrRow ) == ERROR ) Error( 1, BRef.cError); if ( BRef.Registros() == 0 ) { RefNuevoRegistro( &SRef ); if ( BRef.InsReg( (void *)&SRef, BRef.Registros(), ARRIBA ) == ERROR ) Error( 1, BRef.cError); CurrRow = 0; } else // Si he borrado el £ltimo registro subo una linea if ( (CurrRef+CurrRow) >= ( BRef.Registros() - 2 ) ) { if ( (CurrRow + CurrRef) > 0 ) { if ( ( CurrRow ) <= 0 ) { CurrRow = NLINEAS_REF - 1; CurrRef -= NLINEAS_REF; if ( CurrRef < 0 ) CurrRef = 0; while( ( CurrRow + CurrRef ) >= BRef.Registros() && CurrRow > 0 ) CurrRow--; while( ( CurrRow + CurrRef ) >= BRef.Registros() && CurrRef > 0 ) CurrRef++; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosRef( CurrRef ); } else { CurrRow --; if ( CurrRow < 0 ) CurrRow = 0; } } if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR ) Error( 1, BRef.cError); MuestraDatosVRef( CurrRow ); } // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosRef( CurrRef ); if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR ) Error( 1, BRef.cError); MuestraDatosVRef( CurrRow ); } break; // Insertar case 4: RefNuevoRegistro( &SRef ); if ( BRef.InsReg( (void *)&SRef, (CurrRef + CurrRow), ARRIBA ) == ERROR ) Error( 1, BRef.cError); if ( ( CurrRow + CurrRef ) < BRef.Registros() - 1 ) { if ( ( CurrRow ) >= NLINEAS_REF - 1 ) { CurrRow = 0; CurrRef += NLINEAS_REF; while ( (CurrRef + CurrRow) >= BRef.Registros() ) CurrRef--; } else CurrRow++; } // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosRef( CurrRef ); if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR ) Error( 1, BRef.cError); MuestraDatosVRef( 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_REF - 1; CurrRef -= NLINEAS_REF; if ( CurrRef < 0 ) CurrRef = 0; while( ( CurrRow + CurrRef ) >= BRef.Registros() && CurrRow > 0 ) CurrRow--; while( ( CurrRow + CurrRef ) >= BRef.Registros() && CurrRef > 0 ) CurrRef++; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosRef( CurrRef ); if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR ) Error( 1, BRef.cError); MuestraDatosVRef( CurrRow ); #endif break; // Busqueda Atras case 6: if ( BuscaRef( ATRAS, &CurrRow, &CurrRef ) == OK ) { // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosRef( CurrRow + CurrRef ); if ( BRef.LeeReg( (void *)&SRef, (CurrRow + CurrRef) ) == ERROR ) Error( 1, BRef.cError); MuestraDatosVRef( CurrRow ); } else { if ( BRef.LeeReg( (void *)&SRef, (CurrRow + CurrRef) ) == ERROR ) Error( 1, BRef.cError); } break; // Buscar case 7: if ( BuscaRef( NUEVA_BUSQUEDA, &CurrRow, &CurrRef ) == OK ) { // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosRef( CurrRow + CurrRef ); if ( BRef.LeeReg( (void *)&SRef, (CurrRow + CurrRef) ) == ERROR ) Error( 1, BRef.cError); MuestraDatosVRef( CurrRow ); } else { if ( BRef.LeeReg( (void *)&SRef, (CurrRow + CurrRef) ) == ERROR ) Error( 1, BRef.cError); } break; // Busqueda Adelante case 8: if ( BuscaRef( ADELANTE, &CurrRow, &CurrRef ) == OK ) { // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosRef( CurrRow + CurrRef ); if ( BRef.LeeReg( (void *)&SRef, (CurrRow + CurrRef) ) == ERROR ) Error( 1, BRef.cError); MuestraDatosVRef( CurrRow ); } else { if ( BRef.LeeReg( (void *)&SRef, (CurrRow + CurrRef) ) == ERROR ) Error( 1, BRef.cError); } break; // AvanceR pido case 9: #ifndef DEMOSTRACION CurrRow = 0; CurrRef += NLINEAS_REF; while ( (CurrRef + CurrRow) >= BRef.Registros() ) CurrRef--; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosRef( CurrRef ); if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR ) Error( 1, BRef.cError); MuestraDatosVRef( CurrRow ); #endif break; // Poner a cero el stock case 10: #ifndef DEMOSTRACION if ( Optar( 1, "Reinicializar Stock", "Atenci¢n esta apunto de", "borrar todo el stock, desea", "seguir con la operaci¢n ?", NULL ) ) { ReinicializarStock(); // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosRef( CurrRef ); if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR ) Error( 1, BRef.cError); MuestraDatosVRef( CurrRow ); } #else Optar( 0, "VERSION DEMOSTRACION", "En esta versi¢n no se", "permiten reinicializar el", "el stock, de forma autom tica", NULL ); #endif break; default: break; } } while( !ok ); BRef.CerrarReg(); } #ifndef DEMOSTRACION /**************************************************************************\ |* *| |* ReinicializarStock *| |* *| |* Descripci¢n: *| |* Recorre toda la base de datos, poniendo el stock a cero. *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ReinicializarStock( void ) { long RegStk; for ( RegStk=0; RegStk < BRef.Registros(); RegStk++ ) { BRef.LeeReg( (void *)&SRef, RegStk ); SRef.Stock = 0; BRef.EscribeReg( (void *)&SRef, RegStk ); } } #endif /**************************************************************************\ |* *| |* MuestraDatosRef *| |* *| |* 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 MuestraDatosRef( long RowStart ) { int linea, campo; char dev; int X0, Y0, X1, Y1; // Imprimo la NLINEAS_REF que caben en la pantalla dev = OK; for ( linea=0; linea < NLINEAS_REF && dev == OK; linea++ ) { dev = BRef.LeeReg( (void *)&SRef, RowStart + linea ); if ( dev == OK ) // Por cada linea hay 6 campos, ehhh!!! for ( campo=0; campo < 7; campo++ ) MuestraRef( campo, linea, NORMAL ); } // Ahora limpio los restantes huecos si los hay if ( dev != OK ) { linea--; setfillstyle( SOLID_FILL, Config.TxtBgN ); for ( ; linea < NLINEAS_REF; linea++ ) for ( campo=0; campo < 7; campo++ ) { ObtenCoordenadasRef( campo, linea, &X0, &Y0, &X1, &Y1 ); bar( X0, Y0, X1, Y1 ); } } } void MuestraDatosVRef( int linea ) { int campo; // Mostramos los campos que faltan, ( 1¦ Linea ) for ( campo=7; campo < 21; campo++ ) MuestraRef( campo, linea, NORMAL ); } /**************************************************************************\ |* *| |* MuestraRef *| |* *| |* 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 MuestraRef( char columna, int linea, char como ) { char buffer[80]; char buffer1[80]; int X0, Y0, X1, Y1; ObtenCoordenadasRef( columna, linea, &X0, &Y0, &X1, &Y1 ); switch( columna ) { // Codigo Real case 0: sprintf ( buffer, " %09lu", SRef.CodigoR ); break; // Nombre del producto case 1: sprintf ( buffer, "%30s", SRef.Descripcion ); break; // Cantidad por unidad case 2: formatea_u_long( (unsigned long)SRef.CantUnitaria, buffer1 ); sprintf ( buffer, "%4s", buffer1 ); break; // Precio de costo case 3: formatea_u_long( (unsigned long)SRef.PrecioCosto, buffer1 ); sprintf ( buffer, "%6s", buffer1 ); break; // Precio V. P. case 4: formatea_u_long( (unsigned long)SRef.PrecioVenta[0], buffer1 ); sprintf ( buffer, "%6s", buffer1 ); break; // þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ // IVA Asociado case 5: sprintf ( buffer, "%2d", SRef.Categoria ); break; // Stock actual del producto case 6: formatea_long( (long)SRef.Stock, buffer1 ); sprintf ( buffer, "%7s", buffer1 ); break; // Codigos asociados case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: sprintf ( buffer, " %09ld", SRef.CodigosAsociados[columna-7] ); break; // Precios de venta segun horarios. case 17: case 18: case 19: case 20: formatea_u_long( (unsigned long)SRef.PrecioVenta[columna - 17 + 1], buffer1 ); sprintf ( buffer, "%6s", buffer1 ); break; } if ( columna <= 6 && SRef.Categoria == 99 && SRef.PrecioCosto == 0 && SRef.PrecioVenta[0] == 0 ) if ( como == NORMAL ) como = INTENSO; else como = NORMAL; 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 ); } /**************************************************************************\ |* *| |* MuestraAyudaRef *| |* *| |* Descripci¢n: *| |* Muestra una peque¤a descripcion del contenido para el campo *| |* *| |* Entradas: *| |* columna campo ha mostar su ayuda *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void MuestraAyudaRef( char columna ) { char buffer1[80]; switch( columna ) { // Codigo Real case 0: sprintf ( buffer1, "Introduzca el codigo que desea asignar al producto" ); break; // Nombre del producto case 1: sprintf ( buffer1, "Nombre para el producto" ); break; // Cantidad por unidad case 2: sprintf ( buffer1, "Unidades que trae cada producto, al adquirirlo" ); break; // Precio de costo case 3: sprintf ( buffer1, "Precio de costo por unidad ( la que sera vendida )" ); break; // Precio V. P. case 4: sprintf ( buffer1, "Precio de venta por unidad ( la que sera vendida )" ); break; // IVA Asociado case 5: sprintf ( buffer1, "I.V.A Asociado al proucto" ); break; // Stock actual del producto case 6: sprintf ( buffer1, "Stock actual de ese producto" ); break; // Codigos asociados case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: sprintf ( buffer1, "Codigo asociado ( para los combinados )" ); break; // Precios de venta segun horarios. case 17: case 18: case 19: case 20: sprintf ( buffer1, "Precios especiales por horario." ); break; } // Ayuda reducida setfillstyle( SOLID_FILL, EGA_BLACK ); bar( 7, 457, 498, 473 ); // Imprime la ayudita setcolor( EGA_WHITE ); outtextxy( 7, 457, buffer1 ); } /**************************************************************************\ |* *| |* EditItemRef *| |* *| |* 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 EditItemRef( char columna, int linea ) { char buffer[80]; char old; int X0, Y0, X1, Y1; ObtenCoordenadasRef( columna, linea, &X0, &Y0, &X1, &Y1 ); switch( columna ) { // Codigo Real case 0: sprintf ( buffer, "%lu", SRef.CodigoR ); if ( !( InputCadenaG( buffer, 1, 9, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SRef.CodigoR = atol( buffer ); break; // Nombre del producto case 1: strcpy ( buffer, SRef.Descripcion ); if ( !( InputCadenaG( buffer, 0, 30, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SRef.Descripcion, buffer ); break; // Cantidad por unidad case 2: sprintf ( buffer, "%u", SRef.CantUnitaria ); if ( !( InputCadenaG( buffer, 1, 4, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SRef.CantUnitaria = atoi( buffer ); break; // Precio de costo case 3: sprintf ( buffer, "%ld", SRef.PrecioCosto ); if ( !( InputCadenaG( buffer, 1, 5, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SRef.PrecioCosto = atol( buffer ); break; // Precio V. P. case 4: sprintf ( buffer, "%ld", SRef.PrecioVenta[0] ); if ( !( InputCadenaG( buffer, 1, 5, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { SRef.PrecioVenta[0] = atol( buffer ); SRef.PrecioVenta[1] = SRef.PrecioVenta[0]; SRef.PrecioVenta[2] = SRef.PrecioVenta[0]; SRef.PrecioVenta[3] = SRef.PrecioVenta[0]; SRef.PrecioVenta[4] = SRef.PrecioVenta[0]; MuestraRef( 16, 0, NORMAL ); MuestraRef( 17, 0, NORMAL ); MuestraRef( 18, 0, NORMAL ); MuestraRef( 19, 0, NORMAL ); } break; // þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ // IVA Asociado case 5: old = SRef.Categoria; sprintf ( buffer, "%d", (int)SRef.Categoria ); if ( !( InputCadenaG( buffer, 1, 2, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { SRef.Categoria = (int)atoi( buffer ); if ( SRef.Categoria == 99 || ( old == 99 && SRef.Categoria != 99 ) ) for ( columna = 0; columna <= 6; columna++ ) MuestraRef( columna, linea, NORMAL ); } break; // Stock actual del producto case 6: sprintf ( buffer, "%ld", SRef.Stock ); if ( !( InputCadenaG( buffer, 1, 6, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SRef.Stock = atol( buffer ); break; // Codigos asociados case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: sprintf ( buffer, "%lu", SRef.CodigosAsociados[columna-7] ); if ( !( InputCadenaG( buffer, 1, 9, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SRef.CodigosAsociados[columna-7] = atol( buffer ); // Buscamos por todos los codigos asiciados para ver si alguno // es distinto de cero, con lo que se activaria el combinado.. SRef.Combinado = 0; for ( columna = 0; columna < 10; columna++ ) if ( SRef.CodigosAsociados[columna] != 0 ) { SRef.Combinado = 1; break; } break; // Precios de venta segun horarios. case 17: case 18: case 19: case 20: sprintf ( buffer, "%lu", SRef.PrecioVenta[columna-17 + 1 ] ); if ( !( InputCadenaG( buffer, 1, 5, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SRef.PrecioVenta[columna-17 + 1 ] = atol( buffer ); break; } } /**************************************************************************\ |* *| |* ObtenCoordenadasRef *| |* *| |* 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 ObtenCoordenadasRef( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 ) { // Calculamos la Y0, Y1 para la linea dada ( SOLO columna < 6 ) *Y0 = 164 + 19*linea; *Y1 = *Y0 + 17; switch( columna ) { // C¢digo case 0: // *X0 = 7; *X1 = 98; *X0 = 7; *X1 = 95; break; // Nombre Articulo case 1: // *X0 = 107; *X1 = 358; *X0 = 104; *X1 = 355; break; // UNDs case 2: // *X0 = 367; *X1 = 403; *X0 = 364; *X1 = 403; break; // P.C. case 3: *X0 = 412; *X1 = 466; break; // P.V.P. case 4: *X0 = 476; *X1 = 529; break; // IVA Asociado case 5: *X0 = 538; *X1 = 563; break; // Stock Actual case 6: *X0 = 572; *X1 = 633; break; // Codigos asociados case 7: case 8: case 9: case 10: case 11: *X0 = 37; *Y0 = 11 + 22*(columna-7); *X1 = 128; *Y1 = *Y0 + 20; break; case 12: case 13: case 14: case 15: case 16: *X0 = 137; *Y0 = 11 + 22*(columna-12); *X1 = 228; *Y1 = *Y0 + 20; break; // Hora 2 case 17: *X0 = 301; *Y0 = 13; *X1 = 359; *Y1 = 27; break; // Hora 3 case 18: *X0 = 301; *Y0 = 38; *X1 = 359; *Y1 = 52; break; // Hora 4 case 19: *X0 = 301; *Y0 = 63; *X1 = 359; *Y1 = 77; break; // Hora 5 case 20: *X0 = 301; *Y0 = 88; *X1 = 359; *Y1 = 102; break; } *X0 += 2; *X1 -= 2; } /**************************************************************************\ |* *| |* RefNuevoRegistro *| |* *| |* Descripci¢n: *| |* Limpia el buffer, para un nuevo registro. *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void RefNuevoRegistro( INFO_PRODUCTOS *NSRef ) { int i; NSRef -> Categoria = 0; // Otros, Refresco, Tapas, Barriles... NSRef -> CodigoR = 0; // Codigo real del producto NSRef -> CodigoB = 0; // Codigo de barras asociado al producto NSRef -> Descripcion[0] = '\0'; // Nombre del Producto NSRef -> CantUnitaria = 1; // # de productos por unidad NSRef -> PrecioCosto = 0; // Precio de costo for ( i=0; i< 5; i++ ) // P.V.P seg£n horas definidas por el usuario... NSRef -> PrecioVenta[i] = 0; NSRef -> Stock = 0; // # de productos actualmente // Codigos asociados a este producto ( COMBINADOS ) for ( i=0; i<10; i++ ) NSRef -> CodigosAsociados[i] = 0; NSRef -> Combinado = 0; } // ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß // Û Parte secundaria del m¢dulo Û // Û Û // Û Secci¢n de Busqueda de refecencias Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ /**************************************************************************\ |* *| |* BuscaRef *| |* *| |* 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) *| |* *| \**************************************************************************/ int BuscaRef( char TipoBusqueda, char *CurrRow, long *CurrRef ) { static INFO_PRODUCTOS MRef; char enc; long i; switch ( TipoBusqueda ) { case NUEVA_BUSQUEDA: if ( ObtenMatchRef( &MRef ) != OK ) return ERROR; i = 0; break; case ATRAS: case ADELANTE: i = ( *CurrRow + *CurrRef ) + TipoBusqueda; break; } Optar( ENCUADRE, "Comando: Buscar", "Ahora se inica", "la busqueda elegida", NULL ); enc = 0; while ( i < BRef.Registros() && !enc ) { if ( BRef.LeeReg( (void *)&SRef, i ) == ERROR ) Error( 1, BRef.cError); if ( Match_Ref( SRef, MRef ) ) enc = 1; else i++; } Optar( ENCUADRE, NULL ); if ( enc ) { *CurrRow = 0; *CurrRef = i; /* // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosRef( *CurrRow + *CurrRef ); if ( BRef.LeeReg( (void *)&SRef, *CurrRef ) == ERROR ) Error( 1, BRef.cError); MuestraDatosVRef( *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 ( BRef.LeeReg( (void *)&SRef, (*CurrRow + *CurrRef) ) == ERROR ) Error( 1, BRef.cError); */ return ( enc ? OK : ERROR ); } /**************************************************************************\ |* *| |* Match_Ref *| |* *| |* Descripci¢n: *| |* Compara dos registros y devuelve la posible coincidencia *| |* *| |* Entradas: *| |* Registros a comparar *| |* *| |* Salidas: *| |* Resultado de la comparaci¢n *| |* *| \**************************************************************************/ int Match_Ref( INFO_PRODUCTOS A, INFO_PRODUCTOS B ) { if ( B.CodigoR != 0 ) return (A.CodigoR == B.CodigoR); if ( B.CodigoB != 0 ) return (A.CodigoB == B.CodigoB); if ( B.Descripcion[0] != '\0' ) return ( strncmpi( A.Descripcion, B.Descripcion, strlen( B.Descripcion ) ) == 0 ); if ( B.PrecioCosto != 0 ) return (B.PrecioCosto == A.PrecioCosto); if ( B.PrecioVenta[0] != 0 ) return (B.PrecioVenta[0] == A.PrecioVenta[0]); if ( B.Combinado != 0 ) return ( A.Combinado ); return 0; } /**************************************************************************\ |* *| |* ObtenMatchRef *| |* *| |* 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 ObtenMatchRef( INFO_PRODUCTOS *MRef ) { char Row, ok, i; int BPush, key, DEV; struct textsettingstype texttypeinfo; gettextsettings( &texttypeinfo ); Optar( ENCUADRE, "Comando: Buscar", NULL ); Imprime_Estaticos( 21, "systm\\tpv.img" ); ok = 0; Row = 0; RefNuevoRegistro( MRef ); do { MatchDrawRef(Row, *MRef, INTENSO); BPush = Comprueba_Secuencia( SEC_OPTAR, NULL ); MatchDrawRef(Row, *MRef, 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 ); EditMatchRef( Row, MRef ); for ( i=0; i < 6; i++ ) MatchDrawRef(i, *MRef, NORMAL); break; case -1: switch ( getch() ) { // Flecha Izquierda case 75: case 15: // Flecha Arriba case 72: Row--; if ( Row < 0 ) Row = 5; break; // Flecha Derecha case 77: case 9: // Flecha Abajo case 80: Row++; if ( Row > 5 ) 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; } /**************************************************************************\ |* *| |* EditMatchRef *| |* *| |* Descripci¢n: *| |* Edita el patron de busqueda *| |* *| |* Entradas: *| |* Campo a editar, y lugar donde almacenarlo *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void EditMatchRef( char Row, INFO_PRODUCTOS * MRef ) { int X0, Y0, X1, Y1; char buffer[80]; ObtenCoordenadasMatch( Row, &X0, &Y0, &X1, &Y1 ); switch( Row ) { case 0: sprintf( buffer, "%lu", MRef -> CodigoR ); if ( !( InputCadenaG( buffer, 1, 9, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { RefNuevoRegistro( MRef ); MRef -> CodigoR = atol(buffer); } break; case 1: sprintf( buffer, "%lu", MRef -> CodigoB ); if ( !( InputCadenaG( buffer, 1, 9, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { RefNuevoRegistro( MRef ); MRef -> CodigoB = atol(buffer); } break; case 2: strcpy( buffer, MRef -> Descripcion ); if ( !( InputCadenaG( buffer, 0, 25, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { RefNuevoRegistro( MRef ); strcpy ( MRef -> Descripcion, buffer ); } break; case 3: sprintf ( buffer, "%ld", MRef -> PrecioCosto); if ( !( InputCadenaG( buffer, 1, 5, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { RefNuevoRegistro( MRef ); MRef -> PrecioCosto = atol(buffer); } break; case 4: sprintf ( buffer, "%lu", MRef -> PrecioVenta[0] ); if ( !( InputCadenaG( buffer, 1, 5, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { RefNuevoRegistro( MRef ); MRef -> PrecioCosto = atol(buffer); } break; case 5: MRef -> Combinado = !(MRef -> Combinado); break; } } /**************************************************************************\ |* *| |* MatchDrawRef *| |* *| |* 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 MatchDrawRef( char Row, INFO_PRODUCTOS MRef, char como ) { int X0, Y0, X1, Y1; char buffer[80], buffer1[80]; ObtenCoordenadasMatch( Row, &X0, &Y0, &X1, &Y1 ); switch( Row ) { case 0: sprintf( buffer, " %9lu", MRef.CodigoR ); break; case 1: sprintf( buffer, " %9lu", MRef.CodigoB ); break; case 2: strncpy( buffer, MRef.Descripcion, 25 ); buffer[26] = '\0'; break; case 3: formatea_u_long( (unsigned long)MRef.PrecioCosto, buffer1 ); sprintf ( buffer, "%6s", buffer1 ); break; case 4: formatea_u_long( (unsigned long)MRef.PrecioVenta[0], buffer1 ); sprintf ( buffer, "%6s", buffer1 ); break; case 5: sprintf( buffer, "%s", MRef.Combinado ? "ÛÛÛ" : "" ); 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 ); } /**************************************************************************\ |* *| |* MatchDrawRef *| |* *| |* Descripci¢n: *| |* Obtiene las coordenadas relativas al campo dado. *| |* *| |* Entradas: *| |* Campo a obtener las coordenadas, y coordenadas de salida *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ObtenCoordenadasMatch( char Row, int *X0, int *Y0, int *X1, int *Y1 ) { switch( Row ) { case 0: *X0 = 260; *X1 = 360; *Y0 = 200; *Y1 = 220; break; case 1: *X0 = 365; *X1 = 465; *Y0 = 200; *Y1 = 220; break; case 2: *X0 = 260; *X1 = 465; *Y0 = 225; *Y1 = 245; break; case 3: *X0 = 235; *X1 = 315; *Y0 = 250; *Y1 = 275; 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 Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ /**************************************************************************\ |* *| |* MuestraImpresionesRed *| |* *| |* Descripci¢n: *| |* Muestra un cuadro con las distintas opciones de impresi¢n *| |* *| |* Entradas:(ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void MuestraImpresionesRed(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 ); ImprimeReferencias( dev ); } } /**************************************************************************\ |* *| |* ImprimeReferencias *| |* *| |* Descripci¢n: *| |* Imprime todas las referencias seg£n se le indique *| |* *| |* Entradas: *| |* Como imprimir las referencias *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ImprimeReferencias( char como ) { long i, old_reg; char buffer[80]; int j; FILE *file_out; old_reg = BRef.RegActual(); if ( !Config.Impresora.Printer ) { if ( ( file_out = fopen( Config.Impresora.PrintTo, "w" ) ) == NULL ) return; } else file_out = stdprn; ImprimeCabeceraRef( como, file_out ); for ( i=0; i