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)');

  // ¿Viene en modo edició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)');

  // ¿Viene en modo edició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.
