#include <dos.h>                // Estructuras varias

// Para generar una demostraci¢n: activar la macro generadora.
//   la demostraci¢n excluir  suficiente c¢digo como para no
//     poder generar el programa completo a travez de ASM.
//#define DEMOSTRACION

#define Pass_ReferArt 0
#define Pass_StockArt 1
#define Pass_VentaArt 2

#define Pass_InfoProv 3
#define Pass_CompProv 4

#define Pass_InfoEmpl 5
#define Pass_ClavEmpl 6
#define Pass_GrafEmpl 7

#define Pass_GenerCmp 8
#define Pass_GrafiCmp 9

#define Pass_ICajaGst 10
#define Pass_BalcDGst 11
#define Pass_BalcMGst 12
#define Pass_ClienGst 13

#define Pass_ProgrExt 14

#define Pass_MsgPrMsl 15
#define Pass_FA1      16
#define Pass_FA2      17
#define Pass_GBDxxMsl 18
#define Pass_PrExtMsl 19
#define Pass_CfgEnMsl 20

#define DIARIO         0
#define MENSUAL        1

#define NORMAL         0
#define INTENSO        1

#define ELIMINAR      -1
#define INSERTAR       1

#define ATRAS         -1
#define NUEVA_BUSQUEDA 0
#define ADELANTE       1

#define SEC_OPTAR      6
#define ENCUADRE       3

// Niveles de acceso al programa
#define TOTAL          0
#define USUARIO        1
#define NINGUNO        2

#define COMPRA         0
#define VENTA          1

struct hora
{
 char min;                      // Minutos y hora
 char hora;
};


struct VentaProductos
{
 struct hora HoraIni[5];
 struct hora HoraFin[5];

 char CambioHorario;
 char CambioPC;

 char ProcentajeMesa;
};

struct CajaDia
{
  char ImprimirTickets;
  char CobroCompleto;

  char PorcentajeMesa;

  char SaltarInicio;
};

typedef struct
{
 char Printer;
 char PrintTo[80];

 char Lineas;
 char Normal[80], Condensado[80];

 char PrincipioTickets[4][25+1];
 char FinTickets[4][25+1];
} IMPRESORA;

typedef struct
{
 char FillBgS, FillBgC, FillBgF;
 char NumFg, NumBg, NumLn;
 char DigFg, DigBg;
 char TxtBgN, TxtBgI, TxtFgN, TxtFgI;

 IMPRESORA Impresora;

 struct VentaProductos VProductos;

 struct CajaDia OpcionesCaja;

 char   TProtector;
 double Protector;

 char Prot_fnt[80];
 char Vent_msg[80];

 char HorasMedicion[6];

 long UltimaEmpresa;
 char Intentos;

} CONFIG;


#define TOTAL_COMPRAS_ANUAL  17*300
 /**************************************************************************\
|*                                                                          *|
|* Estructura de Clientes (2: Enlace de compras)                            *|
|*                                                                          *|
 \**************************************************************************/
typedef struct
{
 long CodEnlace;                   // Codigo de enlace para las fichas

 int MesDia;                       // 8 << Mes y Dia >> 8
                                   // Codigo de enlace si es el primer dato
 long CodigoR;                     // C¢digo real del producto

 char Unidades;                    // Unidades vendidas << 99

                                   // N§ de compras si es el primer dato
 long Total;                       // Precio Total Venta
} INFO_CLIENTES2;

 /**************************************************************************\
|*                                                                          *|
|* Estructura de Clientes (1: Fichas)                                       *|
|*                                                                          *|
 \**************************************************************************/
typedef struct
{
 long CodEnlace;                   // Codigo de enlace para las fichas

 long Codigo;                      // C¢digo de cliente
 char Cif[10+1];                   // Nif / Cif
 char Nombre[27+1];                // Nombre del cliente
 char DATOa01[27+1];               // Dato sin especificar 01
 char Direccion[27+1];             // Direccion del cliente
 char Localidad[15+1];             // Localidad
 char Provincia[15+1];             // Provincia
 long CodPostal;                   // Codigo Postal
 char Telefono1[15+1];             // Tel‚fono 1
 char Fax[15+1];                   // Tel‚fono 2

 char DATOa02[ 6+1];               // Dato sin especificar 01
 char DATOa03[ 6+1];               // Dato sin especificar 01
 char DATOa04[ 6+1];               // Dato sin especificar 01
 char DATOa05[ 6+1];               // Dato sin especificar 01

 char Notas[5][30+1];              // Notas sobre el cliente

} INFO_CLIENTES1;

 /**************************************************************************\
|*                                                                          *|
|* Estructura de Empresas                                                   *|
|*                                                                          *|
 \**************************************************************************/
