167 lines
4.8 KiB
ObjectPascal
167 lines
4.8 KiB
ObjectPascal
|
|
unit uBizImportesCabeceraBase;
|
|||
|
|
|
|||
|
|
interface
|
|||
|
|
|
|||
|
|
uses
|
|||
|
|
uDAInterfaces, uDADataTable;
|
|||
|
|
|
|||
|
|
type
|
|||
|
|
IBizImportesCabecera = interface(IDAStronglyTypedDataTable)
|
|||
|
|
['{566EE7D3-EE6D-4B01-B327-92E288A0C5A0}']
|
|||
|
|
procedure RecalcularImporte;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
TBizIVAFieldRules = class(TDAFieldRules)
|
|||
|
|
protected
|
|||
|
|
procedure OnChange(Sender: TDACustomField); override;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
TBizDescuentoFieldRules = class(TDAFieldRules)
|
|||
|
|
protected
|
|||
|
|
procedure OnChange(Sender: TDACustomField); override;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
TBizBaseImponibleFieldRules = class(TDAFieldRules)
|
|||
|
|
protected
|
|||
|
|
procedure OnChange(Sender: TDACustomField); override;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
|
|||
|
|
procedure RecalcularImportesCabecera(aDataTable : TDADataTable); overload;
|
|||
|
|
procedure RecalcularImportesCabecera(aMasterTable, aDetailTable : TDADataTable); overload;
|
|||
|
|
|
|||
|
|
implementation
|
|||
|
|
|
|||
|
|
uses
|
|||
|
|
SysUtils, DB, uBizImportesDetalleBase;
|
|||
|
|
|
|||
|
|
const
|
|||
|
|
fld_BASEIMPONIBLE = 'BASEIMPONIBLE';
|
|||
|
|
fld_IVA = 'IVA';
|
|||
|
|
fld_IMPORTEIVA = 'IMPORTEIVA';
|
|||
|
|
fld_DESCUENTO = 'DESCUENTO';
|
|||
|
|
fld_IMPORTEDESCUENTO = 'IMPORTEDESCUENTO';
|
|||
|
|
fld_IMPORTETOTAL = 'IMPORTETOTAL';
|
|||
|
|
|
|||
|
|
procedure RecalcularImportesCabecera(aDataTable : TDADataTable);
|
|||
|
|
{ Recalcula todos los importes de la cabecera a partir de la base imponible }
|
|||
|
|
var
|
|||
|
|
BIField : TDAField;
|
|||
|
|
IDField : TDAField;
|
|||
|
|
DTOField : TDAField;
|
|||
|
|
IVAField : TDAField;
|
|||
|
|
IIField : TDAField;
|
|||
|
|
ITField : TDAField;
|
|||
|
|
EnEdicion : Boolean;
|
|||
|
|
begin
|
|||
|
|
BIField := aDataTable.FindField(fld_BASEIMPONIBLE);
|
|||
|
|
if not Assigned(BIField) then
|
|||
|
|
raise Exception.Create('Campo BASEIMPONIBLE no encontrado (CalcularImportes)');
|
|||
|
|
|
|||
|
|
IDField := aDataTable.FindField(fld_IMPORTEDESCUENTO);
|
|||
|
|
if not Assigned(IDField) then
|
|||
|
|
raise Exception.Create('Campo IMPORTEDESCUENTO no encontrado (CalcularImportes)');
|
|||
|
|
|
|||
|
|
DTOField := aDataTable.FindField(fld_DESCUENTO);
|
|||
|
|
if not Assigned(DTOField) then
|
|||
|
|
raise Exception.Create('Campo DESCUENTO no encontrado (CalcularImportes)');
|
|||
|
|
|
|||
|
|
IVAField := aDataTable.FindField(fld_IVA);
|
|||
|
|
if not Assigned(IVAField) then
|
|||
|
|
raise Exception.Create('Campo IVA no encontrado (CalcularImportes)');
|
|||
|
|
|
|||
|
|
IIField := aDataTable.FindField(fld_IMPORTEIVA);
|
|||
|
|
if not Assigned(IIField) then
|
|||
|
|
raise Exception.Create('Campo IMPORTEIVA no encontrado (CalcularImportes)');
|
|||
|
|
|
|||
|
|
ITField := aDataTable.FindField(fld_IMPORTETOTAL);
|
|||
|
|
if not Assigned(ITField) then
|
|||
|
|
raise Exception.Create('Campo IMPORTETOTAL no encontrado (CalcularImportes)');
|
|||
|
|
|
|||
|
|
// <20>Viene en modo edici<63>n?
|
|||
|
|
EnEdicion := (aDataTable.State in dsEditModes);
|
|||
|
|
|
|||
|
|
if not EnEdicion then
|
|||
|
|
aDataTable.Edit;
|
|||
|
|
|
|||
|
|
IDField.Value := BIField.AsCurrency * (DTOField.AsInteger/100);
|
|||
|
|
ITField.Value := BIField.AsCurrency - IDField.AsCurrency;
|
|||
|
|
IIField.Value := ITField.AsCurrency * (IVAField.AsInteger/100);
|
|||
|
|
ITField.Value := ITField.AsCurrency + IIField.AsCurrency;
|
|||
|
|
|
|||
|
|
if EnEdicion then
|
|||
|
|
aDataTable.Edit; // Para dejar la tabla como estaba otra vez
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
procedure RecalcularImportesCabecera(aMasterTable, aDetailTable : TDADataTable);
|
|||
|
|
{ Recalcula todos los importes de la cabecera a partir de los detalles }
|
|||
|
|
var
|
|||
|
|
aDetalle : IBizImportesDetalle;
|
|||
|
|
BIField : TDAField;
|
|||
|
|
EnEdicion : Boolean;
|
|||
|
|
begin
|
|||
|
|
BIField := aMasterTable.FindField(fld_BASEIMPONIBLE);
|
|||
|
|
if not Assigned(BIField) then
|
|||
|
|
raise Exception.Create('Campo BASEIMPONIBLE no encontrado (CalcularImportes)');
|
|||
|
|
|
|||
|
|
// <20>Viene en modo edici<63>n?
|
|||
|
|
EnEdicion := (aMasterTable.State in dsEditModes);
|
|||
|
|
|
|||
|
|
if not EnEdicion then
|
|||
|
|
aMasterTable.Edit;
|
|||
|
|
|
|||
|
|
BIField.Value := 0;
|
|||
|
|
if aDetailTable.RecordCount > 0 then
|
|||
|
|
if Supports(aDetailTable, IBizImportesDetalle, aDetalle) then
|
|||
|
|
BIField.Value := aDetalle.DarSumaTotalImportes;
|
|||
|
|
|
|||
|
|
RecalcularImportesCabecera(aMasterTable);
|
|||
|
|
|
|||
|
|
if EnEdicion then
|
|||
|
|
aMasterTable.Edit; // Para dejar la tabla como estaba otra vez
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
{ TBizIVAFieldRules }
|
|||
|
|
|
|||
|
|
procedure TBizIVAFieldRules.OnChange(Sender: TDACustomField);
|
|||
|
|
var
|
|||
|
|
aCabecera : IBizImportesCabecera;
|
|||
|
|
begin
|
|||
|
|
inherited;
|
|||
|
|
if Supports(DataTable, IBizImportesCabecera, aCabecera) then
|
|||
|
|
aCabecera.RecalcularImporte;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
{ TBizDescuentoFieldRules }
|
|||
|
|
|
|||
|
|
procedure TBizDescuentoFieldRules.OnChange(Sender: TDACustomField);
|
|||
|
|
var
|
|||
|
|
aCabecera : IBizImportesCabecera;
|
|||
|
|
begin
|
|||
|
|
inherited;
|
|||
|
|
if Supports(DataTable, IBizImportesCabecera, aCabecera) then
|
|||
|
|
aCabecera.RecalcularImporte;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
{ TBizBaseImponibleFieldRules }
|
|||
|
|
|
|||
|
|
procedure TBizBaseImponibleFieldRules.OnChange(Sender: TDACustomField);
|
|||
|
|
var
|
|||
|
|
aCabecera : IBizImportesCabecera;
|
|||
|
|
begin
|
|||
|
|
inherited;
|
|||
|
|
if Supports(DataTable, IBizImportesCabecera, aCabecera) then
|
|||
|
|
aCabecera.RecalcularImporte;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
initialization
|
|||
|
|
RegisterFieldRules('Client.Field.Descuento', TBizDescuentoFieldRules);
|
|||
|
|
RegisterFieldRules('Client.Field.IVA', TBizIVAFieldRules);
|
|||
|
|
RegisterFieldRules('Client.Field.BaseImponible', TBizBaseImponibleFieldRules);
|
|||
|
|
|
|||
|
|
finalization
|
|||
|
|
|
|||
|
|
end.
|