unit uDetallesContratoClienteController; interface uses uDADataTable, uControllerDetallesBase, uControllerDetallesArticulos, uBizDetallesContratoCliente, uIDataModuleContratosCliente, uBizArticulos, uBizContactos, uBizDetallesPresupuestoCliente, uDetallesPresupuestoClienteController; type IDetallesContratoClienteController = interface(IControllerDetallesArticulos) ['{9CA228BB-229C-451F-B3F2-2352F80A861A}'] procedure AnadirArticulos(ADetalles: IDAStronglyTypedDataTable; ACliente: IBizCliente; const ANuevaFila :Boolean = True); overload; procedure ActualizarDetalles(ADetalles: IDAStronglyTypedDataTable; ACliente: IBizCliente); overload; procedure DesglosarPorteDetalles(ImportePorte: Currency; ADetalles: IDAStronglyTypedDataTable); function DarTotalPorteTotal(ADetalles: IDAStronglyTypedDataTable): Double; function DarPropiedades: IBizPropiedades; procedure AnadirCapitulo (const Tipo: String; const Descripcion: String; Const Descuento:Boolean; ADetalles: IDAStronglyTypedDataTable); procedure SetTipoArticulo(ADetalles: IDAStronglyTypedDataTable; ATipo: String); procedure SetVisible(ADetalles: IDAStronglyTypedDataTable;const AVisible: Integer;const Orden: Integer); //1Ascendente/0Descendente end; TDetallesContratoClienteController = class(TControllerDetallesArticulos, IDetallesContratoClienteController) private //Propiedad temporal hasta que exista el controlador independiente de propiedades y capitulos, valores, etc FDetallesPresupuestoCliente: IDetallesPresupuestoClienteController; FDataModule : IDataModuleContratosCliente; protected procedure RellenarOtros(ADetalles: IDAStronglyTypedDataTable; AArticulos: IBizArticulo); overload; 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; ACliente: IBizCliente; const ANuevaFila :Boolean = True); reintroduce; overload; procedure ActualizarDetalles(ADetalles: IDAStronglyTypedDataTable; ACliente: IBizCliente); overload; constructor Create; override; destructor Destroy; override; function DarPropiedades: IBizPropiedades; procedure AnadirCapitulo (const Tipo: String; const Descripcion: String; Const Descuento:Boolean; ADetalles: IDAStronglyTypedDataTable); //Se sobre escribe para hacer otro recorrido y rellenar el tipo_articulo a todos los conceptos de los capitulos procedure ValidarDetalles(ADataTable: IDAStronglyTypedDataTable); override; procedure SetTipoArticulo(ADetalles: IDAStronglyTypedDataTable; ATipo: String); procedure SetVisible(ADetalles: IDAStronglyTypedDataTable;const AVisible: Integer;const Orden: Integer); //1Ascendente/0Descendente end; implementation uses Controls, SysUtils, Dialogs, uDAInterfaces, uDialogUtils, Variants, uDataModuleContratosCliente, uArticulosContratoClienteController, schContratosClienteClient_Intf, uDataTableUtils, uCalculosUtils, //uIEditorAsignarDescuento, uEditorRegistryUtils, uFactuGES_App; { TDetallesContratoClienteController } procedure TDetallesContratoClienteController.ActualizarDetalles(ADetalles: IDAStronglyTypedDataTable; ACliente: IBizCliente); var AArticulos : IBizArticulo; begin if Assigned(ADetalles) then begin try // AArticulos := (FArticulosController.BuscarTodos(ACliente) as IBizArticulo); // ActualizarDetalles(ADetalles, AArticulos); ActualizarDetalles(ADetalles, ACliente.DESCUENTO_LINEA); ShowInfoMessage('Se ha actualizado el descuento para el cliente seleccionado'); finally AArticulos := Nil; end; end; end; procedure TDetallesContratoClienteController.AnadirArticulos(ADetalles: IDAStronglyTypedDataTable; ACliente: IBizCliente; const ANuevaFila :Boolean); var AArticulos: IBizArticulo; begin if Assigned(ADetalles) then begin try AArticulos := (FArticulosController.BuscarTodos(ACliente) 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 IArticulosContratoClienteController).ElegirArticulos(AArticulos, 'Elija los artículos que desea añadir a este presupuesto de cliente', True); Add(ADetalles, AArticulos) end else begin AArticulos := (FArticulosController as IArticulosContratoClienteController).ElegirArticulos(AArticulos, 'Elija el artículo que desea añadir a este presupuesto de cliente', False); RellenarDetalle(ADetalles, AArticulos); end; finally AArticulos := Nil; end; end; end; procedure TDetallesContratoClienteController.AnadirCapitulo(const Tipo: String; const Descripcion: String; Const Descuento:Boolean; ADetalles: IDAStronglyTypedDataTable); begin FDetallesPresupuestoCliente.AnadirCapitulo(Tipo, Descripcion, Descuento, ADetalles); end; procedure TDetallesContratoClienteController.AsignarController; begin FArticulosController := TArticulosContratoClienteController.Create; end; function TDetallesContratoClienteController.CalcularImporteTotalConcepto(DataTable: TDADataTable): Double; begin Result := CalcularLineaConcepto(DataTable); end; constructor TDetallesContratoClienteController.Create; begin inherited; FDataModule := TDataModuleContratosCliente.Create(Nil); FDetallesPresupuestoCliente:= TDetallesPresupuestoClienteController.Create; end; function TDetallesContratoClienteController.DarPropiedades: IBizPropiedades; begin Result := FDetallesPresupuestoCliente.DarPropiedades; end; function TDetallesContratoClienteController.DarTotalPorteTotal(ADetalles: IDAStronglyTypedDataTable): Double; begin Result := DarTotalPorte(ADetalles); end; procedure TDetallesContratoClienteController.DesglosarPorteDetalles(ImportePorte: Currency; ADetalles: IDAStronglyTypedDataTable); begin DesglosarPorte(ImportePorte, ADetalles); ActualizarTotales(ADetalles); end; destructor TDetallesContratoClienteController.Destroy; begin FDataModule := Nil; FDetallesPresupuestoCliente := Nil; inherited; end; procedure TDetallesContratoClienteController.RellenarOtros(ADetalles: IDAStronglyTypedDataTable; AArticulos: IBizArticulo); var ACadena : String; begin ACadena := ADetalles.DataTable.FieldByName('PROPIEDAD').AsString; if (AArticulos.REFERENCIA_PROV <> '') then ACadena := AArticulos.REFERENCIA_PROV + ' ' + ACadena; if (AArticulos.FAMILIA <> '') then ACadena := AArticulos.FAMILIA + ' ' + ACadena; ADetalles.DataTable.FieldByName('PROPIEDAD').AsString := ACadena; //El descuento que hemos puesto a la vista de articulos es el del cliente seleccionado en el documento if Assigned(AArticulos) then ADetalles.DataTable.FieldByName(CAMPO_DESCUENTO).AsFloat := AArticulos.DESCUENTO else ADetalles.DataTable.FieldByName(CAMPO_DESCUENTO).AsFloat := 0; end; procedure TDetallesContratoClienteController.SetTipoArticulo( ADetalles: IDAStronglyTypedDataTable; ATipo: String); begin if assigned(ADetalles) then begin ADetalles.DataTable.Edit; ADetalles.DataTable.FieldByName('TIPO_ARTICULO').AsString := ATipo; ADetalles.DataTable.Post; end; end; procedure TDetallesContratoClienteController.SetVisible(ADetalles: IDAStronglyTypedDataTable; const AVisible, Orden: Integer); begin FDetallesPresupuestoCliente.SetVisible(ADetalles, AVisible, Orden); end; procedure TDetallesContratoClienteController.ValidarCampos(DataTable: TDADataTable); begin inherited; ValidarCamposLineaConcepto(DataTable); end; procedure TDetallesContratoClienteController.ValidarDetalles(ADataTable: IDAStronglyTypedDataTable); var AuxTipoArticulo : String; AuxPosicionIni : Integer; AuxPosicion : Integer; begin inherited; AuxTipoArticulo := ''; AuxPosicionIni := ADataTable.DataTable.FieldByName(CAMPO_POSICION).AsInteger; AuxPosicion := 0; BeginUpdate(ADataTable); try ADataTable.DataTable.First; while ADataTable.DataTable.Locate(CAMPO_POSICION, AuxPosicion, []) do begin if (ADataTable.DataTable.FieldByName(CAMPO_TIPO).AsString = TIPO_DETALLE_TITULO) then AuxTipoArticulo := ADataTable.DataTable.FieldByName(fld_TiposCapitulosTIPO_ARTICULO).AsString else if (ADataTable.DataTable.FieldByName(CAMPO_TIPO).AsString = TIPO_DETALLE_SUBTOTAL) then AuxTipoArticulo := '' else if (ADataTable.DataTable.FieldByName(CAMPO_TIPO).AsString = TIPO_DETALLE_CONCEPTO) then if (Length(AuxTipoArticulo) > 0) then begin if not ADataTable.DataTable.Editing then ADataTable.DataTable.Edit; ADataTable.DataTable.FieldByName(fld_TiposCapitulosTIPO_ARTICULO).AsString := AuxTipoArticulo; ADataTable.DataTable.Post; end; Inc(AuxPosicion); ADataTable.DataTable.First; end; finally //Dejamos el puntero en la misma posición que la que partió ADataTable.DataTable.Locate(CAMPO_POSICION, AuxPosicionIni, []); EndUpdate(ADataTable); end; end; procedure TDetallesContratoClienteController.RellenarImportes(ADetalles: IDAStronglyTypedDataTable; AArticulos: IBizArticulo); begin if ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).IsNull then if Assigned(AArticulos) then ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant := AArticulos.PRECIO_COSTE * AppFactuGES.EmpresaActiva.PRECIO_PUNTO else ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant := Null; end; end.