typedef struct
{
 long CodigoR;                     // Codigos asiignados a los proveedores
 char Empresa[30+1];               // Nombre del proveedor
 char GestorEmpresa[30+1];         // Actividad del proveedor

 char Cif[10+1];                   // Cif / Nif

 char Telefono1[15+1];             // Tel‚fono y fax del proveedor
 char Fax[15+1];                   //

 char IP_tlf[15+1];                // Direccion IP / Telefono para conectar
 char AccessCode[15+1];            // Codigo de acceso

 char Direccion[37+1];             // Direccion
 char Numero[3+1];                 // Numero

 char Poblacion[15+1];             // Poblacion
 char Provincia[15+1];             // Provincia
 long CodPost;                     // C¢digo Postal

 char Estrellas;                   // Estrellas ( lo que imagina el cliente )

 char Notas[4][37+1];                // Breves notas....

} INFO_EMPRESAS;


 /**************************************************************************\
|*                                                                          *|
|* Estructura de PROVEEDORES                                                *|
|*                                                                          *|
 \**************************************************************************/
typedef struct
{
 long CodigoR;                     // Codigos asiignados a los proveedores
 char Proveedor[30+1];             // Nombre del proveedor
 char ActividadProveedor[30+1];    // Actividad del proveedor

 char Cif[10+1];                   // Cif / Nif

 char Telefono1[15+1];             // Tel‚fono y fax del proveedor
 char Fax[15+1];                   //

 char Direccion[30+1];             // Direccion
 char Numero[3+1];                 // Numero

 char Poblacion[15+1];             // Poblacion
 char Provincia[15+1];             // Provincia
 long CodPost;                     // C¢digo Postal

 char Estrellas;                   // Estrellas ( lo que imagina el cliente )

 char Notas[4][37+1];                // Breves notas....

 long Compras[12][31];             // Compras en el a¤o a ese proveedor

} INFO_PROVEEDORES;

 /**************************************************************************\
|*                                                                          *|
|* Estructura con la infomaci¢n especifica de un producto.                  *|
|*                                                                          *|
 \**************************************************************************/
typedef struct
{
 unsigned char Categoria;       // Otros, Refresco, Tapas, Barriles...

 unsigned long CodigoR;         // Codigo real del producto
 unsigned long CodigoB;         // Codigo de barras asociado al producto

 char Descripcion[30+1];        // Nombre del Producto

 unsigned int CantUnitaria;              // # de productos por unidad

 long PrecioCosto;              // Precio de costo
 long PrecioVenta[5];           // P.V.P seg£n horas definidas por el usuario...

 long Stock;                    // # de productos actualmente

                                // Codigos asociados a este producto ( COMBINADOS )
 unsigned long CodigosAsociados[10];
 char Combinado;                // Se activa si hay codigos asociados,
                                // combirtiendose en un combinado...

} INFO_PRODUCTOS;

 /**************************************************************************\
|*                                                                          *|
|* Estructura con la infomaci¢n generica de los productos.                  *|
|*                                                                          *|
 \**************************************************************************/
typedef struct
{
 struct hora hora_ini[5];       // Horas de inicio y finalizacion para
 struct hora hora_fin[5];       // ventas especiales...

 char PorcentMesa;              // Porcentaje de mas para la mesa

} INFO_VENTA_PRODUCTOS;

 /**************************************************************************\
|*                                                                          *|
|* Estructura para las compras                                              *|
|*                                                                          *|
 \**************************************************************************/
