unit uAlbaranesClienteController; interface uses Classes, SysUtils, uDADataTable, uEditorDBItem, uControllerBase, uIDataModuleAlbaranesCliente, uClientesController, uDetallesAlbaranClienteController, uBizAlbaranesCliente, uBizDireccionesContacto, uViewGridBase; type IAlbaranesClienteController = interface(IObservador) ['{E83F4950-400E-446B-8EB0-1609FF8FEA77}'] function GetClienteController: IClientesController; procedure SetClienteController(const Value: IClientesController); property ClienteController: IClientesController read GetClienteController write SetClienteController; function GetDetallesController: IDetallesAlbaranClienteController; procedure SetDetallesController(const Value: IDetallesAlbaranClienteController); property DetallesController: IDetallesAlbaranClienteController read GetDetallesController write SetDetallesController; function Buscar(const ID: Integer): IBizAlbaranCliente; function BuscarTodos: IBizAlbaranCliente; function BuscarAlbaranesNormales: IBizAlbaranCliente; function BuscarAlbaranesDevolucion: IBizAlbaranCliente; function BuscarPendientes : IBizAlbaranCliente; function BuscarSinFacturar : IBizAlbaranCliente; procedure Ver(AAlbaran : IBizAlbaranCliente); procedure VerTodosAlbaranes(AAlbarans: IBizAlbaranCliente); procedure VerTodosAlbaranesDev(AAlbarans: IBizAlbaranCliente); procedure VerDireccionEntrega(AAlbaran : IBizAlbaranCliente); function Nuevo : IBizAlbaranCliente; function Anadir(AAlbaran : IBizAlbaranCliente): Boolean; overload; function AnadirAlbaranDev(AAlbaran : IBizAlbaranCliente) : Boolean; function Eliminar(const ID : Integer): Boolean; overload; function Eliminar(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false): Boolean; overload; function Guardar(AAlbaran : IBizAlbaranCliente): Boolean; procedure DescartarCambios(AAlbaran : IBizAlbaranCliente); function Existe(const ID: Integer) : Boolean; function Duplicar(AAlbaran: IBizAlbaranCliente): IBizAlbaranCliente; function GenerarOrdenDev(AAlbaran: IBizAlbaranCliente): IBizAlbaranCliente; function ExtraerSeleccionados(AAlbaran: IBizAlbaranCliente; Const ViewGrid: IViewGridBase = Nil) : IBizAlbaranCliente; function ElegirAlbaranes(AAlbaran: IBizAlbaranCliente; AMensaje: String; AMultiSelect: Boolean): IBizAlbaranCliente; procedure Preview(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false; ConObservacionesIncidencias: Boolean = false); function Print(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false; ConObservacionesIncidencias: Boolean = false): Boolean; procedure EtiquetasPreview(AAlbaran : IBizAlbaranCliente; Const withRefCliente: Boolean); procedure EtiquetasPrint(AAlbaran : IBizAlbaranCliente; Const withRefCliente: Boolean); procedure RecalcularImportes(AAlbaran: IBizAlbaranCliente); function EsModificable(AAlbaran: IBizAlbaranCliente): Boolean; function EsEliminable(AAlbaran: IBizAlbaranCliente): Boolean; procedure CopiarDireccionEnvio (const ADireccionEnvio: IBizDireccionesContacto; AAlbaran: IBizAlbaranCliente); procedure QuitarDireccionEnvio(AAlbaran: IBizAlbaranCliente); procedure RecuperarCliente(AAlbaran: IBizAlbaranCliente); function CambiarSituacion(AAlbaran : IBizAlbaranCliente; ANuevaSituacion: String; AFechaEnvio : TDateTime = 0; AFechaRecibido : TDateTime = 0; DoPost: Boolean = True) : Boolean; function ValidarSituacion(ASituacion: String; AFechaEnvio : TDateTime = 0; AFechaRecibido : TDateTime = 0) : Boolean; function EnviarEmailAlbaranes(AAlbaranes : IBizAlbaranCliente): Boolean; function GenerarEmailAlbaran(AAlbaran : IBizAlbaranCliente): Boolean; function EnviarAlbaranPorEMail(AAlbaran: IBizAlbaranCliente; const AEnviarDirectamente: Boolean = True; const ADireccionEMail: String = ''; const AAsuntoEMail: String = ''; const ATextoEMail: String = ''): Boolean; function DarListaAnosAlbaranes: TStringList; procedure FiltrarAno(AAlbaran: IBizAlbaranCliente; AWhereDataTable: String; const Ano: String); end; TAlbaranesClienteController = class(TObservador, IAlbaranesClienteController) protected FDataModule : IDataModuleAlbaranesCliente; FClienteController : IClientesController; FDetallesController : IDetallesAlbaranClienteController; function GetClienteController: IClientesController; procedure SetClienteController(const Value: IClientesController); function GetDetallesController: IDetallesAlbaranClienteController; procedure SetDetallesController(const Value: IDetallesAlbaranClienteController); //Estos son los tres métodos a sobre escribir si se desea heredar toda la logica de //este controller procedure AsignarDataModule; virtual; procedure RecuperarObjetos(AAlbaran: IBizAlbaranCliente); virtual; procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override; procedure AsignarID(AAlbaran: IBizAlbaranCliente; const IDNuevo : Integer); function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean; procedure FiltrarEmpresa(AAlbaran: IBizAlbaranCliente); function _Vacio : IBizAlbaranCliente; function ValidarAlbaran(AAlbaran: IBizAlbaranCliente): Boolean; procedure _AnadirMarcaEnvioCorreo(AAlbaran: IBizAlbaranCliente); public property ClienteController: IClientesController read GetClienteController write SetClienteController; property DetallesController: IDetallesAlbaranClienteController read GetDetallesController write SetDetallesController; constructor Create; virtual; destructor Destroy; override; function Eliminar(const ID : Integer): Boolean; overload; function Eliminar(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false): Boolean; overload; function Guardar(AAlbaran : IBizAlbaranCliente): Boolean; procedure DescartarCambios(AAlbaran : IBizAlbaranCliente); virtual; function Existe(const ID: Integer) : Boolean; virtual; function Anadir(AAlbaran : IBizAlbaranCliente): Boolean; overload; function AnadirAlbaranDev(AAlbaran : IBizAlbaranCliente) : Boolean; function Buscar(const ID: Integer): IBizAlbaranCliente; function BuscarTodos: IBizAlbaranCliente; function BuscarAlbaranesNormales: IBizAlbaranCliente; function BuscarAlbaranesDevolucion: IBizAlbaranCliente; function BuscarPendientes : IBizAlbaranCliente; function BuscarSinFacturar : IBizAlbaranCliente; function Nuevo : IBizAlbaranCliente; procedure Ver(AAlbaran : IBizAlbaranCliente); procedure VerTodosAlbaranes(AAlbarans: IBizAlbaranCliente); procedure VerTodosAlbaranesDev(AAlbarans: IBizAlbaranCliente); procedure VerDireccionEntrega(AAlbaran : IBizAlbaranCliente); function Duplicar(AAlbaran: IBizAlbaranCliente): IBizAlbaranCliente; function GenerarOrdenDev(AAlbaran: IBizAlbaranCliente): IBizAlbaranCliente; procedure CopiarDireccionEnvio (const ADireccionEnvio: IBizDireccionesContacto; AAlbaran: IBizAlbaranCliente); procedure QuitarDireccionEnvio(AAlbaran: IBizAlbaranCliente); function ExtraerSeleccionados(AAlbaran: IBizAlbaranCliente; Const ViewGrid: IViewGridBase = Nil) : IBizAlbaranCliente; function ElegirAlbaranes(AAlbaran: IBizAlbaranCliente; AMensaje: String; AMultiSelect: Boolean): IBizAlbaranCliente; procedure RecuperarCliente(AAlbaran : IBizAlbaranCliente); procedure RecalcularImportes(AAlbaran: IBizAlbaranCliente); function EsModificable(AAlbaran: IBizAlbaranCliente): Boolean; function EsEliminable(AAlbaran: IBizAlbaranCliente): Boolean; function ValidarSituacion(ASituacion: String; AFechaEnvio : TDateTime = 0; AFechaRecibido : TDateTime = 0) : Boolean; function CambiarSituacion(AAlbaran : IBizAlbaranCliente; ANuevaSituacion: String; AFechaEnvio : TDateTime = 0; AFechaRecibido : TDateTime = 0; DoPost: Boolean = True) : Boolean; procedure Preview(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false; ConObservacionesIncidencias: Boolean = false); function Print(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false; ConObservacionesIncidencias: Boolean = false): Boolean; procedure EtiquetasPreview(AAlbaran : IBizAlbaranCliente; Const withRefCliente: Boolean); procedure EtiquetasPrint(AAlbaran : IBizAlbaranCliente; Const withRefCliente: Boolean); function EnviarEmailAlbaranes(AAlbaranes : IBizAlbaranCliente): Boolean; function GenerarEmailAlbaran(AAlbaran : IBizAlbaranCliente): Boolean; function EnviarAlbaranPorEMail(AAlbaran: IBizAlbaranCliente; const AEnviarDirectamente: Boolean = True; const ADireccionEMail: String = ''; const AAsuntoEMail: String = ''; const ATextoEMail: String = ''): Boolean; function DarListaAnosAlbaranes: TStringList; procedure FiltrarAno(AAlbaran: IBizAlbaranCliente; AWhereDataTable: String; const Ano: String); end; implementation uses uROTypes, Controls, cxControls, DB, uEditorRegistryUtils, uEditorPreview, DateUtils, uIEditorAlbaranesCliente, uIEditorAlbaranesDevCliente, uIEditorAlbaranDevCliente, uDataModuleAlbaranesCliente, Variants, uBizDetallesAlbaranCliente, uBizContactos, uDataTableUtils, uDataModuleUsuarios, schAlbaranesClienteClient_Intf, uDAInterfaces, uDateUtils, uIEditorAlbaranCliente, uIEditorElegirAlbaranesCliente, uIEditorDireccionEntregaAlbaranCliente, schContactosClient_Intf, uAlbaranesClienteReportController, uControllerDetallesBase, uPedidosClienteController, uBizPedidosCliente, uBizDetallesPedidoCliente, schPedidosClienteClient_Intf, uDialogUtils, Windows, Forms, Dialogs, uGUIBase, uDataModuleRegistroCorreos, uIDialogListaAlbaranesCliEnvioEMail, uSistemaFunc, uStringsUtils, uDialogElegirEMail, uEMailUtils; { TAlbaranesClienteController } function TAlbaranesClienteController.Anadir(AAlbaran: IBizAlbaranCliente): Boolean; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado (Anadir)'); if not AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; AAlbaran.Insert; Result := True; end; function TAlbaranesClienteController.AnadirAlbaranDev(AAlbaran: IBizAlbaranCliente): Boolean; begin Anadir(AAlbaran); AAlbaran.TIPO := CTE_TIPO_ALBARAN_DEV; end; procedure TAlbaranesClienteController.AsignarDataModule; begin FDataModule := TDataModuleAlbaranesCliente.Create(Nil); end; procedure TAlbaranesClienteController.AsignarID(AAlbaran: IBizAlbaranCliente; const IDNuevo : Integer); begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado'); if not Assigned(AAlbaran.Detalles) then raise Exception.Create ('Detalles de albarán no asignados'); if not Assigned(FDetallesController) then raise Exception.Create ('Controller detalles no asignado'); { Los detalles siempre hay que comprobarlos } FDetallesController.AsignarID(AAlbaran.Detalles, IDNuevo, AAlbaran.EsNuevo); if AAlbaran.EsNuevo then begin AAlbaran.Edit; AAlbaran.ID := IDNuevo; AAlbaran.Post; end; end; function TAlbaranesClienteController.Buscar(const ID: Integer): IBizAlbaranCliente; begin Result := FDataModule.GetItem(ID); FiltrarEmpresa(Result); end; function TAlbaranesClienteController.BuscarAlbaranesDevolucion: IBizAlbaranCliente; begin ShowHourglassCursor; try Result := BuscarTodos; with Result.DataTable.Where do begin if NotEmpty then AddOperator(opAND); OpenBraket; AddCondition(fld_AlbaranesClienteIMPORTE_TOTAL, cLess, 0); CloseBraket; end; finally HideHourglassCursor; end; end; function TAlbaranesClienteController.BuscarAlbaranesNormales: IBizAlbaranCliente; begin ShowHourglassCursor; try Result := BuscarTodos; with Result.DataTable.Where do begin if NotEmpty then AddOperator(opAND); OpenBraket; AddCondition(fld_AlbaranesClienteIMPORTE_TOTAL, cMajorOrEqual, 0); CloseBraket; end; finally HideHourglassCursor; end; end; function TAlbaranesClienteController.BuscarTodos: IBizAlbaranCliente; begin Result := FDataModule.GetItems; FiltrarEmpresa(Result); end; function TAlbaranesClienteController.BuscarPendientes: IBizAlbaranCliente; begin ShowHourglassCursor; try Result := BuscarAlbaranesNormales; with Result.DataTable.Where do begin if NotEmpty then AddOperator(opAND); OpenBraket; AddText(fld_AlbaranesClienteSITUACION + ' = ''' + SITUACION_ALBARAN_SERVIDO + ''''); CloseBraket; end; finally HideHourglassCursor; end; end; function TAlbaranesClienteController.BuscarSinFacturar: IBizAlbaranCliente; begin ShowHourglassCursor; try Result := BuscarAlbaranesNormales; with Result.DataTable.Where do begin if NotEmpty then AddOperator(opAND); OpenBraket; AddText(fld_AlbaranesClienteID_FACTURA + ' is null'); CloseBraket; AddOperator(opAND); OpenBraket; AddText(fld_AlbaranesClienteFECHA_ENVIO + ' is not null'); CloseBraket; end; finally HideHourglassCursor; end; end; function TAlbaranesClienteController.CambiarSituacion( AAlbaran: IBizAlbaranCliente; ANuevaSituacion: String; AFechaEnvio, AFechaRecibido: TDateTime; DoPost: Boolean): Boolean; begin Result := False; if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado (CambiarSituacion)'); if not AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; // Validar la situación del albarán // if ValidarSituacion(ANuevaSituacion, AAlbaran.FECHA_ALBARAN, AFechaEnvio, AFechaRecibido) then // begin ShowHourglassCursor; AAlbaran.DataTable.DisableControls; try AAlbaran.Edit; AAlbaran.SITUACION := ANuevaSituacion; AAlbaran.FECHA_ENVIO := AFechaEnvio; AAlbaran.FECHA_RECEPCION := AFechaRecibido; AAlbaran.Post; if DoPost then Guardar(AAlbaran); Result := True; finally AAlbaran.DataTable.EnableControls; HideHourglassCursor; end; // end; end; procedure TAlbaranesClienteController.CopiarDireccionEnvio( const ADireccionEnvio: IBizDireccionesContacto; AAlbaran: IBizAlbaranCliente); var bEnEdicion : Boolean; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albaran no asignado (CopiarDireccionEnvio)'); if not Assigned(ADireccionEnvio) then raise Exception.Create ('No se ha indicado la dirección (CopiarDireccionEnvio)'); if AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; if ADireccionEnvio.DataTable.Active then ADireccionEnvio.DataTable.Active := True; bEnEdicion := (AAlbaran.DataTable.State in dsEditModes); if not bEnEdicion then AAlbaran.Edit; ShowHourglassCursor; AAlbaran.Edit; try AAlbaran.CALLE := ADireccionEnvio.CALLE; AAlbaran.POBLACION := ADireccionEnvio.POBLACION; AAlbaran.CODIGO_POSTAL := ADireccionEnvio.CODIGO_POSTAL; AAlbaran.PROVINCIA := ADireccionEnvio.PROVINCIA; AAlbaran.TELEFONO := ADireccionEnvio.TELEFONO; AAlbaran.PERSONA_CONTACTO := ADireccionEnvio.PERSONA_CONTACTO; if not bEnEdicion then AAlbaran.Post; finally HideHourglassCursor; end; end; constructor TAlbaranesClienteController.Create; begin AsignarDataModule; FClienteController := TClientesController.Create; FDetallesController := TDetallesAlbaranClienteController.Create; FDetallesController.addObservador(Self); end; function TAlbaranesClienteController.CreateEditor(const AName: String; const IID: TGUID; out Intf): Boolean; begin Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf); end; function TAlbaranesClienteController.DarListaAnosAlbaranes: TStringList; begin Result := FDataModule.GetAnosItems; end; procedure TAlbaranesClienteController.DescartarCambios(AAlbaran: IBizAlbaranCliente); begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado'); ShowHourglassCursor; try if (AAlbaran.State in dsEditModes) then AAlbaran.Cancel; AAlbaran.DataTable.CancelUpdates; finally HideHourglassCursor; end; end; destructor TAlbaranesClienteController.Destroy; begin FDataModule := Nil; FClienteController := Nil; FDetallesController := Nil; inherited; end; function TAlbaranesClienteController.Duplicar(AAlbaran: IBizAlbaranCliente): IBizAlbaranCliente; begin Result := Self._Vacio; ShowHourglassCursor; try DuplicarRegistros(AAlbaran.DataTable, Result.DataTable, mdrActual); DuplicarRegistros(AAlbaran.Detalles.DataTable, Result.Detalles.DataTable, mdrTodos); // Hay que dejar algunos campos como si fuera un presupuesto nuevo Result.Edit; with Result do begin ID_EMPRESA := dmUsuarios.IDEmpresaActual; USUARIO := dmUsuarios.LoginInfo.Usuario; FECHA_ALBARAN := DateOf(Now); INCIDENCIAS_ACTIVAS := 0; INCIDENCIAS := Nil; REFERENCIA := ''; FECHA_PREVISTA_ENVIO := 0; FECHA_ENVIO := 0; FECHA_RECEPCION := 0; REF_FACTURA := ''; ID_FACTURA := 0; REF_PEDIDO := ''; ID_PEDIDO := 0; end; Result.Post; finally HideHourglassCursor; end; end; function TAlbaranesClienteController.ValidarAlbaran( AAlbaran: IBizAlbaranCliente): Boolean; begin Result := False; if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado'); if (AAlbaran.DataTable.State in dsEditModes) then AAlbaran.DataTable.Post; //Tambien hacemos post de sus tablas hija if (AAlbaran.Detalles.DataTable.State in dsEditModes) then AAlbaran.Detalles.DataTable.Post; if (AAlbaran.ID_Cliente < 0) or (AAlbaran.ID_Cliente = 0) then // Si hay altas automáticas no hay objeto Cliente pero sí hay ID_CLIENTE { (not Assigned(AAlbaran.Cliente)) or (AAlbaran.Cliente.IsEmpty) then} raise Exception.Create('Debe indicar el cliente de este albarán'); if (EsFechaVacia(AAlbaran.FECHA_ALBARAN)) then raise Exception.Create('Debe indicar la fecha de este albarán'); if (AAlbaran.Detalles.DataTable.RecordCount = 0) then raise Exception.Create('El albarán debe tener en su contenido al menos un concepto'); //En caso de ser un Albarán no podra tener un importe total negativo if (AAlbaran.TIPO = CTE_TIPO_ALBARAN) then if (AAlbaran.IMPORTE_TOTAL < 0) then raise Exception.Create('Un albarán no puede tener un importe total negativo'); //En caso de ser una orden de devolución no podra tener un importe total positivo if (AAlbaran.TIPO = CTE_TIPO_ALBARAN_DEV) then begin if (AAlbaran.IMPORTE_TOTAL >= 0) then raise Exception.Create('Una orden de devolución no puede tener un importe total positivo'); //Una orden de devolución debe tener relleno el almacén de entrada de material if (AAlbaran.ID_ALMACEN < 0) or (AAlbaran.ID_ALMACEN = 0) then raise Exception.Create('Debe indicar el almacén de entrada de esta orden de devolución'); //Ponemos la fecha del albaran de devolución como fecha de envio para que se contabilice según dicha fecha AAlbaran.Edit; AAlbaran.FECHA_ENVIO := AAlbaran.FECHA_ALBARAN; AAlbaran.Post; end; //Validamos las fechas del albarán // if not (EsFechaVacia(AAlbaran.FECHA_ENVIO)) then // if AAlbaran.FECHA_ENVIO < AAlbaran.FECHA_PREVISTA_ENVIO then // raise Exception.Create('La fecha de envio debe ser posterior a la fecha prevista de envio'); if not (EsFechaVacia(AAlbaran.FECHA_RECEPCION)) then if AAlbaran.FECHA_RECEPCION < AAlbaran.FECHA_ENVIO then raise Exception.Create('La fecha de recepcion debe ser posterior a la fecha de envio'); { Asegurarse de valores en campos "automáticos" tanto en MODIFICACIÓN como en INSERCIÓN. } AAlbaran.Edit; try AAlbaran.USUARIO := dmUsuarios.LoginInfo.Usuario; // Lo quitamos temporalmente si no hay mas fallos de cambio de cliente se quita en todos los sitios // if Assigned(AAlbaran.Cliente) // and (AAlbaran.ID_CLIENTE <> AAlbaran.Cliente.ID) then // AAlbaran.ID_CLIENTE := AAlbaran.Cliente.ID; Result := True; finally AAlbaran.Post; end; end; function TAlbaranesClienteController.ValidarSituacion(ASituacion: String; AFechaEnvio, AFechaRecibido: TDateTime): Boolean; begin Result := False; if (ASituacion = SITUACION_ALBARAN_ENVIADO) then begin if (EsFechaVacia(AFechaEnvio)) then raise Exception.Create('Hay que indicar la fecha de envío del albarán') end else if (ASituacion = SITUACION_ALBARAN_SERVIDO) then begin if (EsFechaVacia(AFechaEnvio)) then raise Exception.Create('Hay que indicar la fecha de envío del albarán'); if (EsFechaVacia(AFechaRecibido)) then raise Exception.Create('Hay que indicar la fecha de recepción del albarán'); if (AFechaRecibido < AFechaEnvio) then raise Exception.Create('La fecha de recepción y firma del albarán por parte ' + 'del cliente no puede ser anterior a la fecha de envio del material del albarán'); end; Result := True; end; procedure TAlbaranesClienteController.Ver(AAlbaran: IBizAlbaranCliente); var AEditor : IEditorDBItem; begin AEditor := NIL; ShowHourglassCursor; try RecuperarObjetos(AAlbaran); if (AAlbaran.TIPO = CTE_TIPO_ALBARAN) then CreateEditor('EditorAlbaranCliente', IEditorAlbaranCliente, AEditor) else CreateEditor('EditorAlbaranDevCliente', IEditorAlbaranDevCliente, AEditor); if Assigned(AEditor) then with (AEditor as IEditorAlbaranCliente) do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Albaran := AAlbaran; //MODO CONSULTAR if not EsModificable(AAlbaran) then begin SetDataTableReadOnly(AAlbaran.DataTable, True); ReadOnly := True; end; ShowModal; //MODO CONSULTAR (Se deja la tabla como estaba) if ReadOnly then SetDataTableReadOnly(AAlbaran.DataTable, False); AEditor.Release; end; finally AEditor := NIL; HideHourglassCursor; end; end; procedure TAlbaranesClienteController.VerDireccionEntrega( AAlbaran: IBizAlbaranCliente); var AEditor : IEditorDireccionEntregaAlbaranCliente; begin AEditor := NIL; ShowHourglassCursor; try //RecuperarObjetos(AAlbaran); <- No descomentar. No hace falta CreateEditor('EditorDireccionEntregaAlbaranCliente', IEditorDireccionEntregaAlbaranCliente, AEditor); with (AEditor as IEditorDireccionEntregaAlbaranCliente) do begin Albaran := AAlbaran; end; finally HideHourglassCursor; end; if Assigned(AEditor) then try AEditor.ShowModal; AEditor.Release; finally AEditor := NIL; end; end; procedure TAlbaranesClienteController.VerTodosAlbaranes(AAlbarans: IBizAlbaranCliente); var AEditor : IEditorAlbaranesCliente; begin AEditor := NIL; ShowHourglassCursor; try CreateEditor('EditorAlbaranesCliente', IEditorAlbaranesCliente, AEditor); if Assigned(AEditor) then with AEditor do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Albaranes := AAlbarans; MultiSelect := True; ShowEmbedded; end; finally AEditor := NIL; HideHourglassCursor; end; end; procedure TAlbaranesClienteController.VerTodosAlbaranesDev(AAlbarans: IBizAlbaranCliente); var AEditor : IEditorAlbaranesDevCliente; begin AEditor := NIL; ShowHourglassCursor; try CreateEditor('EditorAlbaranesDevCliente', IEditorAlbaranesDevCliente, AEditor); if Assigned(AEditor) then with AEditor do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Albaranes := AAlbarans; MultiSelect := True; ShowEmbedded; end; finally AEditor := NIL; HideHourglassCursor; end; end; procedure TAlbaranesClienteController._AnadirMarcaEnvioCorreo(AAlbaran: IBizAlbaranCliente); var ASoloLectura : Boolean; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albaran no asignado (_AnadirMarcaEnvioCorreo)'); if AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; if AnadirMarcaEnvioCorreo(nme_AlbaranesCliente, AAlbaran.ID) then begin DesconectarTabla(AAlbaran.DataTable); try ASoloLectura := AAlbaran.DataTable.ReadOnly; if ASoloLectura then SetDataTableReadOnly(AAlbaran.DataTable, False); try AAlbaran.Edit; AAlbaran.NUM_CORREOS := AAlbaran.NUM_CORREOS + 1; AAlbaran.Post; finally if ASoloLectura then SetDataTableReadOnly(AAlbaran.DataTable, True); end; finally ConectarTabla(AAlbaran.DataTable); end; end; end; function TAlbaranesClienteController._Vacio: IBizAlbaranCliente; begin Result := Buscar(ID_NULO); end; function TAlbaranesClienteController.Eliminar(const ID: Integer): Boolean; var AAlbaran : IBizAlbaranCliente; begin AAlbaran := Buscar(ID); if not Assigned(AAlbaran) then raise Exception.Create(Format('No se ha encontrado el albarán con ID = %d', [ID])); Result := Eliminar(AAlbaran); AAlbaran := NIL; end; function TAlbaranesClienteController.ElegirAlbaranes(AAlbaran: IBizAlbaranCliente; AMensaje: String; AMultiSelect: Boolean): IBizAlbaranCliente; var AEditor : IEditorElegirAlbaranesCliente; begin Result := NIL; CreateEditor('EditorElegirAlbaranesCliente', IEditorElegirAlbaranesCliente, AEditor); try with AEditor do begin Controller := Self; Albaranes := AAlbaran; MultiSelect := AMultiSelect; Mensaje := AMensaje; if IsPositiveResult(ShowModal) then Result := AlbaranesClienteSeleccionados; Release; end; finally AEditor := NIL; end; end; function TAlbaranesClienteController.Eliminar(AAlbaran: IBizAlbaranCliente; 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(AAlbaran) then raise Exception.Create ('Albarán no asignada'); ShowHourglassCursor; try if (AAlbaran.State in dsEditModes) then AAlbaran.Cancel; //Siempre eliminaremos el seleccionado if EsEliminable(AAlbaran) then begin AAlbaran.Delete; bEliminado := True; end; //En el caso de querer eliminar todos los items del objeto AAlbaran if AllItems then begin with AAlbaran.DataTable do begin First; while not EOF do begin if EsEliminable(AAlbaran) then begin AAlbaran.Delete; bEliminado := True end else Next; end; end; end; if bEliminado then begin AAlbaran.DataTable.ApplyUpdates; Result := True; end else Result := False; finally HideHourglassCursor; end; end; function TAlbaranesClienteController.EnviarAlbaranPorEMail( AAlbaran: IBizAlbaranCliente; const AEnviarDirectamente: Boolean; const ADireccionEMail, AAsuntoEMail, ATextoEMail: String): Boolean; var AReportController : IAlbaranesClienteReportController; AFicheroTMP : TFileName; AEMail : String; AAsunto : String; AListaEmail : TStringList; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albaran no asignada (EnviarAlbaranPorEMail)'); if AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; RecuperarCliente(AAlbaran); AAlbaran.Cliente.DataTable.Active := True; AFicheroTMP := DarFicheroPDFTemporal(EscapeIllegalChars(AAlbaran.REFERENCIA)); if not EsCadenaVacia(ADireccionEMail) then AEMail := ADireccionEMail else begin AListaEmail := TStringList.Create; try if not EsCadenaVacia(AAlbaran.Cliente.EMAIL_ADMINISTRACION) then AListaEmail.Add(AAlbaran.Cliente.EMAIL_ADMINISTRACION); if not ElegirEMail(AListaEmail, AEMail) then Exit; finally FreeANDNIL(AListaEmail); end; end; if not EsCadenaVacia(AAsuntoEMail) then AAsunto := AAsuntoEMail else begin if (AAlbaran.TIPO = CTE_TIPO_ALBARAN_DEV) then AAsunto := 'Orden devolución ' + AAlbaran.REFERENCIA else AAsunto := 'Albarán ' + AAlbaran.REFERENCIA; end; ShowHourglassCursor; Application.ProcessMessages; AReportController := TAlbaranesClienteReportController.Create; try AReportController.ExportToPDF(AAlbaran.ID, AFicheroTMP); Result := EnviarEMailMAPI(AAsunto, ATextoEMail, AFicheroTMP, '', '', AAlbaran.Cliente.NOMBRE, AEMail, AEnviarDirectamente); if Result then _AnadirMarcaEnvioCorreo(AAlbaran); finally SysUtils.DeleteFile(AFicheroTMP); AReportController := NIL; HideHourglassCursor; Application.ProcessMessages; end; end; function TAlbaranesClienteController.EnviarEmailAlbaranes( AAlbaranes: IBizAlbaranCliente): Boolean; var ADialog : IDialogListaAlbaranesCliEnvioEMail; ARespuesta : Integer; begin ADialog := NIL; if not Assigned(AAlbaranes) then raise Exception.Create ('Albaranes no asignadas (EnviarAlbaranesCliPorEMail)'); if AAlbaranes.DataTable.Active then AAlbaranes.DataTable.Active := True; ShowHourglassCursor; try CreateEditor('DialogListaAlbaranesCliEnvioEMail', IDialogListaAlbaranesCliEnvioEMail, ADialog); if Assigned(ADialog) then begin try ADialog.Albaranes := AAlbaranes; ARespuesta := ADialog.ShowModal; Result := (ARespuesta = mrOK) finally ADialog.Release; end; end; finally ADialog := NIL; HideHourglassCursor; end; end; function TAlbaranesClienteController.EsEliminable(AAlbaran: IBizAlbaranCliente): Boolean; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado: EsModificable'); Result := EsModificable(AAlbaran); if AAlbaran.TIPO = CTE_TIPO_ALBARAN then Result := Result and (AAlbaran.SITUACION = SITUACION_ALBARAN_PENDIENTE); end; function TAlbaranesClienteController.EsModificable(AAlbaran: IBizAlbaranCliente): Boolean; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado: EsModificable'); Result := not (AAlbaran.ID_FACTURA > 0); end; procedure TAlbaranesClienteController.EtiquetasPreview(AAlbaran: IBizAlbaranCliente; Const withRefCliente: Boolean); var AReportController : IAlbaranesClienteReportController; begin AReportController := TAlbaranesClienteReportController.Create; try AReportController.EtiquetasPreview(AAlbaran.ID, withRefCliente); finally AReportController := NIL; end; end; procedure TAlbaranesClienteController.EtiquetasPrint(AAlbaran: IBizAlbaranCliente; Const withRefCliente: Boolean); var AReportController : IAlbaranesClienteReportController; begin AReportController := TAlbaranesClienteReportController.Create; try AReportController.EtiquetasPrint(AAlbaran.ID, withRefCliente); finally AReportController := NIL; end; end; procedure TAlbaranesClienteController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); var AAlbaran : IBizAlbaranCliente; ADetalles : IBizDetallesAlbaranCliente; begin inherited; if Supports(ADataTable, IBizDetallesAlbaranCliente, ADetalles) and Supports(ADetalles.DataTable.MasterSource.DataTable, IBizAlbaranCliente, AAlbaran) then begin RecalcularImportes(AAlbaran); end; end; procedure TAlbaranesClienteController.RecuperarObjetos(AAlbaran: IBizAlbaranCliente); begin RecuperarCliente(AAlbaran); end; procedure TAlbaranesClienteController.RecuperarCliente( AAlbaran: IBizAlbaranCliente); begin AAlbaran._Cliente := (FClienteController.Buscar(AAlbaran.ID_Cliente) as IBizCliente); end; function TAlbaranesClienteController.Existe(const ID: Integer): Boolean; var AAlbaran : IBizAlbaranCliente; begin try AAlbaran := Buscar(ID); Result := Assigned(AAlbaran) and (AAlbaran.ID = ID); finally AAlbaran := NIL; end; end; function TAlbaranesClienteController.ExtraerSeleccionados(AAlbaran: IBizAlbaranCliente; Const ViewGrid: IViewGridBase = Nil): IBizAlbaranCliente; var ASeleccionados : IBizAlbaranCliente; 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 IBizAlbaranCliente); CopyDataTable(AAlbaran.DataTable, ASeleccionados.DataTable, True); Result := ASeleccionados; if Assigned(ViewGrid) then begin ViewGrid.ActivarGrid; ViewGrid.RestoreGridStatus; end; end; procedure TAlbaranesClienteController.FiltrarAno(AAlbaran: IBizAlbaranCliente; AWhereDataTable: String; const Ano: String); var FechaIni: String; FechaFin: String; begin AAlbaran.DataTable.Where.Clear; AAlbaran.DataTable.Where.AddText(AWhereDataTable); if (Ano <> 'Todos') then begin // Filtrar las facturas actuales por empresa FechaIni := '01.01.' + Ano; FechaFin := '31.12.' + Ano; with AAlbaran.DataTable.Where do begin if NotEmpty then AddOperator(opAND); AddCondition(fld_AlbaranesClienteFECHA_ALBARAN, cMajorOrEqual, FechaIni); AddOperator(opAND); AddCondition(fld_AlbaranesClienteFECHA_ALBARAN, cLessOrEqual, FechaFin); end; end; end; procedure TAlbaranesClienteController.FiltrarEmpresa( AAlbaran: IBizAlbaranCliente); begin if AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := False; // Filtrar los presupuestos actuales por empresa with AAlbaran.DataTable.Where do begin if NotEmpty then AddOperator(opAND); AddCondition(fld_AlbaranesClienteID_EMPRESA, cEqual, dmUsuarios.IDEmpresaActual); end; end; procedure TAlbaranesClienteController.SetClienteController(const Value: IClientesController); begin FClienteController := Value; end; procedure TAlbaranesClienteController.SetDetallesController(const Value: IDetallesAlbaranClienteController); begin FDetallesController := Value; end; function TAlbaranesClienteController.Guardar(AAlbaran: IBizAlbaranCliente): Boolean; var IDNuevo: Integer; begin Result := False; if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignada'); if not Assigned(FDetallesController) then raise Exception.Create ('Controller detalles no asignado'); if ValidarAlbaran(AAlbaran) then begin ShowHourglassCursor; // Asegurarnos de que todos los importes están bien. RecalcularImportes(AAlbaran); try if (AAlbaran.EsNuevo) then IDNuevo := FDataModule.GetNextID(AAlbaran.DataTable.LogicalName) else IDNuevo := AAlbaran.ID; AsignarID(AAlbaran, IDNuevo); AAlbaran.DataTable.ApplyUpdates; Result := True; finally HideHourglassCursor; end; end; end; function TAlbaranesClienteController.Nuevo: IBizAlbaranCliente; var AAlbaran : IBizAlbaranCliente; begin AAlbaran := FDataModule.NewItem; FiltrarEmpresa(AAlbaran); AAlbaran.DataTable.Active := True; AAlbaran.Insert; Result := AAlbaran; end; procedure TAlbaranesClienteController.QuitarDireccionEnvio( AAlbaran: IBizAlbaranCliente); var bEnEdicion : Boolean; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado (QuitarDireccionEnvio)'); if AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; bEnEdicion := (AAlbaran.DataTable.State in dsEditModes); if not bEnEdicion then AAlbaran.Edit; ShowHourglassCursor; AAlbaran.Edit; try AAlbaran.DataTable.FieldByName(fld_AlbaranesClienteCALLE).Clear; AAlbaran.DataTable.FieldByName(fld_AlbaranesClientePOBLACION).Clear; AAlbaran.DataTable.FieldByName(fld_AlbaranesClienteCODIGO_POSTAL).Clear; AAlbaran.DataTable.FieldByName(fld_AlbaranesClientePROVINCIA).Clear; AAlbaran.DataTable.FieldByName(fld_AlbaranesClienteTELEFONO).Clear; AAlbaran.DataTable.FieldByName(fld_AlbaranesClientePERSONA_CONTACTO).Clear; if not bEnEdicion then AAlbaran.Post; finally HideHourglassCursor; end; end; procedure TAlbaranesClienteController.Preview(AAlbaran: IBizAlbaranCliente; AllItems: Boolean = false; ConObservacionesIncidencias: Boolean = false); var AReportController : IAlbaranesClienteReportController; ID_Albaranes: TStringList; begin AReportController := TAlbaranesClienteReportController.Create; try ID_Albaranes := TStringList.Create; //Si deseamos previsualizar todos los items del objeto albaran if AllItems then begin with AAlbaran.DataTable do begin First; while not EOF do begin ID_Albaranes.Add(IntToStr(AAlbaran.ID)); Next; end; end; end //Solo previsualizamos el item seleccionado else ID_Albaranes.Add(IntToStr(AAlbaran.ID)); AReportController.Preview(ID_Albaranes.CommaText, ConObservacionesIncidencias); finally AReportController := NIL; ID_Albaranes.Free; end; end; function TAlbaranesClienteController.Print(AAlbaran: IBizAlbaranCliente; AllItems: Boolean = false; ConObservacionesIncidencias: Boolean = false): Boolean; var AReportController : IAlbaranesClienteReportController; ID_Albaranes: TStringList; begin Result := False; AReportController := TAlbaranesClienteReportController.Create; try ID_Albaranes := TStringList.Create; //Si deseamos previsualizar todos los items del objeto albaran if AllItems then begin with AAlbaran.DataTable do begin First; while not EOF do begin ID_Albaranes.Add(IntToStr(AAlbaran.ID)); Next; end; end; end //Solo previsualizamos el item seleccionado else ID_Albaranes.Add(IntToStr(AAlbaran.ID)); Result := AReportController.Print(ID_Albaranes.CommaText, ConObservacionesIncidencias); finally AReportController := NIL; ID_Albaranes.Free; end; end; procedure TAlbaranesClienteController.RecalcularImportes(AAlbaran: IBizAlbaranCliente); var bEnEdicion : Boolean; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado (RecalcularImportes)'); if AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; bEnEdicion := (AAlbaran.DataTable.State in dsEditModes); if not bEnEdicion then AAlbaran.Edit; ShowHourglassCursor; AAlbaran.Edit; try AAlbaran.IMPORTE_NETO := FDetallesController.DarTotalImporteTotal(AAlbaran.Detalles); if not bEnEdicion then AAlbaran.Post; finally HideHourglassCursor; end; end; function TAlbaranesClienteController.GenerarEmailAlbaran( AAlbaran: IBizAlbaranCliente): Boolean; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albaranes no asignadas (GenerarEmailAlbaran)'); if AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; ShowHourglassCursor; try RecuperarCliente(AAlbaran); EnviarAlbaranPorEMail(AAlbaran, False, AAlbaran.Cliente.EMAIL_ADMINISTRACION); finally HideHourglassCursor; end; end; function TAlbaranesClienteController.GenerarOrdenDev(AAlbaran: IBizAlbaranCliente): IBizAlbaranCliente; var AOrden : IBizAlbaranCliente; IdAlbaran: Integer; begin if Assigned(AAlbaran) then begin IdAlbaran := AAlbaran.ID; AOrden := Duplicar(AAlbaran); if Assigned(AOrden) then begin if not AOrden.DataTable.Editing then AOrden.Edit; AOrden.TIPO := CTE_TIPO_ALBARAN_DEV; AOrden.ID_ALBARAN_DEV := IdAlbaran; AOrden.Post; //Convierte todos los articulos del albaran a negativos por se una orden de devolucion FDetallesController.CambiarSignoDetalles(AOrden.Detalles); end; Ver(AOrden); end; end; function TAlbaranesClienteController.GetClienteController: IClientesController; begin Result := FClienteController; end; function TAlbaranesClienteController.GetDetallesController: IDetallesAlbaranClienteController; begin Result := FDetallesController; end; end.