unit uDetallesPedidoProveedorController; interface uses uDADataTable, uControllerDetallesArticulos, uBizDetallesPedidoProveedor, uIDataModulePedidosProveedor, uBizArticulos, uBizContactos; type IDetallesPedidoProveedorController = interface(IControllerDetallesArticulos) ['{942428EC-BCB8-4C56-BFA6-EB9F05D5E0DB}'] procedure AnadirArticulos(ADetalles: IDAStronglyTypedDataTable; AProveedor: IBizProveedor; const ANuevaFila :Boolean = True); overload; procedure ActualizarDetalles(ADetalles: IDAStronglyTypedDataTable; AProveedor: IBizProveedor); overload; function ArticulosPendientes(const ID : Integer): IBizDetallesPedidoProveedorPend; procedure DesglosarPorteDetalles(ImportePorte: Currency; ADetalles: IDAStronglyTypedDataTable); function DarTotalPorteTotal(ADetalles: IDAStronglyTypedDataTable): Double; end; TDetallesPedidoProveedorController = class(TControllerDetallesArticulos, IDetallesPedidoProveedorController) private FDataModule : IDataModulePedidosProveedor; protected procedure RellenarOtros(ADetalles: IDAStronglyTypedDataTable; AArticulos: IBizArticulo); override; procedure RellenarImportes(ADetalles: IDAStronglyTypedDataTable; AArticulos: IBizArticulo); override; procedure AsignarController; 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; procedure ValidarCampos(DataTable: TDADataTable); override; procedure DesglosarPorteDetalles(ImportePorte: Currency; ADetalles: IDAStronglyTypedDataTable); function DarTotalPorteTotal(ADetalles: IDAStronglyTypedDataTable): Double; public procedure AnadirArticulos(ADetalles: IDAStronglyTypedDataTable; AProveedor: IBizProveedor; const ANuevaFila :Boolean = True); overload; procedure ActualizarDetalles(ADetalles: IDAStronglyTypedDataTable; AProveedor: IBizProveedor); overload; function ArticulosPendientes(const ID : Integer): IBizDetallesPedidoProveedorPend; constructor Create; override; destructor Destroy; override; end; implementation uses Variants, uControllerDetallesBase, uDataModulePedidosProveedor, uCalculosUtils, schArticulosClient_Intf, uArticulosPedidoProveedorController; { TDetallesPedidoProveedorController } procedure TDetallesPedidoProveedorController.ActualizarDetalles(ADetalles: IDAStronglyTypedDataTable; AProveedor: IBizProveedor); var AArticulos : IBizArticulo; begin if Assigned(ADetalles) then begin try AArticulos := (FArticulosController.BuscarTodos(AProveedor) as IBizArticulo); ActualizarDetalles(ADetalles, AArticulos); EliminarArticulosProveedor(ADetalles); finally AArticulos := Nil; end; end; end; procedure TDetallesPedidoProveedorController.AnadirArticulos(ADetalles: IDAStronglyTypedDataTable; AProveedor: IBizProveedor; const ANuevaFila :Boolean); var AArticulos: IBizArticulo; begin if Assigned(ADetalles) then begin try AArticulos := (FArticulosController.BuscarTodos as IBizArticulo); //Si nueva fila es false, quiere decir que se sustituye un determinado artículo, por ello la lista a seleccionar no debe ser multiselect if ANuevaFila then begin AArticulos := (FArticulosController as IArticulosPedidoProveedorController).ElegirArticulos(AArticulos, 'Elija los artículos que desea añadir a este pedido a proveedor', True, AProveedor); Add(ADetalles, AArticulos) end else begin AArticulos := (FArticulosController as IArticulosPedidoProveedorController).ElegirArticulos(AArticulos, 'Elija el artículo que desea añadir a este pedido a proveedor', False, AProveedor); RellenarDetalle(ADetalles, AArticulos); end; finally AArticulos := Nil; end; end; end; function TDetallesPedidoProveedorController.ArticulosPendientes(const ID: Integer): IBizDetallesPedidoProveedorPend; begin Result := FDataModule.GetArticulosPendientes(ID); end; procedure TDetallesPedidoProveedorController.AsignarController; begin FArticulosController := TArticulosPedidoProveedorController.Create; end; function TDetallesPedidoProveedorController.CalcularImporteTotalConcepto(DataTable: TDADataTable): Double; begin Result := CalcularLineaConcepto(DataTable); end; constructor TDetallesPedidoProveedorController.Create; begin inherited; FDataModule := TDataModulePedidosProveedor.Create(Nil); end; function TDetallesPedidoProveedorController.DarTotalPorteTotal(ADetalles: IDAStronglyTypedDataTable): Double; begin Result := DarTotalPorte(ADetalles); end; procedure TDetallesPedidoProveedorController.DesglosarPorteDetalles(ImportePorte: Currency; ADetalles: IDAStronglyTypedDataTable); begin DesglosarPorte(ImportePorte, ADetalles); ActualizarTotales(ADetalles); end; destructor TDetallesPedidoProveedorController.Destroy; begin FDataModule := Nil; inherited; end; procedure TDetallesPedidoProveedorController.RellenarOtros(ADetalles: IDAStronglyTypedDataTable; AArticulos: IBizArticulo); begin if Assigned(AArticulos) then ADetalles.DataTable.FieldByName(CAMPO_DESCUENTO).AsFloat := AArticulos.DESCUENTO else ADetalles.DataTable.FieldByName(CAMPO_DESCUENTO).AsFloat := 0; end; procedure TDetallesPedidoProveedorController.ValidarCampos(DataTable: TDADataTable); begin inherited; ValidarCamposLineaConcepto(DataTable); end; procedure TDetallesPedidoProveedorController.RellenarImportes(ADetalles: IDAStronglyTypedDataTable; AArticulos: IBizArticulo); begin if Assigned(AArticulos) then begin ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant := AArticulos.PRECIO_COSTE; ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_PORTE).AsVariant := AArticulos.PRECIO_PORTE; end else begin ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant := Null; ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_PORTE).AsVariant := Null; end; end; end.