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

779 lines
30 KiB
C++
Raw 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
extern BDatos BRef; // Base de datos de Referencias
extern 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 MuestraDatosRef2( long RowStart );
void MuestraAyudaRef2( char columna );
void MuestraRef2( char columna, int linea, char como );
void ObtenCoordenadasRef2( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 );
/*************************************\
| |
| Parte Secundaria del M¢dulo |
| |
| Secci¢n de Busqueda de Productos |
| |
\*************************************/
extern void ObtenCoordenadasMatch( char Row, int *X0, int *Y0, int *X1, int *Y1 );
extern int BuscaRef( char TipoBusqueda, char *CurrRow, long *CurrRef );
extern void MatchDrawRef( char Row, INFO_PRODUCTOS MRef, char como );
extern int Match_Ref( INFO_PRODUCTOS A, INFO_PRODUCTOS B );
extern void EditMatchRef( char Row, INFO_PRODUCTOS * MRef );
extern int ObtenMatchRef( INFO_PRODUCTOS *MRef );
/*************************************\
| |
| Parte Tercera del M¢dulo |
| |
| Secci¢n para la impresi¢n |
| |
\*************************************/
void ImprimeStockActual();
int MuestraOrdenaciones( void );
int Ordenar( const void *A, const void *B );
char TIPO_ORDENACION;
// ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
// Û 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 InfoStock(void)
{
char buffer[100], ok = 0;
char buffer1[40];
int BPush;
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
unsigned long BenefTt,// Beneficio total ( de todos los productos ) -1-
CostoTt,// Costo total -2-
TtBruto;// Total bruto -3-
char SumaMostrar = 1;// ----------- Suma a mostrar, de las anteriores.
// Rellenamos la pantalla con un fondo atractivo...
setfillstyle( Config.FillBgS, Config.FillBgC ); bar( 0, 0, 640, 480 );
Imprime_Estaticos( 23, "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 )
{
Optar( 0, "Atencion !!!", "No existen referencias", "por lo tanto, no hay", "stock que evaluar...", NULL );
return;
}
// Recopilamos los datos sobre el Total de Beneficio, Costo, Bruto
BenefTt = CostoTt = TtBruto = 0;
for ( CurrRef = 0; CurrRef < BRef.Registros(); CurrRef++ )
{
if ( BRef.LeeReg( (void *)&SRef, CurrRef ) == ERROR )
break;
if ( !SRef.Combinado )
{
BenefTt += (long)( ( SRef.PrecioVenta[0] - SRef.PrecioCosto ) * SRef.Stock );
CostoTt += (long)( ( SRef.PrecioCosto ) * SRef.Stock );
TtBruto += (long)( ( SRef.PrecioVenta[0] ) * SRef.Stock );
} else {
if ( SRef.CantUnitaria != 0 )
{
BenefTt += (long)( (float)( ( SRef.PrecioVenta[0] - SRef.PrecioCosto ) * ( (float)SRef.Stock / (float)SRef.CantUnitaria ) ) );
CostoTt += (long)( (float)( ( SRef.PrecioCosto ) * ( (float)SRef.Stock / (float)SRef.CantUnitaria ) ) );
TtBruto += (long)( (float)( ( SRef.PrecioVenta[0] ) * ( (float)SRef.Stock / (float)SRef.CantUnitaria ) ) );
}
}
}
// Mostramos los datos anteriormente recopilados
setfillstyle( SOLID_FILL, Config.TxtBgN );
setcolor( Config.TxtFgN );
bar( 506, 456, 634, 474 );
formatea_u_long( BenefTt, buffer1);
sprintf( buffer, "Benef: %13s", buffer1);
settextstyle( SMALL_FONT, HORIZ_DIR, 4 );
outtextxy( 510, 458, buffer );
settextstyle( SMALL_FONT, HORIZ_DIR, 5 );
CurrRef = 0; CurrRow = 0;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosRef2( CurrRow + CurrRef );
if ( BRef.LeeReg( (void *)&SRef, 0 ) == ERROR )
Error( 1, BRef.cError);
CurrCol = 0;
do {
if ( CurrCol != oldCol || CurrCol == 2 )
{
oldCol = CurrCol; MuestraAyudaRef2( CurrCol );
}
MuestraRef2( CurrCol, CurrRow, INTENSO );
BPush = Comprueba_Secuencia( 2, NULL );
MuestraRef2( CurrCol, CurrRow, NORMAL );
switch ( BPush )
{
case 0: // No se pulso ningun BOTON
while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER
break;
case -2: // Hay una tecla normal en BUFFER
while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER
break;
case -1: // Hay una tecla especial en BUFFER
switch( getch() )
{
// Flecha Izquierda
case 75:
case 15:
CurrCol--; if ( CurrCol < 0 ) CurrCol = 4;
break;
// Flecha Derecha
case 77:
case 9:
CurrCol++; if ( CurrCol > 4 ) CurrCol = 0;
break;
// Flecha Arriba
case 72:
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
MuestraDatosRef2( CurrRef );
} else {
CurrRow --; if ( CurrRow < 0 ) CurrRow = 0;
}
}
if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR )
Error( 1, BRef.cError);
break;
// Flecha Abajo
case 80:
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
MuestraDatosRef2( CurrRef );
} else
CurrRow++;
}
if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR )
Error( 1, BRef.cError);
break;
// Inicio
case 71:
CurrRow = 0;
if ( CurrRef != 0 )
{
CurrRef = 0;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosRef2( CurrRef );
}
if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR )
Error( 1, BRef.cError);
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
MuestraDatosRef2( CurrRef );
}
if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR )
Error( 1, BRef.cError);
break;
}
break;
// Imprimir Referencias
case 1:
#ifndef DEMOSTRACION
ImprimeStockActual();
#else
Optar( 0, "VERSION DEMOSTRACION", "En esta versi¢n no se", "permite imprimir el Stock.", NULL );
#endif
break;
// Menu Principal
case 2:
ok = 1;
break;
// Eliminar
case 3:
break;
// Insertar
case 4:
break;
// 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
MuestraDatosRef2( CurrRef );
if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR )
Error( 1, BRef.cError);
#endif
break;
// Busqueda Atras
case 6:
if ( BuscaRef( ATRAS, &CurrRow, &CurrRef ) == OK )
{
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosRef2( CurrRow + CurrRef );
if ( BRef.LeeReg( (void *)&SRef, (CurrRow + CurrRef) ) == ERROR )
Error( 1, BRef.cError);
} 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
MuestraDatosRef2( CurrRow + CurrRef );
if ( BRef.LeeReg( (void *)&SRef, (CurrRow + CurrRef) ) == ERROR )
Error( 1, BRef.cError);
} 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
MuestraDatosRef2( CurrRow + CurrRef );
if ( BRef.LeeReg( (void *)&SRef, (CurrRow + CurrRef) ) == ERROR )
Error( 1, BRef.cError);
} 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
MuestraDatosRef2( CurrRef );
if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR )
Error( 1, BRef.cError);
#endif
break;
// Boton de uso general 1: ( ORDENACIONES )
case 10:
if ( MuestraOrdenaciones() == OK )
{
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosRef2( CurrRef );
if ( BRef.LeeReg( (void *)&SRef, (CurrRef + CurrRow) ) == ERROR )
Error( 1, BRef.cError);
}
break;
// Boton de uso general 2: ( SUMA BENEFICIOS, BRUTO, COSTO )
case 11:
SumaMostrar = (SumaMostrar++)%3;
// Borramos y mostramos lo deseado
setfillstyle( SOLID_FILL, Config.TxtBgN );
setcolor( Config.TxtFgN );
bar( 506, 456, 634, 474 );
switch( SumaMostrar )
{
case 1:
formatea_u_long( BenefTt, buffer1 );
sprintf( buffer, "Benef: %13s", buffer1 );
break;
case 2:
formatea_u_long( CostoTt, buffer1 );
sprintf( buffer, "Costo: %13s", buffer1 );
break;
case 3:
formatea_u_long( TtBruto, buffer1 );
sprintf( buffer, "Bruto: %13s", buffer1 );
break;
}
settextstyle( SMALL_FONT, HORIZ_DIR, 4 );
outtextxy( 510, 458, buffer );
settextstyle( SMALL_FONT, HORIZ_DIR, 5 );
break;
default:
break;
}
} while( !ok );
BRef.CerrarReg();
}
/**************************************************************************\
|* *|
|* MuestraOrdenaciones *|
|* *|
|* Descripci¢n: *|
|* Despliega un cuadro con las distintas posibilidades de ordenaci¢n *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
int MuestraOrdenaciones( 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( 25, "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 );
if ( dev != 0 )
{
TIPO_ORDENACION = dev -1;
BRef.SortReg( Ordenar );
return OK;
}
}
return ERROR;
}
int Ordenar( const void *A, const void *B )
{
switch( TIPO_ORDENACION )
{
case 0:
if ( (( INFO_PRODUCTOS *)A)->CodigoR > (( INFO_PRODUCTOS *)B)->CodigoR ) return 1;
if ( (( INFO_PRODUCTOS *)A)->CodigoR < (( INFO_PRODUCTOS *)B)->CodigoR ) return -1;
return 0;
break;
case 1:
return ( strcmp( (( INFO_PRODUCTOS *)A)->Descripcion, (( INFO_PRODUCTOS *)B)->Descripcion ) );
break;
case 2:
if ( (( INFO_PRODUCTOS *)A)->Stock > (( INFO_PRODUCTOS *)B)->Stock ) return 1;
if ( (( INFO_PRODUCTOS *)A)->Stock < (( INFO_PRODUCTOS *)B)->Stock ) return -1;
return 0;
break;
}
return 0;
}
/**************************************************************************\
|* *|
|* MuestraDatosRef2 *|
|* *|
|* 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 MuestraDatosRef2( 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 5 campos, ehhh!!!
for ( campo=0; campo < 5; campo++ )
MuestraRef2( 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 < 5; campo++ )
{
ObtenCoordenadasRef2( campo, linea, &X0, &Y0, &X1, &Y1 );
bar( X0, Y0, X1, Y1 );
}
}
}
/**************************************************************************\
|* *|
|* MuestraRef2 *|
|* *|
|* 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 MuestraRef2( char columna, int linea, char como )
{
char buffer[80], font;
char buffer1[80], buffer2[80];
int X0, Y0, X1, Y1;
ObtenCoordenadasRef2( columna, linea, &X0, &Y0, &X1, &Y1 );
if ( SRef.CantUnitaria == 0 ) SRef.CantUnitaria = 1;
font = 1;
switch( columna )
{
// Codigo Real
case 0:
sprintf ( buffer, " %09lu", SRef.CodigoR );
break;
// Nombre del producto
case 1:
sprintf ( buffer, "%30s", SRef.Descripcion );
break;
// Stock Actual ( Cant Und )
case 2:
if ( SRef.CantUnitaria == 1 )
{
formatea_long( (long)( SRef.Stock ), buffer1 );
sprintf ( buffer, "%9s", buffer1 );
} else {
formatea_long( (long)( SRef.Stock / SRef.CantUnitaria ), buffer1 );
formatea_long( (long)( SRef.Stock % SRef.CantUnitaria ), buffer2 );
sprintf ( buffer, "%6s %6s", buffer1, buffer2 );
font = 0;
}
break;
// Valoracion del Stock
case 3:
if ( !SRef.Combinado )
formatea_long( (long)( SRef.PrecioCosto * SRef.Stock ), buffer1 );
else
formatea_long( (long)( (float)( SRef.PrecioCosto * ( (float)SRef.Stock / (float)SRef.CantUnitaria ) ) ), buffer1 );
sprintf ( buffer, "%12s", buffer1 );
font = 0;
break;
// Beneficio estimado
case 4:
if ( !SRef.Combinado )
formatea_long( (long)( ( SRef.PrecioVenta[0] - SRef.PrecioCosto ) * SRef.Stock ), buffer1 );
else
formatea_long( (long)( (float)( ( SRef.PrecioVenta[0] - SRef.PrecioCosto ) * ( (float)SRef.Stock / (float)SRef.CantUnitaria ) ) ), buffer1 );
sprintf ( buffer, "%12s", buffer1 );
font = 0;
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 );
if ( font == 0 ) settextstyle( SMALL_FONT, HORIZ_DIR, 4 );
outtextxy( X0+2, Y0, buffer );
if ( font == 0 ) settextstyle( SMALL_FONT, HORIZ_DIR, 5 );
}
/**************************************************************************\
|* *|
|* MuestraAyudaRef2 *|
|* *|
|* Descripci¢n: *|
|* Muestra una peque¤a descripcion del contenido para el campo *|
|* *|
|* Entradas: *|
|* columna campo ha mostar su ayuda *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MuestraAyudaRef2( char columna )
{
char buffer1[80];
switch( columna )
{
// Codigo Real
case 0:
sprintf ( buffer1, "C¢digo del Producto" );
break;
// Nombre del producto
case 1:
sprintf ( buffer1, "Nombre del producto" );
break;
// Stock Actual ( desglosado )
case 2:
// sprintf ( buffer1, "Stock Actual ( desglosado en Cajas y Unds )" );
sprintf ( buffer1, "Stock Actual ( 1 Caja = %d Unidades )", SRef.CantUnitaria );
break;
// Valor aproximado
case 3:
sprintf ( buffer1, "Valor aproximado del stock" );
break;
// Beneficio Estimado
case 4:
sprintf ( buffer1, "Beneficio estimado del stock actual" );
break;
}
// Ayuda reducida
setfillstyle( SOLID_FILL, EGA_BLACK ); bar( 7, 457, 498, 473 );
// Imprime la ayudita
setcolor( EGA_WHITE ); outtextxy( 7, 457, buffer1 );
}
/**************************************************************************\
|* *|
|* ObtenCoordenadasRef2 *|
|* *|
|* 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 ObtenCoordenadasRef2( 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 = 98;
break;
case 1:
*X0 = 107; *X1 = 358;
break;
case 2:
*X0 = 367; *X1 = 450;
break;
case 3:
*X0 = 459; *X1 = 541;
break;
case 4:
*X0 = 550; *X1 = 633;
break;
}
*X0 += 2;
*X1 -= 2;
}
// ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
// Û Parte secundaria del m¢dulo Û
// Û Û
// Û Secci¢n de Busqueda de refecencias Û
// ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
#ifndef DEMOSTRACION
/**************************************************************************\
|* *|
|* ImprimeStockActual *|
|* *|
|* Descripci¢n: *|
|* Imprime todas las referencias seg£n se le indique *|
|* *|
|* Entradas: *|
|* Como imprimir las referencias *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void ImprimeStockActual(void)
{
long i, old_reg;
char buffer[80];
char buffer1[80];
char buffer2[80];
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;
fprintf( file_out, "C¢digo Descripci¢n Stock Valoraci¢n Beneficio\n\r" );
for ( i=0; i<BRef.Registros(); i++ )
{
BRef.LeeReg( (void *)&SRef, i );
if ( SRef.CantUnitaria == 0 ) SRef.CantUnitaria = 1;
if ( SRef.CantUnitaria == 1 )
{
formatea_long( (long)( SRef.Stock ), buffer1 );
sprintf ( buffer, "%10s", buffer1 );
} else {
formatea_long( (long)( SRef.Stock / SRef.CantUnitaria ), buffer1 );
formatea_long( (long)( SRef.Stock % SRef.CantUnitaria ), buffer2 );
sprintf ( buffer, "%4s %5s", buffer1, buffer2 );
}
fprintf( file_out, "%9lu %-30s %-10s ", SRef.CodigoR, SRef.Descripcion, buffer );
if ( !SRef.Combinado )
formatea_long( (long)( SRef.PrecioCosto * SRef.Stock ), buffer1 );
else
formatea_long( (long)( (float)( SRef.PrecioCosto * ( (float)SRef.Stock / (float)SRef.CantUnitaria ) ) ), buffer1 );
fprintf ( file_out, "%12s ", buffer1 );
if ( !SRef.Combinado )
formatea_long( (long)( ( SRef.PrecioVenta[0] - SRef.PrecioCosto ) * SRef.Stock ), buffer1 );
else
formatea_long( (long)( (float)( ( SRef.PrecioVenta[0] - SRef.PrecioCosto ) * ( (float)SRef.Stock / (float)SRef.CantUnitaria ) ) ), buffer1 );
fprintf ( file_out, "%12s\n\r", buffer1 );
}
if ( !Config.Impresora.Printer )
fclose( file_out );
BRef.LeeReg( (void *)&SRef, old_reg );
}
#endif