TPVwin/TpvVentas.cpp
2021-09-12 22:19:30 +02:00

1752 lines
59 KiB
C++

//---------------------------------------------------------------------------
#include <io.h>
#include <vcl.h>
#pragma hdrstop
#define DEBUG
#ifdef EXIST_CFG
#include "TpvCFG.h"
#endif
#include "TpvVentas.h"
#include "TDlgBuscar.h"
// #include "TpvVntCtbl.h"
#include "TpvVntFctPrint.h"
#include "TpvVntAlbPrint.h"
//---------------------------------------------------------------------------
#pragma link "Grids"
#pragma link "DigitNum"
#pragma link "LetreroDigital"
#pragma link "ElastFrm"
#pragma resource "*.dfm"
TVentas *Ventas;
#define NUM_TERMINAL_ACTUAL 10
#define clQREADY clLime
//---------------------------------------------------------------------------
__fastcall TVentas::TVentas(TComponent* Owner)
: TForm(Owner)
{
EsAlbaran = true;
TerminalActual = NUM_TERMINAL_ACTUAL;
ActualizandoTOTALES = false;
FocoRapido = true;
LetreroDigital1 -> FuenteRAW = ExtractFilePath(Application->ExeName) + "systm\\8x8.fnt";
try {
BtmOK = new Graphics::TBitmap();
BtmOK -> LoadFromFile( "Systm\\ok.bmp" );
} catch (...) {
ShowMessage( "Error: La imagen OK! está corrupta" );
}
// Mostramos el dialogo, buscar [Productos]
DlgBuscarProd = new TDlgBuscar(this);
DlgBuscarProd -> TbBusquedas -> TableName = "Tb_Ref";
DlgBuscarProd -> TbBusquedas -> Active = true;
TbProdCircular -> IndexFieldNames = "CodProdC";
TbProdCircular -> MasterFields = "ForcedIndex";
TbProdCircular -> MasterSource = DlgBuscarProd -> DsBusquedas;
TbProdCircular -> Active = true;
TbCartera -> Active = true;
//---------
// Imprimir (SI/NO)
ImprimirTicket = !ImprimirTicket; PideTicketClick( 0 );
TbVentasC -> TableName = "Ventas (cabecera).db";
TbVentasD -> TableName = "Ventas (cuerpo).db";
TbVentasI -> TableName = "Ventas (caja).db";
TbVentasAbiertas -> TableName = TbVentasC -> TableName;
TbInfoClt -> Active = true; // Información de los clientes
TbInfoEmpl -> Active = true; // Información de los empleados
TbVentasI -> Active = true; // Información sobre la caja del día
TbVentasC -> Active = true; // Cabecera de la factura
TbVentasD -> Active = true; // Datos de la factura
TbVentasF -> Active = true; // Números de factura
// Sus cálculos se basan en la existencia de las tablas "InfoClt'&'InfoEmpl"
TbVentasAbiertas -> Active = true; // Facturas pendiente de cierre
// Preparamos e inicializamos una factura NUEVA...
NuevaFacturaCliente();
//---------
}
//---------------------------------------------------------------------------
void __fastcall TVentas::SpeedButton5Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TVentas::NuevaFacturaCliente(void)
{
bool OneOpen = false;
// Localizamos las fichas del Empleado por defecto...
if ( ! ( TbInfoEmpl -> Locate( "CodCliente1", 1, TLocateOptions() << loCaseInsensitive ) ) )
{
ShowMessage( "ERROR: Vendedor Anómimo no encontrado\n-->CIERRE LA APLICACIÖN <<-" );
Close();
}
// Localizamos las fichas del Cliente por defecto...
if ( ! ( TbInfoClt -> Locate( "CodCliente1", 1, TLocateOptions() << loCaseInsensitive ) ) )
{
ShowMessage( "ERROR: Cliente Anómimo no encontrado\n-->CIERRE LA APLICACIÖN <<-" );
Close();
}
TbVentasAbiertas -> Refresh();
TbVentasAbiertas -> DisableControls();
TbVentasAbiertas -> First();
while ( ! TbVentasAbiertas -> Eof )
{
if ( TbVentasAbiertas->FieldByName("TotalSin")->AsInteger == 0 &&
TbVentasAbiertas->FieldByName("CodFactura")->AsInteger == 0
)
{
OneOpen = true;
TbVentasC->GotoCurrent( TbVentasAbiertas );
TbVentasC->Edit();
TbVentasC->FieldByName("FechaFactura")->AsDateTime = TDateTime::CurrentDate();
TbVentasC->FieldByName("HoraFactura")->AsDateTime = TDateTime::CurrentTime();
TbVentasC->Post();
break;
}
try {
TbVentasAbiertas -> Next();
} catch(...) {
break;
}
}
TbVentasAbiertas -> EnableControls();
if ( ! OneOpen )
{
// Insertamos (y hacemos que sea el actual), un nuevo registro
// Cód. Factura
TbVentasC->Insert();
TbVentasC->FieldByName("CodCliente")->AsInteger = TbInfoClt->FieldByName( "CodCliente1" )->AsInteger;
TbVentasC->FieldByName("CodEmpleado")->AsInteger = TbInfoEmpl->FieldByName( "CodCliente1" )->AsInteger;
TbVentasC->FieldByName("FechaFactura")->AsDateTime = TDateTime::CurrentDate();
TbVentasC->FieldByName("HoraFactura")->AsDateTime = TDateTime::CurrentTime();
TbVentasC->FieldByName("TotalSin")->AsInteger = 0;
TbVentasC->FieldByName("TotalIva")->AsInteger = 0;
TbVentasC->FieldByName("FacturaAbierta")->AsInteger = TerminalActual;
TbVentasC->FieldByName("UltimoPago")->AsDateTime = TDateTime::CurrentDate();
TbVentasC->FieldByName("TotalFrac")->AsInteger = 0;
TbVentasC->FieldByName("FormaPago")->AsInteger = 0;
TbVentasC->FieldByName("NumeroPagos")->AsInteger = 0;
TbVentasC->FieldByName("ImprimirNotas")->AsBoolean = false;
TbVentasC->FieldByName("Contabilizada")->AsBoolean = 0;
TbVentasCCodFactura -> AsInteger = 0;
TbVentasC->Post();
}
// Reseteamos los totales de compra...
DigitNum1 -> Value = 0;
DigitNum2 -> Value = 0;
StatusBar1->Panels->Items[2]->Text = "";
TbVentasAbiertas -> Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbVentasCNewRecord(TDataSet *DataSet)
{
// Fecha / Hora Factura
TbVentasCFormaPago->AsInteger = 0;
TbVentasCUltimoPago -> AsDateTime = TDateTime::CurrentDate();
TbVentasCFechaAlbaran -> AsDateTime = TDateTime::CurrentDate();
TbVentasCFechaFactura -> AsDateTime = TDateTime::CurrentDate();
TbVentasCHoraFactura -> AsDateTime = TDateTime::CurrentTime();
// Terminal que abrió la cuenta...
TbVentasCFacturaAbierta -> AsInteger = TerminalActual;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::BusqClienteClick(TObject *Sender)
{
// Mostramos la zona de busqueda de clientes...
// Mostramos el dialogo, buscar Vendedores
TDlgBuscar *DlgBuscar;
DlgBuscar = new TDlgBuscar(this);
DlgBuscar -> DefaultField = "Nombre";
DlgBuscar -> TbBusquedas -> TableName = TbInfoClt -> TableName;
DlgBuscar -> TbBusquedas -> Active = true;
DlgBuscar -> ShowModal();
if ( DlgBuscar -> ModalResult == mrOk )
{
TbVentasC -> Edit();
TbVentasCCodCliente -> AsInteger = DlgBuscar -> TbBusquedas -> FieldByName( "CodCliente1" ) -> AsInteger;
TbVentasC->FieldByName("Banco_Entidad" )->Value = DlgBuscar->TbBusquedas->FieldByName("Banco_Entidad" )->Value;
TbVentasC->FieldByName("Banco_Sucursal" )->Value = DlgBuscar->TbBusquedas->FieldByName("Banco_Sucursal" )->Value;
TbVentasC->FieldByName("Banco_DC" )->Value = DlgBuscar->TbBusquedas->FieldByName("Banco_DC" )->Value;
TbVentasC->FieldByName("Banco_NumCuenta" )->Value = DlgBuscar->TbBusquedas->FieldByName("Banco_NumCuenta" )->Value;
TbVentasC -> Post();
}
delete DlgBuscar;
// Levamos el foco a donde debe...
if ( FocoRapido )
QCodigo->SetFocus();
else
DBGrid1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TVentas::BusqVendedorClick(TObject *Sender)
{
// Mostramos el dialogo, buscar Vendedores
TDlgBuscar *DlgBuscar;
DlgBuscar = new TDlgBuscar(this);
DlgBuscar -> Filter = "[Empleado] >= 1";
DlgBuscar -> DefaultField = "Nombre";
DlgBuscar -> TbBusquedas -> TableName = TbInfoEmpl -> TableName;
DlgBuscar -> TbBusquedas -> Active = true;
DlgBuscar -> ShowModal();
if ( DlgBuscar -> ModalResult == mrOk )
{
TbVentasC -> Edit();
TbVentasCCodEmpleado -> AsInteger = DlgBuscar -> TbBusquedas -> FieldByName( "CodCliente1" ) -> AsInteger;
TbVentasC -> Post();
// Y sincronizamos las bases de datos
// TbInfoEmpl -> GotoCurrent( DlgBuscar -> TbBusquedas );
}
delete DlgBuscar;
// Levamos el foco a donde debe...
if ( FocoRapido )
QCodigo->SetFocus();
else
DBGrid1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbVentasDCalcFields(TDataSet *DataSet)
{
Currency Cdto;
Cdto = TbVentasDPrecioC -> AsCurrency * TbVentasDCantidad -> AsFloat;
Cdto = Cdto * ( 1 - ( TbVentasD->FieldByName("Dto")->AsCurrency / 100 ) );
TbVentasDSubTotal -> AsCurrency = Cdto;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbVentasAbiertasCalcFields(TDataSet *DataSet)
{
Set<TLocateOption,0,1> flags;
flags << loCaseInsensitive;
// 1º Obtenemos el Nombre del Cliente
if ( TbInfoClt -> Locate( "CodCliente1", TbVentasAbiertasCodCliente->AsInteger, flags ) )
TbVentasAbiertasNombreCliente -> AsString = TbInfoClt -> FieldByName( "Nombre" ) -> AsString + ", " + TbInfoClt -> FieldByName( "Apellidos" ) -> AsString;
else
TbVentasAbiertasNombreCliente -> AsString = "No Encontrado: " + TbVentasCCodCliente -> AsString;
// 2º Obtenemos el Nombre del Vendedor
if ( TbInfoEmpl -> Locate( "CodCliente1", TbVentasAbiertasCodEmpleado -> Value, flags ) )
TbVentasAbiertasNombreVendedor -> AsString = TbInfoEmpl -> FieldByName( "Nombre" ) -> AsString + ", " + TbInfoEmpl -> FieldByName( "Apellidos" ) -> AsString;
else
TbVentasAbiertasNombreVendedor -> AsString = "No Encontrado: " + TbVentasCCodEmpleado -> AsString;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::bFicharTicketClick(TObject *Sender)
{
if ( TbVentasD -> RecordCount > 0 )
{
FicharTicket();
TbVentasI -> Edit();
TbVentasI -> FieldByName( "Tickets" ) -> AsInteger ++;
TbVentasI -> Post();
} else {
TbVentasI -> Edit();
TbVentasI -> FieldByName( "Cambios" ) -> AsInteger ++;
TbVentasI -> Post();
EfectuarCambio();
}
#ifdef EXIST_CFG
if ( CFG->CajonMonedas->Checked )
CFG->AbrirCajon();
#endif
// Levamos el foco a donde debe...
if ( FocoRapido )
QCodigo->SetFocus();
else
DBGrid1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TVentas::EfectuarCambio(void)
{
// Nothing...
}
//---------------------------------------------------------------------------
void __fastcall TVentas::AsignarNumFactura(void)
{
int NumFactura = 0;
#ifdef EXIST_CFG
try {
NumFactura = CFG->SigFactura->Text.ToInt();
} catch(...) {
// continuamos
NumFactura = 0;
}
#endif
if ( NumFactura <= 0 )
{
TbVentasF->Last();
NumFactura = TbVentasF->FieldByName( "idF" )->AsInteger + 1;
}
#ifdef EXIST_CFG
else
CFG->SigFactura->Text = "0";
#endif
TbVentasF->InsertRecord( ARRAYOFCONST( ( NumFactura, TbVentasC->FieldByName( "EnlaceFactura" )->AsInteger, true ) ) );
TbVentasC -> Edit();
TbVentasC -> FieldByName( "CodFactura" ) -> AsInteger = NumFactura;
TbVentasC -> FieldByName("Contabilizada")->AsBoolean = true;
TbVentasCFechaFactura -> AsDateTime = TDateTime::CurrentDate();
TbVentasC -> Post();
}
//---------------------------------------------------------------------------
void __fastcall TVentas::FicharTicket(void)
{
TbVentasC -> Edit();
TbVentasC -> FieldByName( "FacturaAbierta" ) -> AsInteger = 0;
TbVentasC -> Post();
EsAlbaran = false;
#ifdef EXIST_CFG
switch ( CFG->alFacturar->ItemIndex )
{
// 0 ...siempre
case 0:
AsignarNumFactura();
break;
// 1 ...solo a clientes
case 1:
if ( TbVentasC->FieldByName( "CodCliente" )->AsInteger > 1 )
AsignarNumFactura();
else
EsAlbaran = true;
break;
// 2 ...a clientes y preguntar otros
case 2:
if ( TbVentasC->FieldByName( "CodCliente" )->AsInteger > 1 )
{
AsignarNumFactura();
} else {
if ( MessageDlg( "¿Facturar, ahora?", mtConfirmation, TMsgDlgButtons() << mbNo << mbYes, 0 ) == mrYes )
{
AsignarNumFactura();
} else {
EsAlbaran = true;
}
}
break;
// 3 ...preguntar siempre
case 3:
if ( MessageDlg( "¿Facturar, ahora?", mtConfirmation, TMsgDlgButtons() << mbNo << mbYes, 0 ) == mrYes )
{
AsignarNumFactura();
} else {
EsAlbaran = true;
}
break;
// 4 ...nunca
case 4:
EsAlbaran = true;
break;
}
#else
if ( TbVentasC->FieldByName( "CodCliente" )->AsInteger > 1 )
AsignarNumFactura();
#endif
TbVentasC->FlushBuffers();
TbVentasD->FlushBuffers();
// Muestra cuadro Entregado/Cambio
//**** ***************(##########);
// Imprime Factura / Ticket
//**** ***************(##########);
if ( ImprimirTicket )
SpeedButton11Click( 0 );
NuevaFacturaCliente();
TbVentasAbiertas -> Refresh();
DBGrid1 -> SelectedField = DBGrid1 -> Fields[0];
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TabSheet4Enter(TObject *Sender)
{
// Refrescamos el listado de cuentas abiertas...
TbVentasAbiertas -> Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TVentas::FormClose(TObject *Sender, TCloseAction &Action)
{
// Destruimos la imagen de OK!
delete BtmOK;
try {
// Si no hay productos en la factura... La eliminamos...
if ( TbVentasD -> RecordCount == 0 && ( TbVentasC -> State == dsInsert || TbVentasC -> State == dsEdit ) )
TbVentasC -> Delete();
if ( TbVentasD->State == dsEdit || TbVentasD->State == dsInsert )
TbVentasD->Post();
if ( TbVentasC->State == dsEdit || TbVentasC->State == dsInsert )
TbVentasC->Post();
if ( TbVentasI->State == dsEdit || TbVentasI->State == dsInsert )
TbVentasI->Post();
} catch(...) {
ShowMessage( "Error Eliminando factura vacia.\nVentas Cierre" );
}
try {
TbVentasI -> Edit();
TbVentasI -> FieldByName( "Fin" ) -> AsDateTime = TDateTime::CurrentTime();
#ifdef _COMPLETO
TbVentasI -> FieldByName( "ExitoSalir" ) -> AsInteger++;
#else
TbVentasI -> FieldByName( "IntentosSalir" ) -> AsInteger++;
#endif
TbVentasI -> Post();
} catch(...) {
ShowMessage( "Error altamente grave.\nVentas Cierre" );
}
// Eliminamos el dialogo, buscar [Productos]
delete DlgBuscarProd;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbVentasDCodProductoSetText(TField *Sender,
const AnsiString Text)
{
// ## Cambiado 09/08/01
// AnsiString oldCodProducto;
int oldCodProducto;
Currency TParcial;
bool Localizado = true;
// ## Cambiado 09/08/01
// oldCodProducto = Sender -> AsString;
oldCodProducto = TbVentasD->FieldByName( "CodProductoAux" )->AsInteger;
TParcial = TbVentasDPrecioC -> AsCurrency * Currency( ( TbVentasDCantidad -> AsFloat ) );
TParcial = TParcial * (1 - ( TbVentasD -> FieldByName( "Dto" ) -> AsCurrency / 100 ) );
SUMAcompraC -= TParcial;
if ( ! TbVentasD -> FieldByName( "IVA" ) -> IsNull )
IVAcompraC -= ( TParcial / 100 ) * Currency( (int)( TbVentasD -> FieldByName( "IVA" ) -> AsInteger ) );
Sender -> AsString = Text;
// Localizacion del producto
DlgBuscarProd -> TbBusquedas -> Filtered = false;
if ( DlgBuscarProd -> TbBusquedas -> Locate( "ID Producto", Text, TLocateOptions() << loCaseInsensitive ) )
{
/***********************\ */
TbVentasD->FieldByName( "CodProductoAux" )->AsInteger = DlgBuscarProd -> TbBusquedas -> FieldByName( "ForcedIndex" ) -> AsInteger;
TbVentasD->FieldByName( "NombreProducto" )->AsString = DlgBuscarProd -> TbBusquedas -> FieldByName( "Nombre del Producto" ) -> AsString;
TbVentasD->FieldByName( "IVA" )->AsCurrency = DlgBuscarProd->TbBusquedas->FieldByName( "I.V.A" )->AsCurrency;
/***********************\ */
TbVentasDPrecioC -> AsCurrency = GetPrecioVenta( DlgBuscarProd -> TbBusquedas );
if ( oldCodProducto != TbVentasD->FieldByName( "CodProductoAux" )->AsInteger )
{
ActualizaStock( oldCodProducto,
+1 * TbVentasD -> FieldByName( "Cantidad" ) -> AsFloat );
ActualizaStock( TbVentasD->FieldByName( "CodProductoAux" )->AsInteger,
-1 * TbVentasD -> FieldByName( "Cantidad" ) -> AsFloat );
}
} else {
Localizado = false;
TbVentasD -> FieldByName( "CodProductoAux" ) -> AsInteger = 0;
TbVentasD -> FieldByName( "NombreProducto" ) -> AsString = "[##SU PRODUCTO##]";
}
if ( TbVentasDCantidad -> AsFloat <= 0 )
TbVentasDCantidad -> AsFloat = 1;
ActualizaTotales();
#ifdef EXIST_CFG
if ( !CFG->Codigo_y_Unidad->Checked )
{
#endif
if ( Localizado )
{
DBGrid1 -> SelectedField = DBGrid1 -> Fields[0];
TbVentasD -> Next();
if ( TbVentasD -> Eof )
{
TbVentasD -> Append();
}
}
#ifdef EXIST_CFG
}
#endif
}
//---------------------------------------------------------------------------
Currency __fastcall TVentas::GetPrecioVenta( TTable *Sender )
{
Currency dev;
dev = Sender -> FieldByName( "Precio Venta 1" ) -> AsCurrency;
return dev;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbVentasDCantidadSetText(TField *Sender,
const AnsiString Text)
{
Currency TParcial;
// ## Cambiado 09/08/01
// ActualizaStock( TbVentasDCodProducto -> AsString,
ActualizaStock( TbVentasDCodProductoAux -> AsInteger,
+1 * TbVentasDCantidad -> AsFloat );
TParcial = TbVentasDPrecioC -> AsCurrency * Currency( (int)( Sender -> AsInteger ) );
TParcial = TParcial * (1 - ( TbVentasD -> FieldByName( "Dto" ) -> AsCurrency / 100 ) );
SUMAcompraC -= TParcial;
if ( ! TbVentasD -> FieldByName( "IVA" ) -> IsNull )
IVAcompraC -= ( TParcial / 100 ) * Currency( (int)( TbVentasD -> FieldByName( "IVA" ) -> AsInteger ) );
try {
Sender -> AsFloat = Text.ToDouble();
} catch(...) {
Sender->AsFloat = 1;
}
ActualizaTotales();
// ## Cambiado 09/08/01
// ActualizaStock( TbVentasDCodProducto -> AsString,
ActualizaStock( TbVentasDCodProductoAux -> AsInteger,
-1 * TbVentasDCantidad -> AsFloat );
}
//---------------------------------------------------------------------------
void __fastcall TVentas::DBGrid1ColExit(TObject *Sender)
{
if ( TbVentasD -> State == dsEdit )
try {
TbVentasD -> Post();
}catch(...){
// Do nothing
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbVentasDBeforeDelete(TDataSet *DataSet)
{
// No nos olvidemos de anular todo esto (Y del STOCK)
// ## Cambiado 09/08/01
// ActualizaStock( TbVentasD -> FieldByName( "CodProducto" ) -> AsString,
ActualizaStock( TbVentasD -> FieldByName( "CodProductoAux" ) -> AsInteger,
+1 * TbVentasD -> FieldByName( "Cantidad" ) -> AsFloat );
Currency TParcial;
TParcial = TbVentasDPrecioC -> AsCurrency * Currency( ( TbVentasDCantidad -> AsFloat ) );
TParcial = TParcial * (1 - ( TbVentasDDto->AsFloat / 100 ) );
SUMAcompraC -= TParcial;
if ( ! TbVentasDIVA->IsNull )
IVAcompraC -= TParcial * ( TbVentasDIVA->AsCurrency / 100 );
ActualizandoTOTALES = true;
TbVentasC -> Edit();
TbVentasC -> FieldByName( "TotalSin") -> AsCurrency = SUMAcompraC;
TbVentasC -> FieldByName( "TotalIva") -> AsCurrency = IVAcompraC;
TbVentasC -> Post();
ActualizandoTOTALES = false;
int Number = (int)( ( SUMAcompraC + IVAcompraC ) * 100);
DigitNum1 -> Value = Number / 100;
DigitNum2 -> Value = Number % 100;
StatusBar1->Panels->Items[2]->Text = FormatCurr("###,###,###.#0 €", Number/16638.6 );
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbVentasDNombreProductoSetText(TField *Sender,
const AnsiString Text)
{
if ( ( TbVentasDCodProducto -> AsString ) . IsEmpty() )
{
Sender -> AsString = Text;
TbVentasD -> FieldByName( "CodProductoAux" ) -> AsInteger = 0;
}
}
//---------------------------------------------------------------------------
// ## Cambiado 09/08/2001
// void __fastcall TVentas::ActualizaStock( AnsiString CodProducto, float Cantidad )
void __fastcall TVentas::ActualizaStock( int CodProducto, float Cantidad )
{
TStringList *ListaCombinados;
ListaCombinados = new TStringList;
DlgBuscarProd -> TbBusquedas -> Filtered = false;
// ## Cambiado 09/08/2001
// if ( DlgBuscarProd -> TbBusquedas -> Locate( "ID Producto", CodProducto, TLocateOptions()<<loCaseInsensitive ) )
if ( CodProducto > 0 )
// ## Cambiado 09/08/2001
// ActualizaStockMultiple( DlgBuscarProd -> TbBusquedas -> FieldByName( "ForcedIndex" ) -> AsInteger, Cantidad, ListaCombinados );
ActualizaStockMultiple( CodProducto, Cantidad, ListaCombinados );
delete ListaCombinados;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::ActualizaStockMultiple( int CodProducto, float Cantidad, TStringList *ListaCombinados )
{
// Localizamos el CodProducto y actualizamos
short i;
typedef struct AList
{
int CodProd;
float Cantidad;
} TAList;
typedef TAList* PAList;
if ( DlgBuscarProd -> TbBusquedas -> Locate( "ForcedIndex", CodProducto, TLocateOptions()<<loCaseInsensitive ) )
{
if ( DlgBuscarProd -> TbBusquedas -> FieldByName( "COMBINADO" ) -> AsBoolean == false )
{
// No es un combinado (Actualizamos directamente)
DlgBuscarProd -> TbBusquedas -> Edit();
DlgBuscarProd -> TbBusquedas -> FieldByName( "Stock Actual" ) -> AsInteger += Cantidad;
DlgBuscarProd -> TbBusquedas -> Post();
} else {
// No hemos pasado por él aun ( Evitar códigos ciclicos )
if ( ListaCombinados -> IndexOf( CodProducto ) == -1 )
{
ListaCombinados -> Add( CodProducto );
PAList AStruct;
TList *ListaProdC = new TList;
// Productos a seguir
while ( ! TbProdCircular -> Eof )
{
AStruct = new TAList;
AStruct->CodProd = TbProdCircular -> FieldByName( "CodProdE" ) -> AsInteger;
AStruct->Cantidad = TbProdCircular -> FieldByName( "Cantidad" ) -> AsFloat;
ListaProdC->Add(AStruct);
TbProdCircular -> Next();
}
// Recorremos todos los productos (Circulares) que forman este combinado
for ( i = 0; i < ListaProdC -> Count; i++ )
{
AStruct = (PAList) ListaProdC->Items[i];
ActualizaStockMultiple( AStruct->CodProd, Cantidad*(AStruct->Cantidad), ListaCombinados );
}
delete ListaProdC;
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::BitBtn2Click(TObject *Sender)
{
#ifdef DEM001
ShowMessage( "Esta función ha sido deshabilitada para esta versión.\nPongase en contacto con el autor, si desea\nel módulo correspondiente: jd@infdj.com" );
#else
// Si la factura actual, no tiene asignado ningún producto, ¿PARA QUE CAMBIAR?
if ( TbVentasD -> RecordCount == 0 )
{
ShowMessage( "Imposible abrir otra sesión,\n existiendo una LIBRE." );
} else {
// Creamos una nueva factura
NuevaFacturaCliente();
}
#endif
// Levamos el foco a donde debe...
if ( FocoRapido )
QCodigo->SetFocus();
else
DBGrid1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TVentas::bCancelarTicketClick(TObject *Sender)
{
bool RecorrerAbiertas = true;
// Ok! Eliminamos la factura en curso
TbVentasC -> Delete();
//////////////////////////////////////////////////////////////////////
if ( RecorrerAbiertas )
{
TbVentasAbiertas -> Refresh();
if ( TbVentasAbiertas -> RecordCount > 0 )
{
TbVentasAbiertas -> First();
TbVentasC -> GotoCurrent( TbVentasAbiertas );
} else
NuevaFacturaCliente();
} else
NuevaFacturaCliente();
//////////////////////////////////////////////////////////////////////
// Levamos el foco a donde debe...
if ( FocoRapido )
QCodigo->SetFocus();
else
DBGrid1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbVentasCBeforeDelete(TDataSet *DataSet)
{
// Mostramos la advertencia... (Solo si hay algún registro...)
if ( TbVentasD -> RecordCount > 0 )
switch( MessageDlg( "Atención, está apunto de eliminar\el albaran/factura en curso...\n¿Realmente desea continuar?", mtWarning, TMsgDlgButtons() << mbNo << mbYes, 0 ) )
{
case mrNo:
Abort();
break;
default:
// Borramos cada uno de los producto que contiene la facura...
while ( TbVentasD -> RecordCount > 0 )
{
try {
TbVentasD -> Delete();
}catch(...){
break;
}
}
TbVentasI -> Edit();
TbVentasI -> FieldByName( "Cancelados" ) -> AsInteger ++;
TbVentasI -> Post();
break;
};
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbVentasDPrecioCSetText(TField *Sender,
const AnsiString Text)
{
Currency TParcial;
if ( TbVentasD->FieldByName("CodProductoAux")->AsInteger != 0 )
{
if ( !CFG->CambioPrecioProdExistente->Checked )
return;
}
TParcial = Sender -> AsCurrency * Currency( ( TbVentasDCantidad -> AsFloat ) );
TParcial = TParcial * (1 - ( TbVentasD -> FieldByName( "Dto" ) -> AsCurrency / 100 ) );
SUMAcompraC -= TParcial;
if ( ! TbVentasD -> FieldByName( "IVA" ) -> IsNull )
IVAcompraC -= ( TParcial / 100 ) * Currency( (int)( TbVentasD -> FieldByName( "IVA" ) -> AsInteger ) );
try {
Sender->AsString = Text;
} catch(...) {
Sender->AsCurrency =0;
}
ActualizaTotales();
}
//---------------------------------------------------------------------------
void __fastcall TVentas::DBGrid1KeyPress(TObject *Sender, char &Key)
{
short int Salto;
switch( Key )
{
case VK_RETURN:
if ( DBGrid1 -> EditorMode )
{
Key = 0;
if ( DBGrid1 -> SelectedIndex >= 5 )//Fields[DBGrid1 -> SelectedIndex + 2] == NULL )
{
DBGrid1 -> SelectedField = DBGrid1 -> Fields[0];
TbVentasD -> Next();
if ( TbVentasD -> Eof )
{
TbVentasD -> Append();
}
} else {
Salto = 1;
switch ( DBGrid1 -> SelectedIndex )
{
case 0:
if ( ! TbVentasDCodProducto -> AsString . IsEmpty() )
Salto = 5;
break;
case 1:
Salto = 2;
break;
}
DBGrid1 -> SelectedIndex += Salto;
}
}
break;
case '.':
Key = ',';
break;
case '+':
// Fichamos el ticket actual --> si el REGISTRO ACTUAL esta vacio
if ( DBGrid1->SelectedField == DBGrid1 -> Fields[0] &&
DBGrid1->Fields[0]-> AsString . IsEmpty()
)
{
Key = 0;
bFicharTicketClick(0);
}
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::DBGrid4DblClick(TObject *Sender)
{
// Sincronizamos la base de datos principal...
TbVentasC -> GotoCurrent( TbVentasAbiertas );
// Mostramos la solapa inicial
PageControl1 -> ActivePage = TabSheet1;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::DsVentasCDataChange(TObject *Sender,
TField *Field)
{
// Actualizamos los totales...
/*
Currency TParcial;
SUMAcompraC = 0;
IVAcompraC = 0;
TbVentasD -> DisableControls();
TbVentasD -> First();
do
{
TParcial = TbVentasDPrecioC -> AsCurrency * TbVentasDCantidad -> AsFloat;
TParcial = TParcial * (1 - ( TbVentasD -> FieldByName( "Dto" ) -> AsCurrency / 100 ) );
SUMAcompraC += TParcial;
if ( ! TbVentasD -> FieldByName( "IVA" ) -> IsNull )
IVAcompraC += TParcial * ( 1 + (TbVentasD -> FieldByName( "IVA" ) -> AsCurrency / 100) );
try {
TbVentasD -> Next();
} catch(...) {
// nothing
break;
}
}while( ! TbVentasD -> Eof );
TbVentasD -> EnableControls();
if ( TbVentasC -> FieldByName( "TotalSin") -> AsCurrency != SUMAcompraC ||
TbVentasC -> FieldByName( "TotalIva") -> AsCurrency != IVAcompraC )
ShowMessage( "ERROR LOS TOTALES SON DISCORDANTES\n\t" + TbVentasC -> FieldByName( "TotalSin") -> AsString + "\n\t" + TbVentasC -> FieldByName( "TotalIva") -> AsString );
*/
if ( !ActualizandoTOTALES )
{
cbFormaPago->ItemIndex = TbVentasC->FieldByName( "FormaPago" )->AsInteger;
SUMAcompraC = TbVentasC -> FieldByName( "TotalSin") -> AsCurrency;
IVAcompraC = TbVentasC -> FieldByName( "TotalIva") -> AsCurrency;
}
int Number = (int)( ( SUMAcompraC + IVAcompraC ) * 100);
DigitNum1 -> Value = Number / 100;
DigitNum2 -> Value = Number % 100;
StatusBar1->Panels->Items[2]->Text = FormatCurr("###,###,###.#0 €", Number/16638.6 );
}
//---------------------------------------------------------------------------
void __fastcall TVentas::DBGrid1DrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,
TGridDrawState State)
{
if ( ! State.Contains(gdSelected) )
{
if ( TbVentasDCantidad -> AsFloat < 0 )
{
DBGrid1->Canvas->Font->Color = clGreen;
DBGrid1->DefaultDrawColumnCell( Rect, DataCol, Column, State );
}
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbVentasDNewRecord(TDataSet *DataSet)
{
// Por defecto una unidad...
// TbVentasDCantidad -> AsInteger = 1;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::DBGrid4CellClick(TColumn *Column)
{
// Sincronizamos la base de datos principal...
TbVentasC -> GotoCurrent( TbVentasAbiertas );
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbVentasIBeforeOpen(TDataSet *DataSet)
{
#ifdef TB_DISCONTINUAS
AnsiString FileEmp;
FileEmp = TbVentasI -> TableName;
if ( access( FileEmp.c_str(), 0 ) != 0 )
{
// Establecemos la ruta
TbVentasI -> DatabaseName = "TpvWin";
// Facilitamos el nombre de la nueva tabla y su tipo
TbVentasI -> TableType = ttParadox;
// Usamos la propiedad FielDefs para definir
// las columnas que contendrá la tabla
TbVentasI -> FieldDefs -> Clear();
TbVentasI -> FieldDefs -> Add("FechaCaja", ftDate, 0, false );
TbVentasI -> FieldDefs -> Add("Inicio", ftTime, 0, false );
TbVentasI -> FieldDefs -> Add("Fin", ftTime, 0, false );
TbVentasI -> FieldDefs -> Add("IntentosSalir", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("ExitoSalir", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Tickets", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Cancelados", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Cambios", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Cantidad x1", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Total x1", ftInteger, 0, false );
TbVentasI -> FieldDefs -> Add("Cantidad x5", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Total x5", ftInteger, 0, false );
TbVentasI -> FieldDefs -> Add("Cantidad x10", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Total x10", ftInteger, 0, false );
TbVentasI -> FieldDefs -> Add("Cantidad x25", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Total x25", ftInteger, 0, false );
TbVentasI -> FieldDefs -> Add("Cantidad x50", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Total x50", ftInteger, 0, false );
TbVentasI -> FieldDefs -> Add("Cantidad x100", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Total x100", ftInteger, 0, false );
TbVentasI -> FieldDefs -> Add("Cantidad x200", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Total x200", ftInteger, 0, false );
TbVentasI -> FieldDefs -> Add("Cantidad x500", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Total x500", ftInteger, 0, false );
TbVentasI -> FieldDefs -> Add("Cantidad x1000", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Total x1000", ftInteger, 0, false );
TbVentasI -> FieldDefs -> Add("Cantidad x2000", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Total x2000", ftInteger, 0, false );
TbVentasI -> FieldDefs -> Add("Cantidad x5000", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Total x5000", ftInteger, 0, false );
TbVentasI -> FieldDefs -> Add("Cantidad x10000", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Total x10000", ftInteger, 0, false );
TbVentasI -> FieldDefs -> Add("Cantidad xvarios", ftSmallint, 0, false );
TbVentasI -> FieldDefs -> Add("Total xvarios", ftInteger, 0, false );
TbVentasI -> FieldDefs -> Add("Notas", ftMemo, 0, false );
TbVentasI -> IndexDefs-> Clear();
TbVentasI->IndexDefs->Add("Primary", "FechaCaja", TIndexOptions() << ixPrimary << ixUnique );
// Creamos la base...
TbVentasI -> CreateTable();
}
#endif
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbVentasCAfterOpen(TDataSet *DataSet)
{
// Localizamos el dia actual.
StatusBar1->Panels->Items[1]->Text = "Localizando registro de caja...";
if ( ! ( TbVentasI -> Locate( "FechaCaja", TDateTime::CurrentDate(), TLocateOptions()<<loCaseInsensitive ) ) )
{
StatusBar1->Panels->Items[1]->Text = "Inicilizando dia actual...";
// Inicializamos el dia
TbVentasI -> InsertRecord( OPENARRAY( TVarRec,
( // FechaCaja
(Variant)TDateTime::CurrentDate(),
// Inicio
(Variant)TDateTime::CurrentTime()
) ) );
}
StatusBar1->Panels->Items[1]->Text = "";
}
//---------------------------------------------------------------------------
void __fastcall TVentas::PideTicketClick(TObject *Sender)
{
#ifdef DEM001
static bool visto = true;
if ( !visto )
ShowMessage( "Esta función ha sido deshabilitada para esta versión.\nPongase en contacto con el autor, si desea\nel módulo correspondiente: Jose-David.Guillen@cs.us.es" );
visto = false;
#else
// Imprimir (SI/NO)
try {
ImprimirTicket = !ImprimirTicket;
if ( ImprimirTicket )
PideTicket -> Picture -> LoadFromFile( "systm\\On.bmp" );
else
PideTicket -> Picture -> LoadFromFile( "systm\\Off.bmp" );
} catch(...) {
PideTicket -> Picture -> LoadFromFile( "systm\\imerro.bmp" );
}
#endif
}
//---------------------------------------------------------------------------
void __fastcall TVentas::LoadMoldeClick(TObject *Sender)
{
#ifdef DEM001
ShowMessage( "Esta función ha sido deshabilitada para esta versión.\nPongase en contacto con el autor, si desea\nel módulo correspondiente: Jose-David.Guillen@cs.us.es" );
#else
/*nothing*/
#endif
}
//---------------------------------------------------------------------------
void __fastcall TVentas::SalvarMolde1Click(TObject *Sender)
{
#ifdef DEM001
ShowMessage( "Esta función ha sido deshabilitada para esta versión.\nPongase en contacto con el autor, si desea\nel módulo correspondiente: Jose-David.Guillen@cs.us.es" );
#else
/*nothing*/
#endif
}
//---------------------------------------------------------------------------
void __fastcall TVentas::EliminarX1Click(TObject *Sender)
{
#ifdef DEM001
ShowMessage( "Esta función ha sido deshabilitada para esta versión.\nPongase en contacto con el autor, si desea\nel módulo correspondiente: Jose-David.Guillen@cs.us.es" );
#else
/*nothing*/
#endif
}
//---------------------------------------------------------------------------
void __fastcall TVentas::dbgFraccionDrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,
TGridDrawState State)
{
if ( Column -> ID == 0 )
{
if ( TbCartera->FieldByName("Pagado")->AsBoolean )
{
dbgFraccion->Canvas->StretchDraw( Rect, BtmOK );
} else {
dbgFraccion->Canvas->Brush->Color = clWindow;
dbgFraccion->Canvas->FillRect( Rect );
}
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::ComboBoxChange(TObject *Sender)
{
/*
// Debemos cambiar todo lo fraccionado
if ( cbFormaPago->Items->Strings[cbFormaPago->ItemIndex] == "Contado" )
{
if ( Application->MessageBox("¿Eliminar todo el fraccionamiento de pagos?", "Alerta contable", MB_OKCANCEL ) != IDCANCEL )
{
while( !TbCartera->Eof ) // Eliminamos los pagos actuales
TbCartera->Delete();
dbgFraccion->Enabled = false;
Edit1->Enabled=false; Edit2->Enabled=false;
TbVentasC->Edit();
TbVentasC->FieldByName("UltimoPago")->AsDateTime = TDateTime::CurrentDate();
TbVentasC->Post();
} else {
cbFormaPago->ItemIndex = TbCartera->FieldByName("FormaPago")->AsInteger;
}
} else {
dbgFraccion->Enabled = true;
Edit1->Enabled=true; Edit2->Enabled=true;
TbCartera->First();
while( !TbCartera->Eof )
{
TbCartera->Edit();
TbCartera->FieldByName("FormaPago")->AsInteger = cbFormaPago->ItemIndex;
TbCartera->Post();
TbCartera->Next();
}
}
*/
ActualizandoTOTALES = true;
TbVentasC->Edit();
TbVentasC->FieldByName("FormaPago")->AsInteger = cbFormaPago->ItemIndex;
TbVentasC->Post();
ActualizandoTOTALES = false;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::Edit2Change(TObject *Sender)
{
bool pag; short int i; int npagos;
Currency Total = SUMAcompraC + IVAcompraC;
if ( Edit2->Text . IsEmpty() ) return;
try {
npagos = Edit2->Text.ToInt();
} catch(...) {
ShowMessage( "El número de veces a fraccionar el pago, no es correcto" );
return;
}
if ( npagos < 2 )
{
ShowMessage( "El número de veces a fraccionar el pago, no es correcto" );
return;
}
pag = false;
// Eliminamos todos los pagos acumulados (SOLO SI NO HAY NINGUN PAGO REALIZADO)
TbCartera->First();
while( !TbCartera->Eof )
if ( TbCartera->FieldByName("Pagado")->AsBoolean == true )
{
pag = true;
break;
}
if ( pag )
{
while( !TbCartera->Eof ) // Eliminamos los pagos actuales
TbCartera->Delete();
unsigned short year;
Total /= npagos;
TDateTime::CurrentDate().DecodeDate( &year, NULL, NULL);
// desde 1 para que inc. los meses
for ( i = 1; i <= npagos; i++ )
TbCartera->InsertRecord( ARRAYOFCONST( ( TbVentasC->FieldByName("EnlaceFactura")->AsInteger, Variant( EncodeDate( year, i, 1 ) ), Total, 0, cbFormaPago->ItemIndex, false ) ) );
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::Edit1Change(TObject *Sender)
{
bool pag; short int i; int npagos; int tpagos;
Currency Total = SUMAcompraC + IVAcompraC;
if ( Edit1->Text . IsEmpty() ) return;
try {
tpagos = Edit1->Text.ToInt();
} catch(...) {
ShowMessage( "La cantidad para fraccionar el pago, no es correcta" );
return;
}
if ( tpagos < 2000 )
{
ShowMessage( "La cantidad para fraccionar el pago, no es correcta" );
return;
}
pag = false;
// Eliminamos todos los pagos acumulados (SOLO SI NO HAY NINGUN PAGO REALIZADO)
TbCartera->First();
while( !TbCartera->Eof )
if ( TbCartera->FieldByName("Pagado")->AsBoolean == true )
{
pag = true;
break;
} else {
TbCartera->Next();
}
if ( pag )
{
while( !TbCartera->Eof ) // Eliminamos los pagos actuales
TbCartera->Delete();
unsigned short year;
npagos = Total / tpagos;
Total = tpagos;
TDateTime::CurrentDate().DecodeDate(&year, NULL, NULL);
// desde 1 para que inc. los meses
for ( i = 1; i <= npagos; i++ )
TbCartera->InsertRecord( ARRAYOFCONST( ( TbVentasC->FieldByName("EnlaceFactura")->AsInteger, Variant( EncodeDate( year, i, 1 ) ), Total, 0, cbFormaPago->ItemIndex, false ) ) );
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::DsCarteraDataChange(TObject *Sender,
TField *Field)
{
Edit2->Text = "";
Edit1->Text = "";
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbCarteraFechaChange(TField *Sender)
{
if ( (int)Sender->AsDateTime > (int)TbVentasC->FieldByName("UltimoPago")->AsDateTime )
{
TbVentasC->Edit();
TbVentasC->FieldByName("UltimoPago")->AsDateTime = Sender->AsDateTime;
TbVentasC->Post();
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbCarteraImporteSetText(TField *Sender,
const AnsiString Text)
{
TbVentasC->Edit();
TbVentasC->FieldByName("TotalFrac")->AsCurrency -= Sender->AsCurrency * ( 0.01 * TbCartera->FieldByName("Incremento")->AsCurrency );
TbVentasC->FieldByName("TotalFrac")->AsCurrency += Currency( Text ) * ( 0.01 * TbCartera->FieldByName("Incremento")->AsCurrency );
TbVentasC->Post();
Sender->AsString = Text;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbCarteraBeforeDelete(TDataSet *DataSet)
{
if ( TbCartera->FieldByName("Pagado")->AsBoolean == true )
{
ShowMessage( "No se pueden eliminar, fraccionamientos que ya han sido efectuados." );
Abort();
}
TbVentasC->Edit();
TbVentasC->FieldByName("TotalFrac")->AsCurrency -= TbCartera->FieldByName("Importe")->AsCurrency * ( 0.01 * TbCartera->FieldByName("Incremento")->AsCurrency );
TbVentasC->Post();
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbCarteraBeforeInsert(TDataSet *DataSet)
{
if ( !( TbVentasC -> RecNo > 0 && TbVentasC -> RecordCount > 0 ) &&
!( TbVentasD -> RecNo > 0 && TbVentasD -> RecordCount > 0 ) )
{
MessageDlg("¿ No cree que debería crear,\no seleccionar una factura CON DATOS,\nantes de intentar fracionar su pago?.", mtWarning, TMsgDlgButtons() << mbOK, 0);
Abort();
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbCarteraCalcFields(TDataSet *DataSet)
{
TbCartera->FieldByName("Total")->AsCurrency = TbCartera->FieldByName("Importe")->AsCurrency * ( 0.01 * TbCartera->FieldByName("Incremento")->AsCurrency );
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbCarteraNewRecord(TDataSet *DataSet)
{
TbCartera->FieldByName("Fecha")->AsDateTime = TDateTime::CurrentDate();
TbCartera->FieldByName("FormaPago")->AsInteger = cbFormaPago->ItemIndex;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbCarteraIncrementoSetText(TField *Sender,
const AnsiString Text)
{
TbVentasC->Edit();
TbVentasC->FieldByName("TotalFrac")->AsCurrency -= TbCartera->FieldByName("Importe")->AsCurrency * ( 0.01 * Sender->AsCurrency );
TbVentasC->FieldByName("TotalFrac")->AsCurrency += TbCartera->FieldByName("Importe")->AsCurrency * ( 0.01 * Currency( Text ) );
TbVentasC->Post();
Sender->AsString = Text;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::SpeedButton3Click(TObject *Sender)
{
#ifdef DEM001
ShowMessage( "Esta función ha sido deshabilitada para esta versión.\nPongase en contacto con el autor, si desea\nel módulo correspondiente: Jose-David.Guillen@cs.us.es" );
#else
// Mostramos el dialogo, buscar [Productos]
TDlgBuscar *DlgBuscarFactAlb;
DlgBuscarFactAlb = new TDlgBuscar(this);
DlgBuscarFactAlb -> TbBusquedas -> TableName = "Ventas (cabecera)";
DlgBuscarFactAlb -> Filter = "[FacturaAbierta] = '0' AND [FechaFactura] = '" + TDateTime::CurrentDate() +"'";
DlgBuscarFactAlb -> TbBusquedas -> Active = true;
DlgBuscarFactAlb -> ShowModal();
if ( DlgBuscarFactAlb -> ModalResult == mrOk )
{
if ( MessageDlg( "Albarán nº: " + DlgBuscarFactAlb->TbBusquedas->FieldByName("EnlaceFactura")->AsString +
"\nFactura asociada: " + DlgBuscarFactAlb->TbBusquedas->FieldByName("CodFactura")->AsString
+ "\n ¿ Eliminar ?", mtConfirmation, TMsgDlgButtons() << mbNo << mbYes, 0 ) == mrYes )
{
if ( DlgBuscarFactAlb->TbBusquedas->FieldByName("CodFactura")->AsInteger <= 0 )
{
TBookmark SavePlace;
SavePlace = TbVentasC->GetBookmark();
TbVentasC->GotoCurrent( DlgBuscar->TbBusquedas );
TbVentasC->Delete();
TbVentasC->GotoBookmark(SavePlace);
TbVentasC->FreeBookmark(SavePlace);
} else {
// Realizamos otra factura con importe negativo
// ################ PENDIENTE
ShowMessage( " Función no disponible\n1º Realizar copia factura (abono)\\n2º Ingresar los articulos en stock");
}
}
}
#endif
}
//---------------------------------------------------------------------------
void __fastcall TVentas::SpeedButton11Click(TObject *Sender)
{
#ifdef DEM001
ShowMessage( "Esta función ha sido deshabilitada para esta versión.\nPongase en contacto con el autor, si desea\nel módulo correspondiente: Jose-David.Guillen@cs.us.es" );
#else
bool iEsAlbaran = EsAlbaran;
TDlgBuscar *DlgBuscarFactAlb;
TTable *TbDATOS;
if ( Sender != 0 )
{
DlgBuscarFactAlb = new TDlgBuscar(this);
DlgBuscarFactAlb -> TbBusquedas -> TableName = TbVentasC -> TableName;
DlgBuscarFactAlb -> Filter = "[FechaFactura] = '" + TDateTime::CurrentDate() +"'";
DlgBuscarFactAlb -> TbBusquedas -> Active = true;
DlgBuscarFactAlb->ShowModal();
if ( DlgBuscarFactAlb -> ModalResult == mrOk )
{
if ( MessageDlg( "Albarán nº: " + DlgBuscarFactAlb->TbBusquedas->FieldByName("EnlaceFactura")->AsString +
"\nFactura asociada: " + DlgBuscarFactAlb->TbBusquedas->FieldByName("CodFactura")->AsString
+ "\n ¿ Volver a Imprimir ?", mtConfirmation, TMsgDlgButtons() << mbNo << mbYes, 0 ) == mrYes )
{
iEsAlbaran = DlgBuscarFactAlb->TbBusquedas->FieldByName("CodFactura")->AsInteger <= 0;
TbDATOS = DlgBuscarFactAlb->TbBusquedas;
} else
return;
} else {
delete DlgBuscarFactAlb;
return;
}
} else
TbDATOS = TbVentasC;
if ( iEsAlbaran )
{
// Imprime Ticket
TQRMDFacturaVnt1 *QRMDFacturaVnt;
// Creamos una ficha del tipo TProductos
// Guardando la referencia en la variable TProductos
QRMDFacturaVnt = new TQRMDFacturaVnt1(this);
// Mostrarla como modal y según el valor devuelto
QRMDFacturaVnt -> TbVntCabecera -> GotoCurrent( TbDATOS );
QRMDFacturaVnt -> Print();
/*
#ifdef DEBUG
QRMDFacturaVnt -> Preview();
#else
QRMDFacturaVnt -> Print();
#endif
*/
// Destruimos la ficha
delete QRMDFacturaVnt;
} else {
// Imprime factura
TQRMDFacturaVnt *QRMDFacturaVnt;
// Creamos una ficha del tipo TProductos
// Guardando la referencia en la variable TProductos
QRMDFacturaVnt = new TQRMDFacturaVnt(this);
// Mostrarla como modal y según el valor devuelto
QRMDFacturaVnt -> TbVntCabecera -> GotoCurrent( TbDATOS );
QRMDFacturaVnt -> Print();
/*
#ifdef DEBUG
QRMDFacturaVnt -> Preview();
#else
QRMDFacturaVnt -> Print();
#endif
*/
// Destruimos la ficha
delete QRMDFacturaVnt;
}
if ( Sender != 0 )
delete DlgBuscarFactAlb;
#endif
}
//---------------------------------------------------------------------------
void __fastcall TVentas::TbVentasDDtoSetText(TField *Sender,
const AnsiString Text)
{
Currency TParcial;
if ( Text.ToInt() > 15 )
{
ShowMessage( "Uff!, el descuento es demasiado grande.\nNosotros trabajamos con porcentajes demasiado pequeños\nIMPOSIBLE aplicar ese descuento..." );
} else {
TParcial = ( TbVentasDPrecioC -> AsCurrency * Currency( ( TbVentasDCantidad -> AsFloat ) ) );
TParcial = TParcial * (1 - ( Sender->AsCurrency / 100 ) );
SUMAcompraC -= TParcial;
if ( ! TbVentasD -> FieldByName( "IVA" ) -> IsNull )
IVAcompraC -= ( TParcial / 100 ) * Currency( (int)( TbVentasD -> FieldByName( "IVA" ) -> AsInteger ) );
Sender -> AsString = Text;
ActualizaTotales();
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::ActualizaTotales(void)
{
Currency TParcial;
int Number;
try {
TParcial = TbVentasDPrecioC -> AsCurrency * Currency( ( TbVentasDCantidad -> AsFloat ) );
TParcial = TParcial * (1 - ( TbVentasDDto->AsFloat / 100 ) );
SUMAcompraC += TParcial;
if ( ! TbVentasDIVA->IsNull )
IVAcompraC += TParcial * ( TbVentasDIVA->AsCurrency / 100 );
// Number = (int)( ( SUMAcompraC + IVAcompraC ) * 100 );
ActualizandoTOTALES = true;
TbVentasC -> Edit();
TbVentasC -> FieldByName( "TotalSin") -> AsCurrency = SUMAcompraC;
TbVentasC -> FieldByName( "TotalIva") -> AsCurrency = IVAcompraC;
TbVentasC -> Post();
ActualizandoTOTALES = false;
} catch(...) {
// nothing
ActualizandoTOTALES = false;
}
// DigitNum1 -> Value = Number / 100;
// DigitNum2 -> Value = Number % 100;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QPrecioChange(TObject *Sender)
{
try {
if ( !QUnds->Text.IsEmpty() && !QPrecio->Text.IsEmpty() && !QDto->Text.IsEmpty() )
QSubtotal->Text = QUnds->Text.ToDouble() * QPrecio->Text.ToDouble() * (1 - ( QDto->Text.ToInt() / 100 ) );
} catch(...) {
QSubtotal->Text = "";
QPrecio->Text = "";
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QUndsChange(TObject *Sender)
{
try {
if ( !QUnds->Text.IsEmpty() && !QPrecio->Text.IsEmpty() && !QDto->Text.IsEmpty() )
QSubtotal->Text = QUnds->Text.ToDouble() * QPrecio->Text.ToDouble() * (1 - ( QDto->Text.ToInt() / 100 ) );
} catch(...) {
QUnds->Text = "1";
QSubtotal->Text = QPrecio->Text.ToDouble() * (1 - ( QDto->Text.ToInt() / 100 ) );
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QDtoChange(TObject *Sender)
{
if ( !QUnds->Text.IsEmpty() && !QPrecio->Text.IsEmpty() && !QDto->Text.IsEmpty() )
QSubtotal->Text = QUnds->Text.ToDouble() * QPrecio->Text.ToDouble() * (1 - ( QDto->Text.ToInt() / 100 ) );
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QNProductoChange(TObject *Sender)
{
DlgBuscarProd -> TbBusquedas -> Filtered = false;
DlgBuscarProd -> TbBusquedas -> IndexName = "NombreProd";
if ( DlgBuscarProd -> TbBusquedas -> Locate( "Nombre Del Producto", QNProducto->Text, TLocateOptions() << loPartialKey << loCaseInsensitive ) )
{
QRellenaDatos(QNProducto->Text.Length());
} else {
StatusBar1->Panels->Items[3]->Text = "";
StatusBar1->Panels->Items[1]->Text = "";
QCodAux = 0;
QPrecio->Text="0";
QDto->Text="0";
QUnds->Text="1";
QSubtotal->Text="0";
QCodigo->Text="";
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QRellenaDatos(int start)
{
QNProducto->Text = DlgBuscarProd->TbBusquedas->FieldByName("Nombre Del Producto")->AsString;
if ( start == -1 )
{
QNProducto->SelStart = QNProducto->Text.Length();
QNProducto->SelLength = 0;
}else{
QNProducto->SelStart = start;
QNProducto->SelLength = QNProducto->Text.Length() - QNProducto->SelStart;
}
QCodAux = DlgBuscarProd -> TbBusquedas -> FieldByName( "ForcedIndex" ) -> AsInteger;
QCodigo->Text = DlgBuscarProd-> TbBusquedas->FieldByName( "ID Producto" )->AsString;
QIva->Text = DlgBuscarProd-> TbBusquedas->FieldByName( "I.V.A" )->AsString;
try {
if ( QUnds->Text.IsEmpty() || QUnds->Text.ToDouble() <= 0 ) QUnds->Text="1";
}catch(...){QUnds->Text="1";}
QDto->Text = "0";
QPrecio->Text = AnsiString( GetPrecioVenta( DlgBuscarProd -> TbBusquedas ) );
int Stock = DlgBuscarProd->TbBusquedas->FieldByName( "Stock Actual")->AsInteger;
StatusBar1->Panels->Items[3]->Text = (Stock <= 0) ? AnsiString("-No disponibles-") : AnsiString(Stock);
StatusBar1->Panels->Items[1]->Text = DlgBuscarProd->TbBusquedas->FieldByName( "Localizacion")->AsString;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QNProductoKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if ( Key == VK_DOWN )
{
if ( !DlgBuscarProd->TbBusquedas->Eof )
{
DlgBuscarProd->TbBusquedas->Next();
QRellenaDatos(-1);
}
}
if ( Key == VK_UP )
{
if ( !DlgBuscarProd->TbBusquedas->Bof )
{
DlgBuscarProd->TbBusquedas->Prior();
QRellenaDatos(-1);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QNProductoKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if ( Key == VK_BACK )
{
QNProducto->SelStart --;
QNProducto->SelLength = QNProducto->Text.Length() - QNProducto->SelStart;
Key = 0;
}
if ( Key == VK_RETURN )
{
if ( QPrecio->Text.IsEmpty() || ( QPrecio->Text.ToDouble() ) <= 0 )
QPrecio->SetFocus();
else
QUnds->SetFocus();
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::ClearQuickControl(void)
{
// Volver a pedir datos...
QCodAux = 0;
QNProducto->Text = "";
QPrecio->Text="0";
QDto->Text="0";
QUnds->Text="1";
QSubtotal->Text="0";
QCodigo->Text="";
StatusBar1->Panels->Items[3]->Text = "";
StatusBar1->Panels->Items[1]->Text = "";
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QUndsEnter(TObject *Sender)
{
QUnds->Color = clMenu;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QUndsExit(TObject *Sender)
{
QUnds->Color = clWindow;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::DBGrid1Enter(TObject *Sender)
{
// Limpiamos el QuickControl
ClearQuickControl();
FocoRapido = false;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QCodigoEnter(TObject *Sender)
{
FocoRapido = true;
QCodigo->Color = clQREADY;
QCodigo->SelStart = 0;
QCodigo->SelLength = QCodigo->Text.Length();
}
//---------------------------------------------------------------------------
/*
ShowMessage( TbVentasD->FieldByName("CodProducto")->AsString + " -#- " +
TbVentasD->FieldByName("NombreProducto")->AsString + " -#- " +
TbVentasD->FieldByName("Cantidad")->AsString + " -#- " +
" BeforeEdit" );
*/
void __fastcall TVentas::QCodigoExit(TObject *Sender)
{
QCodigo->Color = clWindow;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QCodigoKeyPress(TObject *Sender, char &Key)
{
if ( Key == VK_RETURN )
{
if ( DlgBuscarProd -> TbBusquedas -> Locate( "ID Producto", QCodigo->Text, TLocateOptions() << loCaseInsensitive ) )
{
QRellenaDatos(-1);
QUnds->SetFocus();
} else {
StatusBar1->Panels->Items[3]->Text = "";
StatusBar1->Panels->Items[1]->Text = "";
}
QCodigo->Color = clWindow;
}
if ( QCodigo->Text.IsEmpty() && Key=='+' )
{
Key = 0;
bFicharTicketClick(0);
QCodigo->Color = clQREADY;
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QPrecioKeyPress(TObject *Sender, char &Key)
{
if ( Key == VK_RETURN )
QUnds->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QUndsKeyPress(TObject *Sender, char &Key)
{
if ( Key == VK_RETURN &&
DlgBuscarProd -> TbBusquedas -> Locate( "ID Producto", QCodigo->Text, TLocateOptions() << loCaseInsensitive ) )
{
// Añadir el producto a la lista...
try {
if ( QPrecio->Text.IsEmpty() || QPrecio->Text.ToDouble() < 0 )
return;
if ( QUnds->Text.IsEmpty() || QUnds->Text.ToDouble() < 1 ) QUnds->Text = "1";
if ( QDto->Text.IsEmpty() || QDto->Text.ToDouble() < 0 ) QDto->Text = "0";
if ( QIva->Text.IsEmpty() || QIva->Text.ToDouble() < 0 ) QIva->Text = "0";
} catch(...) {
return;
}
TbVentasD->Insert();
TbVentasD->FieldByName( "CodProductoAux" )->AsInteger = QCodAux;
TbVentasD->FieldByName( "CodProducto" )->AsString = QCodigo->Text;
TbVentasD->FieldByName( "NombreProducto" )->AsString = QNProducto->Text;
TbVentasD->FieldByName( "Cantidad" )->AsFloat = QUnds->Text.ToDouble();
TbVentasD->FieldByName( "Dto" )->AsCurrency = QDto->Text.ToDouble();
TbVentasD->FieldByName( "IVA" )->AsInteger = QIva->Text.ToInt();
TbVentasD->FieldByName( "PrecioC" )->AsCurrency = QPrecio->Text.ToDouble();
TbVentasD->Post();
ActualizaTotales();
// ## Cambiado 09/08/01
// ActualizaStock( TbVentasD -> FieldByName( "CodProducto" ) -> AsString,
ActualizaStock( QCodAux, -1 * QUnds->Text.ToDouble() );
ClearQuickControl();
QCodigo->SetFocus();
}
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QCodigoClick(TObject *Sender)
{
QCodigo->Text="";
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QIvaKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if ( Key == VK_RETURN )
QPrecio->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TVentas::ElasticForm1AfterResize(TObject *Sender)
{
DBGrid1->Font->Size = DBText6->Font->Size;
DBGrid1->TitleFont->Size = DBText6->Font->Size;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QUndsClick(TObject *Sender)
{
QUnds->Text="";
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QPrecioEnter(TObject *Sender)
{
if ( QCodAux != 0 )
QPrecio->Enabled = CFG->CambioPrecioProdExistente->Checked;
}
//---------------------------------------------------------------------------
void __fastcall TVentas::QPrecioExit(TObject *Sender)
{
QPrecio->Enabled = true;
}
//---------------------------------------------------------------------------