typedef struct
{
 unsigned long CodigoR;         // Codigo REAL del producto
 char Descripcion[30+1];        // Nombre del producto
 unsigned int Cantidad;         // # productos comprados

 long CodigoProveedor;

 long PrecioCosto;              // Precio de costo || C lculo interno:
                                // Cantidad_por_Unidades * PrecioCosto
} COMPRAS;

 /*********************************************\
|*                                             *|
|*   Infome Ventas ( Archivo mensual 3 de 3 )  *|
|*                                             *|
 \*********************************************/
   /************************************************************************\
  |*                                                                        *|
  |* Estructura para las ventas diarias.                                    *|
  |*                                                                        *|
   \************************************************************************/
   typedef struct
   {

      unsigned long CodigoR;    // Codigo REAL del producto
      struct hora HoraV;        // Hora en la que se realiz¢ la venta

      char BarraMesa;           // Vendido en Barra o en Mesa

      unsigned int Cantidad;    // # productos vendidos
      unsigned long PrecioV;    // Precio Venta del producto

      unsigned long PrecioC;    // Precio Costo del Producto

                                // C¢digo del vendedor
      unsigned long CodigoVendedor;

    } VENTAS;

   /************************************************************************\
  |*                                                                        *|
  |* Datos esenciales de una venta diaria  ( < 256 bytes )                  *|
  |*                                                                        *|
   \************************************************************************/
   typedef struct
   {
     hora AperturaCaja;         // Hora de apertura
     hora CierreCaja;           // Hora de cierre de caja

     char Dia, Mes;             // Dia, mes y A¤o de la transacci¢n
     int Anyo;

     int Tickets;
     int Cambio;

     int  SalidasExito;         // Salidas con exito
     int  IntentosSalir;        // Intentos de salir al men£ principal
   } INFORMACION_VENTAS;

 /**************************************************************************\
|*                                                                          *|
|* Estructura para guardar las posiciones de los c¢digos                    *|
|*                                                                          *|
 \**************************************************************************/
typedef struct
{
 unsigned long CodigoR;
 unsigned long CodigoB;

 unsigned int Posicion;
} BUSQUEDA_REF;


 /*********************************************\
|*                                             *|
|*   Infome Ventas ( Archivo mensual 3 de 3 )  *|
|*                                             *|
 \*********************************************/
   /************************************************************************\
  |*                                                                        *|
  |* Datos unicos para cada dia, archivo mensual ( 1 de 3 )                 *|
  |*                                                                        *|
   \************************************************************************/
   typedef struct
   {

      char Hora[6];             // Horas que desea controlar este dia
      long TotalVendido[6];     // Totales vendido ( segun hora venta )
      long CosteTotal;          // Coste total de lo vendido
      long TotalVentas;         // Venta total de este dia ( Suma de TVendido )
      int  Tickets;             // N§ de tickets
      int  Cambio;              // Veces que se ha habierto la caja
      int  IntentosSalir;       // Intentos de salir al men£ principal
      int  SalidasExito;        // Salidas con exito
      hora AperturaCaja;        // Hora inicial en que se abri¢ la caja
      hora CierreCaja;          // Hora en que se cerr¢ la caja

      char Notas[7][50+1];      // Notas sobre la caja del dia

   } INFORME1_VENTAS;

   /************************************************************************\
  |*                                                                        *|
  |* Datos sobre como se vendieron los productos ( Archivo Mensual 2 de 3 ) *|
  |*                                                                        *|
   \************************************************************************/
   typedef struct
   {

      long CodigoR;             // Codigo Real del Producto
      char Nombre[30+1];        // Nombre del Producto
                                // Cantidad de producto vendida segun horas,
                                //  y dia de venta ( 1, 2, ..., 31 )
                                // Cantidad unitaria de producto
      unsigned int  CantUnitaria;
      unsigned int  Cantidad[31][6];
                                // Precio de venta ( el dia de venta )
      unsigned long VentaTotal[31];
                                // Precio de costo ( el dia de venta )
      unsigned long PrecioCosto[31];

   } INFORME2_VENTAS;

   /************************************************************************\
  |*                                                                        *|
  |* Informe sobre cuanto vendi¢ cada empleado.  ( Archivo Mensual 2 de 3 ) *|
  |*                                                                        *|
   \************************************************************************/
   typedef struct
   {

     unsigned long CodigoR;     // Codigo Real del Vendedor
     char Vendedor[30+1];       // Nombre del Vendedor

                                // Total que Vendi¢ por dia de cada mes
     unsigned long TotalVendido[31][12];

   } INFORME3_VENTAS;


 /**************************************************************************\
|*                                                                          *|
|* Estructura para guardar la info de los empleados                         *|
|*                                                                          *|
 \**************************************************************************/
typedef struct
{
  long CodigoR;

  char Nombre[15+1];
  char Apellido1[15+1];
  char Apellido2[15+1];

  char Direccion[25+1];
  char Num[4+1];
  char Piso[4+1];

  char Poblacion[15+1];
  char Provincia[15+1];

  long CodPostal;

  char Telefono1[15+1];
  char Telefono2[15+1];

  char NIF[10+1];

  struct date InicioContrato;
  struct date FinContrato;

  char Acceso[30];

  char Password[15];

  char TEMP[45];
  char Observaciones[4][60];

} INFO_EMPLEADOS;


 /**************************************************************************\
|*                                                                          *|
|* Estructura para el informe de datos varios...                            *|
|*                                                                          *|
 \**************************************************************************/
