Tecsitel_FactuGES2/Source/Base/ControllerBase/uControllerDetallesDTO.pas

71 lines
2.3 KiB
ObjectPascal

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
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.