This repository has been archived on 2024-11-29. You can view files and clone it, but cannot push or open issues or pull requests.
Tecsitel_FactuGES/Clientes/FacturaCliente.pas
2007-06-21 15:47:20 +00:00

2393 lines
75 KiB
ObjectPascal

{
===============================================================================
Copyright (©) 2001. Rodax Software.
===============================================================================
Los contenidos de este fichero son propiedad de Rodax Software titular del
copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado,
en su totalidad o en parte, con el permiso escrito de Rodax Software, o de
acuerdo con los términos y condiciones establecidas en el acuerdo/contrato
bajo el que se suministra.
-----------------------------------------------------------------------------
Web: www.rodax-software.com
===============================================================================
Fecha primera versión: 01-10-2001
Versión actual: 1.2.3
Fecha versión actual: 18-03-2005
===============================================================================
Modificaciones:
Fecha Comentarios
---------------------------------------------------------------------------
15-10-2001 Se han añadido las comprobaciones para el campo 'IVA' y para
el campo 'Descuento' porque no estaban.
20-10-2001 Se ha ampliado el campo 'F. de pago' porque pasa a tener
50 caracteres.
21-10-2001 Al pasar del modo Añadir/Modificar a Consultar/Eliminar se
quedaban activados algunos botones con lupa.
23-10-2001 Los conceptos se han implementado como una tabla de memoria.
27-10-2001 Se ha arreglado un fallo que al añadir un concepto estando
en la última fila lo hacia por encima del registro, no por
debajo.
27-10-2001 En el campo 'domiciliación bancaria' debe aparecer una lista
desplegable con todas las cuentas bancarias dadas de alta
en la aplicación.
27-10-2001 Se ha eliminado la pestaña 'Notas' porque en facturas de
cliente no hay.
29-10-2001 Cuando se elimina un concepto con <CTRL+Supr> hay que
volver a recalcular el importe total de la factura.
30-10-2001 Se ha añadido cliente final en facturas de cliente.
31-10-2001 Se han añadido los campos IMPORTEDESCUENTO e IMPORTEIVA.
27-11-2001 Recuperar la unidad de medida del artículo.
17-01-2002 Cuando se copian conceptos de un presupuestos, los conceptos
de tipo 'OPC' se cambian por 'TIT'.
07-02-2002 Desactivada la opción de 'CancelOnExit' del grid.
24-02-2002 En la ventana modal de artículos seleccionar, si es posible,
la fila con el último material seleccionado.
02-03-2002 En el contenido se pueden añadir muchos materiales a la vez.
07-04-2002 Se ha adaptado para la transacción única.
09-04-2002 En las funciones 'CancelarAnadir', 'CancelarModificar',
'CancelarEliminar', 'AnadirDatos', 'ModificarDatos', y
'EliminarDatos' cerrar todas las tablas que se usen.
09-04-2002 En el evento 'bCancelarClick' llamar a la función
'TratarCambios' en vez de 'DescartarOperacion'.
05-05-2002 En el procedimiento 'SetCodigoArticulo' no se daba un mensaje
de error cuando el artículo no existía.
07-05-2002 Adaptación al grid 'TdxDBGrid'.
07-05-2002 Se han eliminado los procedimientos 'DesactivarColumnasTitulo'
y 'ActivarColumnasTitulo'.
11-08-2002 P236. Cuando se borra una factura de cliente hay que
comprobar si es la última para decrementar el contador de
facturas y no dejar un hueco.
21-08-2002 P237. Revisar los botones de 'Eliminar' y 'Eliminar todo'
para que al pulsar 'Esc' cancele la operación y no la
ejecute como ahora.
21-08-2002 P238. Revisar el grid de los detalles para que se pueda
borrar un código de artículo cuando ya se ha introducido.
14-09-2002 P242. Sacar una ventana modal para editar el
texto de un concepto.
24-09-2002 Se producía una excepción si el cursos estaba en el código
de la factura, se pulsaba la tecla 'Esc' y se elegía 'No'.
El frame estaba oculto pero saltaba el evento OnExit del
campo de código de factura.
21-12-2002 Se ha eliminado un error con el campo 'PROVINCIA'. Al estar
situado en ese campo y dar Esc para salir se puede producir
una excepción.
08-03-2003 Se han puesto componentes con calendario.
08-03-2004 p272. Adaptación a multiempresa.
19-07-2004 p278. Error al facturar un presupuesto, albarán o abono.
No estaba bien adaptado a multiempresa.
18-03-2005 p587. Adaptación a Bonificaciones
===============================================================================
}
unit FacturaCliente;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, RdxBotones, RdxTitulos, StdCtrls,
RdxMemo, RdxCampos, ExtCtrls, Tipos, Configuracion,
RdxComboBox, RdxPaneles, RdxBarras, ComCtrls, RdxRichEdit, RXDBCtrl,
RdxPageControl, RdxFrameFacturasCliente, Db,
RdxRadioButton, RxMemDS, IBCustomDataSet, TablaPresupuestos, dxCntner,
dxTL, dxDBCtrl, dxDBGrid, dxEditor, dxExEdtr, dxEdLib, dxDBELib,
cxControls, cxContainer, cxEdit, cxTextEdit, cxMaskEdit, cxDropDownEdit,
cxCalendar, cxDBEdit, cxButtonEdit;
type
TClaseFactura = (cfFactLibre, cfFactPre, cfFactAlb, cfFactAbono);
TfrFacturaCliente = class(TRdxFrameFacturasCliente)
brSalir: TRdxBarraInferior;
bSalir: TRdxBoton;
brGuardar: TRdxBarraInferior;
bGuardar: TRdxBoton;
bCancelar: TRdxBoton;
pnlScroll: TRdxScrollPanel;
pnlFactura: TRdxPanel;
cDatosAlbaran: TRdxCabecera;
eFormaPago: TLabel;
eCuentaBancaria: TLabel;
eCodigo: TLabel;
Codigo: TRdxDBEdit;
Label1: TLabel;
Situacion: TRdxDBComboBox;
Label8: TLabel;
Titulo: TRdxPanelTituloOperacion;
eEstadoFactura: TLabel;
eRealizadoPor: TLabel;
Usuario: TRdxDBEdit;
RdxPanel1: TRdxPanel;
Paginas: TRdxPagesControl;
pagCliente: TTabSheet;
pnlCliente: TRdxPanel;
eCodigoCliente: TLabel;
eNIFCIF: TLabel;
eNombre: TLabel;
eDireccion: TLabel;
eNumero: TLabel;
ePiso: TLabel;
ePoblacion: TLabel;
eCodigoPostal: TLabel;
eProvincia: TLabel;
ePersona: TLabel;
eTelefono1: TLabel;
eFax: TLabel;
NIF: TRdxDBEdit;
Nombre: TRdxDBEdit;
Calle: TRdxDBEdit;
Numero: TRdxDBEdit;
Piso: TRdxDBEdit;
Poblacion: TRdxDBEdit;
CodigoPostal: TRdxDBEdit;
Provincia: TRdxDBEdit;
PersonaContacto: TRdxDBEdit;
Telefono: TRdxDBEdit;
Fax: TRdxDBEdit;
pagContenido: TTabSheet;
pnlGridArticulos: TPanel;
pnlBarraGrid: TRdxPanel;
bAnadirCon: TRdxBoton;
bEliminar: TRdxBoton;
bEliminarTodo: TRdxBoton;
bAnadirCap: TRdxBoton;
pagImportes: TTabSheet;
pagDescripcion: TTabSheet;
RdxPanel4: TRdxPanel;
Label3: TLabel;
RdxPanel5: TRdxPanel;
Descripcion: TRdxDBRichEdit;
pnlImporteAlbaran: TRdxPanel;
Label4: TLabel;
eDto: TLabel;
eIVA: TLabel;
Label6: TLabel;
BaseImponible: TRdxDBEdit;
Descuento: TRdxDBEdit;
IVA: TRdxDBEdit;
ImporteTotal: TRdxDBEdit;
dsFactura: TDataSource;
dsDetallesFacturas: TDataSource;
FormaPago: TRdxDBComboBox;
CuentaBancaria: TRdxDBComboBox;
RdxPanel2: TRdxPanel;
RdxCabecera1: TRdxCabecera;
Label2: TLabel;
Label5: TLabel;
NombreClienteFinal: TRdxDBEdit;
Shape1: TShape;
ImporteDescuento: TRdxDBEdit;
ImporteIVA: TRdxDBEdit;
gridDetalles: TdxDBGrid;
pnlPresupuesto: TPanel;
Label7: TLabel;
Label9: TLabel;
CodPresupuesto: TRdxDBEdit;
pnlAlbaran: TPanel;
Label10: TLabel;
Label11: TLabel;
CodAlbaran: TRdxDBEdit;
pnlAbono: TPanel;
Label12: TLabel;
Label13: TLabel;
CodFacturaCargo: TRdxDBEdit;
FechaAlta: TcxDBDateEdit;
Vencimiento: TcxDBDateEdit;
CodCliente: TcxDBButtonEdit;
CodClienteFinal: TcxDBButtonEdit;
procedure bCancelarClick(Sender: TObject);
procedure bSalirClick(Sender: TObject);
procedure bGuardarClick(Sender: TObject);
procedure CodigoButtonClick(Sender: TObject);
procedure CodigoExit(Sender: TObject);
procedure ProvinciaButtonClick(Sender: TObject);
procedure PoblacionButtonClick(Sender: TObject);
procedure rbPresupuestoClick(Sender: TObject);
procedure rbFacturaLibreClick(Sender: TObject);
procedure rbAlbaranClick(Sender: TObject);
procedure bAnadirConClick(Sender: TObject);
procedure bAnadirCapClick(Sender: TObject);
procedure bEliminarClick(Sender: TObject);
procedure bEliminarTodoClick(Sender: TObject);
procedure gridDetallesCustomDrawCell(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; ANode: TdxTreeListNode; AColumn: TdxTreeListColumn;
ASelected, AFocused, ANewItemRow: Boolean; var AText: String;
var AColor: TColor; AFont: TFont; var AAlignment: TAlignment;
var ADone: Boolean);
procedure gridDetallesEditing(Sender: TObject; Node: TdxTreeListNode;
var Allow: Boolean);
procedure CodClientePropertiesButtonClick(Sender: TObject;
AButtonIndex: Integer);
procedure CodClientePropertiesValidate(Sender: TObject;
var DisplayValue: Variant; var ErrorText: TCaption;
var Error: Boolean);
procedure CodClienteFinalPropertiesButtonClick(Sender: TObject;
AButtonIndex: Integer);
procedure CodClienteFinalPropertiesValidate(Sender: TObject;
var DisplayValue: Variant; var ErrorText: TCaption;
var Error: Boolean);
private
FCodigoProvincia : Variant;
FCodigoPoblacion : Variant;
FCodigoCliente : Variant;
FCodigoClienteAux : Variant;
FCodigoArticulo : Variant;
FCodigoPresupuesto : String;
FCodigoAlbaran : String;
FTablaDetallesMem : TRxMemoryData;
FCodigoClienteFinal: Variant;
FCodigoFacturaCargo : String;
FClaseFactura : TClaseFactura;
procedure CalcularTotalDetalle;
procedure CalcularTotalFactura;
procedure ActivarEventosCampos;
procedure ActivarFacturaLibre;
procedure ActivarPresupuesto;
procedure ActivarAlbaran;
procedure ActivarAbono;
procedure CopiarConceptosAlbaran;
procedure CopiarConceptosPresupuesto(DatosPre: TDatosPresupuesto);
procedure CopiarConceptosFacturaCargo;
procedure IVASetText(Sender: TField; const Text: String);
procedure DtoSetText(Sender: TField; const Text: String);
procedure InsertarReferenciaAPresupuesto (DatosPre : TDatosPresupuesto);
procedure BorrarDetalles;
procedure SalvarDetalles;
procedure CargarDetalles;
procedure BorrarDetallesIB;
procedure DetalleAfterDelete (DataSet: TDataSet);
procedure SetClaseFactura(Value : TClaseFactura);
property ClaseFactura : TClaseFactura read FClaseFactura write SetClaseFactura;
procedure GridBotonCodigoArticuloClick(Sender: TObject);
procedure CodigoArticuloDetalleSetText(Sender: TField; const Text: String);
procedure PlusDetalleSetText(Sender: TField; const Text: String);
procedure CantidadDetalleSetText(Sender: TField; const Text: String);
procedure PrecioDetalleSetText(Sender: TField; const Text: String);
procedure PrecioMinutoDetalleSetText(Sender: TField; const Text: String);
procedure MinutosDetalleSetText(Sender: TField; const Text: String);
procedure GridBotonDescripcionClick(Sender: TObject);
procedure ProvinciaSetText(Sender: TField; const Text: String);
function ComprobarAbono : Boolean;
protected
procedure ActivarModoAnadir; override;
procedure ActivarModoModificar; override;
procedure ActivarModoConsultar; override;
procedure ActivarModoEliminar; override;
function AnadirDatos : Boolean; override;
function ModificarDatos : Boolean; override;
function EliminarDatos : Boolean; override;
function CancelarAnadir : Boolean; override;
function CancelarModificar : Boolean; override;
function CancelarEliminar : Boolean; override;
function ComprobarDatos : Boolean; override;
procedure VerModal; override;
procedure SetCodigoProvincia (Value : Variant); virtual;
procedure SetCodigoPoblacion (Value : Variant); virtual;
procedure SetCodigoCliente (Value : Variant);
procedure SetCodigoClienteFinal (Value : Variant);
procedure SetCodigoArticulo (Value : Variant);
procedure SetCodigoPresupuesto (Value : String);
procedure SetCodigoAlbaran (Value : String);
procedure SetCodigoFacturaCargo (Value : String);
procedure FreeContenido; override;
procedure BuscarFactura; override;
public
property CodigoProvincia : Variant read FCodigoProvincia write SetCodigoProvincia;
property CodigoPoblacion : Variant read FCodigoPoblacion write SetCodigoPoblacion;
property CodigoCliente : Variant read FCodigoCliente write SetCodigoCliente;
property CodigoClienteFinal : Variant read FCodigoClienteFinal write SetCodigoClienteFinal;
property CodigoArticulo : Variant read FCodigoArticulo write SetCodigoArticulo;
property CodigoPresupuesto : String read FCodigoPresupuesto write SetCodigoPresupuesto;
property CodigoAlbaran : String read FCodigoAlbaran write SetCodigoAlbaran;
property CodigoFacturaCargo : String read FCodigoFacturaCargo write SetCodigoFacturaCargo;
constructor Create (AOwner : TComponent); override;
destructor Destroy; override;
published
property TablaFacturas;
property TablaDetallesFacturas;
property TablaDetallesMem : TRxMemoryData read FTablaDetallesMem write FTablaDetallesMem;
property CodigoFactura;
end;
var
frFacturaCliente: TfrFacturaCliente;
implementation
{$R *.DFM}
uses
FacturasClientes, BaseDatos, TablaFacturasCliente, IBDatabase, NumFunc,
Mensajes, Clientes, RdxFrameProvincias, RdxFramePoblaciones,
TablaProvincias, Provincias, Poblaciones, TablaClientes, RdxFrameClientes,
IB, Articulos, RdxFrameArticulos, TablaArticulos, RdxEmpresaActiva,
StrFunc, TablaPoblaciones, TablaFormasPago, TablaBancos,
IBSQL, Excepciones, IBErrorCodes, TablaAlbaranesCliente,
dxDBTLCL, Colores, EditorDescripcion, Literales, Constantes;
var
NuevoConcepto : Integer;
procedure TfrFacturaCliente.bCancelarClick(Sender: TObject);
begin
if (TratarCambios = IDOK) then
CloseFrame;
end;
procedure TfrFacturaCliente.bSalirClick(Sender: TObject);
begin
try
Rollback;
CloseFrame;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaCliente.bGuardarClick(Sender: TObject);
begin
if (RealizarOperacion) then
CloseFrame;
end;
procedure TfrFacturaCliente.ActivarEventosCampos;
begin
with TablaFacturas do
begin
FieldByName('IVA').OnSetText := IVASetText;
FieldByName('DESCUENTO').OnSetText := DtoSetText;
end;
with TablaDetallesMem do
begin
FieldByName('CODIGOARTICULO').OnSetText := CodigoArticuloDetalleSetText;
FieldByName('PLUS').OnSetText := PlusDetalleSetText;
FieldByName('CANTIDAD').OnSetText := CantidadDetalleSetText;
FieldByName('PRECIOUNIDAD').OnSetText := PrecioDetalleSetText;
FieldByName('PRECIOMINUTO').OnSetText := PrecioMinutoDetalleSetText;
FieldByName('MINUTOS').OnSetText := MinutosDetalleSetText;
AfterDelete := DetalleAfterDelete;
end;
end;
procedure TfrFacturaCliente.ActivarModoAnadir;
var
CodNuevo : Variant;
begin
dsFactura.AutoEdit := True;
dsDetallesFacturas.AutoEdit := True;
Codigo.VerBoton := False;
Codigo.ReadOnly := False;
CodCliente.Properties.Buttons[0].Visible := True;
CodCliente.Properties.OnValidate := CodClientePropertiesValidate;
CodClienteFinal.Properties.Buttons[0].Visible := True;
CodClienteFinal.Properties.OnValidate := CodClienteFinalPropertiesValidate;
Poblacion.VerBoton := True;
Provincia.VerBoton := True;
ActivarEdicionGridDetalles(gridDetalles);
(gridDetalles.ColumnByFieldName('CODIGOARTICULO')
as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonCodigoArticuloClick;
(gridDetalles.ColumnByFieldName('DESCRIPCION')
as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonDescripcionClick;
pnlBarraGrid.Visible := True;
try
{ Antes de aplicar la caché hay que asegurarse de que la
tabla está cerrada. }
TablaFacturas.DisableControls;
TablaDetallesFacturas.DisableControls;
{ Inicializar la tabla de facturas }
TablaFacturas.Close;
CodNuevo := dmTablaFacturasCliente.darNuevoCodigo;
with TablaFacturas do
begin
CachedUpdates := True;
Prepare;
Open;
FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
EnableControls;
Insert;
FieldByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
end;
Codigo.Field.asString := CodNuevo;
FechaAlta.DataBinding.Field.AsString := DateToStr(Date);
Vencimiento.DataBinding.Field.AsString := DateToStr(Date);
Situacion.Field.AsString := Situacion.Items.Strings[0];
Usuario.Field.AsString := dmBaseDatos.Usuario;
TablaFacturas.FieldByName('CLASEFACTURA').AsString := 'C';
ActivarFacturaLibre;
{ Inicializar la tabla de detalles }
with TablaDetallesFacturas do
begin
Close;
ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
ParamByName('CODIGOFACTURA').AsString := CodNuevo;
Prepare;
Open;
EnableControls;
end;
with TablaDetallesMem do
begin
Close;
Open;
ActivarEventosCampos;
end;
dmTablaFacturasCliente.InicializarTablaFacturas(@TablaFacturas);
dmTablaFacturasCliente.InicializarTablaDetalles(@TablaDetallesMem);
Visible := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaCliente.ActivarModoConsultar;
var
CodPreAlb : string;
CodCargo : string;
begin
dsFactura.AutoEdit := False;
dsDetallesFacturas.AutoEdit := False;
Codigo.VerBoton := True;
CodCliente.Properties.Buttons[0].Visible := False;
CodCliente.Properties.OnValidate := nil;
CodClienteFinal.Properties.Buttons[0].Visible := False;
CodClienteFinal.Properties.OnValidate := nil;
Poblacion.VerBoton := False;
Provincia.VerBoton := False;
DesactivarEdicionGridDetalles(gridDetalles);
(gridDetalles.ColumnByFieldName('CODIGOARTICULO')
as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;
(gridDetalles.ColumnByFieldName('DESCRIPCION')
as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;
pnlBarraGrid.Visible := False;
try
TablaFacturas.Prepare;
TablaFacturas.Open;
if TablaFacturas.RecordCount = 0 then
begin
VerMensajeFmt(msgFacCliNoExisteFac, [CodigoFactura]);
CloseFrame;
Exit;
end;
TablaFacturas.Cancel;
CodPreAlb := TablaFacturas.FieldByName('CODIGOPRESUPUESTOALBARAN').AsString;
if EsCadenaVacia(CodPreAlb) then
ClaseFactura := cfFactLibre
else begin
if dmTablaPresupuestos.ValidarCodigo(CodPreAlb) then
ClaseFactura := cfFactPre
else begin
if dmTablaAlbaranesCliente.ValidarCodigo(CodPreAlb) then
ClaseFactura := cfFactAlb
else
raise Exception.Create(msgFacCliCodPreAlbInvalido);
end;
end;
CodCargo := TablaFacturas.FieldByName('CODIGOCARGO').AsString;
if (not EsCadenaVacia(CodCargo) or (ImporteTotal.Field.AsFloat < 0)) then
begin
ClaseFactura := cfFactAbono;
FCodigoFacturaCargo := CodCargo;
end;
with TablaDetallesFacturas do
begin
Close;
ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
Params.ByName('CODIGOFACTURA').AsString := CodigoFactura;
Prepare;
Open;
Cancel;
end;
TablaDetallesMem.Close;
TablaDetallesMem.Open;
TablaDetallesMem.Cancel;
CargarDetalles;
dmTablaFacturasCliente.InicializarTablaFacturas(@TablaFacturas);
dmTablaFacturasCliente.InicializarTablaDetalles(@TablaDetallesMem);
Visible := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaCliente.ActivarModoEliminar;
var
CodPreAlb : string;
CodCargo : string;
begin
dsFactura.AutoEdit := False;
dsDetallesFacturas.AutoEdit := False;
Codigo.VerBoton := True;
CodCliente.Properties.Buttons[0].Visible := False;
CodCliente.Properties.OnValidate := nil;
CodClienteFinal.Properties.Buttons[0].Visible := False;
CodClienteFinal.Properties.OnValidate := nil;
Poblacion.VerBoton := False;
Provincia.VerBoton := False;
DesactivarEdicionGridDetalles(gridDetalles);
(gridDetalles.ColumnByFieldName('CODIGOARTICULO')
as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;
(gridDetalles.ColumnByFieldName('DESCRIPCION')
as TdxDBTreeListButtonColumn).OnEditButtonClick := NIL;
pnlBarraGrid.Visible := False;
try
TablaFacturas.Prepare;
TablaFacturas.Open;
if TablaFacturas.RecordCount = 0 then
begin
VerMensajeFmt(msgFacCliNoExisteFac, [CodigoFactura]);
CancelarEliminar;
CloseFrame;
Exit;
end;
TablaFacturas.Cancel;
CodPreAlb := TablaFacturas.FieldByName('CODIGOPRESUPUESTOALBARAN').AsString;
if EsCadenaVacia(CodPreAlb) then
ClaseFactura := cfFactLibre
else begin
if dmTablaPresupuestos.ValidarCodigo(CodPreAlb) then
ClaseFactura := cfFactPre
else begin
if dmTablaAlbaranesCliente.ValidarCodigo(CodPreAlb) then
ClaseFactura := cfFactAlb
else
raise Exception.Create(msgFacCliCodPreAlbInvalido);
end;
end;
CodCargo := TablaFacturas.FieldByName('CODIGOCARGO').AsString;
if (not EsCadenaVacia(CodCargo) or (ImporteTotal.Field.AsFloat < 0)) then
begin
ClaseFactura := cfFactAbono;
FCodigoFacturaCargo := CodCargo;
end;
with TablaDetallesFacturas do
begin
Close;
ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
Params.ByName('CODIGOFACTURA').AsString := CodigoFactura;
Prepare;
Open;
Cancel;
end;
TablaDetallesMem.Close;
TablaDetallesMem.Open;
TablaDetallesMem.Cancel;
CargarDetalles;
dmTablaFacturasCliente.InicializarTablaFacturas(@TablaFacturas);
dmTablaFacturasCliente.InicializarTablaDetalles(@TablaDetallesMem);
Visible := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaCliente.ActivarModoModificar;
var
CodPreAlb : String;
CodCargo : string;
begin
dsFactura.AutoEdit := True;
dsDetallesFacturas.AutoEdit := True;
Codigo.VerBoton := True;
Codigo.ReadOnly := True;
CodCliente.Properties.Buttons[0].Visible := True;
CodCliente.Properties.OnValidate := CodClientePropertiesValidate;
CodClienteFinal.Properties.Buttons[0].Visible := True;
CodClienteFinal.Properties.OnValidate := CodClienteFinalPropertiesValidate;
Poblacion.VerBoton := True;
Provincia.VerBoton := True;
ActivarEdicionGridDetalles(gridDetalles);
(gridDetalles.ColumnByFieldName('CODIGOARTICULO')
as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonCodigoArticuloClick;
(gridDetalles.ColumnByFieldName('DESCRIPCION')
as TdxDBTreeListButtonColumn).OnEditButtonClick := GridBotonDescripcionClick;
pnlBarraGrid.Visible := True;
try
{ Antes de aplicar la caché hay que asegurarse de que la
tabla está cerrada. }
TablaFacturas.Prepare;
TablaFacturas.Open;
TablaFacturas.FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
if TablaFacturas.RecordCount = 0 then
begin
VerMensajeFmt(msgFacCliNoExisteFac, [CodigoFactura]);
CancelarModificar;
CloseFrame;
Exit;
end;
TablaFacturas.Edit;
TablaFacturas.Post;
TablaFacturas.Edit;
CodPreAlb := TablaFacturas.FieldByName('CODIGOPRESUPUESTOALBARAN').AsString;
if EsCadenaVacia(CodPreAlb) then
ClaseFactura := cfFactLibre
else begin
if dmTablaPresupuestos.ValidarCodigo(CodPreAlb) then
ClaseFactura := cfFactPre
else begin
if dmTablaAlbaranesCliente.ValidarCodigo(CodPreAlb) then
ClaseFactura := cfFactAlb
else
raise Exception.Create(msgFacCliCodPreAlbInvalido);
end;
end;
CodCargo := TablaFacturas.FieldByName('CODIGOCARGO').AsString;
if (not EsCadenaVacia(CodCargo) or (ImporteTotal.Field.AsFloat < 0)) then
begin
ClaseFactura := cfFactAbono;
FCodigoFacturaCargo := CodCargo;
end;
with TablaDetallesFacturas do
begin
Close;
ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
Params.ByName('CODIGOFACTURA').AsString := CodigoFactura;
Prepare;
Open;
end;
with TablaDetallesMem do
begin
Close;
Open;
CargarDetalles;
ActivarEventosCampos;
end;
dmTablaFacturasCliente.InicializarTablaFacturas(@TablaFacturas);
dmTablaFacturasCliente.InicializarTablaDetalles(@TablaDetallesMem);
CalcularTotalFactura;
Visible := True;
except
on E : EIBError do
begin
case E.IBErrorCode of
isc_lock_conflict : begin
VerMensajeFmt(msgFacCliBloqueado, [CodigoFactura]);
CancelarModificar;
CloseFrame;
Exit;
end
else
TratarExcepcion(E);
end;
end;
on E : Exception do
TratarExcepcion(E);
end;
end;
function TfrFacturaCliente.AnadirDatos: Boolean;
var
CodPreAlb : string;
begin
Result := False;
try
CalcularTotalFactura;
TablaFacturas.Post;
TablaFacturas.ApplyUpdates;
CodPreAlb := TablaFacturas.FieldByName('CODIGOPRESUPUESTOALBARAN').AsString;
if not EsCadenaVacia(CodPreAlb) then
begin
if dmTablaPresupuestos.ValidarCodigo(CodPreAlb) then
dmTablaPresupuestos.FacturarPresupuesto(EmpresaActiva.Codigo, CodPreAlb, Codigo.Field.AsString)
else begin
if dmTablaAlbaranesCliente.ValidarCodigo(CodPreAlb) then
dmTablaAlbaranesCliente.FacturarAlbaran(EmpresaActiva.Codigo, CodPreAlb, Codigo.Field.AsString)
else
raise Exception.Create(msgFacCliCodPreAlbInvalido);
end;
end;
BorrarDetallesIB;
SalvarDetalles;
dmTablaFacturasCliente.IncrementarCodigo;
FCodigoFactura := TablaFacturas.FieldByName('CODIGO').AsString;
Commit;
TablaFacturas.CachedUpdates := False;
TablaFacturas.Close;
TablaDetallesFacturas.Close;
TablaDetallesMem.Close;
Result := True;
except
on E : EIBError do begin
if E.IBErrorCode = isc_unique_key_violation then begin
VerMensajeFmt(msgFacCliCodFacRepetido, [Codigo.Field.AsString]);
TablaFacturas.Edit;
end
else
TratarExcepcion(E);
end;
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaCliente.BuscarFactura;
begin
if Transaccion = NIL then
exit;
try
TablaFacturas.DisableControls;
TablaDetallesFacturas.DisableControls;
TablaDetallesMem.DisableControls;
TablaFacturas.Close;
TablaDetallesFacturas.Close;
TablaDetallesMem.Close;
// Buscar la fila a tratar si es necesario
if not EsCadenaVacia(FCodigoFactura) then
begin
TablaFacturas.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
TablaFacturas.ParamByName('CODIGO').AsString := FCodigoFactura;
TablaDetallesFacturas.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
TablaDetallesFacturas.ParamByName('CODIGOFACTURA').AsString := FCodigoFactura;
end;
TablaFacturas.Prepare;
TablaFacturas.Open;
TablaDetallesFacturas.Prepare;
TablaDetallesFacturas.Open;
TablaDetallesMem.Close;
TablaDetallesMem.Open;
CargarDetalles;
dmTablaFacturasCliente.InicializarTablaFacturas(@TablaFacturas);
dmTablaFacturasCliente.InicializarTablaDetalles(@TablaDetallesMem);
TablaFacturas.EnableControls;
TablaDetallesFacturas.EnableControls;
TablaDetallesMem.EnableControls;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaCliente.CalcularTotalDetalle;
var
auxCantidad,
auxPrecio,
auxMinutos,
auxPlus,
auxTotal : double;
begin
with TablaDetallesMem do
begin
auxCantidad := FieldByName('CANTIDAD').AsFloat;
if (ClaseFactura = cfFactAbono) then
FieldByName('PRECIOUNIDAD').AsFloat := -1 * System.Abs(FieldByName('PRECIOUNIDAD').AsFloat);
auxPrecio := FieldByName('PRECIOUNIDAD').AsFloat;
auxMinutos := FieldByName('MINUTOS').AsFloat * FieldByName('PRECIOMINUTO').AsFloat;
auxPlus := FieldByName('PLUS').AsFloat;
auxTotal := (auxCantidad * auxPrecio) + auxMinutos;
auxTotal := auxTotal + (auxTotal * (auxPlus / 100));
if auxCantidad > 0 then
FieldByName('PRECIO').AsFloat := auxTotal / auxCantidad
else
FieldByName('PRECIO').AsFloat := 0;
FieldByName('TOTAL').AsFloat := auxTotal;
end;
end;
procedure TfrFacturaCliente.CalcularTotalFactura;
var
BaseImponible,
ImporteIVA,
ImporteDto,
ImporteTotal : Double;
FDetallesBookmark : string;
begin
BaseImponible := 0;
ImporteTotal := 0;
with TablaDetallesMem do
begin
DisableControls;
FDetallesBookmark := Bookmark;
try
First;
while not EOF do begin
BaseImponible := BaseImponible + FieldByName('TOTAL').AsFloat;
Next;
end;
ImporteDto := BaseImponible * (TablaFacturas.FieldByName('DESCUENTO').AsFloat/100);
ImporteTotal := BaseImponible - ImporteDto;
ImporteIVA := ImporteTotal * (TablaFacturas.FieldByName('IVA').AsFloat/100);
ImporteTotal := ImporteTotal + ImporteIVA;
TablaFacturas.FieldByName('BASEIMPONIBLE').AsFloat := BaseImponible;
TablaFacturas.FieldByName('IMPORTEDESCUENTO').AsFloat := ImporteDto;
TablaFacturas.FieldByName('IMPORTEIVA').AsFloat := ImporteIVA;
TablaFacturas.FieldByName('IMPORTETOTAL').AsFloat := ImporteTotal;
finally
Bookmark := FDetallesBookmark;
EnableControls;
end;
end;
end;
function TfrFacturaCliente.CancelarAnadir: Boolean;
begin
Result := False;
try
TablaDetallesMem.Close;
TablaFacturas.CancelUpdates;
RollBack;
TablaFacturas.CachedUpdates := False;
TablaFacturas.Close;
TablaDetallesFacturas.Close;
Result := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
function TfrFacturaCliente.CancelarEliminar: Boolean;
begin
Result := False;
try
TablaDetallesMem.Close;
RollBack;
TablaFacturas.Close;
TablaDetallesFacturas.Close;
TablaDetallesMem.Close;
Result := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
function TfrFacturaCliente.CancelarModificar: Boolean;
begin
Result := False;
try
TablaDetallesMem.Close;
RollBack;
TablaFacturas.Close;
TablaDetallesFacturas.Close;
Result := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
function TfrFacturaCliente.ComprobarDatos: Boolean;
begin
Result := False;
if EsCadenaVacia(FechaAlta.DataBinding.Field.AsString) then
begin
VerMensaje(msgFacCliFaltaFechaAlta);
FechaAlta.SetFocus;
Exit;
end;
if EsCadenaVacia(Vencimiento.DataBinding.Field.AsString) then
begin
VerMensaje(msgFacCliFaltaFecVto);
Vencimiento.SetFocus;
Exit;
end
else begin
if Vencimiento.DataBinding.Field.AsDateTime < FechaAlta.DataBinding.Field.AsDateTime then
begin
VerMensaje(msgFacCliFecVtoMenorFecAlta);
Vencimiento.SetFocus;
Exit;
end
end;
if EsCadenaVacia(Nombre.Field.AsString) then
begin
VerMensaje(msgAlbFaltaNombreCli);
Paginas.ActivePageIndex := 0;
Nombre.SetFocus;
Exit;
end;
if TablaDetallesMem.IsEmpty then
begin
VerMensaje(msgFacCliFaltaArticulos);
Paginas.ActivePage := pagContenido;
gridDetalles.SetFocus;
Exit;
end;
if (ClaseFactura = cfFactAbono) and (Modo <> Eliminar) then
if (ComprobarAbono = False) then
Exit;
if (ClaseFactura <> cfFactAbono) and (Modo = Eliminar) then
if (dmTablaFacturasCliente.ExistenAbonos(EmpresaActiva.Codigo, Codigo.Field.AsString)) then
begin
VerMensaje(msgFacCliFacConAbonos);
Exit;
end;
Result := True;
end;
function TfrFacturaCliente.ComprobarAbono : Boolean;
var
dImporteAbonado : Double;
dImporteCargo : Double;
DatosCargo : TDatosFacturaCliente;
begin
Result := True;
if (ImporteTotal.Field.AsFloat > 0) then
begin
VerMensaje(msgFacCliImpDebeSerNeg);
Result := False;
Exit;
end;
try
DatosCargo := TDatosFacturaCliente.Create;
DatosCargo.Codigo := CodigoFacturaCargo;
DatosCargo.CodigoEmpresa := EmpresaActiva.Codigo;
dmTablaFacturasCliente.DarDatosFactura(DatosCargo);
dImporteCargo := DatosCargo.ImporteTotal;
finally
DatosCargo.Free;
end;
dImporteAbonado := dmTablaFacturasCliente.DarImporteOtrosAbonos(EmpresaActiva.Codigo, CodigoFacturaCargo, Codigo.Field.AsString);
if (Modo = Anadir) then
dImporteAbonado := dImporteAbonado + ImporteTotal.Field.AsFloat;
if (Redondear(dImporteCargo,2) < Redondear(abs(dImporteAbonado), 2)) then
begin
if (dImporteAbonado <> 0) then
VerMensaje(msgFacCliImpAbonadoSuperior)
else
VerMensaje(msgFacCliImpAbonoSuperior);
Result := False;
end;
end;
constructor TfrFacturaCliente.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCodigoProvincia := NULL;
FCodigoPoblacion := NULL;
FCodigoCliente := NULL;
FCodigoArticulo := NULL;
FClaseFactura := cfFactLibre;
Entidad := entFacturaCliente;
ConfigurarFrame(Self, Self.Entidad);
BaseDatos := dmBaseDatos.BD;
Transaccion := dmBaseDatos.Transaccion;
TablaFacturas := TIBDataSet.Create(Self);
TablaDetallesFacturas := TIBDataSet.Create(Self);
TablaDetallesMem := TRxMemoryData.Create(Self);
dsFactura.DataSet := TablaFacturas;
dsDetallesFacturas.DataSet := TablaDetallesMem;
with TablaFacturas do
begin
Database := BaseDatos;
Transaction := Transaccion;
SelectSQL.Assign(dmTablaFacturasCliente.sqlConsultarFactura);
InsertSQL.Assign(dmTablaFacturasCliente.sqlInsertarFactura);
ModifySQL.Assign(dmTablaFacturasCliente.sqlModificarFactura);
DeleteSQL.Assign(dmTablaFacturasCliente.sqlEliminarFactura);
end;
with TablaDetallesFacturas do
begin
Database := BaseDatos;
Transaction := Transaccion;
SelectSQL.Assign(dmTablaFacturasCliente.sqlConsultarGridDetalles);
InsertSQL.Assign(dmTablaFacturasCliente.sqlInsertarDetalles);
ModifySQL.Assign(dmTablaFacturasCliente.sqlModificarDetalles);
DeleteSQL.Assign(dmTablaFacturasCliente.sqlEliminarDetalles);
end;
TablaDetallesMem.CopyStructure(TablaDetallesFacturas);
TablaDetallesMem.FieldByName('CODIGOEMPRESA').Required := False;
TablaDetallesMem.FieldByName('CODIGOFACTURA').Required := False;
TablaDetallesMem.FieldByName('NUMCONCEPTO').Required := False;
dmTablaFacturasCliente.InicializarGridDetalles(gridDetalles);
Situacion.Items := dmTablaFacturasCliente.DarSituaciones;
FormaPago.Items := dmTablaFormasPago.DarFormasPago;
CuentaBancaria.Items := dmTablaBancos.DarBancos;
Paginas.ActivePage := pagCliente;
end;
destructor TfrFacturaCliente.Destroy;
begin
gridDetalles.DataSource := NIL;
TablaDetallesMem.Close;
TablaDetallesMem.Free;
TablaFacturas.Close;
TablaFacturas.UnPrepare;
TablaFacturas.Free;
TablaDetallesFacturas.Close;
TablaDetallesFacturas.Unprepare;
TablaDetallesFacturas.Free;
inherited;
end;
function TfrFacturaCliente.EliminarDatos: Boolean;
var
FacturaPre,
FacturaAlb : Boolean;
begin
Result := False;
try
if ClaseFactura = cfFactAlb then
begin
if (VerMensajePreguntaFmt(msgFacCliBorrarFacAlb, [CodAlbaran.Field.AsString]) <> mrYes) then
Exit
else
dmTablaAlbaranesCliente.NoFacturarAlbaran(EmpresaActiva.Codigo, CodAlbaran.Field.AsString);
end;
if ClaseFactura = cfFactPre then
begin
if (VerMensajePreguntaFmt(msgFacCliBorrarFacPre, [CodPresupuesto.Field.AsString]) <> mrYes) then
Exit
else
dmTablaPresupuestos.NoFacturarPresupuesto(EmpresaActiva.Codigo, CodPresupuesto.Field.AsString);
end;
{ P236. Cuando se borra una factura de cliente hay que comprobar si es
la última para decrementar el contador de facturas y no dejar un hueco.}
if dmTablaFacturasCliente.EsUltimaFactura(EmpresaActiva.Codigo, Codigo.Field.AsString) then
dmTablaFacturasCliente.DecrementarCodigo;
TablaFacturas.Delete;
BorrarDetalles;
Commit;
TablaFacturas.Close;
TablaDetallesFacturas.Close;
TablaDetallesMem.Close;
Result := True;
except
on E : EIBError do
begin
case E.IBErrorCode of
isc_lock_conflict : VerMensajeFmt(msgFacCliBloqueado, [Codigo.Field.AsString]);
else
TratarExcepcion(E);
end;
end;
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaCliente.FreeContenido;
var
Contador : integer;
ListaCodigos : TStringList;
begin
if (ContenidoModal is TRdxFrameFacturasCliente) then begin
CodigoFactura := (ContenidoModal as TRdxFrameFacturasCliente).CodigoFactura;
ActivarModo;
end;
if (ContenidoModal is TRdxFrameArticulos) then
begin
ListaCodigos := (ContenidoModal as TRdxFrameArticulos).ListaArticulos;
for Contador := 0 to ListaCodigos.Count - 1 do
begin
CodigoArticulo := ListaCodigos.Strings[Contador];
bAnadirConClick(Self);
end;
TablaDetallesMem.Delete;
end;
if (ContenidoModal is TfrEditorDescripcion) then
begin
TablaDetallesMem.FieldByName('DESCRIPCION').AsString := (ContenidoModal as TfrEditorDescripcion).Texto;
TablaDetallesMem.Post;
TablaDetallesMem.Edit;
end;
if (ContenidoModal is TRdxFrameClientes) then
FCodigoClienteAux := (ContenidoModal as TRdxFrameClientes).CodigoCliente;
if (ContenidoModal is TRdxFrameProvincias) then
CodigoProvincia := (ContenidoModal as TRdxFrameProvincias).CodigoProvincia;
if (ContenidoModal is TRdxFramePoblaciones) then begin
CodigoProvincia := (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia;
CodigoPoblacion := (ContenidoModal as TRdxFramePoblaciones).CodigoPoblacion;
end;
inherited FreeContenido;
end;
function TfrFacturaCliente.ModificarDatos: Boolean;
begin
Result := False;
try
CalcularTotalFactura;
TablaFacturas.Post;
BorrarDetallesIB;
SalvarDetalles;
Commit;
TablaFacturas.Close;
TablaDetallesFacturas.Close;
TablaDetallesMem.Close;
Result := True;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaCliente.SetCodigoArticulo(Value: Variant);
var
DatosArticulo : TDatosArticulo;
begin
if VarIsNull(Value) then
exit;
DatosArticulo := TDatosArticulo.Create;
DatosArticulo.Codigo := Value;
try
if dmTablaArticulos.DarDatosArticulo(DatosArticulo) then
begin
with TablaDetallesMem do
begin
Edit;
FieldByName('TIPO').AsString := 'CON';
FieldByName('CODIGOARTICULO').AsString := DatosArticulo.Codigo;
FieldByName('DESCRIPCION').AsString := DatosArticulo.Descripcion;
FieldByName('CANTIDAD').AsString := '1';
FieldByName('UNIDADESMEDIDA').AsString := DatosArticulo.Unidadesmedida;
FieldByName('PRECIOUNIDAD').AsString := DatosArticulo.Precio;
FieldByName('PRECIO').AsString := DatosArticulo.Precio;
FieldByName('TOTAL').AsString := DatosArticulo.Precio;
Post;
end;
FCodigoArticulo := Value;
CalcularTotalFactura;
end
else
raise Exception.CreateFmt(msgArtCodArtNoExiste, [Value]);
finally
DatosArticulo.Free;
end;
end;
procedure TfrFacturaCliente.SetCodigoCliente(Value: Variant);
var
DatosCliente : TDatosCliente;
begin
if VarIsNull(Value) then
exit;
FCodigoCliente := Value;
DatosCliente := TDatosCliente.Create;
try
DatosCliente.Codigo := FCodigoCliente;
dmTablaClientes.darDatosCliente(DatosCliente);
CodCliente.DataBinding.Field.AsString := DatosCliente.Codigo;
NIF.Field.AsString := DatosCliente.Nifcif;
Nombre.Field.AsString := DatosCliente.Nombre;
PersonaContacto.Field.AsString := DatosCliente.PersonaContacto;
Telefono.Field.AsString := DatosCliente.Telefono1;
Fax.Field.AsString := DatosCliente.Fax;
Calle.Field.AsString := DatosCliente.Calle;
Numero.Field.AsString := DatosCliente.Numero;
Piso.Field.AsString := DatosCliente.Piso;
CodigoPostal.Field.AsString := DatosCliente.CodigoPostal;
Poblacion.Field.AsString := DatosCliente.Poblacion;
Provincia.Field.AsString := DatosCliente.Provincia;
IVA.Field.AsString := DatosCliente.IVA;
Descuento.Field.AsString := DatosCliente.Descuento;
CuentaBancaria.Field.AsString := DatosCliente.Banco;
FCodigoProvincia := dmTablaProvincias.darCodigoProvincia(DatosCliente.Provincia);
CalcularTotalFactura;
finally
DatosCliente.Free;
end;
end;
procedure TfrFacturaCliente.SetCodigoPoblacion(Value: Variant);
begin
if (not VarIsNull(FCodigoPoblacion)) and (FCodigoPoblacion = Value) then
exit;
if (not VarIsNull(Value)) then
begin
FCodigoPoblacion := Value;
Poblacion.Field.AsString := dmTablaPoblaciones.darNombrePoblacion(FCodigoProvincia, FCodigoPoblacion);
end;
end;
procedure TfrFacturaCliente.SetCodigoProvincia(Value: Variant);
begin
if (not VarIsNull(FCodigoProvincia)) and (FCodigoProvincia = Value) then
exit;
if (not VarIsNull(Value)) then
begin
FCodigoProvincia := Value;
Provincia.Field.AsString := dmTablaProvincias.darNombreProvincia(FCodigoProvincia);
end;
end;
procedure TfrFacturaCliente.VerModal;
begin
if (ContenidoModal is TRdxFramePoblaciones) then
(ContenidoModal as TRdxFramePoblaciones).CodigoProvincia := CodigoProvincia;
if (ContenidoModal is TRdxFrameArticulos) then
(ContenidoModal as TRdxFrameArticulos).CodigoArticulo := CodigoArticulo;
if (ContenidoModal is TfrEditorDescripcion) then
(ContenidoModal as TfrEditorDescripcion).Texto := TablaDetallesMem.FieldByName('DESCRIPCION').AsString;
inherited;
end;
procedure TfrFacturaCliente.CantidadDetalleSetText(Sender: TField;
const Text: String);
begin
if EsCadenaVacia(Text) then
Sender.AsString := '1'
else
Sender.AsString := Text;
CalcularTotalDetalle;
CalcularTotalFactura;
end;
procedure TfrFacturaCliente.CodigoArticuloDetalleSetText(Sender: TField;
const Text: String);
var
Codigo : String;
begin
if (EsCadenaVacia(Text)) then
begin
Sender.AsString := '';
exit;
end;
Codigo := Trim(Text);
if (dmTablaArticulos.validarCodigo(Codigo)) then
Codigo := dmTablaArticulos.formatearCodigo(Codigo)
else
raise Exception.CreateFmt(msgArtCodArtIncorrecto, [Codigo]);
Sender.AsString := Codigo;
CodigoArticulo := Codigo;
end;
procedure TfrFacturaCliente.GridBotonCodigoArticuloClick(Sender: TObject);
begin
TablaDetallesMem.Edit;
ContenidoModal := TfrArticulos.Create(Self);
end;
procedure TfrFacturaCliente.MinutosDetalleSetText(Sender: TField;
const Text: String);
begin
if EsCadenaVacia(Text) then
Sender.AsString := '0'
else
Sender.AsString := Text;
CalcularTotalDetalle;
CalcularTotalFactura;
end;
procedure TfrFacturaCliente.PlusDetalleSetText(Sender: TField;
const Text: String);
begin
if EsCadenaVacia(Text) then
Sender.AsString := '0'
else begin
ValidarDto(Text);
Sender.AsString := Text;
end;
CalcularTotalDetalle;
CalcularTotalFactura;
end;
procedure TfrFacturaCliente.PrecioDetalleSetText(Sender: TField;
const Text: String);
begin
if EsCadenaVacia(Text) then
Sender.AsString := '0'
else
Sender.AsString := Text;
CalcularTotalDetalle;
CalcularTotalFactura;
end;
procedure TfrFacturaCliente.PrecioMinutoDetalleSetText(Sender: TField;
const Text: String);
begin
if EsCadenaVacia(Text) then
Sender.AsString := '0'
else
Sender.AsString := Text;
CalcularTotalDetalle;
CalcularTotalFactura;
end;
procedure TfrFacturaCliente.CodigoButtonClick(Sender: TObject);
begin
if (TratarCambios = IDCANCEL) then
Exit;
{ Esto es porque en modo 'Modificar' hacemos un cambio y pulsamos
este botón se cierra la tabla y si en el frame hijo (el del grid) damos
a cancelar, FCodigoFactura es NULL y da error al activar modo porque
no se inicializa los parámetros de la sql. Lo hace BuscarFactura. }
if not TablaFacturas.Active then
BuscarFactura;
ContenidoModal := TfrFacturasClientes.Create(Self);
end;
procedure TfrFacturaCliente.CodigoExit(Sender: TObject);
begin
if (Modo <> Anadir) or (Visible = false) then
Exit;
if EsCadenaVacia(Codigo.Text) then
Codigo.Field.AsString := dmTablaFacturasCliente.darNuevoCodigo;
if (dmTablaFacturasCliente.validarCodigo(Codigo.Text)) then
begin
Codigo.Field.asString := dmTablaFacturasCliente.FormatearCodigo(Codigo.Text);
if (dmTablaFacturasCliente.existeCodigo(EmpresaActiva.Codigo, Codigo.Text)) then begin
VerMensajeFmt(msgFacCliCodFacRepetido, [Codigo.Text]);
Codigo.SetFocus;
end;
end
else begin
VerMensajeFmt(msgFacCliCodFacIncorrecto, [Codigo.Text]);
Codigo.SetFocus;
end;
end;
procedure TfrFacturaCliente.ProvinciaButtonClick(Sender: TObject);
begin
CaptionModal := 'Lista de provincias';
WidthModal := 280;
HeightModal := 460;
ContenidoModal := TfrProvincias.Create(Self);
end;
procedure TfrFacturaCliente.PoblacionButtonClick(Sender: TObject);
begin
if (VarIsNull(CodigoProvincia)) then begin
VerMensaje(msgSinProvincia);
Paginas.ActivePageIndex := 0;
Provincia.SetFocus;
Exit;
end;
CaptionModal := Format(msgListaPoblaciones, [dmTablaProvincias.darNombreProvincia(CodigoProvincia)]);
WidthModal := 280;
HeightModal := 460;
ContenidoModal := TfrPoblaciones.Create(Self);
end;
procedure TfrFacturaCliente.SetCodigoPresupuesto(Value: String);
var
CodPre : String;
DatosPre : TDatosPresupuesto;
begin
if EsCadenaVacia(Value) then
Exit;
CodPre := Trim(Value);
if FCodigoPresupuesto = CodPre then
Exit;
if not dmTablaPresupuestos.ValidarCodigo(CodPre) then
begin
VerMensajeFmt(msgPreCodPreIncorrecto, [CodPre]);
CodPresupuesto.SetFocus;
Exit;
end;
CodPre := dmTablaPresupuestos.FormatearCodigo(CodPre);
if not (dmTablaPresupuestos.ExisteCodigo(EmpresaActiva.Codigo, CodPre)) then
begin
VerMensajeFmt(msgPreNoExistePre, [CodPre]);
CodPresupuesto.SetFocus;
Exit;
end;
if dmTablaPresupuestos.DarSituacionPresupuesto(EmpresaActiva.Codigo, CodPre) <> CTE_ACEPTADO then
begin
VerMensajeFmt(msgPreNoSePuedeFacturar, [CodPre]);
CodPresupuesto.SetFocus;
Exit;
end;
ClaseFactura := cfFactPre;
FCodigoPresupuesto := CodPre;
CodPresupuesto.Field.AsString := CodPre;
DatosPre := TDatosPresupuesto.Create;
DatosPre.Codigo := CodPre;
DatosPre.CodigoEmpresa := EmpresaActiva.Codigo;
try
if dmTablaPresupuestos.DarDatosPresupuesto(DatosPre) then
begin
with TablaFacturas do
begin
if not EsCadenaVacia(DatosPre.CodigoFactura) then
begin
VerMensajeFmt(msgPreYaFacturado, [FCodigoPresupuesto]);
CodPresupuesto.SelectAll;
CodPresupuesto.SetFocus;
Exit;
end;
{ Saco el IVA y el descuento que tiene el cliente si estuviera
dado de alta }
if not EsCadenaVacia(DatosPre.CodigoCliente) then
CodigoCliente := DatosPre.CodigoCliente;
FieldByName('CODIGOCLIENTE').AsString := DatosPre.CodigoCliente;
FieldByName('NIFCIF').AsString := DatosPre.NIFCIF;
FieldByName('NOMBRE').AsString := DatosPre.Nombre;
FieldByName('CALLE').AsString := DatosPre.Calle;
FieldByName('NUMERO').AsString := DatosPre.Numero;
FieldByName('PISO').AsString := DatosPre.Piso;
FieldByName('CODIGOPOSTAL').AsString := DatosPre.CodigoPostal;
FieldByName('POBLACION').AsString := DatosPre.Poblacion;
FieldByName('PROVINCIA').AsString := DatosPre.Provincia;
FieldByName('PERSONACONTACTO').AsString := DatosPre.PersonaContacto;
FieldByName('TELEFONO').AsString := DatosPre.Telefono;
FieldByName('FAX').AsString := DatosPre.Fax;
FieldByName('DESCRIPCION').AsString := DatosPre.Descripcion;
end;
if VerMensajePreguntaFmt(msgFacCliCopiarConPre, [FCodigoPresupuesto]) = mrYES then
CopiarConceptosPresupuesto(DatosPre)
else
InsertarReferenciaAPresupuesto(DatosPre);
CalcularTotalFactura;
end
else
raise Exception.CreateFmt(msgPreNoExistePre, [CodPre]);
finally
DatosPre.Free;
end;
end;
procedure TfrFacturaCliente.rbPresupuestoClick(Sender: TObject);
begin
ActivarPresupuesto;
CodPresupuesto.SetFocus;
end;
procedure TfrFacturaCliente.rbFacturaLibreClick(Sender: TObject);
begin
ActivarFacturaLibre;
end;
procedure TfrFacturaCliente.rbAlbaranClick(Sender: TObject);
begin
ActivarAlbaran;
CodAlbaran.SetFocus;
end;
procedure TfrFacturaCliente.ActivarAlbaran;
begin
pnlAlbaran.Left := 273;
pnlAlbaran.Top := 48;
pnlAlbaran.Visible := True;
end;
procedure TfrFacturaCliente.ActivarFacturaLibre;
begin
//
end;
procedure TfrFacturaCliente.ActivarPresupuesto;
begin
pnlPresupuesto.Left := 273;
pnlPresupuesto.Top := 48;
pnlPresupuesto.Visible := True;
end;
procedure TfrFacturaCliente.CopiarConceptosAlbaran;
var
oSQL : TIBSQL;
begin
oSQL := TIBSQL.Create(Self);
with oSQL do
begin
Database := dmBaseDatos.BD;
Transaction := dmBaseDatos.Transaccion;
SQL.Add('select * ');
SQL.Add('from DETALLESALBARANESCLIENTE ');
SQL.Add('where CODIGOALBARAN = :CODIGOALBARAN and ');
SQL.Add('CODIGOEMPRESA = :CODIGOEMPRESA ');
SQL.Add('order by NUMCONCEPTO');
end;
try
with TablaDetallesMem do
begin
oSQL.ParamByName('CODIGOALBARAN').AsString := CodigoAlbaran;
oSQL.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
oSQL.Prepare;
oSQL.ExecQuery;
DisableControls;
while not oSQL.EOF do
begin
Append;
FieldByName('CODIGOFACTURA').AsString := Codigo.Field.AsString;
FieldByName('NUMCONCEPTO').AsInteger := oSQL.FieldByName('NUMCONCEPTO').AsInteger;
FieldByName('TIPO').AsString := 'CON';
FieldByName('CODIGOARTICULO').AsString := oSQL.FieldByName('CODIGOARTICULO').AsString;
FieldByName('DESCRIPCION').AsString := oSQL.FieldByName('DESCRIPCION').AsString;
FieldByName('CANTIDAD').AsString := oSQL.FieldByName('CANTIDAD').AsString;
FieldByName('UNIDADESMEDIDA').AsString := oSQL.FieldByName('UNIDADESMEDIDA').AsString;
FieldByName('PRECIOUNIDAD').AsString := oSQL.FieldByName('PRECIOUNIDAD').AsString;
FieldByName('PRECIO').AsString := oSQL.FieldByName('PRECIOUNIDAD').AsString;
FieldByName('TOTAL').AsString := oSQL.FieldByName('TOTAL').AsString;
Post;
oSQL.Next;
end;
First;
EnableControls;
end;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
oSQL.Close;
oSQL.Transaction := NIL;
oSQL.Free;
end;
procedure TfrFacturaCliente.CopiarConceptosPresupuesto(DatosPre: TDatosPresupuesto);
var
oSQL : TIBSQL;
begin
oSQL := TIBSQL.Create(Self);
with oSQL do
begin
Database := dmBaseDatos.BD;
Transaction := dmBaseDatos.Transaccion;
SQL.Add('select * ');
SQL.Add('from DETALLESPRESUPUESTOSCLIENTE ');
SQL.Add('where CODIGOPRESUPUESTO = :CODIGOPRESUPUESTO ');
SQL.Add('and CODIGOEMPRESA = :CODIGOEMPRESA ');
SQL.Add('order by NUMCONCEPTO');
end;
try
with TablaDetallesMem do
begin
oSQL.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
oSQL.ParamByName('CODIGOPRESUPUESTO').AsString := CodigoPresupuesto;
oSQL.Prepare;
oSQL.ExecQuery;
DisableControls;
while not oSQL.EOF do
begin
Append;
FieldByName('CODIGOFACTURA').AsString := Codigo.Field.AsString;
FieldByName('NUMCONCEPTO').AsInteger := oSQL.FieldByName('NUMCONCEPTO').AsInteger;
if (oSQL.FieldByName('TIPO').AsString = 'OPC') then
FieldByName('TIPO').AsString := 'TIT'
else
FieldByName('TIPO').AsString := oSQL.FieldByName('TIPO').AsString;
FieldByName('CODIGOARTICULO').AsString := oSQL.FieldByName('CODIGOARTICULO').AsString;
FieldByName('DESCRIPCION').AsString := oSQL.FieldByName('DESCRIPCION').AsString;
FieldByName('CANTIDAD').AsString := oSQL.FieldByName('CANTIDAD').AsString;
FieldByName('UNIDADESMEDIDA').AsString := oSQL.FieldByName('UNIDADESMEDIDA').AsString;
FieldByName('PRECIOUNIDAD').AsString := oSQL.FieldByName('PRECIOUNIDAD').AsString;
FieldByName('PRECIO').AsString := oSQL.FieldByName('PRECIO').AsString;
FieldByName('MINUTOS').AsString := oSQL.FieldByName('MINUTOS').AsString;
FieldByName('PRECIOMINUTO').AsString := oSQL.FieldByName('PRECIOMINUTO').AsString;
FieldByName('PLUS').AsString := oSQL.FieldByName('PLUS').AsString;
FieldByName('TOTAL').AsString := oSQL.FieldByName('TOTAL').AsString;
Post;
oSQL.Next;
end;
//En el caso de tener bonificación añadimos un concepto más a la factura
if not VarIsNull(DatosPre.DesBonificacion) then
begin
Append;
FieldByName('CODIGOFACTURA').AsString := Codigo.Field.AsString;
FieldByName('NUMCONCEPTO').AsInteger := (oSQL.RecordCount + 1);
FieldByName('TIPO').AsString := 'CON';
FieldByName('DESCRIPCION').AsString := DatosPre.DesBonificacion;
FieldByName('CANTIDAD').AsInteger := 1;
FieldByName('PRECIOUNIDAD').AsFloat := (-1)* DatosPre.ImpBonificacion;
FieldByName('PRECIO').AsFloat := (-1)* DatosPre.ImpBonificacion;
FieldByName('TOTAL').AsFloat := (-1)* DatosPre.ImpBonificacion;
Post;
end;
First;
EnableControls;
end;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
oSQL.Close;
oSQL.Transaction := NIL;
oSQL.Free;
end;
procedure TfrFacturaCliente.bAnadirConClick(Sender: TObject);
begin
try
with TablaDetallesMem do
begin
DisableControls;
Next;
if EOF then
Append
else
Insert;
FieldByName('TIPO').AsString := 'CON';
EnableControls;
end;
Paginas.ActivePage := pagContenido;
gridDetalles.SetFocus;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaCliente.bAnadirCapClick(Sender: TObject);
begin
try
with TablaDetallesMem do
begin
DisableControls;
Next;
if EOF then
Append
else
Insert;
FieldByName('TIPO').AsString := 'TIT';
FieldByName('DESCRIPCION').AsString := 'Nombre del capítulo';
Post;
EnableControls;
end;
Paginas.ActivePage := pagContenido;
gridDetalles.SetFocus;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaCliente.bEliminarClick(Sender: TObject);
begin
if (VerMensajePregunta(msgDeseaBorrar) <> IDYES) then
Exit;
if TablaDetallesMem.RecordCount = 0 then begin
{ Hacemos un cancel de la tabla por si el registro actual estuviera
recien creado }
TablaDetallesMem.Cancel;
Exit
end;
try
TablaDetallesMem.Delete;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
CalcularTotalFactura;
end;
procedure TfrFacturaCliente.bEliminarTodoClick(Sender: TObject);
begin
if (VerMensajePregunta(msgDeseaBorrarTodo) <> IDYES) then
Exit;
BorrarDetalles;
CalcularTotalFactura;
end;
procedure TfrFacturaCliente.DtoSetText(Sender: TField; const Text: String);
begin
if EsCadenaVacia(Text) then
Sender.AsString := '0'
else begin
ValidarDto(Text);
Sender.AsString := Text;
end;
CalcularTotalFactura;
end;
procedure TfrFacturaCliente.IVASetText(Sender: TField; const Text: String);
begin
if EsCadenaVacia(Text) then
Sender.AsString := '0'
else begin
ValidarIVA(Text);
Sender.AsString := Text;
end;
CalcularTotalFactura;
end;
procedure TfrFacturaCliente.InsertarReferenciaAPresupuesto (DatosPre : TDatosPresupuesto);
var
FechaAux : String;
begin
FechaAux := FormatDateTime('d "de" mmmm "de" yyyy', StrToDate(DatosPre.FechaAlta));
TablaFacturas.FieldByName('DESCRIPCION').AsString := Format(msgFacCliDesFacPre, [DatosPre.Codigo, FechaAux]);
// Añadir un concepto con el importe del presupuesto
try
with TablaDetallesMem do
begin
DisableControls;
Append;
FieldByName('CODIGOFACTURA').AsString := Codigo.Field.AsString;
FieldByName('NUMCONCEPTO').AsInteger := 0;
FieldByName('TIPO').AsString := 'CON';
FieldByName('DESCRIPCION').AsString := 'Presupuesto ' + DatosPre.Codigo;
FieldByName('CANTIDAD').AsString := '1';
FieldByName('PRECIOUNIDAD').AsString := DatosPre.ImporteTotal;
FieldByName('PRECIO').AsString := DatosPre.ImporteTotal;
FieldByName('TOTAL').AsString := DatosPre.ImporteTotal;
Post;
EnableControls;
end;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
end;
procedure TfrFacturaCliente.SetCodigoAlbaran(Value: String);
var
CodAlb : String;
DatosAlb : TDatosAlbaranCliente;
begin
if EsCadenaVacia(Value) then
exit;
CodAlb := Trim(Value);
if FCodigoAlbaran = CodAlb then
Exit;
if not dmTablaAlbaranesCliente.ValidarCodigo(CodAlb) then
begin
VerMensajeFmt(msgAlbCodAlbIncorrecto, [CodAlb]);
CodAlbaran.SetFocus;
Exit;
end;
CodAlb := dmTablaAlbaranesCliente.FormatearCodigo(CodAlb);
if not (dmTablaAlbaranesCliente.ExisteCodigo(EmpresaActiva.Codigo, CodAlb)) then
begin
VerMensajeFmt(msgAlbNoExisteAlb, [CodAlb]);
CodAlbaran.SetFocus;
Exit;
end;
ClaseFactura := cfFactAlb;
FCodigoAlbaran := CodAlb;
CodAlbaran.Field.AsString := CodAlb;
DatosAlb := TDatosAlbaranCliente.Create;
DatosAlb.Codigo := CodAlb;
DatosAlb.CodigoEmpresa := EmpresaActiva.Codigo;
try
if dmTablaAlbaranesCliente.DarDatosAlbaran(DatosAlb) then
begin
with TablaFacturas do
begin
if not EsCadenaVacia(DatosAlb.CodigoFactura) then
begin
VerMensajeFmt(msgAlbYaFacturado, [FCodigoAlbaran]);
CodAlbaran.SelectAll;
CodAlbaran.SetFocus;
Exit;
end;
{ Saco el IVA y el descuento que tiene el cliente si estuviera
dado de alta }
if not EsCadenaVacia(DatosAlb.CodigoCliente) then
CodigoCliente := DatosAlb.CodigoCliente;
FieldByName('CODIGOCLIENTE').AsString := DatosAlb.CodigoCliente;
FieldByName('NIFCIF').AsString := DatosAlb.NIFCIF;
FieldByName('NOMBRE').AsString := DatosAlb.Nombre;
FieldByName('CALLE').AsString := DatosAlb.Calle;
FieldByName('NUMERO').AsString := DatosAlb.Numero;
FieldByName('PISO').AsString := DatosAlb.Piso;
FieldByName('CODIGOPOSTAL').AsString := DatosAlb.CodigoPostal;
FieldByName('POBLACION').AsString := DatosAlb.Poblacion;
FieldByName('PROVINCIA').AsString := DatosAlb.Provincia;
FieldByName('PERSONACONTACTO').AsString := DatosAlb.PersonaContacto;
FieldByName('TELEFONO').AsString := DatosAlb.Telefono;
FieldByName('FAX').AsString := DatosAlb.Fax;
FieldByName('DESCRIPCION').AsString := DatosAlb.Descripcion;
end;
CopiarConceptosAlbaran;
CalcularTotalFactura;
end
else
raise Exception.CreateFmt(msgAlbNoExisteAlb, [CodAlb]);
finally
DatosAlb.Free;
end;
end;
procedure TfrFacturaCliente.BorrarDetalles;
begin
with TablaDetallesMem do
begin
DisableControls;
EmptyTable;
EnableControls;
end;
end;
procedure TfrFacturaCliente.BorrarDetallesIB;
begin
with TablaDetallesFacturas do
begin
if IsEmpty then
Exit;
DisableControls;
Last;
while not BOF do
begin
Delete;
Prior;
end;
if not IsEmpty then
Delete;
EnableControls;
end;
end;
procedure TfrFacturaCliente.CargarDetalles;
var
NumeroCampo : Integer;
begin
with TablaDetallesMem do
begin
if TablaDetallesFacturas.IsEmpty then
Exit;
DisableControls;
TablaDetallesFacturas.First;
while not TablaDetallesFacturas.EOF do
begin
Append;
for NumeroCampo := 0 to TablaDetallesFacturas.FieldCount-1 do
Fields[NumeroCampo].AsString := TablaDetallesFacturas.Fields[NumeroCampo].AsString;
Post;
TablaDetallesFacturas.Next;
end;
EnableControls;
end;
end;
procedure TfrFacturaCliente.SalvarDetalles;
var
NumeroCampo : Integer;
NumConcepto : Integer;
begin
try
with TablaDetallesMem do
begin
if IsEmpty then
Exit;
NumConcepto := 0;
DisableControls;
First;
while not EOF do
begin
TablaDetallesFacturas.Append;
for NumeroCampo := 0 to FieldCount-1 do
begin
if Fields[NumeroCampo].FieldName = 'CODIGOEMPRESA' then
TablaDetallesFacturas.Fields[NumeroCampo].AsInteger := EmpresaActiva.Codigo
else begin
if Fields[NumeroCampo].FieldName = 'CODIGOFACTURA' then
TablaDetallesFacturas.Fields[NumeroCampo].AsString := Codigo.Field.asString
else
if Fields[NumeroCampo].FieldName = 'NUMCONCEPTO' then
TablaDetallesFacturas.Fields[NumeroCampo].AsInteger := NumConcepto
else
if (Fields[NumeroCampo].FieldName = 'TIPO') and EsCadenaVacia(Fields[NumeroCampo].AsString) then
TablaDetallesFacturas.Fields[NumeroCampo].AsString := 'CON'
else
TablaDetallesFacturas.Fields[NumeroCampo].AsString := Fields[NumeroCampo].AsString;
end;
end;
TablaDetallesFacturas.Post;
Next;
NumConcepto := NumConcepto + 1;
end;
EnableControls;
end
except
on E : EIBError do begin
if E.IBErrorCode = isc_unique_key_violation then
begin
TablaDetallesFacturas.Delete;
TablaDetallesMem.EnableControls;
end;
raise EIBError.Create(E.SQLCode, E.IBErrorCode, E.Message);
end;
end;
end;
procedure TfrFacturaCliente.DetalleAfterDelete(DataSet: TDataSet);
begin
CalcularTotalFactura;
end;
procedure TfrFacturaCliente.SetCodigoClienteFinal(Value: Variant);
var
DatosCliente : TDatosCliente;
begin
if VarIsNull(Value) then
exit;
FCodigoClienteFinal := Value;
DatosCliente := TDatosCliente.Create;
try
DatosCliente.Codigo := FCodigoClienteFinal;
dmTablaClientes.DarDatosCliente(DatosCliente);
CodClienteFinal.DataBinding.Field.AsString := DatosCliente.Codigo;
NombreClienteFinal.Field.AsString := DatosCliente.Nombre;
finally
DatosCliente.Free;
end;
end;
procedure TfrFacturaCliente.gridDetallesCustomDrawCell(Sender: TObject;
ACanvas: TCanvas; ARect: TRect; ANode: TdxTreeListNode;
AColumn: TdxTreeListColumn; ASelected, AFocused, ANewItemRow: Boolean;
var AText: String; var AColor: TColor; AFont: TFont;
var AAlignment: TAlignment; var ADone: Boolean);
var
IndiceCol : Integer;
begin
IndiceCol := (Sender as TdxDBGrid).ColumnByFieldName('TIPO').Index;
if ANode.Strings[IndiceCol] = 'TIT' then
begin
AFont.Style := AFont.Style + [fsBold];
if (not ASelected) and (not Focused) then
AColor := rdxLightGreen;
end;
{ if TablaDetallesMem.FieldByName('TIPO').AsString <> 'TIT' then
begin
gridDetalles.DefaultDrawColumnCell(ARect, DataCol, Column, AState);
Exit;
end;}
{ El concepto es el título de un capítulo }
{ gridDetalles.Canvas.Font.Style := [fsBold];
if not (gdSelected in AState) then
gridDetalles.Canvas.Brush.Color := gridDetalles.FixedColor;
if Column.FieldName = 'DESCRIPCION' then
gridDetalles.DefaultDrawColumnCell(ARect, DataCol, Column, AState)
else
gridDetalles.Canvas.FillRect(ARect);}
end;
procedure TfrFacturaCliente.gridDetallesEditing(Sender: TObject;
Node: TdxTreeListNode; var Allow: Boolean);
var
IndiceCol : Integer;
begin
IndiceCol := (Sender as TdxDBGrid).ColumnByFieldName('TIPO').Index;
if (Node.Strings[IndiceCol] = 'TIT') and
(gridDetalles.FocusedField.FieldName <> 'DESCRIPCION')
then
Allow := False;
end;
procedure TfrFacturaCliente.SetCodigoFacturaCargo(Value: String);
var
CodCargo : String;
DatosCargo : TDatosFacturaCliente;
begin
if EsCadenaVacia(Value) then
Exit;
CodCargo := Trim(Value);
if FCodigoFacturaCargo = CodCargo then
Exit;
if not dmTablaFacturasCliente.ValidarCodigo(CodCargo) then
begin
VerMensajeFmt(msgFacCliCodFacCargoIncorrecto, [CodCargo]);
Exit;
end;
CodCargo := dmTablaFacturasCliente.FormatearCodigo(CodCargo);
if not (dmTablaFacturasCliente.ExisteCodigo(EmpresaActiva.Codigo, CodCargo)) then
begin
VerMensajeFmt(msgFacCliCodFacCargoNoExiste, [CodCargo]);
Exit;
end;
if (dmTablaFacturasCliente.DarClaseFactura(EmpresaActiva.Codigo, CodCargo) <> 'C') then
begin
VerMensajeFmt(msgFacCliClaseFacDistinta, [CodCargo]);
Exit;
end;
ClaseFactura := cfFactAbono;
FCodigoFacturaCargo := CodCargo;
CodFacturaCargo.Field.AsString := CodCargo;
DatosCargo := TDatosFacturaCliente.Create;
DatosCargo.Codigo := CodCargo;
DatosCargo.CodigoEmpresa := EmpresaActiva.Codigo;
try
if dmTablaFacturasCliente.DarDatosFactura(DatosCargo) then
begin
with TablaFacturas do
begin
FieldByName('FORMAPAGO').AsString := DatosCargo.FormaPago;
FieldByName('DESCRIPCION').AsString := DatosCargo.Descripcion;
FieldByName('CODIGOCLIENTE').AsString := DatosCargo.CodigoCliente;
FieldByName('NIFCIF').AsString := DatosCargo.NifCif;
FieldByName('NOMBRE').AsString := DatosCargo.Nombre;
FieldByName('CALLE').AsString := DatosCargo.Calle;
FieldByName('NUMERO').AsString := DatosCargo.Numero;
FieldByName('PISO').AsString := DatosCargo.Piso;
FieldByName('CODIGOPOSTAL').AsString := DatosCargo.CodigoPostal;
FieldByName('POBLACION').AsString := DatosCargo.Poblacion;
FieldByName('PROVINCIA').AsString := DatosCargo.Provincia;
FieldByName('PERSONACONTACTO').AsString := DatosCargo.PersonaContacto;
FieldByName('TELEFONO').AsString := DatosCargo.Telefono;
FieldByName('FAX').AsString := DatosCargo.Fax;
FieldByName('DESCUENTO').AsInteger := DatosCargo.Descuento;
FieldByName('IVA').AsInteger := DatosCargo.Iva;
FieldByName('BANCO').AsString := DatosCargo.Banco;
FieldByName('NOTAS').AsString := DatosCargo.Notas;
FieldByName('CODIGOCLIENTEFINAL').AsString := DatosCargo.CodigoClienteFinal;
FieldByName('NOMBRECLIENTEFINAL').AsString := DatosCargo.NombreClienteFinal;
TablaFacturas.FieldByName('CLASEFACTURA').AsString := 'A';
FieldByName('CODIGOCARGO').AsString := FCodigoFacturaCargo;
end;
CopiarConceptosFacturaCargo;
CalcularTotalFactura;
end
else
raise Exception.CreateFmt(msgFacCliCodFacCargoNoExiste, [CodCargo]);
finally
DatosCargo.Free;
end;
end;
procedure TfrFacturaCliente.SetClaseFactura(Value: TClaseFactura);
begin
if (FClaseFactura = Value) then
exit;
FClaseFactura := Value;
case FClaseFactura of
cfFactLibre : ActivarFacturaLibre;
cfFactPre : ActivarPresupuesto;
cfFactAlb : ActivarAlbaran;
cfFactAbono : ActivarAbono;
else ActivarFacturaLibre;
end;
end;
procedure TfrFacturaCliente.ActivarAbono;
begin
pnlAbono.Left := 273;
pnlAbono.Top := 48;
pnlAbono.Visible := True;
end;
procedure TfrFacturaCliente.CopiarConceptosFacturaCargo;
var
oSQL : TIBSQL;
begin
oSQL := TIBSQL.Create(Self);
with oSQL do
begin
Database := dmBaseDatos.BD;
Transaction := dmBaseDatos.Transaccion;
SQL.Add('select * ');
SQL.Add('from DETALLESFACTURASCLIENTE ');
SQL.Add('where CODIGOFACTURA = :CODIGOFACTURA ');
SQL.Add('and CODIGOEMPRESA = :CODIGOEMPRESA ');
SQL.Add('order by NUMCONCEPTO');
end;
try
with TablaDetallesMem do
begin
oSQL.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
oSQL.ParamByName('CODIGOFACTURA').AsString := CodigoFacturaCargo;
oSQL.Prepare;
oSQL.ExecQuery;
DisableControls;
while not oSQL.EOF do
begin
Append;
FieldByName('CODIGOFACTURA').AsString := Codigo.Field.AsString;
FieldByName('NUMCONCEPTO').AsInteger := oSQL.FieldByName('NUMCONCEPTO').AsInteger;
FieldByName('TIPO').AsString := oSQL.FieldByName('TIPO').AsString;
FieldByName('CODIGOARTICULO').AsString := oSQL.FieldByName('CODIGOARTICULO').AsString;
FieldByName('DESCRIPCION').AsString := oSQL.FieldByName('DESCRIPCION').AsString;
FieldByName('UNIDADESMEDIDA').AsString := oSQL.FieldByName('UNIDADESMEDIDA').AsString;
FieldByName('CANTIDAD').AsString := oSQL.FieldByName('CANTIDAD').AsString;
FieldByName('PRECIOUNIDAD').AsFloat := (-1) * oSQL.FieldByName('PRECIOUNIDAD').AsFloat;
FieldByName('PRECIO').AsString := oSQL.FieldByName('PRECIO').AsString;
FieldByName('MINUTOS').AsString := oSQL.FieldByName('MINUTOS').AsString;
FieldByName('PRECIOMINUTO').AsFloat := (-1) * oSQL.FieldByName('PRECIOMINUTO').AsFloat;
FieldByName('PLUS').AsString := oSQL.FieldByName('PLUS').AsString;
FieldByName('TOTAL').AsString := oSQL.FieldByName('TOTAL').AsString;
CalcularTotalDetalle;
Post;
oSQL.Next;
end;
First;
EnableControls;
end;
except
on E : EIBError do
TratarExcepcion(E);
on E : Exception do
TratarExcepcion(E);
end;
oSQL.Close;
oSQL.Transaction := NIL;
oSQL.Free;
end;
procedure TfrFacturaCliente.GridBotonDescripcionClick(Sender: TObject);
begin
TablaDetallesMem.Edit;
WidthModal := 420;
HeightModal := 435;
ModoModal := Modo;
ContenidoModal := TfrEditorDescripcion.Create(Self);
end;
procedure TfrFacturaCliente.ProvinciaSetText(Sender: TField;
const Text: String);
begin
FCodigoProvincia := dmTablaProvincias.darCodigoProvincia(Text);
Sender.AsString := Text;
end;
procedure TfrFacturaCliente.CodClientePropertiesButtonClick(
Sender: TObject; AButtonIndex: Integer);
begin
ContenidoModal := TfrClientes.Create(Self);
CodigoCliente := FCodigoClienteAux;
end;
procedure TfrFacturaCliente.CodClientePropertiesValidate(Sender: TObject;
var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
begin
if not (Modo in [Anadir, Modificar]) then
Exit;
if EsCadenaVacia(DisplayValue) then
exit;
if (dmTablaClientes.validarCodigo(DisplayValue)) then begin
//Comprueba que le numero es lo sufucientemente pequeño para ser un entero
if not EsSmallInt(DisplayValue) then
begin
VerMensajeFmt(msgCliCodCliIncorrecto,[DisplayValue]);
DisplayValue := '0';
Codigo.SetFocus;
end
else
begin
DisplayValue := dmTablaClientes.formatearCodigo(DisplayValue);
if (dmTablaClientes.existeCodigo(DisplayValue)) then
CodigoCliente := DisplayValue
else begin
VerMensajeFmt(msgCliCodCliNoExiste, [DisplayValue]);
Paginas.ActivePageIndex := 0;
CodCliente.SetFocus;
end;
end;
end
else begin
VerMensajeFmt(msgCliCodCliIncorrecto, [CodCliente.Text]);
Paginas.ActivePageIndex := 0;
CodCliente.SetFocus;
end;
end;
procedure TfrFacturaCliente.CodClienteFinalPropertiesButtonClick(
Sender: TObject; AButtonIndex: Integer);
begin
ContenidoModal := TfrClientes.Create(Self);
CodigoClienteFinal := FCodigoClienteAux;
end;
procedure TfrFacturaCliente.CodClienteFinalPropertiesValidate(
Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
var Error: Boolean);
begin
if not (Modo in [Anadir, Modificar]) then
Exit;
if EsCadenaVacia(DisplayValue) then
Exit;
if (dmTablaClientes.validarCodigo(DisplayValue)) then begin
//Comprueba que le numero es lo sufucientemente pequeño para ser un entero
if not EsSmallInt(DisplayValue) then
begin
VerMensajeFmt(msgCliCodCliIncorrecto,[DisplayValue]);
DisplayValue := '0';
Codigo.SetFocus;
end
else
begin
DisplayValue := dmTablaClientes.FormatearCodigo(DisplayValue);
if (dmTablaClientes.ExisteCodigo(DisplayValue)) then
CodigoClienteFinal := DisplayValue
else
begin
VerMensajeFmt(msgCliCodCliNoExiste, [DisplayValue]);
Paginas.ActivePage := pagCliente;
CodClienteFinal.SetFocus;
end;
end;
end
else begin
VerMensajeFmt(msgCliCodCliIncorrecto, [CodClienteFinal.Text]);
Paginas.ActivePage := pagCliente;
CodClienteFinal.SetFocus;
end;
end;
end.