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

1487 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 <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_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<BRef.Registros(); i++ )
{
BRef.LeeReg( (void *)&SRef, i );
switch( como )
{
// Listado R pido
case 1:
formatea_u_long( (unsigned long)SRef.CantUnitaria, buffer );
fprintf( file_out, "%9lu %-30s %-6s ", SRef.CodigoR, SRef.Descripcion, buffer );
formatea_u_long( (unsigned long)SRef.PrecioCosto, buffer );
fprintf( file_out, "%-7s ", buffer );
formatea_u_long( (unsigned long)SRef.PrecioVenta[0], buffer );
fprintf( file_out, "%-7s %-10s\n\r", buffer, SRef.Combinado ? "Combinado" : " " );
break;
// Listado Completo
case 2:
formatea_u_long( (unsigned long)SRef.CantUnitaria, buffer );
fprintf( file_out, "%9lu %-30s %-6s ", SRef.CodigoR, SRef.Descripcion, buffer );
formatea_u_long( (unsigned long)SRef.PrecioCosto, buffer );
fprintf( file_out, "%-7s ", buffer );
formatea_u_long( (unsigned long)SRef.PrecioVenta[0], buffer );
fprintf( file_out, "%-7s %-10s\n\r", buffer, SRef.Combinado ? "Combinado" : " " );
if ( SRef.Combinado )
{
for ( j=0; j<10; j++ )
if ( SRef.CodigosAsociados[j] != 0 )
fprintf( file_out, " %9lu\n\r", /*%-7s %9lu", j < 4 ? SRef.PrecioVenta[j+1] : 0,*/ SRef.CodigosAsociados[j] );
}
break;
// C¢digos de barra
case 3:
break;
}
}
if ( !Config.Impresora.Printer )
fclose( file_out );
BRef.LeeReg( (void *)&SRef, old_reg );
}
void ImprimeCabeceraRef( char como, FILE *file_out )
{
switch( como )
{
// Listado R pido
case 1:
fprintf( file_out, "C¢digo Producto Cant.Unt P.Costo P.Venta Combinado\n\r" );
break;
// Listado Completo
case 2:
fprintf( file_out, "C¢digo Producto Cant.Unt P.Costo P.Venta Cod. Combinado\n\r" );
break;
// C¢digos de barra
case 3:
break;
}
}