unit uProcesoPresupuestosClienteController; interface uses Classes, SysUtils, uDADataTable, FactuGES_Intf, uControllerBase, uIDataModulePedidosCliente, uBizPedidosCliente, uPedidosClienteController, uBizPedidosProveedor, uPedidosProveedorController, uBizAlbaranesProveedor, uAlbaranesProveedorController, uBizFacturasProveedor, uFacturasProveedorController; type IProcesoPresupuestosClienteController = interface(IControllerBase) ['{CBF0D9CF-2CFB-4205-9891-4BAA4EFE0D7C}'] procedure VerProceso(const ListaIDPresupuestosCliente: TIntegerArray); end; TProcesoPresupuestosClienteController = class(TControllerBase, IProcesoPresupuestosClienteController) private FPedidosClienteController : IPedidosClienteController; FPedidosProveedorController : IPedidosProveedorController; FAlbaranesProveedorController : IAlbaranesProveedorController; FFacturasProveedorController : IFacturasProveedorController; public constructor Create; override; destructor Destroy; override; function BuscarPedidosCliente(const ListaIDPresupuestosCliente: TIntegerArray): IBizPedidoCliente; function BuscarPedidosProveedor(const ListaIDPresupuestosCliente: TIntegerArray): IBizPedidoProveedor; function BuscarAlbaranesProveedor(APedidosProveedor: IBizPedidoProveedor): IBizAlbaranProveedor; function BuscarFacturasProveedor(AAlbaranesProveedor: IBizAlbaranProveedor): IBizFacturaProveedor; procedure VerProceso(const ListaIDPresupuestosCliente: TIntegerArray); end; implementation uses uROTypes, Controls, cxControls, DB, uEditorRegistryUtils, uEditorPreview, DateUtils, uFactuGES_App, uDataTableUtils, uDataModuleUsuarios, Forms, schPedidosClienteClient_Intf, uDAInterfaces, uDateUtils, Dialogs, Variants, uSistemaFunc, uIntegerListUtils, uStringsUtils, uIEditorProcesoPresupuestosCliente, uModuleController; { TProcesoPresupuestosClienteController } constructor TProcesoPresupuestosClienteController.Create; begin inherited; FPedidosClienteController := TPedidosClienteController.Create; FPedidosProveedorController := TPedidosProveedorController.Create; FAlbaranesProveedorController := TAlbaranesProveedorController.Create; FFacturasProveedorController := TFacturasProveedorController.Create; end; destructor TProcesoPresupuestosClienteController.Destroy; begin FPedidosClienteController := Nil; FPedidosProveedorController := Nil; FAlbaranesProveedorController := Nil; FFacturasProveedorController := Nil; inherited; end; function TProcesoPresupuestosClienteController.BuscarAlbaranesProveedor(APedidosProveedor: IBizPedidoProveedor): IBizAlbaranProveedor; var Condicion: TDAWhereExpression; AArray : Array of TDAWhereExpression; i: Integer; begin Result := FAlbaranesProveedorController.BuscarTodos; //Quitamos el filtro por empresa ya que no es necesario y complicaría where que hacemos a continuación, además de que puede darse el caso de haber dado de alta un pedido de proveedor con otra empresa? Result.DataTable.DynamicWhere.Clear; if Assigned(Result) then begin //Vamos generando todos los where necesarios para cada uno de los ID de Pedido de proveedor que buscamos // Filtrar los Presupuestos pendientes de recepcion with Result.DataTable.DynamicWhere do begin APedidosProveedor.Open; SetLength(AArray, APedidosProveedor.RecordCount); APedidosProveedor.First; i:=0; while not ApedidosProveedor.EOF do begin AArray[i] := NewConstant(APedidosProveedor.ID, datInteger); Inc(i); APedidosProveedor.Next; end; // (ID_PEDIDO in lista IDs) Condicion := NewBinaryExpression(NewField('', 'ID_PEDIDO'), NewList(AArray), dboIn); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); APedidosProveedor.Close; end; end; end; function TProcesoPresupuestosClienteController.BuscarFacturasProveedor(AAlbaranesProveedor: IBizAlbaranProveedor): IBizFacturaProveedor; var Condicion: TDAWhereExpression; AArray : Array of TDAWhereExpression; i: Integer; begin Result := FFacturasProveedorController.BuscarTodosDeAlbaran; if Assigned(Result) then begin // Filtrar los Presupuestos pendientes de recepcion with Result.DataTable.DynamicWhere do begin //Vamos generando todos los where necesarios para cada uno de los ID de Pedido de proveedor que buscamos AAlbaranesProveedor.Open; SetLength(AArray, AAlbaranesProveedor.RecordCount); AAlbaranesProveedor.First; i:=0; while not AAlbaranesProveedor.EOF do begin if not AAlbaranesProveedor.ID_FACTURAIsNull then begin AArray[i] := NewConstant(AAlbaranesProveedor.ID, datInteger); Inc(i); end; AAlbaranesProveedor.Next; end; // (ID in lista de IDs) Condicion := NewBinaryExpression(NewField('', 'ID_ALBARAN'), NewList(AArray), dboIn); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboOr); AAlbaranesProveedor.Close; end; end; end; function TProcesoPresupuestosClienteController.BuscarPedidosCliente(const ListaIDPresupuestosCliente: TIntegerArray): IBizPedidoCliente; var Condicion: TDAWhereExpression; AArray : Array of TDAWhereExpression; i: Integer; begin Result := FPedidosClienteController.BuscarTodos; //Quitamos el filtro por empresa ya que no es necesario y complicaría where que hacemos a continuación Result.DataTable.DynamicWhere.Clear; if Assigned(Result) then begin // Filtrar los pedidos de cliente que esten en la lista with Result.DataTable.DynamicWhere do begin SetLength(AArray, ListaIDPresupuestosCliente.Count); //Vamos generando la lista de ID de pedidos de cliente que vamos a inlcuir en la clausula IN for i := 0 to ListaIDPresupuestosCliente.Count - 1 do AArray[i] := NewConstant(ListaIDPresupuestosCliente.Items[i], datInteger); // (ID IN lista de IDs) Condicion := NewBinaryExpression(NewField('', fld_PedidosClienteID), NewList(AArray), dboIn); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; end; end; function TProcesoPresupuestosClienteController.BuscarPedidosProveedor(const ListaIDPresupuestosCliente: TIntegerArray): IBizPedidoProveedor; var Condicion: TDAWhereExpression; AArray : Array of TDAWhereExpression; i: Integer; begin Result := FPedidosProveedorController.BuscarTodos; //Quitamos el filtro por empresa ya que no es necesario y complicaría where que hacemos a continuación, además de que puede darse el caso de haber dado de alta un pedido de proveedor con otra empresa? Result.DataTable.DynamicWhere.Clear; if Assigned(Result) then begin // Filtrar los Pedidos de proveedor relacionados con los pedidos de cliente pasados por parametro with Result.DataTable.DynamicWhere do begin SetLength(AArray, ListaIDPresupuestosCliente.Count); //Vamos generando la lista de ID de pedidos de cliente que vamos a inlcuir en la clausula IN for i := 0 to ListaIDPresupuestosCliente.Count - 1 do AArray[i] := NewConstant(ListaIDPresupuestosCliente.Items[i], datInteger); // (ID_PEDIDO_CLIENTE IN lista de IDs) Condicion := NewBinaryExpression(NewField('', 'ID_PEDIDO_CLIENTE'), NewList(AArray), dboIn); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; end; end; procedure TProcesoPresupuestosClienteController.VerProceso(const ListaIDPresupuestosCliente: TIntegerArray); var AEditor : IEditorProcesoPresupuestosCliente; APedidosCliente: IBizPedidoCliente; APedidosProveedor: IBizPedidoProveedor; AAlbaranesProveedor: IBizAlbaranProveedor; AFacturasProveedor: IBizFacturaProveedor; begin AEditor := NIL; APedidosCliente := BuscarPedidosCliente(ListaIDPresupuestosCliente); APedidosProveedor := BuscarPedidosProveedor(ListaIDPresupuestosCliente); AAlbaranesProveedor := BuscarAlbaranesProveedor(APedidosProveedor); AFacturasProveedor := BuscarFacturasProveedor(AAlbaranesProveedor); CreateEditor('EditorProcesoPresupuestosCLiente', IEditorProcesoPresupuestosCliente, AEditor); if Assigned(AEditor) then try // AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE AEditor.PedidosCliente := APedidosCliente; AEditor.PedidosProveedor := APedidosProveedor; AEditor.AlbaranesProveedor := AAlbaranesProveedor; AEditor.FacturasProveedor := AFacturasProveedor; AEditor.ShowModal; finally AEditor.Release; AEditor := NIL; end; end; end.