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

2356 lines
88 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 <dos.h>
#include <math.h>
#include <time.h>
#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"
#include "tpv_num.h"
#define NLINEAS_VENT 15
#define NORMAL 0
#define BARRAS 1
BDatos BVentas; // Base de datos de Ventaserencias
VENTAS SVentas[101]; // 100 productos ( distintos ) maximo por ticket
INFORMACION_VENTAS S_IVentas; // Datos sobre la venta del dia
// Empresa a la que se le realizan las gestiones
extern char EmpresaActual[9];
extern struct date FechaGestionActual;
extern BDatos BEmpl; // Base de Datos de empleados
extern INFO_EMPLEADOS SEmpl; // Estructura de Empleados
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 char BusquedaDirecta; // Tipo de busqueda en Referencias
extern BDatos BProtector; // Base de datos para el protector
extern MENSAJES SProtector; // Para guardar los mensajes del protector
extern BDatos BClt1; // Base de datos de Clientes1: FICHAS
extern INFO_CLIENTES1 SClt1; // Estructura de Clientes
extern BDatos BClt2; // Base de datos de Clientes2: COMPRAS
extern INFO_CLIENTES2 SClt2; // Estructura de Clientes
S_CobroCompleto SCc; // Estructura para el cobro completo
extern char BufferM[6][65 + 1];// Buffer para los mensajes...
char CurrRow; // Linea sobre la que estamos
int CurrVentas; // Producto sobre el que estamos posicionados a golpes
/*************************************\
| |
| Parte Principal del M¢dulo |
| |
\*************************************/
void MuestraTotal( void );
long ObtenPrecioVenta( void );
char ProcesaCobroCompleto( char AsignarComprasCliente );
void InicializaDatosVentas( void );
void RedibujaPantallaVentas( void );
void MuestraDatosVentas( int RowStart );
void MuestraAyudaVentas( char columna );
void VentasNuevoRegistro( VENTAS *MSVentas );
void EditItemVentas( char columna, int linea );
void ManipulaVentas( int Registro, char operacion );
long ActualizaStock( int Cantidad, int VentaCompra, char ComprasVentas );
void MuestraVentas( char columna, int linea, char como );
void InsertarLinea( char *CurrRow, int *CurrVentas, char *CurrCol );
void ObtenCoordenadasVentas( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 );
/*************************************\
| |
| Parte Segunda del M¢dulo |
| |
| Secci¢n para el cobro completo |
| |
\*************************************/
void MuestraDatosCCVentas( void );
void MuestraCCVentas( char columna, char como );
void MuestraAyudaCCVentas( char columna );
void EditItemCCVentas( char columna );
extern void BuscaClt( char TipoBusqueda, char *CurrRow, long *CurrClt );
extern void EmplNuevoRegistro( INFO_EMPLEADOS *MSEmpl );
extern int MatchVendedor( long CodigoVendedor );
extern int MatchCliente( long CodigoCliente );
extern int MatchCCliente( long CodigoEnlace );
extern void CltNuevoRegistro( INFO_CLIENTES1 *NSClt1 );
void CopiaDatosClnt(void);
extern void CltNuevoEnlace( INFO_CLIENTES1 *TmpClt );
/*************************************\
| |
| Parte Tercera del M¢dulo |
| |
| Secci¢n para cargar los elementos |
| |
\*************************************/
void ImprimeVentas( char como );
void ImprimeCabeceraVentas( char como, FILE *file_out );
/*************************************\
| |
| Parte Cuarta del M¢dulo |
| |
| Secci¢n para cargar los elementos |
| |
| Enlaces, a TPV_VENT.CPP |
| |
\*************************************/
extern int CargaProductos( void );
extern int MatchRef( unsigned long Codigo, char NormalBarras );
extern void GeneraBalanceDiario( void );
extern void CargaDatosProtector( void );
int far RatonVentas(void);
int ProtectorPantalla( void );
void CargaDatosProtector( void );
p_graphics TotalVenta = { 15, 15, 6, 3, 3, Config.NumFg, Config.NumBg, Config.NumLn };
p_Ampliada MensajesLn = { 17, 92, 13, 2, 2, Config.DigBg, Config.DigFg, 0 };
extern char DiaActual, MesActual;
long TotalVendido = 0; // Cuanto se lleva vendido hasta ahora ??
char NProductos = 0; // # de productos en el ticket actual
char OldNProductos ; // # de productos del ticket anterior.
char Buffer[80];
char Transaccion;
extern int ScrollUpProtectorPantalla(void);
extern double Protector; // Variable temporal para que salte el protector
char SALIDA_TOTAL;
extern char *ptr_char; // Puntero a la fuentes de caracteres propia
extern BDatos BConfig; // Base con la configuracion del programa
// ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
// Û Parte principal del m¢dulo Û
// ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
/**************************************************************************\
|* *|
|* RedibujaPantallasVentas *|
|* *|
|* Descripci¢n: *|
|* Redibuja la pantalla de ventas, cuando se entra por primera *|
|* vez, o se ha salido para realizar alguna gestion. *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void RedibujaPantallaVentas(void)
{
// Rellenamos la pantalla con un fondo atractivo...
setfillstyle( Config.FillBgS, Config.FillBgC );
bar( 0, 0, 640, 480 );
LeeFuentes(Config.Vent_msg);
Imprime_Estaticos( 10, "systm\\Tpv.img"); // Imprime botones estaticos 'Seccion 1'
MuestraDatosVentas( 0 );
Numero_Digital( -1, &TotalVenta );
MuestraTotal();
// Luces de informaci¢n
if ( Config.OpcionesCaja.ImprimirTickets )
ponicono( 460+7, 5+7, led_on, 1 );
else
ponicono( 460+7, 5+7, led_off, 1 );
if ( Config.OpcionesCaja.CobroCompleto )
ponicono( 460+7, 50+7, led_on, 1 );
else
ponicono( 460+7, 50+7, led_off, 1 );
if ( SVentas[0].BarraMesa )
ponicono( 460+7, 95+7, led_on, 1 );
else
ponicono( 460+7, 95+7, led_off, 1 );
}
/**************************************************************************\
|* *|
|* MuestraTotal *|
|* *|
|* Descripci¢n: *|
|* Muestra el total con IVA ( servicio en mesa ) en los nos. *|
|* grandes y el total simple en los n§s peque¤os. *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MuestraTotal( void )
{
char buffer[80];
char buffer1[80];
// Dibujamos el total vendido incluyendo el IVA del servicio en mesa
Numero_Digital( TotalVendido + ( SVentas[0].BarraMesa ? ( TotalVendido * Config.OpcionesCaja.PorcentajeMesa ) / 100 : 0 ), &TotalVenta );
formatea_u_long( (unsigned long)( TotalVendido ), buffer1 );
sprintf( buffer, "%12s", buffer1 );
setfillstyle( SOLID_FILL, Config.TxtBgN );
bar( 507, 457, 633, 473 );
setcolor ( Config.TxtFgN );
outtextxy( 507, 457, buffer );
}
void AbreCajon(void)
{
clock_t start;
start = clock();
while ( ( clock() - start ) / ( CLK_TCK / 16 ) <= 1 )
{
outportb( 0x2f8, 0x00 );
}
}
/**************************************************************************\
|* *|
|* VentasDiarias *|
|* *|
|* Descripci¢n: *|
|* Gestiona las ventas diarias que se realizan *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
char UltimaPalabra;
void VentasDiarias( void )
{
char buffer[100], ok = 0;
int BPush, key;
unsigned long PrecioC;
long i;
#ifdef DEMOSTRACION
char NumeroProductosVendidos = 0;
#endif
SALIDA_TOTAL = !OK;
char oldCol = -1;
char CurrCol; // Columna sobre la que estamos
struct time HoraGestion, reloj;
if ( VisualMode == OK )
{
Optar( 0, "Modo de Visualizaci¢n", "No se permite la alteraci¢n", "de datos en a¤os pasados.", "- Consulte el manual -", NULL );
return;
}
sprintf( Buffer, "1996 (c) JD. " );
MensajesLn.x = 15; MensajesLn.y = 92;
MensajesLn.ndigitos = 13;
MensajesLn.AX = 2; MensajesLn.AY = 2;
MensajesLn.C1 = Config.DigBg; MensajesLn.C2 = Config.DigFg;
getdate( &FechaGestionActual );
MesActual = FechaGestionActual.da_mon;
DiaActual = FechaGestionActual.da_day;
gettime( &reloj );
sprintf( Buffer, "Hoy es %02d-%02d-%02d y son las %02d:%02d ", FechaGestionActual.da_day, FechaGestionActual.da_mon, FechaGestionActual.da_year, (int)reloj.ti_hour, (int)reloj.ti_min );
UltimaPalabra = strlen( Buffer ) - 3;
char ClaveSalida[15];
sprintf( ClaveSalida, "%02d%02d", FechaGestionActual.da_mon, FechaGestionActual.da_day );
CargaDatosProtector();
// Inicializamos los datos de ventas ( Nuevo ticket );
InicializaDatosVentas();
// Redibujamos la pantalla ( Esto se puede hacer ahora, por que los datos
// se guardan en memoria )
RedibujaPantallaVentas();
// 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 ventas", "sin que existan productos", "que puedan ser vendidos", NULL );
return;
}
// Abre un archivo temporal para agilizar la salvaguardia de datos
// en bruto. ( Al abandonar este m¢dulo, los datos del archivo temporal
// se guardar n en el archivo final, de una manera mas comoda y esttica )
sprintf( buffer, "datos\\%s\\Ventas.TMP", NEmpresa );
if ( BVentas.AbrirReg( buffer, sizeof( VENTAS ) ) == ERROR )
Error( 1, BVentas.cError);
if ( BVentas.Registros() == 0 )
{
gettime( &HoraGestion );
S_IVentas.AperturaCaja.hora = HoraGestion.ti_hour;
S_IVentas.AperturaCaja.min = HoraGestion.ti_min;
S_IVentas.Dia = FechaGestionActual.da_day;
S_IVentas.Mes = FechaGestionActual.da_mon;
S_IVentas.Anyo = FechaGestionActual.da_year;
// Solo para el rango de cambio ;-)
if ( HoraGestion.ti_hour >= 0 && HoraGestion.ti_hour < Config.VProductos.CambioHorario )
{
S_IVentas.Dia --;
if ( S_IVentas.Dia <= 0 )
{
S_IVentas.Mes --;
if ( S_IVentas.Mes <= 0 )
{
S_IVentas.Mes = 12;
S_IVentas.Anyo--;
}
{
// Dias de los meses si el a¤o no es bisiesto
auto char DiasMeses[12] = { 31, 00, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 };
// Ajusta febrero si es bisiesto el a¤o
DiasMeses[1] = (S_IVentas.Anyo%4 == 0) ? 29 : 28;
S_IVentas.Dia = DiasMeses[S_IVentas.Mes];
}
}
}
S_IVentas.Tickets = 0;
S_IVentas.Cambio = 0;
BVentas.SalvaDatosUsuario( (void *)&S_IVentas );
} else {
BVentas.CargaDatosUsuario( (void *)&S_IVentas, sizeof( INFORMACION_VENTAS ) );
}
// Nos posicionamos en la primera venta
CurrRow = CurrVentas = CurrCol = 0;
Transaccion = ON;
do {
if ( CurrCol != oldCol )
{
oldCol = CurrCol; MuestraAyudaVentas( CurrCol );
}
if ( Transaccion == ON )
MuestraVentas( CurrCol, CurrRow+CurrVentas, INTENSO );
BPush = Comprueba_Secuencia( 1, RatonVentas );
if ( Transaccion == OFF )
{
Optar( ENCUADRE, NULL );
SVentas[100] = SVentas[0];
// Inicializamos los datos de ventas ( Nuevo ticket );
InicializaDatosVentas();
MuestraDatosVentas( 0 ); CurrRow = CurrVentas = CurrCol = 0;
Transaccion = ON;
} else
MuestraVentas( CurrCol, CurrRow+CurrVentas, 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
#ifdef DEMOSTRACION
if ( NumeroProductosVendidos > 5 )
{
while( kbhit() ) getch();
Optar( 0, "VERSION DEMO", "El n£mero m ximo de", "tickets por sesi¢n", "es de CINCO!!!", NULL );
break;
}
#endif
if ( (key = getch()) == 255 )
break;
if ( key != 13 && key != 27 )
ungetch( key );
if ( CurrCol == 0 || CurrCol == 2 )
{
TotalVendido -= SVentas[CurrRow+CurrVentas].PrecioV * SVentas[CurrRow+CurrVentas].Cantidad;
if ( MatchRef( SVentas[CurrRow+CurrVentas].CodigoR, NORMAL ) == OK )
{
ActualizaStock( SVentas[CurrRow+CurrVentas].Cantidad, 1, VENTA );
}
}
// Si la tecla que pulsamos fue intro y estamos en el campo
// de cantidad, seguramente era para validar la cantidad...
if ( ( CurrCol == 2 && key != 13 ) || CurrCol != 2 )
EditItemVentas( CurrCol, CurrRow );
while( kbhit() ) getch();
// Miramos si existe ese producto, en caso de haber editado
// la columna 0 || 2, ( columna del c¢digo, cantidad )
if ( CurrCol == 0 || CurrCol == 2 )
{
if ( MatchRef( SVentas[CurrRow+CurrVentas].CodigoR, NORMAL ) == OK )
{
// Ya se debe haber cargado la referencia, asi que podemos
// copiar los datos importantes y actualizar el stock
PrecioC = ActualizaStock( SVentas[CurrRow+CurrVentas].Cantidad, -1, VENTA );
SVentas[CurrRow+CurrVentas].PrecioC = PrecioC;
SVentas[CurrRow+CurrVentas].PrecioV = ObtenPrecioVenta();
} else {
SVentas[CurrRow+CurrVentas].CodigoR = 0;
}
}
TotalVendido += SVentas[CurrRow+CurrVentas].PrecioV * SVentas[CurrRow+CurrVentas].Cantidad;
MuestraVentas( 1, CurrRow+CurrVentas, NORMAL );
MuestraVentas( 3, CurrRow+CurrVentas, NORMAL );
MuestraTotal();
// Esto que sigue es para que el cursor avance solo y
// a¤ada el producto autom ticamente...
MuestraVentas( CurrCol, CurrRow+CurrVentas, NORMAL );
switch ( CurrCol )
{
case 0:
if ( SVentas[CurrRow+CurrVentas].CodigoR == 0 )
CurrCol = 3;
else
CurrCol = 2;
break;
case 1:
case 2:
if ( SVentas[CurrRow+CurrVentas].CodigoR == 0 )
{
CurrCol = 3;
} else {
// de lo contrario, insertamos una nueva venta.
InsertarLinea( &CurrRow, &CurrVentas, &CurrCol );
}
break;
case 3:
if ( SVentas[CurrRow+CurrVentas].PrecioV != 0 )
InsertarLinea( &CurrRow, &CurrVentas, &CurrCol );
break;
}
break;
case -1: // Hay una tecla especial en BUFFER
switch( getch() )
{
// Flecha Izquierda
case 75:
case 15:
// Solo se permite acceder a Todo cuando el Codigo es 0
// CurrCol--;
switch ( CurrCol )
{
case 0:
if ( SVentas[CurrRow+CurrVentas].CodigoR == 0 )
CurrCol = 3;
else
CurrCol = 2;
break;
case 1:
case 2:
CurrCol = 0;
break;
case 3:
CurrCol = 2;
break;
}
break;
// Flecha Derecha
case 77:
case 9:
// Solo se permite acceder a Todo cuando el Codigo es 0
//CurrCol++;
switch ( CurrCol )
{
case 0:
case 1:
CurrCol = 2;
break;
case 2:
if ( SVentas[CurrRow+CurrVentas].CodigoR == 0 )
CurrCol = 3;
else
CurrCol = 0;
break;
case 3:
CurrCol = 0;
break;
}
break;
// Flecha Arriba
case 72:
if ( (CurrRow + CurrVentas) > 0 )
{
if ( ( CurrRow ) <= 0 )
{
CurrRow = NLINEAS_VENT - 1; CurrVentas -= NLINEAS_VENT;
if ( CurrVentas < 0 ) CurrVentas = 0;
while( ( CurrRow + CurrVentas ) >= NProductos && CurrRow > 0 ) CurrRow--;
while( ( CurrRow + CurrVentas ) >= NProductos && CurrVentas > 0 ) CurrVentas++;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosVentas( CurrVentas );
} else {
CurrRow --; if ( CurrRow < 0 ) CurrRow = 0;
}
if ( SVentas[CurrRow+CurrVentas].CodigoR != 0 && ( CurrCol == 1 || CurrCol == 3 ) ) CurrCol = 0;
}
break;
// Flecha Abajo
case 80:
if ( ( CurrRow + CurrVentas ) < ( NProductos - 1 ) )
{
if ( ( CurrRow ) >= NLINEAS_VENT - 1 )
{
CurrRow = 0; CurrVentas += NLINEAS_VENT;
while ( (CurrVentas + CurrRow) >= NProductos ) CurrVentas--;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosVentas( CurrVentas );
} else
CurrRow++;
}
if ( SVentas[CurrRow+CurrVentas].CodigoR != 0 && ( CurrCol == 1 || CurrCol == 3 ) ) CurrCol = 0;
break;
// Inicio
case 71:
CurrRow = 0;
if ( CurrVentas != 0 )
{
CurrVentas = 0;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosVentas( CurrVentas );
}
if ( SVentas[CurrRow+CurrVentas].CodigoR != 0 && ( CurrCol == 1 || CurrCol == 3 ) ) CurrCol = 0;
break;
// Fin
case 79:
CurrRow = 0;
if ( CurrVentas != NProductos - NLINEAS_VENT )
{
CurrVentas = NProductos - NLINEAS_VENT;
if ( CurrVentas < 0 )
{
CurrVentas = 0;
CurrRow = NProductos-1;
}
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosVentas( CurrVentas );
}
if ( SVentas[CurrRow+CurrVentas].CodigoR != 0 && ( CurrCol == 1 || CurrCol == 3 ) ) CurrCol = 0;
break;
// Eliminar
case 83:
TotalVendido -= SVentas[CurrRow+CurrVentas].PrecioV * SVentas[CurrRow+CurrVentas].Cantidad;
MuestraTotal();
if ( MatchRef( SVentas[CurrRow+CurrVentas].CodigoR, NORMAL ) == OK )
{
ActualizaStock( SVentas[CurrRow+CurrVentas].Cantidad, 1, VENTA );
}
ManipulaVentas( CurrVentas + CurrRow, ELIMINAR );
if ( NProductos == 0 )
{
ManipulaVentas( 0, INSERTAR );
VentasNuevoRegistro( &SVentas[0] );
CurrRow = 0;
} else
// Si he borrado el £ltimo registro subo una linea
if ( (CurrVentas+CurrRow) >= ( NProductos - 2 ) )
{
if ( (CurrRow + CurrVentas) > 0 )
{
if ( ( CurrRow ) <= 0 )
{
CurrRow = NLINEAS_VENT - 1; CurrVentas -= NLINEAS_VENT;
if ( CurrVentas < 0 ) CurrVentas = 0;
while( ( CurrRow + CurrVentas ) >= NProductos && CurrRow > 0 ) CurrRow--;
while( ( CurrRow + CurrVentas ) >= NProductos && CurrVentas > 0 ) CurrVentas++;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosVentas( CurrVentas );
} else {
CurrRow --; if ( CurrRow < 0 ) CurrRow = 0;
}
}
}
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosVentas( CurrVentas );
if ( SVentas[CurrRow+CurrVentas].CodigoR != 0 && ( CurrCol == 1 || CurrCol == 3 ) ) CurrCol = 0;
break;
// Insertar
case 82:
InsertarLinea( &CurrRow, &CurrVentas, &CurrCol );
break;
// Retroceso R pido
case 73:
CurrRow = NLINEAS_VENT - 1; CurrVentas -= NLINEAS_VENT;
if ( CurrVentas < 0 ) CurrVentas = 0;
while( ( CurrRow + CurrVentas ) >= NProductos && CurrRow > 0 ) CurrRow--;
while( ( CurrRow + CurrVentas ) >= NProductos && CurrVentas > 0 ) CurrVentas++;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosVentas( CurrVentas );
if ( SVentas[CurrRow+CurrVentas].CodigoR != 0 && ( CurrCol == 1 || CurrCol == 3 ) ) CurrCol = 0;
break;
// AvanceR pido
case 81:
CurrRow = 0; CurrVentas += NLINEAS_VENT;
while ( (CurrVentas + CurrRow) >= NProductos ) CurrVentas--;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosVentas( CurrVentas );
if ( SVentas[CurrRow+CurrVentas].CodigoR != 0 && ( CurrCol == 1 || CurrCol == 3 ) ) CurrCol = 0;
break;
}
break;
// Imprimir £ltimo ticket
case 1:
// Solo si hay solo un producto ( y es no valido )
if ( NProductos == 1 && SVentas[0].CodigoR == 0 && SVentas[0].PrecioV == 0 )
{
NProductos = OldNProductos;
SVentas[0] = SVentas[100];
if ( ProcesaCobroCompleto( !Config.OpcionesCaja.CobroCompleto ) == OK )
{
// Tengo que modificar la compra del cliente: ¨ Quien se la vendio ?
// ...pero solo lo hago si no esta activado el C.Completo
if ( !Config.OpcionesCaja.CobroCompleto )
for ( i = BVentas.Registros()-NProductos; i < BVentas.Registros(); i++ )
{
BVentas.LeeReg( (void *)&SVentas[1], i );
SVentas[1].CodigoVendedor = SVentas[0].CodigoVendedor;
BVentas.EscribeReg( (void *)&SVentas[1], i );
}
}
VentasNuevoRegistro( &SVentas[0] );
OldNProductos = NProductos;
NProductos = 1;
CurrRow = CurrVentas = CurrCol = 0; oldCol = -1;
} else {
Optar( 0, " ­­ No mas facturas !! ", "Solo se permite una factura", "pulsando el boton C.Completo", NULL );
}
break;
// Imprimir Tickets
case 2:
Config.OpcionesCaja.ImprimirTickets = !Config.OpcionesCaja.ImprimirTickets;
if ( Config.OpcionesCaja.ImprimirTickets )
ponicono( 460+7, 5+7, led_on, 1 );
else
ponicono( 460+7, 5+7, led_off, 1 );
break;
// Cobro Completo
case 3:
Config.OpcionesCaja.CobroCompleto = !Config.OpcionesCaja.CobroCompleto;
if ( Config.OpcionesCaja.CobroCompleto )
ponicono( 460+7, 50+7, led_on, 1 );
else
ponicono( 460+7, 50+7, led_off, 1 );
break;
// Servicio en mesa
case 4:
SVentas[0].BarraMesa = !SVentas[0].BarraMesa;
if ( SVentas[0].BarraMesa )
ponicono( 460+7, 95+7, led_on, 1 );
else
ponicono( 460+7, 95+7, led_off, 1 );
MuestraTotal();
break;
// Enlace a la seccion de gastos / compras
case 5:
// Cerramos los archivos abiertos que necesita el m¢dulo
farfree( BusquedaRef );
BRef.CerrarReg();
// Ejecutamos el m¢dulo de compras ( con acceso limitado )
ComprasDiarias( NINGUNO );
// Vuelvo a abrir los ficheros necesarios
CargaProductos();
// Al volver de esta secci¢n habr  que redibujar la pantalla
RedibujaPantallaVentas();
oldCol = -1;
break;
// Men£ Pricipal
case 6:
if ( strcmp( PideClave( "Clave de Salida", ">>> registrando..." ), ClaveSalida ) == 0 )
//if ( PideClaveUsuario() == OK )
{
S_IVentas.SalidasExito ++;
ok = 1;
} else {
S_IVentas.IntentosSalir ++;
SALIDA_TOTAL = OK;
ok = 1;
}
break;
// Fichar ticket
case 7:
#ifdef DEMOSTRACION
NumeroProductosVendidos++;
#endif
// Apertura de la caja para cambio
if ( NProductos == 1 && SVentas[0].CodigoR == 0 && SVentas[0].PrecioV == 0 )
{
// Solo un producto, y su codigo y precio venta == 0 ( CAMBIO )
S_IVentas.Cambio++;
// Abrimos la caja
AbreCajon();
// Indicamos que la transacci¢n ha finalizado
Optar( ENCUADRE, "Transacci¢n finalizada", "Cajon abierto para cambio", "Registrando tiempo de apertura", "­­­ Sistema preparado !!!", NULL );
} else {
// Si se entra, es un ticket completo
if ( Config.OpcionesCaja.CobroCompleto )
if ( ProcesaCobroCompleto( Config.OpcionesCaja.CobroCompleto ) == ERROR )
break;
// Esto es un ticket normal
// Guardamos la info del ticket
for ( i = 0; i < NProductos; i++ )
{
SVentas[i].CodigoVendedor = SVentas[0].CodigoVendedor;
SVentas[i].BarraMesa = SVentas[0].BarraMesa;
// Solo insertamos el registro si: CodigoR != 0
// o: CodigoR == 0 && PrecioV != 0
if ( SVentas[i].CodigoR != 0 || SVentas[i].PrecioV != 0 )
BVentas.InsReg( (void *)&SVentas[i], BVentas.Registros(), ARRIBA );
}
S_IVentas.Tickets++;
// Abrimos la caja
AbreCajon();
// Imprimimos el ticket's si corresponde
if ( Config.OpcionesCaja.ImprimirTickets )
ImprimeVentas( 4 );
// Indicamos que la transacci¢n ha finalizado
Optar( ENCUADRE, "Transacci¢n finalizada", "La transacci¢n ha finalizado", "sistema preparado para", "una nueva transacci¢n.", NULL );
}
// Salvamos los datos estadisticos...
BVentas.SalvaDatosUsuario( (void *)&S_IVentas );
Transaccion = OFF;
CurrRow = CurrVentas = CurrCol = 0; oldCol = -1;
break;
// Anular Ticket
case 8:
// ReActualizamos el stock
for ( i = 0; i < NProductos; i++ )
{
if ( MatchRef( SVentas[i].CodigoR, NORMAL ) == OK )
ActualizaStock( SVentas[i].Cantidad, 1, VENTA );
}
// Inicializamos los datos de ventas ( Nuevo ticket );
InicializaDatosVentas();
// Redibujamos la pantalla ( Esto se puede hacer ahora, por que los datos
// se guardan en memoria )
MuestraDatosVentas( 0 ); CurrRow = CurrVentas = CurrCol = 0; oldCol = -1;
Numero_Digital( -1, &TotalVenta );
MuestraTotal();
Transaccion = ON;
break;
default:
break;
}
} while( !ok );
if ( Transaccion == ON )
// ReActualizamos el stock
for ( i = 0; i < NProductos; i++ )
{
if ( MatchRef( SVentas[i].CodigoR, NORMAL ) == OK )
ActualizaStock( SVentas[i].Cantidad, 1, VENTA );
}
gettime( &HoraGestion );
S_IVentas.CierreCaja.hora = HoraGestion.ti_hour;
S_IVentas.CierreCaja.min = HoraGestion.ti_min;
BVentas.SalvaDatosUsuario( (void *)&S_IVentas );
// Generamos el balance del dia y cerramos el archivo de ventas
GeneraBalanceDiario();
// El indice de referencias ya no nos hace falta
farfree( BusquedaRef );
BVentas.CerrarReg();
BRef.CerrarReg();
// Eliminamos el archivo temporal de ventas
sprintf( buffer, "datos\\%s\\Ventas.TMP", NEmpresa );
if ( unlink( buffer ) != 0 )
{
sprintf( buffer, "archivo: datos\\%s\\Ventas.TMP", NEmpresa );
Optar( 0, "Error de eliminacion!", "Alguien impide eliminar el", buffer, "Eliminel¢ MANUALMENTE!!!", NULL );
}
if ( SALIDA_TOTAL == OK )
{
/*****************************\
|* DesInicializamos todo y *| °±²Ü²±°
|* mostramos el mensaje final. *| °±²ß²±°
\*****************************/
BConfig.CerrarReg();
farfree( ptr_char );
AnulaInterrupcion();
closegraph();
printf( "\nLa salida ILEGAL, acaba de ser registrada.\n­­Queda un intento menos, para bloquear el programa!!\n" );
exit( -1 );
}
}
/**************************************************************************\
|* *|
|* InsertatLinea *|
|* *|
|* Descripci¢n: *|
|* Me he visto obligado a sacar esta parte del c¢digo de la *|
|* funci¢n principal, ya que se usa en distintas partes. *|
|* *|
|* Entradas: *|
|* Linea en la que se inserta y posici¢n f¡sica, y columna *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void InsertarLinea( char *CurrRow, int *CurrVentas, char *CurrCol )
{
char campo;
ManipulaVentas( (*CurrVentas + *CurrRow), INSERTAR );
VentasNuevoRegistro( &SVentas[*CurrVentas+*CurrRow+1] );
if ( ( *CurrRow + *CurrVentas ) < NProductos - 1 )
{
if ( ( *CurrRow ) >= NLINEAS_VENT - 1 )
{
*CurrRow = 0; *CurrVentas = *CurrVentas + NLINEAS_VENT;
while ( (*CurrVentas + *CurrRow) >= NProductos ) *CurrVentas = *CurrVentas - 1;
// MuestraDatosVentas( *CurrVentas );
} else
*CurrRow = *CurrRow + 1;
for ( campo=0; campo < 4; campo++ )
MuestraVentas( campo, *CurrRow + *CurrVentas, NORMAL );
}
*CurrCol = 0;
MuestraDatosVentas( *CurrVentas );
}
/**************************************************************************\
|* *|
|* ManipulaVentas *|
|* *|
|* Descripci¢n: *|
|* Inserta o elimina una venta *|
|* *|
|* Entradas: Registro a manipular *|
|* Tipo de manipulacion INSERTAR / ELIMINAR *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void ManipulaVentas( int Registro, char operacion )
{
int avance;
if ( operacion == INSERTAR )
{
// Solo se permiten 100 compras por ticket
if ( Registro > 99 )
return;
NProductos++;
avance = NProductos - 1;
while( avance > (
Registro+1) )
{
SVentas[ avance ] = SVentas[ avance - 1 ];
avance--;
}
} else {
NProductos --;
if ( NProductos >= 0 )
{
avance = Registro;
while( avance < NProductos )
{
SVentas[ avance ] = SVentas[ avance + 1 ];
avance++;
}
}
}
}
/**************************************************************************\
|* *|
|* InicializaDatosVentas *|
|* *|
|* Descripci¢n: *|
|* Inicializa los datos necesarios para un nuevo ticket *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void InicializaDatosVentas(void)
{
// Llevamos 0 ptas. vendidas
TotalVendido = 0;
OldNProductos = NProductos;
// Hay solo 1 venta ( nada por defecto )
NProductos = 1;
VentasNuevoRegistro( &SVentas[0] );
}
/**************************************************************************\
|* *|
|* ObtenPrecioVenta *|
|* *|
|* Descripci¢n: *|
|* Obtiene el precio de venta, dependiendo de la hora actual *|
|* ( se supone que la estructura SRef es sobre la que debemos *|
|* obtener el precio, y que esta actualizada ) *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: Precio de venta *|
|* *|
\**************************************************************************/
long ObtenPrecioVenta( void )
{
char i; long Precio;
struct time t;
gettime( &t );
Precio = SRef.PrecioVenta[0];
for ( i=1; i < 5; i++ )
// 1§ tienen que coincidir las horas
if ( t.ti_hour >= Config.VProductos.HoraIni[i].hora && t.ti_hour <= Config.VProductos.HoraFin[i].hora &&
t.ti_min >= Config.VProductos.HoraIni[i].min && t.ti_min <= Config.VProductos.HoraFin[i].min )
{
Precio = SRef.PrecioVenta[i];
break;
}
return Precio;
}
/**************************************************************************\
|* *|
|* MuestraDatosVentas *|
|* *|
|* 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 MuestraDatosVentas( int RowStart )
{
int linea, campo;
int X0, Y0, X1, Y1;
linea = CurrRow;
// Imprimo la NLINEAS_VENT que caben en la pantalla
for ( CurrRow=0; CurrRow < NLINEAS_VENT && (CurrRow + RowStart) < NProductos; CurrRow++ )
{
// Por cada CurrRow hay 4 campos, ehhh!!!
for ( campo=0; campo < 4; campo++ )
MuestraVentas( campo, CurrRow+RowStart, NORMAL );
}
// Ahora limpio los restantes huecos si los hay
if ( CurrRow < NLINEAS_VENT )
{
setfillstyle( SOLID_FILL, Config.TxtBgN );
for ( ; CurrRow < NLINEAS_VENT; CurrRow++ )
for ( campo=0; campo < 4; campo++ )
{
ObtenCoordenadasVentas( campo, CurrRow, &X0, &Y0, &X1, &Y1 );
bar( X0, Y0, X1, Y1 );
}
}
CurrRow = linea;
}
/**************************************************************************\
|* *|
|* MuestraVentas *|
|* *|
|* 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 MuestraVentas( char columna, int linea, char como )
{
char buffer[80];
char buffer1[80];
int X0, Y0, X1, Y1;
ObtenCoordenadasVentas( columna, CurrRow, &X0, &Y0, &X1, &Y1 );
switch( columna )
{
// Codigo Real de la compra
case 0:
sprintf ( buffer, " %09lu", SVentas[linea].CodigoR );
break;
// Nombre del producto
case 1:
if ( MatchRef( SVentas[linea].CodigoR, NORMAL ) == ERROR )
{
strcpy( buffer1, "Ticket Varios" );
sprintf ( buffer, " %30s", buffer1 );
} else
sprintf ( buffer, " %30s", SRef.Descripcion );
break;
// Cantidad
case 2:
sprintf ( buffer, "%4d", SVentas[linea].Cantidad );
break;
// Total
case 3:
formatea_u_long( (unsigned long)( SVentas[linea].Cantidad * SVentas[linea].PrecioV ), buffer1 );
sprintf ( buffer, "%8s", buffer1 );
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 );
//ÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄ
// Û Û Û Û Û Û Û Û Û Û Û Û Û Û Û Û
//ÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄ
// Û Û Û Û Û Û Û Û Û Û Û Û Û Û Û Û
//ÄßÄßÄÛÄÛÄÄßÄßÄÛÄÛÄÄßÄßÄÛÄÛÄÄßÄßÄÛÄÛÄÄßÄßÄÛÄÛÄÄßÄßÄÛÄÛÄÄßÄßÄÛÄÛÄÄßÄßÄÛÄÛÄ
/*
setfillstyle( SOLID_FILL, Config.TxtFgN );
bar( 507, 457, 633, 473 );
formatea_long( (unsigned long)( SVentas[CurrRow+CurrVentas].PrecioC ), buffer );
setcolor ( Config.TxtBgN );
outtextxy( 507, 457, buffer );
*/
//ÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄ
// Û Û Û Û Û Û Û Û Û Û Û Û Û Û Û Û
//ÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄÄÜÄÜÄÛÄÛÄ
// Û Û Û Û Û Û Û Û Û Û Û Û Û Û Û Û
//ÄßÄßÄÛÄÛÄÄßÄßÄÛÄÛÄÄßÄßÄÛÄÛÄÄßÄßÄÛÄÛÄÄßÄßÄÛÄÛÄÄßÄßÄÛÄÛÄÄßÄßÄÛÄÛÄÄßÄßÄÛÄÛÄ
}
/**************************************************************************\
|* *|
|* MuestraAyudaVentas *|
|* *|
|* Descripci¢n: *|
|* Muestra una peque¤a descripcion del contenido para el campo *|
|* *|
|* Entradas: *|
|* columna campo ha mostar su ayuda *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MuestraAyudaVentas( char columna )
{
char buffer1[80];
switch( columna )
{
// Codigo Real del producto
case 0:
sprintf ( buffer1, "C¢digo del producto. ( 0 si no tiene c¢digo )" );
break;
// Nombre del producto
case 1:
sprintf ( buffer1, "Nombre ( para el producto sin catalogar )" );
break;
// Cantidad
case 2:
sprintf ( buffer1, "Unidades de venta" );
break;
// Total
case 3:
sprintf ( buffer1, "Total de la venta actual" );
break;
}
// Ayuda reducida
setfillstyle( SOLID_FILL, EGA_BLACK ); bar( 7, 457, 498, 473 );
// Imprime la ayudita
setcolor( EGA_WHITE ); outtextxy( 7, 455, buffer1 );
}
/**************************************************************************\
|* *|
|* EditItemVentas *|
|* *|
|* 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 EditItemVentas( char columna, int linea )
{
char buffer[80];
int X0, Y0, X1, Y1;
ObtenCoordenadasVentas( columna, linea, &X0, &Y0, &X1, &Y1 );
switch( columna )
{
// Codigo Real
case 0:
buffer[0] = '\0'; // Creo que lo mejor es que teclee el c¢digo desde cero
if ( !( InputCadenaG( buffer, 1, 9, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
SVentas[CurrRow+CurrVentas].CodigoR = atol( buffer );
break;
// Nombre del producto ( Solo si el codigo es el 0 )
case 1:
/*
if ( SVentas[CurrRow+CurrVentas].CodigoR == 0 )
{
// ÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛßÜßÛ
strcpy ( buffer, SVentas[CurrRow+CurrVentas].Descripcion );
if ( !( InputCadenaG( buffer, 0, 30, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
strcpy ( SVentas[CurrRow+CurrVentas].Descripcion, buffer );
// ÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛÜßÜßÛÛßÜßÛ
}
*/
while( kbhit() ) getch();
break;
// Cantidad
case 2:
buffer[0] = '\0';
if ( !( InputCadenaG( buffer, 1, 4, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
SVentas[CurrRow+CurrVentas].Cantidad = atoi( buffer );
if ( SVentas[CurrRow+CurrVentas].Cantidad == 0 )
SVentas[CurrRow+CurrVentas].Cantidad = 1;
break;
// Total ( Solo Accesible con Codigo 0 )
case 3:
if ( SVentas[CurrRow+CurrVentas].CodigoR == 0 )
{
buffer[0] = '\0';
if ( !( InputCadenaG( buffer, 1, 8, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
SVentas[CurrRow+CurrVentas].PrecioV = atol( buffer ) / SVentas[CurrRow+CurrVentas].Cantidad;
}
while( kbhit() ) getch();
break;
default:
while( kbhit() ) getch();
break;
}
}
/**************************************************************************\
|* *|
|* ObtenCoordenadasVentas *|
|* *|
|* 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 ObtenCoordenadasVentas( 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 )
{
case 0:
*X0 = 7; *X1 = 123;
break;
case 1:
*X0 = 137; *X1 = 468;
break;
case 2:
*X0 = 482; *X1 = 528;
break;
case 3:
*X0 = 542; *X1 = 632;
break;
}
*X0 += 2;
*X1 -= 2;
}
/**************************************************************************\
|* *|
|* VentasNuevoRegistro *|
|* *|
|* Descripci¢n: *|
|* Limpia el buffer, para un nuevo registro. *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void VentasNuevoRegistro( VENTAS *NSVentas )
{
struct time t;
gettime( &t );
NSVentas -> CodigoR = 0; // Codigo real del producto
NSVentas -> Cantidad = 1; // # de productos por unidad
NSVentas -> PrecioV = 0; // Precio de venta
NSVentas -> BarraMesa = 0; // Servicio en barra o en mesa
NSVentas -> PrecioC = 0; // Precio de Costo del Producto
NSVentas -> CodigoVendedor = 0; // C¢digo del vendedor ( 0 genricos )
// Hora exacta de venta del producto
NSVentas -> HoraV.hora = t.ti_hour;
NSVentas -> HoraV.min = t.ti_min;
}
/**************************************************************************\
|* *|
|* ActualizaStock *|
|* *|
|* Descripci¢n: *|
|* Actualiza el Stock teniendo en cuenta si es un combinado *|
|* Se supone que la referencia origen esta cargada en SRef. *|
|* *|
|* *|
|* Entradas: *|
|* Referencia Origen, Cantidad, VentaCompra ( -1, 1 ) *|
|* *|
|* Salidas: (ninguna) *|
|* *|
|* ­­­ Nota: !!! *|
|* *|
|* COMBINADO PADRE: producto que se llama a si mismo *|
|* COMBINADO HIJO: alguien llamo a un combinado padre (x partes util)*|
|* COMBINADO NORMAL: resto de casos *|
|* *|
\**************************************************************************/
#define COMBINADO_NORMAL 1
#define COMBINADO_PADRE 2
#define COMBINADO_HIJO 3
#define COMBINADO_COMBINADO 0
long ActualizaStock( int Cantidad, int VentaCompra, char ComprasVentas )
{
long CodigoR[10], BRef_pos, BRef_und, BRef_cod;
unsigned long PrecioCosto;
char i, j;
char TipoCombinado = NORMAL;
// Si no es un combinado, simplemente actualizamos en su Stock la cantidad
if ( SRef.Combinado == 0 )
{
SRef.Stock += ( (long)Cantidad * VentaCompra );
if ( BRef.EscribeReg( (void *)&SRef, BRef.RegActual() ) == ERROR )
Error(0x01, BRef.cError );
PrecioCosto = SRef.PrecioCosto * Cantidad;
} else {
// Como es un combinado, tenemos que realizar un rastreo para actualizar
// las referencias de cada combinado
BRef_pos = BRef.RegActual(); // Guardamos la posici¢n para saber de donde venimos
BRef_und = SRef.CantUnitaria; // Unidades que hay que quitar a los subcodigos
BRef_cod = SRef.CodigoR;
// Guardamos los c¢digos combinados
for ( i = 0; i < 10; i++ )
CodigoR[i] = SRef.CodigosAsociados[i];
PrecioCosto = 0;
// Ahora recorremos cada c¢digo para actualizar el combinado
for ( i = 0; i < 10; i++ )
if ( CodigoR[i] )
{
if ( MatchRef( CodigoR[i], NORMAL ) == OK )
{
// Comprobamos si la sub-ref. es o no un combinado
TipoCombinado = COMBINADO_COMBINADO;
for ( j = 0; j < 10 && TipoCombinado == COMBINADO_COMBINADO; j++ )
{
if ( SRef.CodigoR == SRef.CodigosAsociados[j] )
{
if ( SRef.CodigoR == BRef_cod )
TipoCombinado = COMBINADO_PADRE;
else
TipoCombinado = COMBINADO_HIJO;
} else {
TipoCombinado = COMBINADO_NORMAL;
}
}
if ( SRef.Combinado == 0 || TipoCombinado != COMBINADO_COMBINADO )
{
switch( TipoCombinado )
{
// C¢digo padre ( lo estoy vendiendo entero )
case COMBINADO_HIJO:
// Solo vendo parte del c¢digo padre
if ( ComprasVentas == COMPRA )
SRef.Stock += ( (long)Cantidad * /*SRef.CantUnitaria*/ VentaCompra );
else
SRef.Stock += ( (long)Cantidad * BRef_und/*SRef.CantUnitaria*/ * VentaCompra );
PrecioCosto += SRef.CantUnitaria == 0 ? 1 : (long)( ( (double)(SRef.PrecioCosto / SRef.CantUnitaria ) * Cantidad ) );
break;
case COMBINADO_PADRE:
if ( ComprasVentas == COMPRA )
SRef.Stock += ( (long)Cantidad * VentaCompra );
else
SRef.Stock += ( (long)Cantidad * SRef.CantUnitaria * VentaCompra );
Cantidad = Cantidad / SRef.CantUnitaria;
PrecioCosto += SRef.PrecioCosto * Cantidad;
break;
case COMBINADO_NORMAL:
default:
SRef.Stock += ( (long)Cantidad /** SRef.CantUnitaria*/ * VentaCompra );
PrecioCosto += SRef.PrecioCosto * Cantidad;
break;
}
if ( BRef.EscribeReg( (void *)&SRef, BRef.RegActual() ) == ERROR )
Error(0x01, BRef.cError );
} else {
PrecioCosto += ActualizaStock( ( Cantidad * SRef.CantUnitaria ), VentaCompra, ComprasVentas );
} // Fin sub-ref. es combinado / no combinado
}
}
BRef.LeeReg( (void *)&SRef, BRef_pos );
} // Fin no combinado / combinado
return PrecioCosto;
}
// ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
// Û Parte terciaria del m¢dulo Û
// Û Û
// Û Secci¢n de Impresion de compras Û
// ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
/**************************************************************************\
|* *|
|* ImprimeVentas *|
|* *|
|* Descripci¢n: *|
|* Imprime todas las referencias seg£n se le indique *|
|* *|
|* Entradas: *|
|* Como imprimir las referencias *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void ImprimeVentas( char como )
{
unsigned char i;
char buffer[80];
long Suma_Total = 0;
FILE *file_out;
if ( !Config.Impresora.Printer )
{
if ( ( file_out = fopen( Config.Impresora.PrintTo, "w" ) ) == NULL )
return;
} else
file_out = stdprn;
printf( "\n\r" );
ImprimeCabeceraVentas( como, file_out );
for ( i=0; i < NProductos; i++ )
{
switch( como )
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
if ( SVentas[i].PrecioV != 0 || SVentas[i].CodigoR != 0 )
{
formatea_u_long( (unsigned long)SVentas[i].PrecioV*SVentas[i].Cantidad, buffer );
if ( MatchRef( SVentas[i].CodigoR, NORMAL ) == OK )
fprintf( file_out, "%9lu %-30s %4ld %6s\n\r", (unsigned long)SVentas[i].CodigoR, SRef.Descripcion, (long)SVentas[i].Cantidad, buffer );
else
fprintf( file_out, "%9lu Tickets varios %4ld %6s\n\r",(unsigned long) SVentas[i].CodigoR, (long)SVentas[i].Cantidad, buffer );
Suma_Total += SVentas[i].PrecioV*SVentas[i].Cantidad;
}
break;
}
}
if ( como == 4 )
{
formatea_long( Suma_Total, buffer );
fprintf ( file_out, "\n\r Suma total %11s\n\r", buffer );
for ( i=0; i < 4; i++ )
fprintf( file_out, "\n\r%s", &Config.Impresora.FinTickets[i][0] );
}
if ( !Config.Impresora.Printer )
fclose( file_out );
}
void ImprimeCabeceraVentas( char como, FILE *file_out )
{
int i;
switch( como )
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
for ( i=0; i < 4; i++ )
fprintf( file_out, "%s\n\r", &Config.Impresora.PrincipioTickets[i][0] );
fprintf( file_out, "\n\rC¢digo Articulo Cant P.Total \n\r" );
break;
}
}
//ÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛÛßÛ
// ß ß ß ß ß ß ß ß ß ß ß ß ß ß ß ß ß ß ß ß ß ß ß ß ß
int ProtectorPantalla( void )
{
p_Ampliada far *LetraG[6];
int Pasadas = 20*8 - 1;
time_t first;
char Paso;
int i;
for ( i = 0; i < 6; i++ )
if ( ( LetraG[i] = ( p_Ampliada far * )farmalloc( sizeof( p_Ampliada ) ) ) == NULL )
{
for ( i=0; i < 6; i++ )
farfree( LetraG[i] );
ungetch( 255 );
return 0;
}
LetraG[0] -> x = 0; LetraG[0] -> y = 0;
LetraG[0] -> ndigitos = 20;
LetraG[0] -> AX = 2; LetraG[0] -> AY = 2;
LetraG[0] -> C1 = 0; LetraG[0] -> C2 = Config.DigFg+5;
LetraG[0] -> C3 = 0;
*LetraG[5] = *LetraG[4] = *LetraG[3] = *LetraG[2] = *LetraG[1] = *LetraG[0];
LetraG[1] -> y = 32;
LetraG[2] -> y = 64;
LetraG[3] -> y = 96;
LetraG[4] -> y = 128;
LetraG[5] -> y = 160;
for ( i = 0; i < 6; i++ )
{
LetraG[i] -> C1 = SProtector.CBg[i];
LetraG[i] -> C2 = SProtector.CFg[i];
// LetraG[i] -> Frase1[0] = '\0';
}
for ( i = 0; i < 6; i++ )
sprintf( BufferM[i], "%-20s%-20s%-20s", SProtector.Mensaje1[i], SProtector.Mensaje2[i], SProtector.Mensaje3[i] );
desactiva_raton();
// Cambiamos a 320x200
IntVect = OFF;
restorecrtmode();
asm mov al, 0x13
asm mov ah, 0x00
asm int 0x10
LeeFuentes(Config.Prot_fnt);
time( &first );
Paso = 0;
do {
if ( Pasadas == -1 && difftime( time(NULL), first ) >= SProtector.TEspera )
{
Pasadas = 0;
if ( Paso == 4 ) Paso = 1;
}
if ( Pasadas >= 0 )
{
Pasadas ++;
if ( Pasadas > (Paso != 3 ? 20*8 : 20*8 ) )
{
time( &first );
Pasadas = -1;
Paso++;
}
}
for ( i = 0; i < 6; i++ )
{
if ( SProtector.Desplaz[i] || Pasadas != -1 )
FuenteAmplia( BufferM[i], LetraG[i] );
}
} while( !kbhit() );
while ( kbhit() ) getch();
for ( i=0; i < 6; i++ )
farfree( LetraG[i] );
// Cambiamos a 640x480
asm mov al, 0x03
asm mov ah, 0x00
asm int 0x10
setgraphmode( 2 );
inicializa_raton_grafico( 0, 0, 639, 479 );
//////////
setrgbpalette(EGA_WHITE, 56, 58, 59 );
setrgbpalette(EGA_LIGHTGRAY, 30, 37, 43 );
setrgbpalette(EGA_DARKGRAY, 24, 27, 30 );
IntVect = ON;
ungetch( 255 );
return 0;
}
/**************************************************************************\
|* *|
|* RatonVentas *|
|* *|
|* Descripci¢n: *|
|* Funci¢n soporte para el control del raton, que ademas se *|
|* encarga de mostrar el letrero digital y el protector de *|
|* pantalla. *|
|* *|
|* Entradas: *|
|* Linea en la que se inserta y posici¢n f¡sica, y columna *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
int far RatonVentas(void)
{
char Que;
clock_t start, end, start2;
struct time first;
struct time old;
start2 = start = clock();
activa_raton();
union REGS io;
io.x.ax = 3;
do{
end = clock();
if ( Protector == 1 && ( ( end - start ) / CLK_TCK ) >= Config.Protector )
{
if ( Transaccion == OFF )
{
Optar( ENCUADRE, NULL );
// Inicializamos los datos de ventas ( Nuevo ticket );
InicializaDatosVentas();
MuestraDatosVentas( 0 );
Transaccion = ON;
}
//ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
//ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
// ProtectorPantalla();
if ( ScrollUpProtectorPantalla() == 1 )
ProtectorPantalla();
//ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
//ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
RedibujaPantallaVentas();
return 0;
}
/*
if ( (m++) >= Config.TiempoDezplazamiento )
{
m = 0;
*/
if ( ( (end - start2) / (CLK_TCK /*/ 4*/) ) >= 0.001 )
{
start2 = end;
old = first;
gettime( &first );
if ( Protector == 1 && ( old.ti_min != first.ti_min || old.ti_hour != first.ti_hour ) )
sprintf( Buffer, "Hoy es %02d-%02d-%02d y son las %02d:%02d ", FechaGestionActual.da_day, FechaGestionActual.da_mon, FechaGestionActual.da_year, (int)first.ti_hour, (int)first.ti_min );
Fuente_Amplia( Buffer, &MensajesLn );
}
int86(0x33, &io, &io); // lee posici¢n y estados del bot¢n
// boton_izq = io.x.bx & 1;
// boton_der = (io.x.bx >> 1) & 1;
x_raton = io.x.cx;
y_raton = io.x.dx;
}while( (io.x.bx & 1) == 0 && ((io.x.bx >> 1) & 1) == 0 && !kbhit() );
/////////////////////////////////////////
// RETURN Derecho Izquierdo //
// //
// 0 0 0 //
// 1 1 0 //
// 2 0 1 //
// 3 1 1 //
// //
/////////////////////////////////////////
if ( ((io.x.bx >> 1) & 1)==0 && (io.x.bx & 1)==0 ) Que = 0;
if ( ((io.x.bx >> 1) & 1)==1 && (io.x.bx & 1)==0 ) Que = 1;
if ( ((io.x.bx >> 1) & 1)==0 && (io.x.bx & 1)==1 ) Que = 2;
if ( ((io.x.bx >> 1) & 1)==1 && (io.x.bx & 1)==1 ) Que = 3;
desactiva_raton();
return Que;
}
// ÜÛ²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²ÛÜ
// °±²Û²±ÛÛÛÛÛÛ±ÛÛÛÛÛÛ±ÛÛÛÛÛ²±ÛÛÛÛÛ²±ÛÛÛÛÛÛ±°°±ÛÛÛÛÛ°ÛÛÛÛÛÛ°Û²Û²Û°ÛÛÛÛ²±°°±²Û²
// °±²Û²±Û°±²Û²±Û°±²ÛÛ±Û°±²ÛÛ±Û°±²ÛÛ±Û°±²ÛÛ±°°±ÛÛ²±°°Û²Û²±Û°ÛÛÛÛÛ°Û±²ÛÛ±°°±²Û²
// °±²Û²±Û°±²Û²±Û°±²ÛÛ±Û°±²ÛÛ±Û°±²ÛÛ±Û°±²ÛÛ±°°±ÛÛ²±°°Û²Û²±Û°Û²Û²Û°Û±²ÛÛ±°°±²Û²
// °±²Û²±Û°±²Û²±Û°±²ÛÛ±ÛÛÛÛÛ²±Û°ÛÛÛ²±Û°±²ÛÛ±°°±ÛÛ²±°°Û²Û²±Û°Û²Û²Û°ÛÛÛÛ²±°°±²Û²
// °±²Û²±Û°±²Û²±Û°±²ÛÛ±Û°±²ÛÛ±ÛÛ±²Û²±Û°±²ÛÛ±°°±ÛÛ²±°°Û²Û²±Û°Û²Û²Û°Û±²Û²±°°±²Û²
// °±²Û²±Û°±²Û²±Û°±²ÛÛ±Û°±²ÛÛ±Û°ÛÛÛ²±Û°±²ÛÛ±°°±ÛÛ²±°°Û²Û²±Û°Û²Û²Û°Û±²Û²±°°±²Û²
// °±²Û²±ÛÛÛÛÛÛ±ÛÛÛÛÛÛ±ÛÛÛÛÛ²±Û°±²ÛÛ±ÛÛÛÛÛÛ±°°±ÛÛÛÛÛ°ÛÛÛÛÛÛ°Û²Û²Û°Û±²Û²±°°±²Û²
// °±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²
// ßÛ²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Û²±°°±²Ûß
/**************************************************************************\
|* *|
|* ProcesaCobroCompleto *|
|* *|
|* Descripci¢n: *|
|* Procesa un cobro completo, gestionando tanto al vendedor *|
|* como al cliente, para obtener datos posteriores sobre ellos *|
|* *|
|* Entradas: Si se desea o no asignar las compras al cliente (1§,2¦ vez) *|
|* *|
|* Salidas: Transacci¢n aceptada o no!!! *|
|* *|
\**************************************************************************/
char ProcesaCobroCompleto( char AsignarComprasCliente )
{
int Status, ok;
int CurrCol, oldCol;
char CurrRow, OCRow;
long CurrClnt, OCClnt;
int BPush, key, i;
char buffer[80];
CurrRow = CurrClnt = -1;
CurrCol = 0; oldCol = -1;
ok = 0; Status = ERROR;
/*
if ( ( SClt2 = (INFO_CLIENTES2 *)malloc( sizeof( INFO_CLIENTES2 ) * TOTAL_COMPRAS_ANUAL ) ) == NULL )
{
Optar( 0, "­ Memoria insuficiente !", "Atenci¢n, no hay suficiente memoria", "libre, por lo que no se", "asignar n las compras al Clte.", NULL );
return Status;
}
*/
sprintf( buffer, "datos\\%s\\info_clt1.dbf", NEmpresa );
if ( BClt1.AbrirReg( buffer, sizeof( INFO_CLIENTES1 ) ) == ERROR )
Error(0x01, BClt1.cError);
sprintf( buffer, "datos\\%s\\info_clt2.%03d", NEmpresa, ( FechaGestionActual.da_year - (FechaGestionActual.da_year/1000)*1000 ) );
if ( BClt2.AbrirReg( buffer, sizeof( INFO_CLIENTES2 ) * TOTAL_COMPRAS_ANUAL ) == ERROR )
Error(0x01, BClt2.cError);
Imprime_Estaticos( 11, "systm\\Tpv.img"); // Imprime botones estaticos 'Seccion 1'
// Si no existe el empleado genrico, obtenemos el nombre del primer empleado
EmplNuevoRegistro( &SEmpl );
SEmpl.CodigoR = 0;
if ( MatchVendedor( SEmpl.CodigoR ) == ERROR )
BEmpl.LeeReg( (void *)&SEmpl, 0 );
SCc.EntregadoCaja = 0;
CopiaDatosClnt();
MuestraDatosCCVentas();
do {
if ( CurrCol != oldCol )
{
oldCol = CurrCol; MuestraAyudaCCVentas( CurrCol );
}
MuestraCCVentas( CurrCol, INTENSO );
BPush = Comprueba_Secuencia( 12, RatonVentas );
MuestraCCVentas( CurrCol, 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()) == 255 )
break;
if ( key != 13 && key != 27 )
ungetch( key );
EditItemCCVentas( CurrCol );
if ( CurrCol == 0 )
{
// Busca al cliente cuyo c¢digo concuerde
if ( MatchCliente( SCc.CodCliente ) == ERROR )
{
CltNuevoRegistro( &SClt1 );
SCc.CodCliente = SClt1.Codigo;
strcpy( SCc.Nombre, "Cliente -NUEVO-" );
} else {
CopiaDatosClnt();
}
MuestraDatosCCVentas();
}
while( kbhit() ) getch();
break;
case -1: // Hay una tecla especial en BUFFER
switch( getch() )
{
// Flecha Izquierda
case 75:
case 15:
// Flecha Arriba
case 72:
CurrCol--; if ( CurrCol < 0 ) CurrCol = 0;
break;
// Flecha Derecha
case 77:
case 9:
// Flecha Abajo
case 80:
CurrCol++; if ( CurrCol > 9 ) CurrCol = 9;
break;
// Inicio
case 71:
CurrCol = 0;
// Fin
case 79:
CurrCol = 9;
break;
}
break;
// Aceptar
case 1:
Status = OK;
ok = 1;
break;
// Cancelar
case 2:
Status = ERROR;
ok = 1;
break;
// Busca a un cliente determinado, desplegando el cuadro de busqueda.
// Buscar Anterior
case 3:
OCRow = CurrRow; OCClnt = CurrClnt;
BuscaClt( ATRAS, &CurrRow, &CurrClnt );
if ( OCRow != CurrRow || OCClnt != CurrClnt )
CopiaDatosClnt();
MuestraDatosCCVentas();
break;
// Buscar
case 4:
OCRow = CurrRow; OCClnt = CurrClnt;
BuscaClt( NUEVA_BUSQUEDA, &CurrRow, &CurrClnt );
if ( OCRow != CurrRow || OCClnt != CurrClnt )
CopiaDatosClnt();
MuestraDatosCCVentas();
break;
// Buscar Posterior
case 5:
OCRow = CurrRow; OCClnt = CurrClnt;
BuscaClt( ADELANTE, &CurrRow, &CurrClnt );
if ( OCRow != CurrRow || OCClnt != CurrClnt )
CopiaDatosClnt();
MuestraDatosCCVentas();
break;
default:
break;
}
} while ( !ok );
ok = OK;
if ( Status == OK )
{
SVentas[0].CodigoVendedor = SEmpl.CodigoR;
if ( AsignarComprasCliente )
{
// Localizamos la ficha de ventas del cliente y le a¤adimos los productos
// que ha comprado, (solo c¢digo, cant. y total) el resto (nombre prod.)
// lo pillamos del archivo de venta de productos.
if ( MatchCliente( SCc.CodCliente ) == ERROR )
{
if ( Optar( 1, "-Cliente Nuevo-", "¨ Desea dar de alta,", "a este nuevo cliente?", NULL ) )
{
// Si el cliente en cuesti¢n no existe, habr  que crearlo...
CltNuevoRegistro( &SClt1 );
SClt1.Codigo = SCc.CodCliente;
strcpy( SClt1.Cif , SCc.CifNif );
strcpy( SClt1.Nombre , SCc.Nombre );
strcpy( SClt1.Direccion , SCc.Direccion );
strcpy( SClt1.Localidad , SCc.Localidad );
strcpy( SClt1.Provincia , SCc.Provincia );
SClt1.CodPostal = SCc.CodPostal;
// Habrimos la base de datos de clientes y lo insertamos
CltNuevoEnlace( &SClt1 );
BClt1.EscribeReg( (void *)&SClt1, BClt1.RegActual() );
} else {
ok = ERROR;
}
}
// Solo si el cliente existe, o lo dio de alta, le a¤adimos sus compras
if ( ok != ERROR )
{
/*
if ( MatchCCliente( SClt1.CodEnlace ) == ERROR )
{
SClt2[0].MesDia = (int)(S_IVentas.Mes<<8) || S_IVentas.Dia;
SClt2[0].CodigoR = SClt1.CodEnlace;
SClt2[0].Unidades = 0;
SClt2[0].Total = 0;
BClt2.InsReg( (void *)SClt2, BClt2.Registros(), ARRIBA );
}
MatchCCliente( SClt1.CodEnlace );
BClt2.LeeReg( (void *)SClt2, BClt2.RegActual() );
long NRegInicio = SClt2[0].Total;
SClt2[0].Total += NProductos;
*/
// Escribimos los productos que ha comprado
for ( i = 0; i < NProductos; i++/*, NRegInicio++ */ )
{
SClt2.CodEnlace = SClt1.CodEnlace;
SClt2/*[i+1+NRegInicio]*/.MesDia = (int)(S_IVentas.Mes<<8) || S_IVentas.Dia;
SClt2/*[i+1+NRegInicio]*/.CodigoR = SVentas[i].CodigoR;
SClt2/*[i+1+NRegInicio]*/.Unidades = SVentas[i].Cantidad;
SClt2/*[i+1+NRegInicio]*/.Total = SVentas[i].PrecioC;
BClt2.InsReg( (void *)&SClt2, BClt2.Registros(), ARRIBA );
}
// BClt2.EscribeReg( (void *)SClt2, BClt2.RegActual() );
}
}
// Ahora abrimos la base de datos -> Ventas a Clientes <- e insertamos la compra
}
// free( SClt2 );
BClt1.CerrarReg();
BClt2.CerrarReg();
#ifdef DEMOSTRACION
Optar( 0, "VERSION DEMO", "Registre el programa", "si realmente desea", "usarlo. ­­­Gracias!!!", NULL );
#endif
// Terminada la transaccion ( correcta o no ), redibujamos toda la pantalla
RedibujaPantallaVentas();
return Status;
}
#ifndef DEMOSTRACION
void MuestraDatosCCVentas(void)
{
int i;
// ...y los mostramos.
for ( i = 0; i < 11; i++ )
MuestraCCVentas( i, NORMAL );
}
#endif
void CopiaDatosClnt(void)
{
// Copiamos los datos del cliente a nuestra estructura...
SCc.CodCliente = SClt1.Codigo;
strcpy( SCc.CifNif , SClt1.Cif );
strcpy( SCc.Nombre , SClt1.Nombre );
strcpy( SCc.Direccion , SClt1.Direccion );
strcpy( SCc.Localidad , SClt1.Localidad );
strcpy( SCc.Provincia , SClt1.Provincia );
SCc.CodPostal = SClt1.CodPostal;
}
#ifndef DEMOSTRACION
/**************************************************************************\
|* *|
|* MuestraCCVentas *|
|* *|
|* Descripci¢n: *|
|* Reescribe el campo dado, seg£n la fila, y la intensidad *|
|* *|
|* Entradas: *|
|* columna campo ha mostar *|
|* como intensidad del texto (NORMAL/INTENSO) *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MuestraCCVentas( char columna, char como )
{
char buffer[80];
char buffer1[80];
int X0[]={ 240, 460, 240, 240, 240, 500, 240, 240, 400, 290, 475 },
Y0[]={ 171, 171, 191, 211, 231, 231, 251, 291, 291, 311, 311 },
X1[]={ 350, 575, 575, 575, 420, 575, 420, 330, 575, 380, 575 },
Y1[]={ 189, 189, 209, 229, 249, 249, 269, 309, 309, 329, 329 };
switch( columna )
{
// C¢digo del Cliente
case 0:
sprintf ( buffer, " %09lu", SCc.CodCliente );
break;
// Cif/Nif
case 1:
sprintf ( buffer, "%10s", SCc.CifNif );
break;
// Nombre del cliente
case 2:
sprintf ( buffer, " %27s", SCc.Nombre );
break;
// Direccion
case 3:
sprintf ( buffer, " %30s", SCc.Direccion );
break;
// Localidad
case 4:
sprintf ( buffer, " %15s", SCc.Localidad );
break;
// Cod. Post
case 5:
sprintf ( buffer, " %ld", SCc.CodPostal );
break;
// Provincia
case 6:
sprintf ( buffer, " %15s", SCc.Provincia );
break;
// Cod. Vendedor
case 7:
sprintf ( buffer, " %ld", SEmpl.CodigoR );
break;
// Nombre Vendedor
case 8:
sprintf ( buffer, " %15s %15s", SEmpl.Nombre, SEmpl.Apellido1 );
break;
// Entregado a caja
case 9:
formatea_u_long( (unsigned long)( SCc.EntregadoCaja ), buffer1 );
sprintf ( buffer, "%9s", buffer1 );
break;
// Devolver
case 10:
formatea_long( (unsigned long)( SCc.EntregadoCaja - TotalVendido ), buffer1 );
sprintf ( buffer, "%9s", buffer1 );
break;
}
setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI );
bar( X0[columna], Y0[columna], X1[columna], Y1[columna] );
setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI );
outtextxy( X0[columna]+2, Y0[columna], buffer );
}
#endif
/**************************************************************************\
|* *|
|* MuestraCCAyudaVentas *|
|* *|
|* Descripci¢n: *|
|* Muestra una peque¤a descripcion del contenido para el campo *|
|* *|
|* Entradas: *|
|* columna campo ha mostar su ayuda *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MuestraAyudaCCVentas( char columna )
{
char buffer1[80];
switch( columna )
{
// Codigo del cliente
case 0:
sprintf ( buffer1, "C¢digo del cliente. (Si el cliente no existe se crear )" );
break;
// Nif/Cif
case 1:
sprintf ( buffer1, "Nif/Cif o equivalente." );
break;
// Nombre del cliente
case 2:
sprintf ( buffer1, "Nombre ( para el cliente si este no existe )" );
break;
// Direcci¢n
case 3:
sprintf ( buffer1, "Direcci¢n del cliente" );
break;
// Localidad
case 4:
sprintf ( buffer1, "Localidad del Cliente" );
break;
// Cod. Post
case 5:
sprintf ( buffer1, "C¢digo postal del Cliente" );
break;
// Provincia
case 6:
sprintf ( buffer1, "Provincia del Cliente" );
break;
// Codigo de vendedor
case 7:
sprintf ( buffer1, "C¢digo del vendedor" );
break;
// Nombre del vendedor
case 8:
sprintf ( buffer1, "Nombre del vendedor (no modificable)" );
break;
// Entregado a caja
case 9:
sprintf ( buffer1, "Importe que el cliente entrega a caja." );
break;
// Devolver caja
case 10:
sprintf ( buffer1, "Devoluci¢n al cliente seg£n cantidad entregada." );
break;
}
// Ayuda reducida
setfillstyle( SOLID_FILL, EGA_BLACK ); bar( 7, 457, 498, 473 );
// Imprime la ayudita
setcolor( EGA_WHITE ); outtextxy( 7, 455, buffer1 );
}
/**************************************************************************\
|* *|
|* EditItemCCVentas *|
|* *|
|* Descripci¢n: *|
|* Se encarga de editar y validar el campo. *|
|* *|
|* Entradas: *|
|* columna campo ha editar *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void EditItemCCVentas( char columna )
{
char buffer[80];
int X0[]={ 240, 460, 240, 240, 240, 500, 240, 240, 400, 290, 475 },
Y0[]={ 171, 171, 191, 211, 231, 231, 251, 291, 291, 311, 311 },
X1[]={ 350, 575, 575, 575, 420, 575, 420, 330, 575, 380, 575 },
Y1[]={ 189, 189, 209, 229, 249, 249, 269, 309, 309, 329, 329 };
switch( columna )
{
// Codigo Cliente
case 0:
sprintf( buffer, "%ld", SCc.CodCliente );
if ( !( InputCadenaG( buffer, 1, 9, Config.TxtBgN, Config.TxtFgN, X0[columna], Y0[columna], X1[columna], Y1[columna]) >> 8 ) )
SCc.CodCliente = atol( buffer );
break;
// CIF/NIF Cliente
case 1:
strcpy( buffer, SCc.CifNif );
if ( !( InputCadenaG( buffer, 0, 10, Config.TxtBgN, Config.TxtFgN, X0[columna], Y0[columna], X1[columna], Y1[columna]) >> 8 ) )
strcpy( SCc.CifNif, buffer );
break;
// Nombre del Cliente
case 2:
strcpy( buffer, SCc.Nombre );
if ( !( InputCadenaG( buffer, 0, 25, Config.TxtBgN, Config.TxtFgN, X0[columna], Y0[columna], X1[columna], Y1[columna]) >> 8 ) )
strcpy( SCc.Nombre, buffer );
break;
// Direcci¢n
case 3:
strcpy( buffer, SCc.Direccion );
if ( !( InputCadenaG( buffer, 0, 30, Config.TxtBgN, Config.TxtFgN, X0[columna], Y0[columna], X1[columna], Y1[columna]) >> 8 ) )
strcpy( SCc.Direccion, buffer );
break;
// Localidad
case 4:
strcpy( buffer, SCc.Localidad );
if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0[columna], Y0[columna], X1[columna], Y1[columna]) >> 8 ) )
strcpy( SCc.Localidad, buffer );
break;
// Cod.Postal
case 5:
sprintf( buffer, "%ld", SCc.CodPostal );
if ( !( InputCadenaG( buffer, 1, 4, Config.TxtBgN, Config.TxtFgN, X0[columna], Y0[columna], X1[columna], Y1[columna]) >> 8 ) )
SCc.CodPostal = atol( buffer );
break;
// Provincia
case 6:
strcpy( buffer, SCc.Provincia );
if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0[columna], Y0[columna], X1[columna], Y1[columna]) >> 8 ) )
strcpy( SCc.Provincia, buffer );
break;
// C¢digo vendedor
case 7:
sprintf( buffer, "%ld", SEmpl.CodigoR );
if ( !( InputCadenaG( buffer, 1, 8, Config.TxtBgN, Config.TxtFgN, X0[columna], Y0[columna], X1[columna], Y1[columna]) >> 8 ) )
{
SEmpl.CodigoR = atol( buffer );
// si modifico el c¢digo de vendedor
if ( MatchVendedor( SEmpl.CodigoR ) == ERROR )
{
SEmpl.CodigoR = 0;
if ( MatchVendedor( SEmpl.CodigoR ) == ERROR )
BEmpl.LeeReg( (void *)&SEmpl, 0 );
}
MuestraCCVentas( 7, NORMAL );
MuestraCCVentas( 8, NORMAL );
}
break;
// Entregado a caja
case 9:
sprintf( buffer, "%ld", SCc.EntregadoCaja );
if ( !( InputCadenaG( buffer, 1, 5, Config.TxtBgN, Config.TxtFgN, X0[columna], Y0[columna], X1[columna], Y1[columna]) >> 8 ) )
SCc.EntregadoCaja = atol( buffer );
MuestraCCVentas( 10, NORMAL );
break;
default:
while( kbhit() ) getch();
break;
}
}
/*
& 110, 160, 580, 340, 7, 63, 56, 2, 2
| 120, 170, 2, 6, 0, 63, C¢d. Cliente: Cif/Nif:,
| 121, 171, 2, 6, 0, 0, C¢d. Cliente: Cif/Nif:,
& 240, 171, 350, 189, 63, 7, 56, 0, 2
& 460, 171, 575, 189, 63, 7, 56, 0, 2
| 120, 190, 2, 6, 0, 63, Nombre:,
| 121, 191, 2, 6, 0, 0, Nombre:,
& 240, 191, 575, 209, 63, 7, 56, 0, 2
| 120, 210, 2, 6, 0, 63, Direcci¢n:,
| 121, 211, 2, 6, 0, 0, Direcci¢n:,
& 240, 211, 575, 229, 63, 7, 56, 0, 2
| 120, 230, 2, 6, 0, 63, Localidad: Cod Post,
| 121, 231, 2, 6, 0, 0, Localidad: Cod Post,
& 240, 231, 420, 249, 63, 7, 56, 0, 2
& 500, 231, 575, 249, 63, 7, 56, 0, 2
| 120, 250, 2, 6, 0, 63, Provincia:,
| 121, 251, 2, 6, 0, 0, Provincia:,
& 240, 251, 420, 269, 63, 7, 56, 0, 2
| 120, 290, 2, 6, 0, 63, Cod.Vendedor: Nombre:,
| 121, 291, 2, 6, 0, 0, Cod.Vendedor: Nombre:,
& 240, 291, 330, 309, 63, 7, 56, 0, 2
& 400, 291, 575, 309, 63, 7, 56, 0, 2
| 120, 310, 2, 6, 0, 63, Entregado a caja: devolver:,
| 121, 311, 2, 6, 0, 0, Entregado a caja: devolver:,
& 290, 311, 380, 329, 63, 7, 56, 0, 2
& 475, 311, 575, 329, 63, 7, 56, 0, 2
*/