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

831 lines
29 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 <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_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 area 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 Û
// ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