unit uControllerDetallesDTO;

interface

uses Classes, Variants, uDACDSDataTable, uDADataTable, uControllerDetallesBase;

const
  CAMPO_DESCUENTO = 'DESCUENTO';
  //Además del descuento tambien se añade el Precio de porte por artículo
  CAMPO_IMPORTE_PORTE = 'IMPORTE_PORTE';

type
  IControllerDetallesDTO = interface(IControllerDetallesBase)
  ['{F6C5D9E4-4D3D-404F-9B6A-58D4A24B01C6}']
  end;

  TControllerDetallesDTO = class (TControllerDetallesBase, IControllerDetallesDTO)
  protected
    //Si en los hijos existen campos a tener en cuenta se sobreescribira este metodo
    procedure ValidarCampos(DataTable: TDADataTable); override;

    //Si sobreescribimos este método podremos tener en cuenta otras columnas para el calculo del importe total de un concepto
    function CalcularImporteTotalConcepto(DataTable: TDADataTable): Double; override;
  end;


implementation

{ TControllerDetallesBase }

uses SysUtils, uDAInterfaces;

function TControllerDetallesDTO.CalcularImporteTotalConcepto(DataTable: TDADataTable): Double;
var
  ImporteTotal : Double;
begin
  ImporteTotal := 0;
  
  with DataTable do
  begin
    if (VarIsNull(FieldByName(CAMPO_DESCUENTO).AsVariant)) then
      ImporteTotal := FieldByName(CAMPO_CANTIDAD).asInteger * FieldByName(CAMPO_IMPORTE_UNIDAD).AsFloat
    else
      ImporteTotal := FieldByName(CAMPO_CANTIDAD).asInteger * (FieldByName(CAMPO_IMPORTE_UNIDAD).AsFloat - (FieldByName(CAMPO_IMPORTE_UNIDAD).AsFloat * (FieldByName(CAMPO_DESCUENTO).AsFloat/100)));

    if (VarIsNull(FieldByName(CAMPO_IMPORTE_PORTE).AsVariant)) then
      ImporteTotal := ImporteTotal
    else
      ImporteTotal := ImporteTotal + (FieldByName(CAMPO_CANTIDAD).asInteger * FieldByName(CAMPO_IMPORTE_PORTE).AsFloat);
  end;

  Result := ImporteTotal;
end;

procedure TControllerDetallesDTO.validarCampos(DataTable: TDADataTable);
var
  AField: TDAField;
begin
  inherited;
  //Validamos la existencia de todos los campos necesarios

  AField := DataTable.FindField(CAMPO_DESCUENTO);
  if not Assigned(AField) then
     raise Exception.Create('Campo ' + CAMPO_DESCUENTO + ' no encontrado (validarCampos)');


  AField := DataTable.FindField(CAMPO_IMPORTE_PORTE);
  if not Assigned(AField) then
     raise Exception.Create('Campo ' + CAMPO_IMPORTE_PORTE + ' no encontrado (validarCampos)');
end;

end.
