unit uPedidosProveedorController; interface uses Classes, SysUtils, uDADataTable, uEditorDBItem, uControllerBase, uIDataModulePedidosProveedor, uProveedoresController, uDetallesPedidoProveedorController, uBizPedidosProveedor, uViewGridBase; type IPedidosProveedorController = interface(IObservador) ['{404FFA2F-D683-447D-91E6-C9A7322934D8}'] function GetProveedorController: IProveedoresController; procedure SetProveedorController(const Value: IProveedoresController); property ProveedorController: IProveedoresController read GetProveedorController write SetProveedorController; function GetDetallesController: IDetallesPedidoProveedorController; procedure SetDetallesController(const Value: IDetallesPedidoProveedorController); property DetallesController: IDetallesPedidoProveedorController read GetDetallesController write SetDetallesController; function Buscar(const ID: Integer): IBizPedidoProveedor; function BuscarTodos: IBizPedidoProveedor; function BuscarPendientesRecepcion: IBizPedidoProveedor; procedure Ver(APedido : IBizPedidoProveedor); procedure VerTodos(APedidos: IBizPedidoProveedor); procedure VerDireccionEntrega(APedido : IBizPedidoProveedor); function Nuevo : IBizPedidoProveedor; procedure Anadir(APedido : IBizPedidoProveedor); function Eliminar(const ID : Integer): Boolean; overload; function Eliminar(APedido : IBizPedidoProveedor; AllItems: Boolean = false): Boolean; overload; function Guardar(APedido : IBizPedidoProveedor): Boolean; procedure DescartarCambios(APedido : IBizPedidoProveedor); function Existe(const ID: Integer) : Boolean; function Duplicar(APedido: IBizPedidoProveedor): IBizPedidoProveedor; procedure Preview(APedido : IBizPedidoProveedor; AllItems: Boolean = false); function Print(APedido : IBizPedidoProveedor; AllItems: Boolean = false): Boolean; procedure RecalcularImportes(APedido: IBizPedidoProveedor); function EsModificable(APedido : IBizPedidoProveedor): Boolean; function EsEliminable(APedido : IBizPedidoProveedor): Boolean; function CambiarSituacion(APedido: IBizPedidoProveedor; ASituacion : String; AFechaPagado: TDateTime = 0; DoPost : Boolean = True): Boolean; overload; function CambiarSituacion(APedido: IBizPedidoProveedor): Boolean; overload; function ExtraerSeleccionados(APedido: IBizPedidoProveedor; Const ViewGrid: IViewGridBase = Nil) : IBizPedidoProveedor; function ElegirPedidos(APedido: IBizPedidoProveedor; AMensaje: String; AMultiSelect: Boolean): IBizPedidoProveedor; procedure RecuperarProveedor(APedido: IBizPedidoProveedor); procedure Limpiardireccion(APedido: IBizPedidoProveedor); function EnviarEmailPedidos(APedidos : IBizPedidoProveedor): Boolean; function GenerarEmailPedido(APedido : IBizPedidoProveedor): Boolean; function EnviarPedidoPorEMail(APedido: IBizPedidoProveedor; const AEnviarDirectamente: Boolean = True; const ADireccionEMail: String = ''; const AAsuntoEMail: String = ''; const ATextoEMail: String = ''): Boolean; function DarListaAnosPedidos: TStringList; procedure FiltrarAno(APedido: IBizPedidoProveedor; AWhereDataTable: String; const Ano: String); end; TPedidosProveedorController = class(TObservador, IPedidosProveedorController) protected FDataModule : IDataModulePedidosProveedor; FProveedorController : IProveedoresController; FDetallesController : IDetallesPedidoProveedorController; function GetProveedorController: IProveedoresController; procedure SetProveedorController(const Value: IProveedoresController); procedure RecuperarProveedor(APedido : IBizPedidoProveedor); function GetDetallesController: IDetallesPedidoProveedorController; procedure SetDetallesController(const Value: IDetallesPedidoProveedorController); //Estos son los tres métodos a sobre escribir si se desea heredar toda la logica de //este controller procedure AsignarDataModule; virtual; procedure RecuperarObjetos(APedido: IBizPedidoProveedor); virtual; procedure AsignarID(APedido: IBizPedidoProveedor; const IDNuevo : Integer); function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean; procedure FiltrarEmpresa(APedido: IBizPedidoProveedor); function _Vacio : IBizPedidoProveedor; function ValidarPedido(APedido: IBizPedidoProveedor): Boolean; function ValidarSituacion(ASituacion: String; AFechaPedido: TDateTime; var AFechaRecepcion: TDateTime): Boolean; procedure _AnadirMarcaEnvioCorreo(APedido: IBizPedidoProveedor); public property ProveedorController: IProveedoresController read GetProveedorController write SetProveedorController; property DetallesController: IDetallesPedidoProveedorController read GetDetallesController write SetDetallesController; procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override; constructor Create; virtual; destructor Destroy; override; function Eliminar(const ID : Integer): Boolean; overload; function Eliminar(APedido : IBizPedidoProveedor; AllItems: Boolean = false): Boolean; overload; function Guardar(APedido : IBizPedidoProveedor): Boolean; procedure DescartarCambios(APedido : IBizPedidoProveedor); virtual; function Existe(const ID: Integer) : Boolean; virtual; procedure Anadir(APedido : IBizPedidoProveedor); function Buscar(const ID: Integer): IBizPedidoProveedor; function BuscarTodos: IBizPedidoProveedor; function BuscarPendientesRecepcion: IBizPedidoProveedor; function Nuevo : IBizPedidoProveedor; procedure Ver(APedido : IBizPedidoProveedor); procedure VerTodos(APedidos: IBizPedidoProveedor); procedure VerDireccionEntrega(APedido : IBizPedidoProveedor); function Duplicar(APedido: IBizPedidoProveedor): IBizPedidoProveedor; procedure Preview(APedido : IBizPedidoProveedor; AllItems: Boolean = false); function Print(APedido : IBizPedidoProveedor; AllItems: Boolean = false): Boolean; procedure RecalcularImportes(APedido: IBizPedidoProveedor); function EsModificable(APedido : IBizPedidoProveedor): Boolean; function EsEliminable(APedido : IBizPedidoProveedor): Boolean; function CambiarSituacion(APedido: IBizPedidoProveedor; ASituacion : String; AFechaRecepcion: TDateTime = 0; DoPost : Boolean = True): Boolean; overload; function CambiarSituacion(APedido: IBizPedidoProveedor): Boolean; overload; function ExtraerSeleccionados(APedido: IBizPedidoProveedor; Const ViewGrid: IViewGridBase = Nil) : IBizPedidoProveedor; function ElegirPedidos(APedido: IBizPedidoProveedor; AMensaje: String; AMultiSelect: Boolean): IBizPedidoProveedor; procedure Limpiardireccion(APedido: IBizPedidoProveedor); function EnviarEmailPedidos(APedidos : IBizPedidoProveedor): Boolean; function GenerarEmailPedido(APedido : IBizPedidoProveedor): Boolean; function EnviarPedidoPorEMail(APedido: IBizPedidoProveedor; const AEnviarDirectamente: Boolean = True; const ADireccionEMail: String = ''; const AAsuntoEMail: String = ''; const ATextoEMail: String = ''): Boolean; function DarListaAnosPedidos: TStringList; procedure FiltrarAno(APedido: IBizPedidoProveedor; AWhereDataTable: String; const Ano: String); end; implementation uses uROTypes, Controls, cxControls, DB, uEditorRegistryUtils, uEditorPreview, DateUtils, uIEditorPedidosProveedor, uDataModulePedidosProveedor, uBizDetallesPedidoProveedor, uBizContactos, uDataTableUtils, uDataModuleUsuarios, schPedidosProveedorClient_Intf, uDAInterfaces, uPedidosProveedorReportController, uDateUtils, uIEditorPedidoProveedor, uIEditorElegirPedidosProveedor, Dialogs, uIEditorDireccionEntregaPedidoProveedor, uIEditorSituacionPedidoProveedor, Variants, uDataModuleRegistroCorreos, uIDialogListaPedidosProvEnvioEMail, uSistemaFunc, uStringsUtils, uDialogElegirEMail, Forms, uEMailUtils; { TPedidosProveedorController } procedure TPedidosProveedorController.Anadir(APedido: IBizPedidoProveedor); begin APedido.Insert; end; procedure TPedidosProveedorController.AsignarDataModule; begin FDataModule := TDataModulePedidosProveedor.Create(Nil); end; procedure TPedidosProveedorController.AsignarID(APedido: IBizPedidoProveedor; const IDNuevo : Integer); begin if not Assigned(APedido) then raise Exception.Create ('Pedido no asignada'); if not Assigned(APedido.Detalles) then raise Exception.Create ('Detalles de pedido no asignados'); if not Assigned(FDetallesController) then raise Exception.Create ('Controller detalles no asignado'); { Los detalles siempre hay que comprobarlos } FDetallesController.AsignarID(APedido.Detalles, IDNuevo, APedido.EsNuevo); if APedido.EsNuevo then begin APedido.Edit; APedido.ID := IDNuevo; APedido.Post; end; end; function TPedidosProveedorController.Buscar(const ID: Integer): IBizPedidoProveedor; begin Result := FDataModule.GetItem(ID); FiltrarEmpresa(Result); end; function TPedidosProveedorController.BuscarPendientesRecepcion: IBizPedidoProveedor; begin ShowHourglassCursor; try Result := BuscarTodos; with Result.DataTable.Where do begin if NotEmpty then AddOperator(opAND); OpenBraket; AddText(fld_PedidosProveedorSITUACION + ' <> ''' + SITUACION_PEDIDO_RECIBIDO + ''''); CloseBraket; end; finally HideHourglassCursor; end; end; function TPedidosProveedorController.BuscarTodos: IBizPedidoProveedor; begin Result := FDataModule.GetItems; FiltrarEmpresa(Result); end; constructor TPedidosProveedorController.Create; begin AsignarDataModule; FProveedorController := TProveedoresController.Create; FDetallesController := TDetallesPedidoProveedorController.Create; FDetallesController.addObservador(Self); end; function TPedidosProveedorController.CreateEditor(const AName: String; const IID: TGUID; out Intf): Boolean; begin Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf); end; function TPedidosProveedorController.DarListaAnosPedidos: TStringList; begin Result := FDataModule.GetAnosItems; end; procedure TPedidosProveedorController.DescartarCambios(APedido: IBizPedidoProveedor); begin if not Assigned(APedido) then raise Exception.Create ('Pedido no asignado'); ShowHourglassCursor; try if (APedido.State in dsEditModes) then APedido.Cancel; APedido.DataTable.CancelUpdates; finally HideHourglassCursor; end; end; function TPedidosProveedorController.CambiarSituacion(APedido: IBizPedidoProveedor; ASituacion: String; AFechaRecepcion: TDateTime; DoPost: Boolean): Boolean; begin Result := False; if not Assigned(APedido) then raise Exception.Create ('Pedido no asignado (CambiarSituacion)'); if not APedido.DataTable.Active then APedido.DataTable.Active := True; // Validar la situación del pedido if ValidarSituacion(ASituacion, APedido.FECHA_PEDIDO, AFechaRecepcion) then begin ShowHourglassCursor; APedido.DataTable.DisableControls; try APedido.Edit; APedido.SITUACION := ASituacion; if AFechaRecepcion <> APedido.FECHA_ENTREGA then APedido.FECHA_ENTREGA := AFechaRecepcion; APedido.Post; if DoPost then Guardar(APedido); Result := True; finally APedido.DataTable.EnableControls; HideHourglassCursor; end; end; end; function TPedidosProveedorController.CambiarSituacion(APedido: IBizPedidoProveedor): Boolean; var AEditor : IEditorSituacionPedidoProveedor; begin Result := False; AEditor := NIL; ShowHourglassCursor; try RecuperarProveedor(APedido); CreateEditor('EditorSituacionPedidoProveedor', IEditorSituacionPedidoProveedor, AEditor); with AEditor do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE PedidoProveedor := APedido; end; finally HideHourglassCursor; end; if Assigned(AEditor) then try AEditor.ShowModal; AEditor.Release; Result := True; finally AEditor := NIL; end; end; destructor TPedidosProveedorController.Destroy; begin FDataModule := Nil; FProveedorController := Nil; FDetallesController := Nil; inherited; end; function TPedidosProveedorController.Duplicar( APedido: IBizPedidoProveedor): IBizPedidoProveedor; begin Result := Self._Vacio; ShowHourglassCursor; try DuplicarRegistros(APedido.DataTable, Result.DataTable, mdrActual); DuplicarRegistros(APedido.Detalles.DataTable, Result.Detalles.DataTable, mdrTodos); // Hay que dejar algunos campos como si fuera un presupuesto nuevo Result.Edit; with Result do begin REFERENCIA := ''; ID_EMPRESA := dmUsuarios.IDEmpresaActual; USUARIO := dmUsuarios.LoginInfo.Usuario; FECHA_PEDIDO := DateOf(Now); SITUACION := SITUACION_PEDIDO_PENDIENTE; FECHA_ENVIO := 0; FECHA_CONFIRMACION := 0; FECHA_ENTREGA := 0; INCIDENCIAS_ACTIVAS := 0; INCIDENCIAS := Nil; REF_PED_CLIENTE := ''; ID_PEDIDO_CLIENTE := 0; end; Result.Post; finally HideHourglassCursor; end; end; function TPedidosProveedorController.ValidarPedido( APedido: IBizPedidoProveedor): Boolean; begin Result := False; if not Assigned(APedido) then raise Exception.Create ('Pedido no asignado'); if (APedido.DataTable.State in dsEditModes) then APedido.DataTable.Post; //Tambien hacemos post de sus tablas hija if (APedido.Detalles.DataTable.State in dsEditModes) then APedido.Detalles.DataTable.Post; if (APedido.ID_PROVEEDOR < 0) or (not Assigned(APedido.Proveedor)) or (APedido.Proveedor.IsEmpty) then raise Exception.Create('Debe indicar el proveedor de esta pedido'); if (EsFechaVacia(APedido.FECHA_PEDIDO)) then raise Exception.Create('Debe indicar la fecha de este pedido'); if (Length(APedido.CALLE) = 0) and (APedido.ID_ALMACEN = 0) then raise Exception.Create('Debe indicar una dirección de entrega o almacén para este pedido'); if (APedido.Detalles.DataTable.RecordCount = 0) then raise Exception.Create('Debe indicar al menos un concepto en el contenido del pedido'); { Asegurarse de valores en campos "automáticos" tanto en MODIFICACIÓN como en INSERCIÓN. } APedido.Edit; try APedido.USUARIO := dmUsuarios.LoginInfo.Usuario; if Assigned(APedido.Proveedor) and (APedido.ID_PROVEEDOR <> APedido.Proveedor.ID) then APedido.ID_PROVEEDOR := APedido.Proveedor.ID; Result := True; finally APedido.Post; end; end; function TPedidosProveedorController.ValidarSituacion(ASituacion: String; AFechaPedido: TDateTime; var AFechaRecepcion: TDateTime): Boolean; begin Result := False; if ASituacion = SITUACION_PEDIDO_PENDIENTE then AFechaRecepcion := 0 else if (ASituacion = SITUACION_PEDIDO_PARCIAL) or (ASituacion = SITUACION_PEDIDO_RECIBIDO) then begin if (EsFechaVacia(AFechaRecepcion)) then raise Exception.Create('Hay que indicar una fecha de recepción') else if (AFechaRecepcion < AFechaPedido) then raise Exception.Create('La fecha de recepción debe ser posterior a la fecha del pedido'); end; Result := True; end; procedure TPedidosProveedorController.Ver(APedido: IBizPedidoProveedor); var AEditor : IEditorPedidoProveedor; begin AEditor := NIL; ShowHourglassCursor; try RecuperarObjetos(APedido); CreateEditor('EditorPedidoProveedor', IEditorPedidoProveedor, AEditor); if Assigned(AEditor) then with AEditor do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Pedido := APedido; //MODO CONSULTAR if not EsModificable(APedido) then begin SetDataTableReadOnly(APedido.DataTable, True); ReadOnly := True; end; ShowModal; //MODO CONSULTAR (Se deja la tabla como estaba) if ReadOnly then SetDataTableReadOnly(APedido.DataTable, False); AEditor.Release; end; finally AEditor := NIL; HideHourglassCursor; end; end; procedure TPedidosProveedorController.VerTodos(APedidos: IBizPedidoProveedor); var AEditor : IEditorPedidosProveedor; begin AEditor := NIL; ShowHourglassCursor; try CreateEditor('EditorPedidosProveedor', IEditorPedidosProveedor, AEditor); if Assigned(AEditor) then with AEditor do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Pedidos := APedidos; MultiSelect := True; ShowEmbedded; end; finally AEditor := NIL; HideHourglassCursor; end; end; procedure TPedidosProveedorController.VerDireccionEntrega( APedido: IBizPedidoProveedor); var AEditor : IEditorDireccionEntregaPedidoProveedor; begin AEditor := NIL; ShowHourglassCursor; try //RecuperarObjetos(APedido); <- No descomentar. No hace falta CreateEditor('EditorDireccionEntregaPedidoProveedor', IEditorDireccionEntregaPedidoProveedor, AEditor); with (AEditor as IEditorDireccionEntregaPedidoProveedor) do begin Pedido := APedido; end; finally HideHourglassCursor; end; if Assigned(AEditor) then try AEditor.ShowModal; AEditor.Release; finally AEditor := NIL; end; end; procedure TPedidosProveedorController._AnadirMarcaEnvioCorreo( APedido: IBizPedidoProveedor); var ASoloLectura : Boolean; begin if not Assigned(APedido) then raise Exception.Create ('Pedido no asignada (_AnadirMarcaEnvioCorreo)'); if APedido.DataTable.Active then APedido.DataTable.Active := True; if AnadirMarcaEnvioCorreo(nme_PedidosProveedor, APedido.ID) then begin DesconectarTabla(APedido.DataTable); try ASoloLectura := APedido.DataTable.ReadOnly; if ASoloLectura then SetDataTableReadOnly(APedido.DataTable, False); try APedido.Edit; APedido.NUM_CORREOS := APedido.NUM_CORREOS + 1; APedido.Post; finally if ASoloLectura then SetDataTableReadOnly(APedido.DataTable, True); end; finally ConectarTabla(APedido.DataTable); end; end; end; function TPedidosProveedorController._Vacio: IBizPedidoProveedor; begin Result := Buscar(ID_NULO); end; function TPedidosProveedorController.Eliminar(const ID: Integer): Boolean; var APedido : IBizPedidoProveedor; begin APedido := Buscar(ID); if not Assigned(APedido) then raise Exception.Create(Format('No se ha encontrado el pedido con ID = %d', [ID])); Result := Eliminar(APedido); APedido := NIL; end; function TPedidosProveedorController.ElegirPedidos(APedido: IBizPedidoProveedor; AMensaje: String; AMultiSelect: Boolean): IBizPedidoProveedor; var AEditor : IEditorElegirPedidosProveedor; begin Result := NIL; CreateEditor('EditorElegirPedidosProveedor', IEditorElegirPedidosProveedor, AEditor); try with AEditor do begin Controller := Self; Pedidos := APedido; MultiSelect := AMultiSelect; Mensaje := AMensaje; if IsPositiveResult(ShowModal) then Result := PedidosProveedorSeleccionados; Release; end; finally AEditor := NIL; end; end; function TPedidosProveedorController.Eliminar(APedido: IBizPedidoProveedor; AllItems: Boolean = false): Boolean; //En el caso de eliminar almenos un elemento del conjunto se devuelve true var bEliminado: Boolean; begin bEliminado := False; if not Assigned(APedido) then raise Exception.Create ('APedido no asignado'); ShowHourglassCursor; try if not APedido.DataTable.Active then APedido.DataTable.Active := True; if (APedido.State in dsEditModes) then APedido.Cancel; //Siempre eliminaremos el seleccionado if EsEliminable(APedido) then begin APedido.Delete; bEliminado := True; end; //En el caso de querer eliminar todos los items del objeto AAlbaran if AllItems then begin with APedido.DataTable do begin First; while not EOF do begin if EsEliminable(APedido) then begin APedido.Delete; bEliminado := True end else Next; end; end; end; if bEliminado then begin APedido.DataTable.ApplyUpdates; Result := True; end else Result := False; finally HideHourglassCursor; end; end; function TPedidosProveedorController.EnviarEmailPedidos( APedidos: IBizPedidoProveedor): Boolean; var ADialog : IDialogListaPedidosProvEnvioEMail; ARespuesta : Integer; begin ADialog := NIL; if not Assigned(APedidos) then raise Exception.Create ('Pedidos no asignadas (EnviarPedidosProvPorEMail)'); if APedidos.DataTable.Active then APedidos.DataTable.Active := True; ShowHourglassCursor; try CreateEditor('DialogListaPedidosProvEnvioEMail', IDialogListaPedidosProvEnvioEMail, ADialog); if Assigned(ADialog) then begin try ADialog.Pedidos := APedidos; ARespuesta := ADialog.ShowModal; Result := (ARespuesta = mrOK) finally ADialog.Release; end; end; finally ADialog := NIL; HideHourglassCursor; end; end; function TPedidosProveedorController.EnviarPedidoPorEMail( APedido: IBizPedidoProveedor; const AEnviarDirectamente: Boolean; const ADireccionEMail, AAsuntoEMail, ATextoEMail: String): Boolean; var AReportController : IPedidosProveedorReportController; AFicheroTMP : TFileName; AEMail : String; AAsunto : String; AListaEmail : TStringList; begin if not Assigned(APedido) then raise Exception.Create ('Pedido no asignada (EnviarPedidoPorEMail)'); if APedido.DataTable.Active then APedido.DataTable.Active := True; RecuperarProveedor(APedido); APedido.Proveedor.DataTable.Active := True; AFicheroTMP := DarFicheroPDFTemporal(EscapeIllegalChars(APedido.REFERENCIA)); if not EsCadenaVacia(ADireccionEMail) then AEMail := ADireccionEMail else begin AListaEmail := TStringList.Create; try if not EsCadenaVacia(APedido.Proveedor.EMAIL_ADMINISTRACION) then AListaEmail.Add(APedido.Proveedor.EMAIL_ADMINISTRACION); if not ElegirEMail(AListaEmail, AEMail) then Exit; finally FreeANDNIL(AListaEmail); end; end; if not EsCadenaVacia(AAsuntoEMail) then AAsunto := AAsuntoEMail else AAsunto := 'Pedido ' + APedido.REFERENCIA; ShowHourglassCursor; Application.ProcessMessages; AReportController := TPedidosProveedorReportController.Create; try AReportController.ExportToPDF(APedido.ID, AFicheroTMP); Result := EnviarEMailMAPI(AAsunto, ATextoEMail, AFicheroTMP, '', '', APedido.Proveedor.NOMBRE, AEMail, AEnviarDirectamente); if Result then _AnadirMarcaEnvioCorreo(APedido); finally SysUtils.DeleteFile(AFicheroTMP); AReportController := NIL; HideHourglassCursor; Application.ProcessMessages; end; end; function TPedidosProveedorController.EsEliminable(APedido: IBizPedidoProveedor): Boolean; begin if not Assigned(APedido) then raise Exception.Create ('Pedido no asignado: EsEliminable'); Result := (APedido.SITUACION = SITUACION_PEDIDO_PENDIENTE); end; function TPedidosProveedorController.EsModificable(APedido: IBizPedidoProveedor): Boolean; begin if not Assigned(APedido) then raise Exception.Create ('Pedido no asignado: EsModificable'); Result := (APedido.SITUACION <> SITUACION_PEDIDO_RECIBIDO); end; procedure TPedidosProveedorController.RecalcularImportes( APedido: IBizPedidoProveedor); var bEnEdicion : Boolean; begin if not Assigned(APedido) then raise Exception.Create ('Pedido no asignado (RecalcularImportes)'); if APedido.DataTable.Active then APedido.DataTable.Active := True; bEnEdicion := (APedido.DataTable.State in dsEditModes); if not bEnEdicion then APedido.Edit; ShowHourglassCursor; APedido.Edit; try APedido.IMPORTE_NETO := FDetallesController.DarTotalImporteTotal(APedido.Detalles); APedido.IMPORTE_PORTE := FDetallesController.DarTotalPorteTotal(APedido.Detalles); if not bEnEdicion then APedido.Post; finally HideHourglassCursor; end; end; procedure TPedidosProveedorController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); var APedido : IBizPedidoProveedor; ADetalles : IBizDetallesPedidoProveedor; begin inherited; if Supports(ADataTable, IBizDetallesPedidoProveedor, ADetalles) and Supports(ADetalles.DataTable.MasterSource.DataTable, IBizPedidoProveedor, APedido) then begin RecalcularImportes(APedido); end; end; procedure TPedidosProveedorController.RecuperarObjetos(APedido: IBizPedidoProveedor); begin RecuperarProveedor(APedido); end; procedure TPedidosProveedorController.RecuperarProveedor(APedido: IBizPedidoProveedor); begin APedido._Proveedor := (FProveedorController.Buscar(APedido.ID_PROVEEDOR) as IBizProveedor); end; function TPedidosProveedorController.Existe(const ID: Integer): Boolean; var APedido : IBizPedidoProveedor; begin try APedido := Buscar(ID); Result := Assigned(APedido) and (APedido.ID = ID); finally APedido := NIL; end; end; function TPedidosProveedorController.ExtraerSeleccionados(APedido: IBizPedidoProveedor; Const ViewGrid: IViewGridBase = Nil): IBizPedidoProveedor; var ASeleccionados : IBizPedidoProveedor; begin if Assigned(ViewGrid) then begin //Guardamos la situación porque el CopyDataTable nos cambia la posicion ViewGrid.SaveGridStatus; ViewGrid.DesactivarGrid; end; ASeleccionados := (Self.Buscar(ID_NULO) as IBizPedidoProveedor); CopyDataTable(APedido.DataTable, ASeleccionados.DataTable, True); Result := ASeleccionados; if Assigned(ViewGrid) then begin ViewGrid.ActivarGrid; ViewGrid.RestoreGridStatus; end; end; procedure TPedidosProveedorController.FiltrarAno(APedido: IBizPedidoProveedor; AWhereDataTable: String; const Ano: String); var FechaIni: String; FechaFin: String; begin APedido.DataTable.Where.Clear; APedido.DataTable.Where.AddText(AWhereDataTable); if (Ano <> 'Todos') then begin // Filtrar las facturas actuales por empresa FechaIni := '01.01.' + Ano; FechaFin := '31.12.' + Ano; with APedido.DataTable.Where do begin if NotEmpty then AddOperator(opAND); AddCondition(fld_PedidosProveedorFECHA_PEDIDO, cMajorOrEqual, FechaIni); AddOperator(opAND); AddCondition(fld_PedidosProveedorFECHA_PEDIDO, cLessOrEqual, FechaFin); end; end; end; procedure TPedidosProveedorController.FiltrarEmpresa( APedido: IBizPedidoProveedor); begin if APedido.DataTable.Active then APedido.DataTable.Active := False; // Filtrar los presupuestos actuales por empresa with APedido.DataTable.Where do begin if NotEmpty then AddOperator(opAND); AddCondition(fld_PedidosProveedorID_EMPRESA, cEqual, dmUsuarios.IDEmpresaActual); end; end; procedure TPedidosProveedorController.SetProveedorController(const Value: IProveedoresController); begin FProveedorController := Value; end; procedure TPedidosProveedorController.SetDetallesController(const Value: IDetallesPedidoProveedorController); begin FDetallesController := Value; end; function TPedidosProveedorController.Guardar(APedido: IBizPedidoProveedor): Boolean; var IDNuevo : Integer; begin Result := False; if not Assigned(APedido) then raise Exception.Create ('Pedido no asignada'); if not Assigned(FDetallesController) then raise Exception.Create ('Controller detalles no asignado'); if ValidarPedido(APedido) then begin ShowHourglassCursor; // Asegurarnos de que todos los importes están bien. RecalcularImportes(APedido); try if (APedido.EsNuevo) then IDNuevo := FDataModule.GetNextID(APedido.DataTable.LogicalName) else IDNuevo := APedido.ID; AsignarID(APedido, IDNuevo); APedido.DataTable.ApplyUpdates; Result := True; finally HideHourglassCursor; end; end; end; procedure TPedidosProveedorController.Limpiardireccion(APedido: IBizPedidoProveedor); begin if Assigned(APedido) then begin APedido.Edit; APedido.DataTable.FieldByName(fld_PedidosProveedorCALLE).AsVariant := null; APedido.DataTable.FieldByName(fld_PedidosProveedorPOBLACION).AsVariant := null; APedido.DataTable.FieldByName(fld_PedidosProveedorPROVINCIA).AsVariant := null; APedido.DataTable.FieldByName(fld_PedidosProveedorCODIGO_POSTAL).AsVariant := null; APedido.DataTable.FieldByName(fld_PedidosProveedorPERSONA_CONTACTO).AsVariant := null; APedido.DataTable.FieldByName(fld_PedidosProveedorTELEFONO).AsVariant := null; end; end; function TPedidosProveedorController.Nuevo: IBizPedidoProveedor; var APedido : IBizPedidoProveedor; begin APedido := FDataModule.NewItem; FiltrarEmpresa(APedido); APedido.DataTable.Active := True; APedido.Insert; Result := APedido; end; procedure TPedidosProveedorController.Preview(APedido: IBizPedidoProveedor; AllItems: Boolean = false); var AReportController : IPedidosProveedorReportController; ID_Pedidos: TStringList; begin AReportController := TPedidosProveedorReportController.Create; try ID_Pedidos := TStringList.Create; //Si deseamos previsualizar todos los items del objeto albaran if AllItems then begin with APedido.DataTable do begin First; while not EOF do begin ID_Pedidos.Add(IntToStr(APedido.ID)); Next; end; end; end //Solo previsualizamos el item seleccionado else ID_Pedidos.Add(IntToStr(APedido.ID)); AReportController.Preview(ID_Pedidos.CommaText); finally AReportController := NIL; ID_Pedidos.Free; end; end; function TPedidosProveedorController.Print(APedido: IBizPedidoProveedor; AllItems: Boolean = false): Boolean; var AReportController : IPedidosProveedorReportController; ID_Pedidos: TStringList; begin Result := False; AReportController := TPedidosProveedorReportController.Create; try ID_Pedidos := TStringList.Create; //Si deseamos previsualizar todos los items del objeto albaran if AllItems then begin with APedido.DataTable do begin First; while not EOF do begin ID_Pedidos.Add(IntToStr(APedido.ID)); Next; end; end; end //Solo previsualizamos el item seleccionado else ID_Pedidos.Add(IntToStr(APedido.ID)); Result := AReportController.Print(ID_Pedidos.CommaText); finally AReportController := NIL; ID_Pedidos.Free; end; end; function TPedidosProveedorController.GetProveedorController: IProveedoresController; begin Result := FProveedorController; end; function TPedidosProveedorController.GenerarEmailPedido( APedido: IBizPedidoProveedor): Boolean; begin if not Assigned(APedido) then raise Exception.Create ('Pedidos no asignadas (GenerarEmailPedido)'); if APedido.DataTable.Active then APedido.DataTable.Active := True; ShowHourglassCursor; try RecuperarProveedor(APedido); EnviarPedidoPorEMail(APedido, False, APedido.Proveedor.EMAIL_ADMINISTRACION); finally HideHourglassCursor; end; end; function TPedidosProveedorController.GetDetallesController: IDetallesPedidoProveedorController; begin Result := FDetallesController; end; end.