#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_PROVcmp 7 #define NORMAL 0 #define BARRAS 1 extern BDatos BCmp; // Base de datos de Compras extern COMPRAS SCmp; // Estructura de referencias /* BDatos BVentProv; // Compras por proveedor CMP_PROV SVentProv; // Ventas de proveedores */ // Dia y mes actual para la gestion extern char DiaActual, MesActual; extern long RegCompras[31 + 2];// Indice para cado uno de los dias del mes + 2 extern char EmpresaActual[9]; // Empresa a la que se le realizan las gestiones extern char AjusteCalendario; // Ajuste para los dias del calendario extern char DiasMes; // Dias que tiene el mes actual extern BDatos BRef; // Base de datos de Referencias extern INFO_PRODUCTOS SRef; // Estructura de referencias // Para guardar las posiciones de los c¢digos extern BUSQUEDA_REF far *BusquedaRef; extern BDatos BProv; // Base de datos de Proveedores extern INFO_PROVEEDORES SProv; // Estructura de Proveedores extern char BusquedaDirecta; // Tipo de busqueda en Referencias /*************************************\ | | | Parte Principal del M¢dulo | | | \*************************************/ void GraficaComprasMeses( void ); void MuestraDatosICmpCmp( int como ); void MuestraDatosICmp( long RowStart ); void MuestraAyudaICmp ( char columna ); void MuestraMesActual( char MesMostrar ); extern long PosicionDia( char Dia ); extern void SeleccionaMesCompras( int NivelAcceso ); void MuestraICmp( char columna, long linea, char como ); void ObtenCoordenadasICmp( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 ); /*************************************\ | | | Parte Cuarta del M¢dulo | | | | Secci¢n para cargar los elementos | | | \*************************************/ extern int CargaProductos( void ); extern void CargaProveedores( void ); /* void ActualizaProv( long CodigoProv ); */ extern int MatchProveedor( long NProveedor ); extern int MatchRef( unsigned long Codigo, char NormalBarras ); /*************************************\ | | | Parte Quinta del M¢dulo | | | | Utilidades para el calendario | | | \*************************************/ /*************************************\ | | | Parte Sexta del M¢dulo | | | | Edicion a‚rea de los proveedores | | | \*************************************/ /*************************************\ | | | Parte Setima del M¢dulo | | | | Despliegue de los proveedores | | | \*************************************/ // ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß // Û Parte principal del m¢dulo Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ /**************************************************************************\ |* *| |* InformeCompras *| |* *| |* Descripci¢n: *| |* Informa sobre las compras realizadas a un proveedor concreto*| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void InformeCompras( void ) { char ok, swap; int BPush; 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 // Actualizasmos el mes y dia actual en curso DiaActual = FechaGestionActual.da_day; MesActual = FechaGestionActual.da_mon; // Rellenamos la pantalla con un fondo atractivo... setfillstyle( Config.FillBgS, Config.FillBgC ); bar( 0, 0, 640, 480 ); Imprime_Estaticos( 80, "systm\\Tpv.img"); // Imprime botones estaticos 'Seccion 40' // Inicializa el tratamiento de proveedores para las compras CargaProveedores(); if ( BProv.Registros() == 0 ) { Optar( 0, "Informe Ventas", "Atenci¢n no hay registro", "de proveedores activos...", "Imposible generar informe!!!", NULL ); BProv.CerrarReg(); return; } // Inicializa un indice r pido para encontrar a los productos por su c¢digo if ( CargaProductos() != OK ) { Optar( 0, "Error de Gestion", "No se pueden realizar compras", "sin que existan productos", "que puedan ser comprados", NULL ); farfree( BusquedaRef ); BRef.CerrarReg(); BProv.CerrarReg(); return; } // Abre el archivo coreccto y se posiciona en el dia // actual de gestion... SeleccionaMesCompras( NINGUNO ); CurrProv = CurrRow = 0; // PosicionDia( DiaActual // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosICmp( CurrProv ); // Leemos el registro sobre el que estamos posicionados if ( BProv.LeeReg( (void *)&SProv, CurrRow + CurrProv ) == ERROR ) Error(0x01, BProv.cError ); GraficaComprasMeses(); MuestraDatosICmpCmp( NUEVA_BUSQUEDA ); // Mostramos el mes Actual MuestraMesActual( MesActual ); CurrCol = 0; swap = 0; ok = 0; do { if ( CurrCol != oldCol ) { oldCol = CurrCol; MuestraAyudaICmp ( CurrCol ); } MuestraICmp( CurrCol, CurrRow, INTENSO ); BPush = Comprueba_Secuencia( 2, NULL ); MuestraICmp( 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: // Solo se permite acceder a Todo cuando el Codigo es 0 CurrCol++; if ( CurrCol > 4 ) CurrCol = 0; break; // Flecha Arriba case 72: if ( !swap ) { if ( (CurrRow + CurrProv) > 0 ) { if ( ( CurrRow ) <= 0 ) { CurrRow = NLINEAS_PROVcmp - 1; CurrProv -= NLINEAS_PROVcmp; 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 MuestraDatosICmp( CurrProv ); } else { CurrRow --; if ( CurrRow < 0 ) CurrRow = 0; } if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow ) ) == ERROR ) Error(0x01, BProv.cError ); GraficaComprasMeses(); MuestraDatosICmpCmp( NUEVA_BUSQUEDA ); } } else { MuestraDatosICmpCmp( NUEVA_BUSQUEDA ); } break; // Flecha Abajo case 80: if ( !swap ) { if ( ( CurrRow + CurrProv ) < ( BProv.Registros() - 1 ) ) { if ( ( CurrRow ) >= NLINEAS_PROVcmp - 1 ) { CurrRow = 0; CurrProv += NLINEAS_PROVcmp; while ( (CurrProv + CurrRow) >= BProv.Registros() ) CurrProv--; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosICmp( CurrProv ); } else CurrRow++; } if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow ) ) == ERROR ) Error(0x01, BProv.cError ); GraficaComprasMeses(); MuestraDatosICmpCmp( NUEVA_BUSQUEDA ); } else { MuestraDatosICmpCmp( ADELANTE ); } break; // Inicio case 71: if ( !swap ) { CurrRow = 0; if ( CurrProv != 0 ) { CurrProv = 0; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosICmp( CurrProv ); } if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow ) ) == ERROR ) Error(0x01, BProv.cError ); GraficaComprasMeses(); MuestraDatosICmpCmp( NUEVA_BUSQUEDA ); } break; // Fin case 79: if ( !swap ) { CurrRow = 0; if ( CurrProv != BProv.Registros() - NLINEAS_PROVcmp ) { CurrProv = BProv.Registros() - NLINEAS_PROVcmp; if ( CurrProv < 0 ) { CurrProv = 0; CurrRow = BProv.Registros()-1; } // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosICmp( CurrProv ); } if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow ) ) == ERROR ) Error(0x01, BProv.cError ); GraficaComprasMeses(); MuestraDatosICmpCmp( NUEVA_BUSQUEDA ); } break; } break; // Imprimir Compras case 1: break; // Menu Principal case 2: ok = 1; break; #ifndef DEMOSTRACION // Mes Anterior case 3: MesActual --; if ( MesActual < 1 ) MesActual = 1; // Abre el archivo coreccto y se posiciona en el dia // actual de gestion... SeleccionaMesCompras( NINGUNO ); // Mostramos el mes Actual MuestraMesActual( MesActual ); CurrProv = CurrRow = 0; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosICmp( CurrProv ); // Leemos el registro sobre el que estamos posicionados if ( BProv.LeeReg( (void *)&SProv, CurrRow + CurrProv ) == ERROR ) Error(0x01, BProv.cError ); GraficaComprasMeses(); MuestraDatosICmpCmp( NUEVA_BUSQUEDA ); break; // Mes Siguiente case 4: MesActual ++; if ( MesActual > 12 ) MesActual = 12; // Abre el archivo coreccto y se posiciona en el dia // actual de gestion... SeleccionaMesCompras( NINGUNO ); // Mostramos el mes Actual MuestraMesActual( MesActual ); CurrProv = CurrRow = 0; // PosicionDia( DiaActual // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosICmp( CurrProv ); // Leemos el registro sobre el que estamos posicionados if ( BProv.LeeReg( (void *)&SProv, CurrRow + CurrProv ) == ERROR ) Error(0x01, BProv.cError ); GraficaComprasMeses(); MuestraDatosICmpCmp( NUEVA_BUSQUEDA ); break; #else case 3: case 4: Optar( 0, "VERSION DEMOSTRACION", "En esta versi¢n no se", "permite cambiar de mes...", NULL ); break; #endif // Retroceso R pido case 5: break; // P gina principal de la compra case 6: MuestraDatosICmpCmp( NUEVA_BUSQUEDA ); break; // Cambiar el mes a observar case 7: break; // Siguiente p guina de compras case 8: MuestraDatosICmpCmp( ADELANTE ); break; // AvanceR pido case 9: break; default: break; } } while( !ok ); farfree( BusquedaRef ); BCmp.CerrarReg(); BRef.CerrarReg(); BProv.CerrarReg(); } /**************************************************************************\ |* *| |* MuestraMesActual *| |* *| |* Descripci¢n: *| |* Muestra en pantalla el mes que se le pasa como par metro *| |* *| |* Entradas: Mes a mostrar *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void MuestraMesActual( char MesMostrar ) { char Mes[12][15] = { "Enero" , "Febrero", "Marzo" , "Abril" , "Mayo" , "Junio" , "Julio" , "Agosto" , "Septiembre", "Octubre", "Noviembre", "Diciembre" }; int Centrado; setfillstyle( SOLID_FILL, EGA_LIGHTGRAY ); bar( 483, 103, 552, 122 ); settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); Centrado = ( 69 - textwidth( Mes[ MesMostrar - 1 ] ) ) / 2; TextoDoble( 483 + Centrado, 104, Mes[ MesMostrar - 1 ] ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); } /**************************************************************************\ |* *| |* 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 GraficaComprasMeses( 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" }; int i; long TMPbuff[12]; for ( i = 0; i < 12; i++ ) TMPbuff[i] = SProv.Compras[i][0]; MuestraGraficas( 10, 15, 380, 95, 12, (long *)TMPbuff, Mensajes ); } /**************************************************************************\ |* *| |* MuestraDatosICmp *| |* *| |* 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 MuestraDatosICmp( long RowStart ) { int linea, campo; char dev; int X0, Y0, X1, Y1; // Imprimo la NLINEAS_PROVcmp que caben en la pantalla dev = OK; for ( linea=0; linea < NLINEAS_PROVcmp && dev == OK && (linea + RowStart) < BProv.Registros(); linea++ ) { dev = BProv.LeeReg( (void *)&SProv, RowStart + linea ); if ( dev == OK ) { // Por cada linea hay 5 campos, ehhh!!! for ( campo=0; campo < 5; campo++ ) MuestraICmp( campo, linea, NORMAL ); } } // Ahora limpio los restantes huecos si los hay if ( linea < NLINEAS_PROVcmp ) { setfillstyle( SOLID_FILL, Config.TxtBgN ); for ( ; linea < NLINEAS_PROVcmp; linea++ ) for ( campo=0; campo < 5; campo++ ) { ObtenCoordenadasICmp( campo, linea, &X0, &Y0, &X1, &Y1 ); bar( X0, Y0, X1, Y1 ); } } } void MuestraDatosICmpCmp( int como ) { static long linea; int campo, Row; char dev, dia; int X0, Y0, X1, Y1; switch( como ) { case NUEVA_BUSQUEDA: linea = 0; break; default: if ( linea >= BCmp.Registros() ) return ; break; } // Imprimo la NLINEAS_PROVcmp que caben en la pantalla dev = OK; for ( Row=0; Row < NLINEAS_PROVcmp && dev == OK && linea < BCmp.Registros(); Row++ ) { do { dev = BCmp.LeeReg( (void *)&SCmp, linea ); linea++; } while( dev == OK && ( SProv.CodigoR != SCmp.CodigoProveedor || ( SProv.CodigoR == SCmp.CodigoProveedor && SCmp.PrecioCosto <= 0 ) ) ); if ( dev == OK ) { for ( dia = 1; dia < 31; dia++ ) if ( linea >= PosicionDia( dia ) && linea < PosicionDia( dia + 1 ) ) { DiaActual = dia /*- 1*/; break; } // Por cada linea hay 5 campos, ehhh!!! for ( campo=5; campo < 10; campo++ ) MuestraICmp( campo, Row, NORMAL ); } else { Row--; } } // Ahora limpio los restantes huecos si los hay if ( Row < NLINEAS_PROVcmp ) { setfillstyle( SOLID_FILL, Config.TxtBgN ); for ( ; Row < NLINEAS_PROVcmp; Row++ ) for ( campo=5; campo < 10; campo++ ) { ObtenCoordenadasICmp( campo, Row, &X0, &Y0, &X1, &Y1 ); bar( X0, Y0, X1, Y1 ); } } } /**************************************************************************\ |* *| |* MuestraICmp *| |* *| |* 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 MuestraICmp( char columna, long linea, char como ) { char buffer[80]; char buffer1[80], i; unsigned long TotalCompras; int X0, Y0, X1, Y1; TotalCompras = 0; for ( i = 0; i < 12; i++ ) TotalCompras += SProv.Compras[i][0]; ObtenCoordenadasICmp( columna, linea, &X0, &Y0, &X1, &Y1 ); switch( columna ) { // Parte 1 ( visualizaci¢n de proveedores y compras a ellos ) // Codigo Real del Proveedor case 0: sprintf ( buffer, "%08lu", SProv.CodigoR ); break; // Actividad del proveedor case 1: sprintf ( buffer, "%30s", SProv.ActividadProveedor ); break; // % que supone esa compra, en todo el a¤o case 2: sprintf ( buffer, " %03d", TotalCompras != 0 ? ( SProv.Compras[MesActual][0]*100 ) / TotalCompras : 0 ); break; // Compras en ese mes case 3: formatea_long( SProv.Compras[MesActual][0], buffer1 ); sprintf ( buffer, "%11s", buffer1 ); break; // Compras en total case 4: formatea_long( TotalCompras, buffer1 ); sprintf ( buffer, "%11s", buffer1 ); break; // Parte 2 ( visualizacion de compras especificas por proveedor ) // Fecha de venta case 5: sprintf ( buffer, "%02d-%02d-%04d", DiaActual, MesActual, FechaGestionActual.da_year ); break; // Codigo del producto case 6: sprintf ( buffer, " %09lu", SCmp.CodigoR ); break; // Descripcion del producto case 7: sprintf ( buffer, "%30s", SCmp.Descripcion[0] == '\0' ? "Compras Varias" : SCmp.Descripcion ); break; // Cantidad de producto case 8: formatea_long( SCmp.Cantidad, buffer1 ); sprintf ( buffer, "%9s", buffer1 ); break; // Costo del producto case 9: formatea_long( /*SCmp.Cantidad **/ SCmp.PrecioCosto , buffer1 ); sprintf ( buffer, "%11s", buffer1 ); break; } setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI ); bar( X0, Y0, X1, Y1 ); setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI ); if ( columna == 5 || columna == 6 ) { Y0 += 2; settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); } if ( SCmp.PrecioCosto !=0 || columna < 5 ) outtextxy( X0+2, Y0, buffer ); else if ( columna == 7 ) { sprintf ( buffer, " Dia %02d", DiaActual ); outtextxy( X0+2, Y0, buffer ); } if ( columna == 5 || columna == 6 ) settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); } /**************************************************************************\ |* *| |* MuestraAyudaICmp *| |* *| |* Descripci¢n: *| |* Muestra una peque¤a descripcion del contenido para el campo *| |* *| |* Entradas: *| |* columna campo ha mostar su ayuda *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void MuestraAyudaICmp ( char columna ) { char buffer1[80]; switch( columna ) { // Parte 1 // Codigo Real del producto case 0: sprintf ( buffer1, "Codigo del Proveedor" ); break; // Actividad del proveedor case 1: sprintf ( buffer1, "Acticidad del proveedor" ); break; // % de venta en el mes case 2: sprintf ( buffer1, "Procentaje que supone la compra frente al a¤o" ); break; // Venta del mes seleccionado case 3: sprintf ( buffer1, "Compras que se le realizaron en el mes" ); break; // Total Ventas case 4: sprintf ( buffer1, "Compras que le hemos realizado en todo el a¤o" ); break; // Parte 2 // Fecha de compra case 5: sprintf ( buffer1, "Fecha de la compra" ); break; // C¢digo del producto case 6: sprintf ( buffer1, "C¢digo del producto" ); break; // Nombre del producto case 7: sprintf ( buffer1, "Nombre del producto" ); break; // Cantidad vendidaa case 8: sprintf ( buffer1, "Cantidad Vendida" ); break; // Costo total del producto case 9: sprintf ( buffer1, "Costo total del producto" ); break; } // Ayuda reducida setfillstyle( SOLID_FILL, EGA_BLACK ); bar( 7, 457, 498, 473 ); // Imprime la ayudita setcolor( EGA_WHITE ); outtextxy( 7, 457, buffer1 ); } /**************************************************************************\ |* *| |* ObtenCoordenadasICmp *| |* *| |* 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 ObtenCoordenadasICmp( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 ) { // Calculamos la Y0, Y1 para la linea dada ( SOLO columna < 6 ) *Y0 = ( columna < 5 ) ? ( 164 + 18*linea ) : ( 337 + 15*linea ); *Y1 = *Y0 + 17; switch( columna ) { case 0: *X0 = 7; *X1 = 78; break; case 1: *X0 = 87; *X1 = 338; break; case 2: *X0 = 347; *X1 = 413; break; case 3: *X0 = 422; *X1 = 523; break; case 4: *X0 = 532; *X1 = 633; break; case 5: *X0 = 7; *X1 = 78; break; case 6: *X0 = 87; *X1 = 154; break; case 7: *X0 = 162; *X1 = 413; break; case 8: *X0 = 422; *X1 = 503; break; case 9: *X0 = 512; *X1 = 633; break; } *X0 += 2; *X1 -= 2; } // ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß // Û Parte secundaria del m¢dulo Û // Û Û // Û Secci¢n de Busqueda de refecencias Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ // ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß // Û Parte terciaria del m¢dulo Û // Û Û // Û Secci¢n de Impresion de compras Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