typedef struct
{
    // Empresas
    int  NumEmpr;        // N£mero de empresas
    long EmprAct;        // C¢digo de empresa actual
    char NEmpresa[80];   // Nombre de la empresa

    // Articulos
    long NumProd;        // N£mero de productos

    // Proveedores
    int  NumProv;        // N£mero de proveedores

    // Empleados
    int  NumEmpl;        // N£mero de empleados

    //  Compras          // N£mero de compras en el mes
    int  NumComp[2];     // y compras en el dia actual.

    // Datos de interes vario
    long EspacioCon;     // Espacio consumido por el prorg.
    long EspacioLib;     // Espacio libre en disco.
} DatosInformativos;


 /**************************************************************************\
|*                                                                          *|
|* Estructura para los mensajes que se muestran en pantalla                 *|
|*                                                                          *|
 \**************************************************************************/
typedef struct
{

 char TEspera;          // Segundos de espera para pasar al siguiente bloque

 char Desplaz[6];       // Indicador si se desplaza o no.

 char Mensaje1[6][20+1];// Mensaje que se va a mostrar
 char Mensaje2[6][20+1];// Mensaje que se va a mostrar
 char Mensaje3[6][20+1];// Mensaje que se va a mostrar

 char CFg[6], CBg[6];   // Colores de 1er plano y fondo para cada linea

} MENSAJES;


 /**************************************************************************\
|*                                                                          *|
|* Estructura para el Cobro completo                                        *|
|*                                                                          *|
 \**************************************************************************/
typedef struct
{

 long EntregadoCaja;

 long CodCliente;

 char CifNif[10+1];                // Cif / Nif
 char Nombre[27+1];                // Nombre y Apellidos
 char Direccion[30+1];             // Direccion
 char Localidad[15+1];             // Localidad
 char Provincia[15+1];             // Provincia
 long CodPostal;                   // C¢digo Postal

} S_CobroCompleto;

//ÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜß
//ÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜß
//ÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜß
//ÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜßÜß


extern struct date FechaGestionActual;

extern CONFIG Config;
extern char NEmpresa[80];




extern char led_on [18] [18];
extern char led_off [18] [18];
extern char flecha  [18] [18];

int  Optar( int optar, ... );
void ponicono(int x,int y,char matriz[18][18], char pos);
void formatea_u_long( unsigned long Numero, char *Inter_Chg);
void formatea_long( long Numero, char *Inter_Chg);
int  InputCadenaG(char *s, int numalp, int lmax, int cc, int cf, int X0, int Y0, int X1, int Y1);
int  EditComentario( char *Comentario, int Lineas, int Columnas, int cc, int cf, int X0, int Y0, int X1, int Y1, int Inc );

int  CalculaAjusteDias( char *Ajuste, char *DiasMes, char Mes, int Anyo );
void TextoDoble( int x, int y, char *texto );
void AnulaInterrupcion(void);

extern char IntVect;
extern char VisualMode;

void Error( int code, char *MensajeError );

extern int far RatonVentas(void);

// Pide la clave de usuario
char PideClaveUsuario( void );
char *PideClave( char *LineaVentana, char *Comprobante );
void MuestraGraficas( int PosX, int PosY, int xWidth, int yWidth, int NDatos, long *Datos, char Mensajes[][12] );


// M¢dulo para el inicio de caja
void VentasDiarias(void);

// M¢dulo para el Balance diario
void BalanceDiario_Mensual( char DiarioMensual );

// M¢dulo de referencias
void InfoProductos(void);

// Informacion sobre el stock
void InfoStock(void);

// M¢dulo de Compras
void ComprasDiarias( int NivelAcceso );

// Informacion de los proveedores
void InfoProveedores(void);

// Configuraci¢n de los mensajes para el protector de pantalla
void ConfigurarMensajes(void);

// Informacion de los empleados
void InfoEmpleados(void);

// Informacion acceso de los empleados
void PassEmpleados(void);

// Informacion comrpas a proveedores
void InformeCompras( void );

// Informacion de las empresas disponibles
void InfoEmpresas( void );

// Sirve para escoger la empresa a tratar
void EscogeEmpresaActiva( void );

// Venta de productos por meses
void InfoVentaProductos( void );

// Graficas sobre compras en el mes
void GraficaCompras( void );

// Cambia las opciones de configuraci¢n.
void ConfigurarEntorno( void );

// Gr ficas de ventas por empleado
void GraficaVentaEmpleados( void );

// Ficha de Clientes
void FichaClientes( void );

// Compra de los Clientes
void CompraClientes( void );

// Datos de Clientes
void DatosClientes( void );