unit uProcesoPresupuestosClienteController; interface uses Classes, SysUtils, uDADataTable, FactuGES_Intf, uControllerBase, uIDataModulePedidosCliente, uBizPedidosCliente, uPedidosClienteController, uBizPedidosProveedor, uPedidosProveedorController, uBizAlbaranesProveedor, uAlbaranesProveedorController, uBizFacturasProveedor, uFacturasProveedorController, uBizAlbaranesCliente, uAlbaranesClienteController, uBizFacturasCliente, uFacturasClienteController, uBizFacturasProforma, uFacturasProformaController; 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; FAlbaranesClienteController : IAlbaranesClienteController; FFacturasClienteController : IFacturasClienteController; FFacturasProformaController : IFacturasProformaController; 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; function BuscarAlbaranesCliente(APedidosCliente: IBizPedidoCliente): IBizAlbaranCliente; function BuscarFacturasCliente(AAlbaranesCliente: IBizAlbaranCliente): IBizFacturaCliente; function BuscarFacturasProforma(const ListaIDPresupuestosCliente: TIntegerArray): IBizFacturaProforma; 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; FAlbaranesClienteController := TAlbaranesClienteController.Create; FFacturasClienteController := TFacturasClienteController.Create; FFacturasProformaController := TFacturasProformaController.Create; end; destructor TProcesoPresupuestosClienteController.Destroy; begin FPedidosClienteController := Nil; FPedidosProveedorController := Nil; FAlbaranesProveedorController := Nil; FFacturasProveedorController := Nil; FAlbaranesClienteController := Nil; FFacturasClienteController := Nil; FFacturasProformaController := Nil; inherited; end; function TProcesoPresupuestosClienteController.BuscarAlbaranesCliente(APedidosCliente: IBizPedidoCliente): IBizAlbaranCliente; var Condicion: TDAWhereExpression; AArrayIdPedidosCli : Array of TDAWhereExpression; i: Integer; begin Result := FAlbaranesClienteController.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 APedidosCliente.Open; SetLength(AArrayIdPedidosCli, APedidosCliente.RecordCount); APedidosCliente.First; i:=0; while not APedidosCliente.EOF do begin AArrayIdPedidosCli[i] := NewConstant(APedidosCliente.ID, datInteger); Inc(i); APedidosCliente.Next; end; // (ID_PEDIDO in lista IDs) (SIEMPRE HAY AL MENOS UNO) Condicion := NewBinaryExpression(NewField('', 'ID_PEDIDO'), NewList(AArrayIdPedidosCli), dboIn); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); APedidosCliente.Close; end; end; end; function TProcesoPresupuestosClienteController.BuscarAlbaranesProveedor(APedidosProveedor: IBizPedidoProveedor): IBizAlbaranProveedor; var Condicion: TDAWhereExpression; AArrayIdPedidosProv : 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(AArrayIdPedidosProv, APedidosProveedor.RecordCount); APedidosProveedor.First; i:=0; while not ApedidosProveedor.EOF do begin AArrayIdPedidosProv[i] := NewConstant(APedidosProveedor.ID, datInteger); Inc(i); APedidosProveedor.Next; end; if (length(AArrayIdPedidosProv)<>0) then // (ID_PEDIDO in lista IDs) Condicion := NewBinaryExpression(NewField('', 'ID_PEDIDO'), NewList(AArrayIdPedidosProv), dboIn) else // (ID is null, para que nos devuelva la lista vacia) Condicion := NewBinaryExpression(NewField('', 'ID'), NewConstant(ID_NULO, datInteger), dboEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); APedidosProveedor.Close; end; end; end; function TProcesoPresupuestosClienteController.BuscarFacturasCliente(AAlbaranesCliente: IBizAlbaranCliente): IBizFacturaCliente; var Condicion: TDAWhereExpression; AArrayIdAlbaranesCli : Array of TDAWhereExpression; i: Integer; begin Result := FFacturasClienteController.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 AAlbaranesCliente.Open; AAlbaranesCliente.First; i:=0; while not AAlbaranesCliente.EOF do begin if not AAlbaranesCliente.ID_FACTURAIsNull then begin SetLength(AArrayIdAlbaranesCli, i+1); AArrayIdAlbaranesCli[i] := NewConstant(AAlbaranesCliente.ID, datInteger); Inc(i); end; AAlbaranesCliente.Next; end; if (length(AArrayIdAlbaranesCli)<>0) then // (ID in lista de IDs) Condicion := NewBinaryExpression(NewField('', 'ID_ALBARAN'), NewList(AArrayIdAlbaranesCli), dboIn) else // (ID is null, para que nos devuelva la lista vacia) Condicion := NewBinaryExpression(NewField('', 'ID'), NewConstant(ID_NULO, datInteger), dboEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboOr); AAlbaranesCliente.Close; end; end; end; function TProcesoPresupuestosClienteController.BuscarFacturasProforma(const ListaIDPresupuestosCliente: TIntegerArray): IBizFacturaProforma; var Condicion: TDAWhereExpression; AArrayIdPresupuestosCli : Array of TDAWhereExpression; i: Integer; begin Result := FFacturasProformaController.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 SetLength(AArrayIdPresupuestosCli, 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 AArrayIdPresupuestosCLi[i] := NewConstant(ListaIDPresupuestosCliente.Items[i], datInteger); // (ID IN lista de IDs) (SIEMPRE HAY AL MENOS UNO) Condicion := NewBinaryExpression(NewField('', fld_PedidosClienteID), NewList(AArrayIdPresupuestosCli), dboIn); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; end; end; function TProcesoPresupuestosClienteController.BuscarFacturasProveedor(AAlbaranesProveedor: IBizAlbaranProveedor): IBizFacturaProveedor; var Condicion: TDAWhereExpression; AArrayIdAlbaranesProv : 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; AAlbaranesProveedor.First; i:=0; while not AAlbaranesProveedor.EOF do begin if not AAlbaranesProveedor.ID_FACTURAIsNull then begin SetLength(AArrayIdAlbaranesProv, i+1); AArrayIdAlbaranesProv[i] := NewConstant(AAlbaranesProveedor.ID, datInteger); Inc(i); end; AAlbaranesProveedor.Next; end; if (length(AArrayIdAlbaranesProv)<>0) then // (ID in lista de IDs) Condicion := NewBinaryExpression(NewField('', 'ID_ALBARAN'), NewList(AArrayIdAlbaranesProv), dboIn) else // (ID is null, para que nos devuelva la lista vacia) Condicion := NewBinaryExpression(NewField('', 'ID'), NewConstant(ID_NULO, datInteger), dboEqual); 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; AArrayIdPresupuestos : 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(AArrayIdPresupuestos, 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 AArrayIdPresupuestos[i] := NewConstant(ListaIDPresupuestosCliente.Items[i], datInteger); // (ID IN lista de IDs) (SIEMPRE HAY AL MENOS UNO) Condicion := NewBinaryExpression(NewField('', fld_PedidosClienteID), NewList(AArrayIdPresupuestos), 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; AArrayIdPedidosCli : 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(AArrayIdPedidosCli, 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 AArrayIdPedidosCli[i] := NewConstant(ListaIDPresupuestosCliente.Items[i], datInteger); // (ID_PEDIDO_CLIENTE IN lista de IDs) (SIEMPRE HAY AL MENOS UNO) Condicion := NewBinaryExpression(NewField('', 'ID_PEDIDO_CLIENTE'), NewList(AArrayIdPedidosCli), 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; AAlbaranesCliente: IBizAlbaranCliente; AFacturasCliente: IBizFacturaCliente; AFacturasProforma: IBizFacturaProforma; begin AEditor := NIL; APedidosCliente := BuscarPedidosCliente(ListaIDPresupuestosCliente); APedidosProveedor := BuscarPedidosProveedor(ListaIDPresupuestosCliente); AAlbaranesProveedor := BuscarAlbaranesProveedor(APedidosProveedor); AFacturasProveedor := BuscarFacturasProveedor(AAlbaranesProveedor); AAlbaranesCliente := BuscarAlbaranesCliente(APedidosCliente); AFacturasCliente := BuscarFacturasCliente(AAlbaranesCliente); AFacturasProforma := BuscarFacturasProforma(ListaIDPresupuestosCliente); 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.AlbaranesCliente := AAlbaranesCliente; AEditor.FacturasCliente := AFacturasCliente; AEditor.FacturasProforma := AFacturasProforma; AEditor.ShowModal; finally AEditor.Release; AEditor := NIL; //Se añade esta linea ya que sin ella no se libera bien el puntero HideHourglassCursor; end; end; end.