#include #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_IVENT 15 extern BDatos B_IVentas2; // Archivo de Ventas 2 de 3 ( Productos Vendidos ) extern INFORME2_VENTAS S_IVentas2; // Productos Vendidos ( 2 de 3 ) extern char DiaActual, MesActual; extern long RegCompras[31 + 2];// Indice para cado uno de los dias del mes + 2 extern char AjusteCalendario; // Ajuste para los dias del calendario extern char DiasMes; // Dias que tiene el mes actual // Empresa a la que se le realizan las gestiones extern char EmpresaActual[9]; /*************************************\ | | | Parte Principal del M¢dulo | | | \*************************************/ void MuestraComprasDias( void ); void MuestraAyudaIVentas( char columna ); void MuestraDatosIVentas( long RowStart ); void MuestraIVentas( char columna, int linea, char como ); extern void MuestraMesActual( char MesMostrar ); extern void ObtenCoordenadasRef2( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 ); /*************************************\ | | | Parte Secundaria del M¢dulo | | | | Secci¢n de Busqueda de Productos | | | \*************************************/ extern void ObtenCoordenadasMatch( char Row, int *X0, int *Y0, int *X1, int *Y1 ); void BuscaIVent( char TipoBusqueda, char *CurrRow, long *CurrIVent ); extern void MatchDrawRef( char Row, INFO_PRODUCTOS MRef, char como ); int MatchIVent( INFORME2_VENTAS A, INFORME2_VENTAS B ); extern void EditMatchRef( char Row, INFO_PRODUCTOS * MRef ); extern int ObtenMatchRef( INFO_PRODUCTOS *MRef ); /*************************************\ | | | Parte Tercera del M¢dulo | | | | Secci¢n para la impresi¢n | | | \*************************************/ void ImprimeVentasProductos(void); // ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß // Û Parte principal del m¢dulo Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ /**************************************************************************\ |* *| |* InfoVentaProductos *| |* *| |* Descripci¢n: *| |* Graficas sobre la venta de productos... *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void InfoVentaProductos(void) { char buffer[100], ok = 0; int BPush, OldMes; char oldCol = -1; char CurrRow; // Linea sobre la que estamos char CurrCol; // Columna sobre la que estamos long CurrIVent; // Producto sobre el que estamos posicionados a golpes // Actualizasmos el mes y dia actual en curso DiaActual = FechaGestionActual.da_day; MesActual = FechaGestionActual.da_mon; // Calculamos los dias que tiene el mes y el ajuste necesario CalculaAjusteDias( &AjusteCalendario, &DiasMes, MesActual, FechaGestionActual.da_year ); // Rellenamos la pantalla con un fondo atractivo... setfillstyle( Config.FillBgS, Config.FillBgC ); bar( 0, 0, 640, 480 ); Imprime_Estaticos( 24, "systm\\Tpv.img"); // Imprime botones estaticos 'Seccion 1' // Archivo de productos vendidos ( 2 de 3 ) sprintf( buffer, "datos\\%s\\VT2-%04d.M%02d", NEmpresa, FechaGestionActual.da_year, MesActual ); if ( access( buffer, 0 ) != 0 ) { MesActual = 0; // Buscamos un mes accesible hacia adelante do { // Avanzamos y comprobamos existencia del archivo MesActual++; // Archivo de productos vendidos ( 2 de 3 ) sprintf( buffer, "datos\\%s\\VT2-%04d.M%02d", NEmpresa, FechaGestionActual.da_year, MesActual ); if ( access( buffer, 0 ) == 0 ) { B_IVentas2.CerrarReg(); // Cerramos el antiguo y abrimos el nuevo if ( B_IVentas2.AbrirReg( buffer, sizeof( INFORME2_VENTAS ) ) == ERROR ) Error( 0x01, "Imposible abrir archivo, Ventas diarias 2 de 3" ); // Solo si contiene datos, sera v lido if ( B_IVentas2.Registros() > 0 ) { B_IVentas2.CerrarReg(); // Cerramos para una posterior apertura. break; } } } while( MesActual <= 12 ); } // Calculamos los dias que tiene el mes y el ajuste necesario CalculaAjusteDias( &AjusteCalendario, &DiasMes, MesActual, FechaGestionActual.da_year ); // Si no logramos situarnos en un mes posterior, REGRESAMOS!!! if ( MesActual > 12 ) { Optar( 0, "Atencion !!!", "No existen ventas", "por lo tanto, no hay", "nada que evaluar...", NULL ); B_IVentas2.CerrarReg(); return; } if ( B_IVentas2.AbrirReg( buffer, sizeof( INFORME2_VENTAS ) ) == ERROR ) Error( 0x01, "Imposible abrir archivo, Ventas diarias 2 de 3" ); // Si no hay registros, creamos uno almenos. if ( B_IVentas2.Registros() == 0 ) { Optar( 0, "Atencion !!!", "No existen ventas", "por lo tanto, no hay", "nada que evaluar...", NULL ); B_IVentas2.CerrarReg(); return; } CurrIVent = 0; CurrRow = 0; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosIVentas( CurrRow + CurrIVent ); if ( B_IVentas2.LeeReg( (void *)&S_IVentas2, 0 ) == ERROR ) Error( 1, B_IVentas2.cError); MuestraComprasDias(); // Mostramos el mes Actual MuestraMesActual( MesActual ); CurrCol = 0; do { if ( CurrCol != oldCol || CurrCol == 2 ) { oldCol = CurrCol; MuestraAyudaIVentas( CurrCol ); } MuestraIVentas( CurrCol, CurrRow, INTENSO ); BPush = Comprueba_Secuencia( 2, NULL ); MuestraIVentas( 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 while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER break; case -1: // Hay una tecla especial en BUFFER switch( getch() ) { // Flecha Izquierda case 75: case 15: CurrCol--; if ( CurrCol < 0 ) CurrCol = 4; break; // Flecha Derecha case 77: case 9: CurrCol++; if ( CurrCol > 4 ) CurrCol = 0; break; // Flecha Arriba case 72: if ( (CurrRow + CurrIVent) > 0 ) { if ( ( CurrRow ) <= 0 ) { CurrRow = NLINEAS_IVENT - 1; CurrIVent -= NLINEAS_IVENT; if ( CurrIVent < 0 ) CurrIVent = 0; while( ( CurrRow + CurrIVent ) >= B_IVentas2.Registros() && CurrRow > 0 ) CurrRow--; while( ( CurrRow + CurrIVent ) >= B_IVentas2.Registros() && CurrIVent > 0 ) CurrIVent++; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosIVentas( CurrIVent ); } else { CurrRow --; if ( CurrRow < 0 ) CurrRow = 0; } } if ( B_IVentas2.LeeReg( (void *)&S_IVentas2, (CurrIVent + CurrRow) ) == ERROR ) Error( 1, B_IVentas2.cError); MuestraComprasDias(); break; // Flecha Abajo case 80: if ( ( CurrRow + CurrIVent ) < B_IVentas2.Registros() - 1 ) { if ( ( CurrRow ) >= NLINEAS_IVENT - 1 ) { CurrRow = 0; CurrIVent += NLINEAS_IVENT; while ( (CurrIVent + CurrRow) >= B_IVentas2.Registros() ) CurrIVent--; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosIVentas( CurrIVent ); } else CurrRow++; } if ( B_IVentas2.LeeReg( (void *)&S_IVentas2, (CurrIVent + CurrRow) ) == ERROR ) Error( 1, B_IVentas2.cError); MuestraComprasDias(); break; // Inicio case 71: CurrRow = 0; if ( CurrIVent != 0 ) { CurrIVent = 0; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosIVentas( CurrIVent ); } if ( B_IVentas2.LeeReg( (void *)&S_IVentas2, (CurrIVent + CurrRow) ) == ERROR ) Error( 1, B_IVentas2.cError); MuestraComprasDias(); break; // Fin case 79: CurrRow = 0; if ( CurrIVent != B_IVentas2.Registros() - NLINEAS_IVENT ) { CurrIVent = B_IVentas2.Registros() - NLINEAS_IVENT; if ( CurrIVent < 0 ) { CurrIVent = 0; CurrRow = B_IVentas2.Registros()-1; } // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosIVentas( CurrIVent ); } if ( B_IVentas2.LeeReg( (void *)&S_IVentas2, (CurrIVent + CurrRow) ) == ERROR ) Error( 1, B_IVentas2.cError); MuestraComprasDias(); break; } break; // Imprimir Informe case 1: ImprimeVentasProductos(); break; // Menu Principal case 2: ok = 1; break; // MesAnterior case 3: OldMes = MesActual; CurrRow = CurrIVent = 0; // Buscamos un mes accesible hacia adelante do { // Avanzamos y comprobamos existencia del archivo MesActual--; // Archivo de productos vendidos ( 2 de 3 ) sprintf( buffer, "datos\\%s\\VT2-%04d.M%02d", NEmpresa, FechaGestionActual.da_year, MesActual ); if ( access( buffer, 0 ) == 0 ) { B_IVentas2.CerrarReg(); // Cerramos el antiguo y abrimos el nuevo if ( B_IVentas2.AbrirReg( buffer, sizeof( INFORME2_VENTAS ) ) == ERROR ) Error( 0x01, "Imposible abrir archivo, Ventas diarias 2 de 3" ); // Solo si contiene datos, sera v lido if ( B_IVentas2.Registros() > 0 ) break; } } while( MesActual >= 1 ); // Si no logramos situarnos en un mes posterior, REGRESAMOS!!! if ( MesActual < 1 ) { MesActual = OldMes; B_IVentas2.CerrarReg(); // Cerramos el antiguo y abrimos el nuevo sprintf( buffer, "datos\\%s\\VT2-%04d.M%02d", NEmpresa, FechaGestionActual.da_year, MesActual ); if ( B_IVentas2.AbrirReg( buffer, sizeof( INFORME2_VENTAS ) ) == ERROR ) Error( 0x01, "Imposible abrir archivo, Ventas diarias 2 de 3" ); Optar( 0, "Atencion !!!", "No existen ventas ese mes", "por lo tanto, no hay", "nada que evaluar...", NULL ); } // Calculamos los dias que tiene el mes y el ajuste necesario CalculaAjusteDias( &AjusteCalendario, &DiasMes, MesActual, FechaGestionActual.da_year ); MuestraDatosIVentas( CurrIVent ); if ( B_IVentas2.LeeReg( (void *)&S_IVentas2, (CurrIVent + CurrRow) ) == ERROR ) Error( 1, B_IVentas2.cError); MuestraComprasDias(); // Mostramos el mes Actual MuestraMesActual( MesActual ); break; // MesPosterior case 4: OldMes = MesActual; CurrRow = CurrIVent = 0; // Buscamos un mes accesible hacia adelante do { // Avanzamos y comprobamos existencia del archivo MesActual++; // Archivo de productos vendidos ( 2 de 3 ) sprintf( buffer, "datos\\%s\\VT2-%04d.M%02d", NEmpresa, FechaGestionActual.da_year, MesActual ); if ( access( buffer, 0 ) == 0 ) { B_IVentas2.CerrarReg(); // Cerramos el antiguo y abrimos el nuevo if ( B_IVentas2.AbrirReg( buffer, sizeof( INFORME2_VENTAS ) ) == ERROR ) Error( 0x01, "Imposible abrir archivo, Ventas diarias 2 de 3" ); // Solo si contiene datos, sera v lido if ( B_IVentas2.Registros() > 0 ) break; } } while( MesActual <= 12 ); // Si no logramos situarnos en un mes posterior, REGRESAMOS!!! if ( MesActual > 12 ) { MesActual = OldMes; B_IVentas2.CerrarReg(); // Cerramos el antiguo y abrimos el nuevo sprintf( buffer, "datos\\%s\\VT2-%04d.M%02d", NEmpresa, FechaGestionActual.da_year, MesActual ); if ( B_IVentas2.AbrirReg( buffer, sizeof( INFORME2_VENTAS ) ) == ERROR ) Error( 0x01, "Imposible abrir archivo, Ventas diarias 2 de 3" ); Optar( 0, "Atencion !!!", "No existen ventas ese mes", "por lo tanto, no hay", "nada que evaluar...", NULL ); } // Calculamos los dias que tiene el mes y el ajuste necesario CalculaAjusteDias( &AjusteCalendario, &DiasMes, MesActual, FechaGestionActual.da_year ); MuestraDatosIVentas( CurrIVent ); if ( B_IVentas2.LeeReg( (void *)&S_IVentas2, (CurrIVent + CurrRow) ) == ERROR ) Error( 1, B_IVentas2.cError); MuestraComprasDias(); // Mostramos el mes Actual MuestraMesActual( MesActual ); break; // Retroceso R pido case 5: #ifndef DEMOSTRACION CurrRow = NLINEAS_IVENT - 1; CurrIVent -= NLINEAS_IVENT; if ( CurrIVent < 0 ) CurrIVent = 0; while( ( CurrRow + CurrIVent ) >= B_IVentas2.Registros() && CurrRow > 0 ) CurrRow--; while( ( CurrRow + CurrIVent ) >= B_IVentas2.Registros() && CurrIVent > 0 ) CurrIVent++; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosIVentas( CurrIVent ); if ( B_IVentas2.LeeReg( (void *)&S_IVentas2, (CurrIVent + CurrRow) ) == ERROR ) Error( 1, B_IVentas2.cError); MuestraComprasDias(); #endif break; // Busqueda Atras case 6: // BuscaRef( ATRAS, &CurrRow, &CurrIVent ); break; // Buscar case 7: // BuscaRef( NUEVA_BUSQUEDA, &CurrRow, &CurrIVent ); break; // Busqueda Adelante case 8: // BuscaRef( ADELANTE, &CurrRow, &CurrIVent ); break; // AvanceR pido case 9: #ifndef DEMOSTRACION CurrRow = 0; CurrIVent += NLINEAS_IVENT; while ( (CurrIVent + CurrRow) >= B_IVentas2.Registros() ) CurrIVent--; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosIVentas( CurrIVent ); if ( B_IVentas2.LeeReg( (void *)&S_IVentas2, (CurrIVent + CurrRow) ) == ERROR ) Error( 1, B_IVentas2.cError); MuestraComprasDias(); #endif break; case 10: break; default: break; } } while( !ok ); B_IVentas2.CerrarReg(); } /**************************************************************************\ |* *| |* GraficasComprasMeses *| |* *| |* Descripci¢n: *| |* Muestra una grafica, donde se reflejan las compras realiz. *| |* a ese proveedor a lo largo del a¤o... *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void MuestraComprasDias(void) { char Mensajes[][12] = { "1", "2", "3", "4", "5", "6", "7", "8", "9","10", "11","12","13","14","15","16","17","18","19","20", "21","22","23","24","25","26","27","28","29","30", "31" }; MuestraGraficas( 10, 15, 380, 95, DiasMes, (long *)S_IVentas2.VentaTotal, Mensajes ); } /**************************************************************************\ |* *| |* MuestraDatosIVentas *| |* *| |* 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 MuestraDatosIVentas( long RowStart ) { int linea, campo; char dev; int X0, Y0, X1, Y1; // Imprimo la NLINEAS_IVENT que caben en la pantalla dev = OK; for ( linea=0; linea < NLINEAS_IVENT && dev == OK; linea++ ) { dev = B_IVentas2.LeeReg( (void *)&S_IVentas2, RowStart + linea ); if ( dev == OK ) // Por cada linea hay 5 campos, ehhh!!! for ( campo=0; campo < 5; campo++ ) MuestraIVentas( campo, linea, NORMAL ); } // Ahora limpio los restantes huecos si los hay if ( dev != OK ) { linea--; setfillstyle( SOLID_FILL, Config.TxtBgN ); for ( ; linea < NLINEAS_IVENT; linea++ ) for ( campo=0; campo < 5; campo++ ) { ObtenCoordenadasRef2( campo, linea, &X0, &Y0, &X1, &Y1 ); bar( X0, Y0, X1, Y1 ); } } } /**************************************************************************\ |* *| |* MuestraRef2 *| |* *| |* 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 MuestraIVentas( char columna, int linea, char como ) { char buffer[80], font, Dia; char buffer1[80], buffer2[80]; long UnidadesVentas, VentaTotal, PrecioCosto; int X0, Y0, X1, Y1; ObtenCoordenadasRef2( columna, linea, &X0, &Y0, &X1, &Y1 ); if ( S_IVentas2.CantUnitaria == 0 ) S_IVentas2.CantUnitaria = 1; UnidadesVentas = 0; VentaTotal = 0; PrecioCosto = 0; for ( Dia=0; Dia < DiasMes; Dia++ ) { VentaTotal += S_IVentas2.VentaTotal[Dia]; PrecioCosto += S_IVentas2.PrecioCosto[Dia]; for ( font = 0; font < 6; font++ ) UnidadesVentas += S_IVentas2.Cantidad[Dia][font]; } font = 1; switch( columna ) { // Codigo Real case 0: sprintf ( buffer, " %09lu", S_IVentas2.CodigoR ); break; // Nombre del producto case 1: sprintf ( buffer, "%30s", S_IVentas2.Nombre ); break; // Unidades Vendidas case 2: if ( S_IVentas2.CantUnitaria == 1 ) { formatea_long( (long)( UnidadesVentas ), buffer1 ); sprintf ( buffer, "%9s", buffer1 ); } else { formatea_long( (long)( UnidadesVentas / S_IVentas2.CantUnitaria ), buffer1 ); formatea_long( (long)( UnidadesVentas % S_IVentas2.CantUnitaria ), buffer2 ); sprintf ( buffer, "%6s %6s", buffer1, buffer2 ); font = 0; } break; // Valoracion de la venta case 3: formatea_long( (long)( VentaTotal/* PrecioCosto UnidadesVentas*/ ), buffer1 ); sprintf ( buffer, "%12s", buffer1 ); font = 0; break; // Beneficio de la venta case 4: formatea_long( (long)( ( VentaTotal - PrecioCosto ) ), buffer1 ); sprintf ( buffer, "%12s", buffer1 ); font = 0; break; } setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI ); bar( X0, Y0, X1, Y1 ); setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI ); if ( font == 0 ) settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); outtextxy( X0+2, Y0, buffer ); if ( font == 0 ) settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); } /**************************************************************************\ |* *| |* MuestraAyudaRef2 *| |* *| |* Descripci¢n: *| |* Muestra una peque¤a descripcion del contenido para el campo *| |* *| |* Entradas: *| |* columna campo ha mostar su ayuda *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void MuestraAyudaIVentas( char columna ) { char buffer1[80]; switch( columna ) { // Codigo Real case 0: sprintf ( buffer1, "C¢digo del Producto" ); break; // Nombre del producto case 1: sprintf ( buffer1, "Nombre del producto" ); break; // Stock Actual ( desglosado ) case 2: sprintf ( buffer1, "Unidades Vendidas ( 1 Caja = %d Unidades )", S_IVentas2.CantUnitaria ); break; // Valor aproximado case 3: sprintf ( buffer1, "Valor aproximado de la venta" ); break; // Beneficio Estimado case 4: sprintf ( buffer1, "Beneficio estimado de la venta" ); break; } // Ayuda reducida setfillstyle( SOLID_FILL, EGA_BLACK ); bar( 7, 457, 498, 473 ); // Imprime la ayudita setcolor( EGA_WHITE ); outtextxy( 7, 457, buffer1 ); } // ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß // Û Parte terciaria del m¢dulo Û // Û Û // Û Secci¢n de Impresi¢n Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ /**************************************************************************\ |* *| |* ImprimeVentaProductos *| |* *| |* Descripci¢n: *| |* Imprime el informe de venta de productos, como el que *| |* estamos visualizando, tambien imprime una gr fica de *| |* ventas *| |* *| |* Entradas: *| |* Como imprimir las referencias *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ImprimeVentasProductos(void) { /* long i, old_reg; char buffer[80]; char buffer1[80]; char buffer2[80]; 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; fprintf( file_out, "C¢digo Descripci¢n Stock Valoraci¢n Beneficio\n\r" ); for ( i=0; i