diff --git a/Source/Base/GUIBase/GUIBase.res b/Source/Base/GUIBase/GUIBase.res index 1641339f..8b251f31 100644 Binary files a/Source/Base/GUIBase/GUIBase.res and b/Source/Base/GUIBase/GUIBase.res differ diff --git a/Source/Cliente/FactuGES.bdsproj b/Source/Cliente/FactuGES.bdsproj index 49e5c501..90a4168d 100644 --- a/Source/Cliente/FactuGES.bdsproj +++ b/Source/Cliente/FactuGES.bdsproj @@ -148,7 +148,7 @@ True False 3 - 1 + 2 0 0 False @@ -162,7 +162,7 @@ Rodax Software S.L. - 3.1.0.0 + 3.2.0.0 FactuGES diff --git a/Source/Cliente/FactuGES.rc b/Source/Cliente/FactuGES.rc index 86c194e1..c51188f0 100644 --- a/Source/Cliente/FactuGES.rc +++ b/Source/Cliente/FactuGES.rc @@ -1,7 +1,7 @@ MAINICON ICON "c:\Codigo Luis Leon\Source\Iconos\Factuges.ico" 1 VERSIONINFO -FILEVERSION 3,0,9,0 -PRODUCTVERSION 3,0,9,0 +FILEVERSION 3,2,0,0 +PRODUCTVERSION 3,2,0,0 FILEFLAGSMASK 0x3FL FILEFLAGS 0x00L FILEOS 0x40004L @@ -13,9 +13,9 @@ BEGIN BLOCK "0C0A04E4" BEGIN VALUE "CompanyName", "Rodax Software S.L.\0" - VALUE "FileVersion", "3.0.9.0\0" + VALUE "FileVersion", "3.2.0.0\0" VALUE "InternalName", "FactuGES\0" - VALUE "ProductVersion", "3.0.9.0\0" + VALUE "ProductVersion", "3.1.0.0\0" END END BLOCK "VarFileInfo" diff --git a/Source/Cliente/FactuGES.res b/Source/Cliente/FactuGES.res index 2fb237ec..2f549a7f 100644 Binary files a/Source/Cliente/FactuGES.res and b/Source/Cliente/FactuGES.res differ diff --git a/Source/Modulos/Albaranes de cliente/Controller/AlbaranesCliente_controller.dpk b/Source/Modulos/Albaranes de cliente/Controller/AlbaranesCliente_controller.dpk index 4a1f4c0d..07ce7544 100644 --- a/Source/Modulos/Albaranes de cliente/Controller/AlbaranesCliente_controller.dpk +++ b/Source/Modulos/Albaranes de cliente/Controller/AlbaranesCliente_controller.dpk @@ -54,6 +54,7 @@ contains uAlbaranesClienteReportController in 'uAlbaranesClienteReportController.pas', uIEditorAlbaranesClientePreview in 'View\uIEditorAlbaranesClientePreview.pas', uIEditorAlbaranesDevCliente in 'View\uIEditorAlbaranesDevCliente.pas', - uIEditorAlbaranDevCliente in 'View\uIEditorAlbaranDevCliente.pas'; + uIEditorAlbaranDevCliente in 'View\uIEditorAlbaranDevCliente.pas', + uIDialogListaAlbaranesCliEnvioEMail in 'View\uIDialogListaAlbaranesCliEnvioEMail.pas'; end. diff --git a/Source/Modulos/Albaranes de cliente/Controller/View/uIDialogListaAlbaranesCliEnvioEMail.pas b/Source/Modulos/Albaranes de cliente/Controller/View/uIDialogListaAlbaranesCliEnvioEMail.pas new file mode 100644 index 00000000..dd201933 --- /dev/null +++ b/Source/Modulos/Albaranes de cliente/Controller/View/uIDialogListaAlbaranesCliEnvioEMail.pas @@ -0,0 +1,21 @@ +unit uIDialogListaAlbaranesCliEnvioEMail; + +interface + +uses + uBizAlbaranesCliente, uAlbaranesClienteController; + +type + IDialogListaAlbaranesCliEnvioEMail = interface + ['{2C6DBF4E-28D8-49A6-9FF3-13AA5C6F6CF1}'] + function GetAlbaranes: IBizAlbaranCliente; + procedure SetAlbaranes(const Value: IBizAlbaranCliente); + property Albaranes: IBizAlbaranCliente read GetAlbaranes write SetAlbaranes; + function ShowModal : Integer; + procedure Release; + end; + + +implementation + +end. diff --git a/Source/Modulos/Albaranes de cliente/Controller/uAlbaranesClienteController.pas b/Source/Modulos/Albaranes de cliente/Controller/uAlbaranesClienteController.pas index cfdbc577..7079d944 100644 --- a/Source/Modulos/Albaranes de cliente/Controller/uAlbaranesClienteController.pas +++ b/Source/Modulos/Albaranes de cliente/Controller/uAlbaranesClienteController.pas @@ -65,6 +65,13 @@ type 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; end; TAlbaranesClienteController = class(TObservador, IAlbaranesClienteController) @@ -143,6 +150,13 @@ type function Print(AAlbaran : IBizAlbaranCliente; AllItems: 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; end; implementation @@ -156,7 +170,9 @@ uses uIEditorElegirAlbaranesCliente, uIEditorDireccionEntregaAlbaranCliente, schContactosClient_Intf, uAlbaranesClienteReportController, uControllerDetallesBase, uPedidosClienteController, uBizPedidosCliente, uBizDetallesPedidoCliente, - schPedidosClienteClient_Intf, uDialogUtils, Windows, Forms, Dialogs, uGUIBase; + schPedidosClienteClient_Intf, uDialogUtils, Windows, Forms, Dialogs, uGUIBase, + + uIDialogListaAlbaranesCliEnvioEMail, uSistemaFunc, uStringsUtils, uDialogElegirEMail, uEMailUtils; @@ -742,6 +758,104 @@ begin 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 @@ -1042,6 +1156,24 @@ begin end; end; +function TAlbaranesClienteController.GenerarEmailAlbaran( + AAlbaran: IBizAlbaranCliente): Boolean; +begin + if not Assigned(AAlbaran) then + raise Exception.Create ('Pedidos no asignadas (GenerarEmailPedido)'); + + 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; diff --git a/Source/Modulos/Albaranes de cliente/Controller/uAlbaranesClienteReportController.pas b/Source/Modulos/Albaranes de cliente/Controller/uAlbaranesClienteReportController.pas index fe746ba5..f9376766 100644 --- a/Source/Modulos/Albaranes de cliente/Controller/uAlbaranesClienteReportController.pas +++ b/Source/Modulos/Albaranes de cliente/Controller/uAlbaranesClienteReportController.pas @@ -14,6 +14,7 @@ type function Print(const AID : String): Boolean; procedure EtiquetasPreview(const AID : integer; Const withRefCliente: Boolean); procedure EtiquetasPrint(const AID : integer; Const withRefCliente: Boolean); + function ExportToPDF(const AID: Integer; const AFileName : String = ''): Boolean; end; TAlbaranesClienteReportController = class(TInterfacedObject, IAlbaranesClienteReportController) @@ -29,6 +30,7 @@ type function Print(const AID : String): Boolean; procedure EtiquetasPreview(const AID : integer; const withRefCliente: Boolean); procedure EtiquetasPrint(const AID : integer; const withRefCliente: Boolean); + function ExportToPDF(const AID: Integer; const AFileName : String = ''): Boolean; end; @@ -37,7 +39,7 @@ implementation uses uROTypes, uEditorRegistryUtils, uIEditorAlbaranesClientePreview, uEditorPreview, uDataModuleAlbaranesCliente, uEditorBase, cxControls, - schAlbaranesClienteClient_Intf; + schAlbaranesClienteClient_Intf, uStringsUtils; { TAlbaranesClienteReportController } @@ -107,6 +109,28 @@ begin AEditor.Print end; +function TAlbaranesClienteReportController.ExportToPDF(const AID: Integer; const AFileName: String): Boolean; +var + AStream: Binary; +begin + Result := False; + if EsCadenaVacia(AFileName) then + Exit; + + ShowHourglassCursor; + try + AStream := FDataModule.GetRptPDF(AID, True); + try + AStream.SaveToFile(AFileName); + Result := True; + finally + FreeAndNil(AStream); + end; + finally + HideHourglassCursor; + end; +end; + procedure TAlbaranesClienteReportController.Preview(const AID : String); var AStream: Binary; diff --git a/Source/Modulos/Albaranes de cliente/Data/uDataModuleAlbaranesCliente.pas b/Source/Modulos/Albaranes de cliente/Data/uDataModuleAlbaranesCliente.pas index 98593ab2..ce1d3d38 100644 --- a/Source/Modulos/Albaranes de cliente/Data/uDataModuleAlbaranesCliente.pas +++ b/Source/Modulos/Albaranes de cliente/Data/uDataModuleAlbaranesCliente.pas @@ -40,6 +40,7 @@ type // Report function GetReport(const AID: String; const ShowLogotipo: Boolean = False): Binary; function GetEtiquetas(const AID: Integer; withRefCliente: Boolean): Binary; + function GetRptPDF(const AID: Integer; const ShowLogotipo: Boolean = False): Binary; end; implementation @@ -81,6 +82,20 @@ begin Result := (RORemoteService as IsrvAlbaranesCliente).GenerateReport(AID, ShowLogotipo) end; +function TDataModuleAlbaranesCliente.GetRptPDF(const AID: Integer; + const ShowLogotipo: Boolean): Binary; +var + AParam : TIntegerArray; +begin + AParam := TIntegerArray.Create; + try + AParam.Add(AID); + Result := (RORemoteService as IsrvAlbaranesCliente).GenerarReportPDF(AParam, ShowLogotipo) + finally + FreeANDNIL(AParam) + end; +end; + function TDataModuleAlbaranesCliente.NewItem: IBizAlbaranCliente; begin Result := GetItem(ID_NULO) diff --git a/Source/Modulos/Albaranes de cliente/Model/Data/uIDataModuleAlbaranesClienteReport.pas b/Source/Modulos/Albaranes de cliente/Model/Data/uIDataModuleAlbaranesClienteReport.pas index 4886639e..d0822d64 100644 --- a/Source/Modulos/Albaranes de cliente/Model/Data/uIDataModuleAlbaranesClienteReport.pas +++ b/Source/Modulos/Albaranes de cliente/Model/Data/uIDataModuleAlbaranesClienteReport.pas @@ -9,7 +9,8 @@ type IDataModuleAlbaranesClienteReport = interface ['{42C55204-5AB9-403E-8385-1A62B02D8234}'] function GetReport(const AID: String; const ShowLogotipo: Boolean = False): Binary; - function GetEtiquetas(const AID: Integer; withRefCliente: Boolean): Binary; + function GetEtiquetas(const AID: Integer; withRefCliente: Boolean): Binary; + function GetRptPDF(const AID: Integer; const ShowLogotipo: Boolean = False): Binary; end; implementation diff --git a/Source/Modulos/Albaranes de cliente/Reports/uRptAlbaranesCliente_Server.dfm b/Source/Modulos/Albaranes de cliente/Reports/uRptAlbaranesCliente_Server.dfm index bd77cd8c..bd3f54ec 100644 --- a/Source/Modulos/Albaranes de cliente/Reports/uRptAlbaranesCliente_Server.dfm +++ b/Source/Modulos/Albaranes de cliente/Reports/uRptAlbaranesCliente_Server.dfm @@ -1404,4 +1404,18 @@ object RptAlbaranesCliente: TRptAlbaranesCliente Left = 344 Top = 16 end + object frxPDFExport1: TfrxPDFExport + ShowDialog = False + UseFileCache = True + ShowProgress = False + PrintOptimized = True + Outline = True + Author = 'FactuGES' + Subject = 'FactuGES' + Background = False + Creator = 'FactuGES' + HTMLTags = True + Left = 360 + Top = 344 + end end diff --git a/Source/Modulos/Albaranes de cliente/Reports/uRptAlbaranesCliente_Server.pas b/Source/Modulos/Albaranes de cliente/Reports/uRptAlbaranesCliente_Server.pas index 409010d0..7282f983 100644 --- a/Source/Modulos/Albaranes de cliente/Reports/uRptAlbaranesCliente_Server.pas +++ b/Source/Modulos/Albaranes de cliente/Reports/uRptAlbaranesCliente_Server.pas @@ -7,7 +7,7 @@ uses Dialogs, frxClass, frxDBSet, uDAScriptingProvider, uDADataTable, uDACDSDataTable, DB, uDAClasses, frxChart, frxGradient, frxChBox, frxCross, frxOLE, frxBarcode, frxRich, uDABINAdapter, uROTypes, - uDAInterfaces; + uDAInterfaces, FactuGES_Intf, frxExportPDF; type TRptAlbaranesCliente = class(TDataModule) @@ -28,16 +28,18 @@ type schReport: TDASchema; DataDictionary: TDADataDictionary; frxReport: TfrxReport; + frxPDFExport1: TfrxPDFExport; procedure DataModuleCreate(Sender: TObject); procedure frxReportGetValue(const VarName: string; var Value: Variant); private FConnection: IDAConnection; FShowLogotipo: Boolean; //Genera cada uno de los albaranes a imprimir - procedure GenerarAlbaran(const ID: integer); overload; + procedure _GenerarAlbaran(const ID: integer); overload; public function GenerarAlbaran(const AID : String; const AConLogotipo: Boolean = False): Binary; overload; function GenerarEtiquetas(const AID : Integer; withRefCliente: Boolean): Binary; + function GenerarReportEnPDF(const ListaID : TIntegerArray; const AConLogotipo: Boolean = False): Binary; end; implementation @@ -74,21 +76,17 @@ var i: Integer; begin Result := Binary.Create; - FConnection.BeginTransaction; - try - FShowLogotipo := AConLogotipo; + FShowLogotipo := AConLogotipo; ID_Albaranes := TStringList.Create; ID_Albaranes.CommaText := AID; //Vamos generando todos y cada uno de los albaranes recibidos for i := 0 to ID_Albaranes.Count - 1 do - GenerarAlbaran(StrToInt(ID_Albaranes.Strings[i])); + _GenerarAlbaran(StrToInt(ID_Albaranes.Strings[i])); frxReport.PreviewPages.SaveToStream(Result); - finally - FConnection.RollbackTransaction; end; end; @@ -98,13 +96,14 @@ begin Value := FShowLogotipo; end; -procedure TRptAlbaranesCliente.GenerarAlbaran(const ID: integer); +procedure TRptAlbaranesCliente._GenerarAlbaran(const ID: integer); var AStream: TMemoryStream; dsMaster: IDADataset; dsDetail: IDADataset; begin AStream := TMemoryStream.Create; + FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" try dsMaster := schReport.NewDataset(FConnection, ds_InformeCabecera, ['ID'], [ID]); @@ -122,6 +121,7 @@ begin frxReport.PrepareReport(False); finally + FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" AStream.Free; dsMaster := Nil; dsDetail := Nil; @@ -162,4 +162,22 @@ begin end; end; +function TRptAlbaranesCliente.GenerarReportEnPDF(const ListaID: TIntegerArray; + const AConLogotipo: Boolean): Binary; +var + i: Integer; +begin + FShowLogotipo := AConLogotipo; + Result := Binary.Create; + try + //Vamos generando todos y cada uno de los presupuestos recibidos + for i := 0 to ListaID.Count - 1 do + _GenerarAlbaran(ListaID.Items[i]); + + frxPDFExport1.Stream := Result; + frxReport.Export(frxPDFExport1) + finally + end; +end; + end. diff --git a/Source/Modulos/Albaranes de cliente/Servidor/srvAlbaranesCliente_Impl.pas b/Source/Modulos/Albaranes de cliente/Servidor/srvAlbaranesCliente_Impl.pas index 8043f739..c26c8ad3 100644 --- a/Source/Modulos/Albaranes de cliente/Servidor/srvAlbaranesCliente_Impl.pas +++ b/Source/Modulos/Albaranes de cliente/Servidor/srvAlbaranesCliente_Impl.pas @@ -40,6 +40,7 @@ type function GetNextAutoInc(const GeneratorName: String): Integer; function GenerateReport(const ID: String; const ShowLogotipo: Boolean): Binary; function GenerateEtiquetas(const ID: Integer; const withRefCliente: Boolean): Binary; + function GenerarReportPDF(const ListaID: TIntegerArray; const ShowLogotipo: Boolean): Binary; end; implementation @@ -82,6 +83,19 @@ begin bpAlbaranesCliente.BusinessRulesID := BIZ_SERVER_ALBARAN_CLIENTE; end; +function TsrvAlbaranesCliente.GenerarReportPDF(const ListaID: TIntegerArray; + const ShowLogotipo: Boolean): Binary; +var + AReportGenerator : TRptAlbaranesCliente; +begin + AReportGenerator := TRptAlbaranesCliente.Create(nil); + try + Result := AReportGenerator.GenerarReportEnPDF(ListaID, ShowLogotipo); + finally + FreeAndNIL(AReportGenerator); + end; +end; + function TsrvAlbaranesCliente.GenerateEtiquetas(const ID: Integer; const withRefCliente: Boolean): Binary; var AReportGenerator : TRptAlbaranesCliente; diff --git a/Source/Modulos/Albaranes de cliente/Views/AlbaranesCliente_view.dpk b/Source/Modulos/Albaranes de cliente/Views/AlbaranesCliente_view.dpk index 0944f7d4..4712c4f6 100644 --- a/Source/Modulos/Albaranes de cliente/Views/AlbaranesCliente_view.dpk +++ b/Source/Modulos/Albaranes de cliente/Views/AlbaranesCliente_view.dpk @@ -100,7 +100,8 @@ requires Inventario_controller, JSDialog100, PedCli_AlbCli_relation, - AlbCli_FacCli_relation; + AlbCli_FacCli_relation, + dxGDIPlusD10; contains uAlbaranesClienteViewRegister in 'uAlbaranesClienteViewRegister.pas', @@ -117,6 +118,7 @@ contains uEditorAlbaranesDevCliente in 'uEditorAlbaranesDevCliente.pas' {fEditorAlbaranesDevCliente: TCustomEditor}, uViewAlbaranesDevCliente in 'uViewAlbaranesDevCliente.pas' {frViewAlbaranesDevCliente: TCustomView}, uEditorAlbaranDevCliente in 'uEditorAlbaranDevCliente.pas' {fEditorAlbaranDevCliente: TCustomEditor}, - uViewAlbaranDevCliente in 'uViewAlbaranDevCliente.pas' {frViewAlbaranDevCliente: TCustomView}; + uViewAlbaranDevCliente in 'uViewAlbaranDevCliente.pas' {frViewAlbaranDevCliente: TCustomView}, + uDialogListaAlbaranesCliEnvioEMail in 'uDialogListaAlbaranesCliEnvioEMail.pas' {fDialogListaAlbaranesCliEnvioEMail: TCustomEditor}; end. diff --git a/Source/Modulos/Albaranes de cliente/Views/uAlbaranesClienteViewRegister.pas b/Source/Modulos/Albaranes de cliente/Views/uAlbaranesClienteViewRegister.pas index 15b329bf..c1935599 100644 --- a/Source/Modulos/Albaranes de cliente/Views/uAlbaranesClienteViewRegister.pas +++ b/Source/Modulos/Albaranes de cliente/Views/uAlbaranesClienteViewRegister.pas @@ -10,7 +10,8 @@ implementation uses uEditorRegistryUtils, uEditorAlbaranesCliente, uEditorAlbaranCliente, uEditorElegirArticulosAlbaranCliente, uEditorAlbaranesClienteReport, - uEditorElegirAlbaranesCliente, uEditorAlbaranesDevCliente, uEditorAlbaranDevCliente; + uEditorElegirAlbaranesCliente, uEditorAlbaranesDevCliente, uEditorAlbaranDevCliente, + uDialogListaAlbaranesCliEnvioEMail; procedure RegisterViews; begin @@ -21,6 +22,7 @@ begin EditorRegistry.RegisterClass(TfEditorElegirArticulosAlbaranCliente, 'EditorElegirArticulosAlbaranesCliente'); EditorRegistry.RegisterClass(TfEditorAlbaranesClientePreview, 'EditorAlbaranesClientePreview'); EditorRegistry.RegisterClass(TfEditorElegirAlbaranesCliente, 'EditorElegirAlbaranesCliente'); + EditorRegistry.RegisterClass(TfDialogListaAlbaranesCliEnvioEMail, 'DialogListaAlbaranesCliEnvioEMail'); end; procedure UnregisterViews; @@ -32,6 +34,7 @@ begin EditorRegistry.UnRegisterClass(TfEditorElegirArticulosAlbaranCliente); EditorRegistry.UnRegisterClass(TfEditorAlbaranesClientePreview); EditorRegistry.UnRegisterClass(TfEditorElegirAlbaranesCliente); + EditorRegistry.UnRegisterClass(TfDialogListaAlbaranesCliEnvioEMail); end; end. diff --git a/Source/Modulos/Albaranes de cliente/Views/uDialogListaAlbaranesCliEnvioEMail.dfm b/Source/Modulos/Albaranes de cliente/Views/uDialogListaAlbaranesCliEnvioEMail.dfm new file mode 100644 index 00000000..78f2e60f --- /dev/null +++ b/Source/Modulos/Albaranes de cliente/Views/uDialogListaAlbaranesCliEnvioEMail.dfm @@ -0,0 +1,89 @@ +inherited fDialogListaAlbaranesCliEnvioEMail: TfDialogListaAlbaranesCliEnvioEMail + Caption = 'Enviar albaranes por correo electr'#243'nico' + ClientHeight = 432 + ClientWidth = 735 + ExplicitWidth = 741 + ExplicitHeight = 457 + PixelsPerInch = 96 + TextHeight = 13 + inherited pnlBotones: TFlowPanel + Top = 376 + Width = 735 + ExplicitTop = 382 + ExplicitWidth = 735 + inherited Button1: TButton + Left = 639 + Caption = '&Salir' + ExplicitLeft = 639 + end + inherited Button2: TButton + Left = 528 + Width = 96 + ExplicitLeft = 528 + ExplicitWidth = 96 + end + end + inherited FlowPanel1: TFlowPanel + Width = 735 + Height = 376 + ExplicitWidth = 735 + ExplicitHeight = 376 + inherited lblInstruccion: TLabel + Width = 320 + Caption = 'Enviar albaranes por correo electr'#243'nico' + Font.Style = [fsBold] + ExplicitWidth = 320 + end + inherited Label2: TLabel + Height = 51 + Caption = + 'Se generar'#225'n correos electr'#243'nicos autom'#225'ticos adjuntando los alb' + + 'aranes elegidos en formato PDF. S'#243'lo se tendr'#225'n en cuenta los cl' + + 'ientes que tengan relleno su e-mail administrativo.' + WordWrap = True + ExplicitHeight = 51 + end + inherited ListView1: TListView + Top = 121 + Width = 658 + Height = 232 + Columns = < + item + Caption = 'Documento' + MaxWidth = 75 + MinWidth = 75 + Width = 75 + end + item + Caption = 'Destinatario' + MaxWidth = 300 + Width = 280 + end + item + Caption = 'Direcci'#243'n E-Mail' + MaxWidth = 250 + Width = 150 + end + item + Caption = 'Estado' + MaxWidth = 250 + Width = 149 + end> + ExplicitTop = 121 + ExplicitWidth = 658 + ExplicitHeight = 232 + end + end + inherited ActionList1: TActionList + Left = 8 + Top = 352 + inherited actAceptar: TAction + Caption = '&Generar correos' + OnExecute = actAceptarExecute + OnUpdate = actAceptarUpdate + end + inherited actCancelar: TAction + OnExecute = actCancelarExecute + end + end +end diff --git a/Source/Modulos/Albaranes de cliente/Views/uDialogListaAlbaranesCliEnvioEMail.pas b/Source/Modulos/Albaranes de cliente/Views/uDialogListaAlbaranesCliEnvioEMail.pas new file mode 100644 index 00000000..e584a585 --- /dev/null +++ b/Source/Modulos/Albaranes de cliente/Views/uDialogListaAlbaranesCliEnvioEMail.pas @@ -0,0 +1,166 @@ +unit uDialogListaAlbaranesCliEnvioEMail; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, uDialogBase, ActnList, StdCtrls, ExtCtrls, ComCtrls, + uDialogListaEnvioEMail, uIDialogListaAlbaranesCliEnvioEMail, uAlbaranesClienteController, + uBizAlbaranesCliente; + +type + TfDialogListaAlbaranesCliEnvioEMail = class(TfDialogListaEnvioEMail, IDialogListaAlbaranesCliEnvioEMail) + procedure actCancelarExecute(Sender: TObject); + procedure actAceptarUpdate(Sender: TObject); + procedure actAceptarExecute(Sender: TObject); + private + FAlbaranes : IBizAlbaranCliente; + FController : IAlbaranesClienteController; + protected + function GetAlbaranes: IBizAlbaranCliente; + procedure SetAlbaranes(const Value: IBizAlbaranCliente); + + procedure RellenarLista; + procedure BorrarLista; + public + constructor Create(AOwner: TComponent); override; + property Albaranes: IBizAlbaranCliente read GetAlbaranes write SetAlbaranes; + end; + +implementation + +uses + schAlbaranesClienteClient_Intf, uStringsUtils, cxControls; + +{$R *.dfm} + + +{ TfDialogListaAlbaranesEnvioEMail } + +procedure TfDialogListaAlbaranesCliEnvioEMail.actAceptarExecute(Sender: TObject); +var + i : Integer; +begin + ShowHourglassCursor; + Application.ProcessMessages; + try + FAlbaranes.First; + FController.RecuperarCliente(FAlbaranes); + FAlbaranes.Cliente.DataTable.Active := True; + try + for i := 0 to FAlbaranes.DataTable.RecordCount - 1 do + begin + if not EsCadenaVacia(FAlbaranes.Cliente.EMAIL_ADMINISTRACION) then + begin + if FController.EnviarAlbaranPorEMail(FAlbaranes, True, FAlbaranes.Cliente.EMAIL_ADMINISTRACION) then + begin + ListView1.Items[i].SubItems[2] := 'Correo generado'; + ModalResult := mrOk; + end + else + ListView1.Items[i].SubItems[2] := 'Error al generar correo'; + Self.Update; + Application.ProcessMessages; + end; + + FAlbaranes.Next; + FController.RecuperarCliente(FAlbaranes); + FAlbaranes.Cliente.DataTable.Active := True; + end; + Button2.Enabled := False; + finally + ListView1.Items.EndUpdate; + end; + finally + HideHourglassCursor; + end; + + Button1.SetFocus; +end; + +procedure TfDialogListaAlbaranesCliEnvioEMail.actAceptarUpdate(Sender: TObject); +begin + inherited; + (Sender as TAction).Enabled := (ListView1.Items.Count > 0) +end; + +procedure TfDialogListaAlbaranesCliEnvioEMail.actCancelarExecute(Sender: TObject); +begin + inherited; + ModalResult := mrOk; +end; + +procedure TfDialogListaAlbaranesCliEnvioEMail.BorrarLista; +begin + ListView1.Items.Clear; +end; + +constructor TfDialogListaAlbaranesCliEnvioEMail.Create(AOwner: TComponent); +begin + inherited; + ModalResult := mrCancel; + FController := TAlbaranesClienteController.Create; +end; + +function TfDialogListaAlbaranesCliEnvioEMail.GetAlbaranes: IBizAlbaranCliente; +begin + Result := FAlbaranes; +end; + +procedure TfDialogListaAlbaranesCliEnvioEMail.RellenarLista; +var + i : Integer; +begin + ListView1.Items.BeginUpdate; + ListView1.Items.Clear; + + FAlbaranes.First; + FAlbaranes.DataTable.DisableControls; + try + for i := 0 to FAlbaranes.DataTable.RecordCount - 1 do + begin + FController.RecuperarCliente(FAlbaranes); + FAlbaranes.Cliente.DataTable.Active := True; + + with ListView1.Items.Add do + begin + Caption := FAlbaranes.REFERENCIA; + SubItems.Add(FAlbaranes.NOMBRE); + SubItems.Add(FAlbaranes.Cliente.EMAIL_ADMINISTRACION); + + if EsCadenaVacia(FAlbaranes.Cliente.EMAIL_ADMINISTRACION) then + SubItems.Add('Sin dirección e-mail administrativa') + else + SubItems.Add('') + end; + FAlbaranes.Next; + end; + finally + FAlbaranes.DataTable.EnableControls; + ListView1.Items.EndUpdate; + end; +end; + +procedure TfDialogListaAlbaranesCliEnvioEMail.SetAlbaranes( + const Value: IBizAlbaranCliente); +begin + FAlbaranes := Value; + + if Assigned(FAlbaranes) then + begin + FAlbaranes.DataTable.Open; + + if (FAlbaranes.TIPO = CTE_TIPO_ALBARAN_DEV) then + begin + Self.Caption := 'Enviar órdenes de devolución por correo electrónico'; + lblInstruccion.Caption := 'Enviar órdenes de devolución por correo electrónico'; + Label2.Caption := 'Se generarán correos electrónicos automáticos adjuntando las órdenes de devolución elegidas en formato PDF. Sólo se tendrán en cuenta los clientes que tengan relleno su e-mail administrativo.'; + end; + + RellenarLista; + end + else + BorrarLista; +end; + +end. diff --git a/Source/Modulos/Albaranes de cliente/Views/uEditorAlbaranesCliente.dfm b/Source/Modulos/Albaranes de cliente/Views/uEditorAlbaranesCliente.dfm index 348589b7..2e0e31b3 100644 --- a/Source/Modulos/Albaranes de cliente/Views/uEditorAlbaranesCliente.dfm +++ b/Source/Modulos/Albaranes de cliente/Views/uEditorAlbaranesCliente.dfm @@ -9,7 +9,7 @@ inherited fEditorAlbaranesCliente: TfEditorAlbaranesCliente inherited JvNavPanelHeader: TJvNavPanelHeader Width = 855 Caption = 'Lista de albaranes de cliente' - ExplicitWidth = 583 + ExplicitWidth = 855 inherited Image1: TImage Left = 828 Picture.Data = { @@ -124,11 +124,14 @@ inherited fEditorAlbaranesCliente: TfEditorAlbaranesCliente end inherited TBXDock: TTBXDock Width = 855 - ExplicitWidth = 583 + ExplicitWidth = 855 inherited tbxMain: TTBXToolbar - ExplicitWidth = 638 + ExplicitWidth = 746 object TBXSeparatorItem17: TTBXSeparatorItem [10] end + object TBXItem40: TTBXItem [14] + Action = actEnviarEMail + end end inherited tbxMenu: TTBXToolbar ExplicitWidth = 855 @@ -169,7 +172,8 @@ inherited fEditorAlbaranesCliente: TfEditorAlbaranesCliente inherited StatusBar: TJvStatusBar Top = 430 Width = 855 - ExplicitWidth = 583 + ExplicitTop = 430 + ExplicitWidth = 855 end inherited EditorActionList: TActionList inherited actNuevo: TAction @@ -225,6 +229,12 @@ inherited fEditorAlbaranesCliente: TfEditorAlbaranesCliente ImageIndex = 23 OnExecute = actGenerarOrdenExecute end + object actEnviarEMail: TAction + Category = 'Acciones' + Caption = 'Enviar por e-mail...' + OnExecute = actEnviarEMailExecute + OnUpdate = actEnviarEMailUpdate + end end inherited SmallImages: TPngImageList PngImages = < diff --git a/Source/Modulos/Albaranes de cliente/Views/uEditorAlbaranesCliente.pas b/Source/Modulos/Albaranes de cliente/Views/uEditorAlbaranesCliente.pas index 986323cc..b3b956a9 100644 --- a/Source/Modulos/Albaranes de cliente/Views/uEditorAlbaranesCliente.pas +++ b/Source/Modulos/Albaranes de cliente/Views/uEditorAlbaranesCliente.pas @@ -38,6 +38,8 @@ type JsListaAlbaranesNoEliminados: TJSDialog; actGenerarOrden: TAction; TBXItem39: TTBXItem; + actEnviarEMail: TAction; + TBXItem40: TTBXItem; procedure FormShow(Sender: TObject); procedure actGenerarFacturaUpdate(Sender: TObject); procedure actGenerarFacturaExecute(Sender: TObject); @@ -51,6 +53,8 @@ type procedure actGenerarEtiquetasExecute(Sender: TObject); procedure actGenerarEtiquetasUpdate(Sender: TObject); procedure actGenerarOrdenExecute(Sender: TObject); + procedure actEnviarEMailExecute(Sender: TObject); + procedure actEnviarEMailUpdate(Sender: TObject); protected FAlbaranes: IBizAlbaranCliente; @@ -88,7 +92,7 @@ uses uBizPedidosCliente, uDialogUtils, schAlbaranesClienteClient_Intf, uFacturasClienteController, uBizFacturasCliente, uInventarioController, uEditorBase, uGenerarAlbaranesCliUtils, uGenerarFacturasCliAlbCliUtils, - cxCustomData, uGridUtils, uDBSelectionListUtils; + cxCustomData, uGridUtils, uDBSelectionListUtils, cxControls; {$R *.dfm} @@ -196,6 +200,40 @@ begin FController.GenerarOrdenDev(Albaranes); end; +procedure TfEditorAlbaranesCliente.actEnviarEMailExecute(Sender: TObject); +var + AAlbaranes : IBizAlbaranCliente; +begin + inherited; + + if ViewGrid.NumSeleccionados = 1 then + FController.GenerarEmailAlbaran(Albaranes) + else begin + ShowHourglassCursor; + try + SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (Albaranes as ISeleccionable).SelectedRecords); + AAlbaranes := (Controller as IAlbaranesClienteController).ExtraerSeleccionados(Albaranes, ViewGrid) as IBizAlbaranCliente; + + if Assigned(AAlbaranes) then + if FController.EnviarEmailAlbaranes(AAlbaranes) then + RefrescarInterno; + finally + AAlbaranes := NIL; + HideHourglassCursor; + end; + end; +end; + +procedure TfEditorAlbaranesCliente.actEnviarEMailUpdate(Sender: TObject); +begin + inherited; + if HayDatos and Assigned(ViewGrid) then + (Sender as TAction).Enabled := ViewGrid.esSeleccionCeldaDatos + and (ViewGrid.NumSeleccionados > 0) + else + (Sender as TAction).Enabled := False; +end; + procedure TfEditorAlbaranesCliente.actEnviarExecute(Sender: TObject); var AInventarioController : IInventarioController; diff --git a/Source/Modulos/Albaranes de proveedor/Reports/uRptAlbaranesProveedor_Server.dfm b/Source/Modulos/Albaranes de proveedor/Reports/uRptAlbaranesProveedor_Server.dfm index e3cd9737..71a8383c 100644 --- a/Source/Modulos/Albaranes de proveedor/Reports/uRptAlbaranesProveedor_Server.dfm +++ b/Source/Modulos/Albaranes de proveedor/Reports/uRptAlbaranesProveedor_Server.dfm @@ -1043,13 +1043,14 @@ object RptAlbaranesProveedor: TRptAlbaranesProveedor Top = 158 end object frxReport: TfrxReport - Version = '3.23.7' + Version = '4.3' DotMatrixReport = False EngineOptions.DoublePass = True IniFile = '\Software\Fast Reports' PreviewOptions.Buttons = [pbPrint, pbLoad, pbSave, pbExport, pbZoom, pbFind, pbOutline, pbPageSetup, pbTools, pbEdit, pbNavigator, pbExportQuick] PreviewOptions.Zoom = 1.000000000000000000 PrintOptions.Printer = 'Por defecto' + PrintOptions.PrintOnSheet = 0 ReportOptions.CreateDate = 39065.872423495400000000 ReportOptions.LastChange = 39290.783958333330000000 ScriptLanguage = 'PascalScript' @@ -1157,29 +1158,6 @@ object RptAlbaranesProveedor: TRptAlbaranesProveedor OnStartReport = 'frxReportOnStartReport' Left = 169 Top = 16 - Datasets = < - item - DataSet = frxDBCabecera - DataSetName = 'frxDBCabecera' - end - item - DataSet = frxDBDetalles - DataSetName = 'frxDBDetalles' - end> - Variables = < - item - Name = ' Paginacion' - Value = Null - end - item - Name = 'TotalPaginas' - Value = Null - end - item - Name = 'Pagina' - Value = Null - end> - Style = <> end object frxDBCabecera: TfrxDBDataset UserName = 'frxDBCabecera' diff --git a/Source/Modulos/Albaranes de proveedor/Reports/uRptAlbaranesProveedor_Server.pas b/Source/Modulos/Albaranes de proveedor/Reports/uRptAlbaranesProveedor_Server.pas index 71101cf1..77baaf28 100644 --- a/Source/Modulos/Albaranes de proveedor/Reports/uRptAlbaranesProveedor_Server.pas +++ b/Source/Modulos/Albaranes de proveedor/Reports/uRptAlbaranesProveedor_Server.pas @@ -32,7 +32,7 @@ type private FConnection: IDAConnection; //Genera cada uno de los albaranes a imprimir - procedure GenerarAlbaran(const ID: integer); overload; + procedure _GenerarAlbaran(const ID: integer); overload; public function GenerarAlbaran(const AID : String): Binary; overload; end; @@ -68,30 +68,27 @@ var i: Integer; begin Result := Binary.Create; - FConnection.BeginTransaction; - try ID_Albaranes := TStringList.Create; ID_Albaranes.CommaText := AID; //Vamos generando todos y cada uno de los albaranes recibidos for i := 0 to ID_Albaranes.Count - 1 do - GenerarAlbaran(StrToInt(ID_Albaranes.Strings[i])); + _GenerarAlbaran(StrToInt(ID_Albaranes.Strings[i])); frxReport.PreviewPages.SaveToStream(Result); - finally - FConnection.RollbackTransaction; end; end; -procedure TRptAlbaranesProveedor.GenerarAlbaran(const ID: integer); +procedure TRptAlbaranesProveedor._GenerarAlbaran(const ID: integer); var AStream: TMemoryStream; dsMaster: IDADataset; dsDetail: IDADataset; begin AStream := TMemoryStream.Create; + FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" try dsMaster := schReport.NewDataset(FConnection, ds_InformeCabecera, ['ID'], [ID]); @@ -109,6 +106,7 @@ begin frxReport.PrepareReport(False); finally + FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" AStream.Free; dsMaster := Nil; dsDetail := Nil; diff --git a/Source/Modulos/Facturas de cliente/Controller/uFacturasClienteController.pas b/Source/Modulos/Facturas de cliente/Controller/uFacturasClienteController.pas index 67b1377b..d580204f 100644 --- a/Source/Modulos/Facturas de cliente/Controller/uFacturasClienteController.pas +++ b/Source/Modulos/Facturas de cliente/Controller/uFacturasClienteController.pas @@ -112,13 +112,11 @@ type function EnviarEmailFacturas(AFacturas : IBizFacturaCliente): Boolean; function GenerarEmailFactura(AFactura : IBizFacturaCliente): Boolean; - function EnviarFacturaPorEMail(AFactura: IBizFacturaCliente; const AEnviarDirectamente: Boolean = True; const ADireccionEMail: String = ''; const AAsuntoEMail: String = ''; const ATextoEMail: String = ''): Boolean; - procedure RecalcularImportes(AFactura: IBizFacturaCliente); function EsModificable(AFactura: IBizFacturaCliente): Boolean; function EsEliminable(AFactura: IBizFacturaCliente): Boolean; diff --git a/Source/Modulos/Facturas de cliente/FacturasCliente_Group.bdsgroup b/Source/Modulos/Facturas de cliente/FacturasCliente_Group.bdsgroup index c3105ec6..4fac7f7b 100644 --- a/Source/Modulos/Facturas de cliente/FacturasCliente_Group.bdsgroup +++ b/Source/Modulos/Facturas de cliente/FacturasCliente_Group.bdsgroup @@ -8,7 +8,9 @@ - + + + ..\..\Base\Base.bdsproj ..\..\Base\ControllerBase\ControllerBase.bdsproj ..\..\Base\GUIBase\GUIBase.bdsproj @@ -28,14 +30,10 @@ ..\..\Cliente\FactuGES.bdsproj ..\..\Servidor\FactuGES_Server.bdsproj ..\Albaranes de cliente\Controller\AlbaranesCliente_controller.bdsproj - ..\Pedidos de cliente\Model\PedidosCliente_model.bdsproj ..\Facturas de proveedor\Views\FacturasProveedor_view.bdsproj - ..\Formas de pago\Model\FormasPago_model.bdsproj - ..\Formas de pago\Data\FormasPago_data.bdsproj - ..\Formas de pago\Controller\FormasPago_controller.bdsproj - ..\Formas de pago\Views\FormasPago_view.bdsproj - ..\Formas de pago\Plugin\FormasPago_plugin.bdsproj - Base.bpl ControllerBase.bpl GUIBase.bpl Contactos_model.bpl Contactos_data.bpl Contactos_controller.bpl Articulos_model.bpl Articulos_data.bpl Articulos_controller.bpl Contactos_view.bpl Articulos_view.bpl FacturasCliente_model.bpl FacturasCliente_data.bpl FacturasCliente_controller.bpl AlbCli_FacCli_relation.bpl FacturasCliente_view.bpl FactuGES.exe FactuGES_Server.exe AlbaranesCliente_controller.bpl PedidosCliente_model.bpl FacturasProveedor_view.bpl FormasPago_model.bpl FormasPago_data.bpl FormasPago_controller.bpl FormasPago_view.bpl FormasPago_plugin.bpl + ..\Pedidos de cliente\Views\PedidosCliente_view.bdsproj + ..\Pedidos de cliente\Controller\PedidosCliente_controller.bdsproj + Base.bpl ControllerBase.bpl GUIBase.bpl Contactos_model.bpl Contactos_data.bpl Contactos_controller.bpl Articulos_model.bpl Articulos_data.bpl Articulos_controller.bpl Contactos_view.bpl Articulos_view.bpl FacturasCliente_model.bpl FacturasCliente_data.bpl FacturasCliente_controller.bpl AlbCli_FacCli_relation.bpl FacturasCliente_view.bpl FactuGES.exe FactuGES_Server.exe AlbaranesCliente_controller.bpl FacturasProveedor_view.bpl PedidosCliente_view.bpl PedidosCliente_controller.bpl diff --git a/Source/Modulos/Facturas de cliente/Reports/uRptFacturasCliente_Server.pas b/Source/Modulos/Facturas de cliente/Reports/uRptFacturasCliente_Server.pas index 1fcfb7b1..53d19779 100644 --- a/Source/Modulos/Facturas de cliente/Reports/uRptFacturasCliente_Server.pas +++ b/Source/Modulos/Facturas de cliente/Reports/uRptFacturasCliente_Server.pas @@ -41,7 +41,7 @@ type procedure _GenerarFactura(const ID: Integer); public function GenerarFactura(const ListaID : TIntegerArray; - const AConLogotipo: Boolean = False): Binary; + const AConLogotipo: Boolean = False): Binary; function GenerarFacturaEnPDF(const ListaID : TIntegerArray; const AConLogotipo: Boolean = False): Binary; end; @@ -105,6 +105,7 @@ var dsVencimientos : IDADataset; begin AStream := TMemoryStream.Create; + FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" try dsMaster := schReport.NewDataset(FConnection, ds_InformeFacturasCliente, ['ID'], [ID]); @@ -128,6 +129,7 @@ begin frxReport.PrepareReport(False); finally + FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" AStream.Free; dsMaster := Nil; dsDetail := Nil; @@ -148,8 +150,6 @@ var begin FShowLogotipo := AConLogotipo; Result := Binary.Create; - //FConnection.BeginTransaction; <--- Creo que no va a hacer falta. - try //Vamos generando todos y cada uno de los presupuestos recibidos for i := 0 to ListaID.Count - 1 do @@ -157,7 +157,6 @@ begin frxReport.PreviewPages.SaveToStream(Result); finally - //FConnection.RollbackTransaction; <--- Creo que no va a hacer falta. end; end; @@ -168,8 +167,6 @@ var begin FShowLogotipo := AConLogotipo; Result := Binary.Create; - //FConnection.BeginTransaction; <--- Creo que no va a hacer falta. - try //Vamos generando todos y cada uno de los presupuestos recibidos for i := 0 to ListaID.Count - 1 do @@ -178,7 +175,6 @@ begin frxPDFExport1.Stream := Result; frxReport.Export(frxPDFExport1) finally - //FConnection.RollbackTransaction; <--- Creo que no va a hacer falta. end; end; diff --git a/Source/Modulos/Facturas de cliente/Views/uDialogListaFacturasEnvioEMail.dfm b/Source/Modulos/Facturas de cliente/Views/uDialogListaFacturasEnvioEMail.dfm index 11018caa..6a932265 100644 --- a/Source/Modulos/Facturas de cliente/Views/uDialogListaFacturasEnvioEMail.dfm +++ b/Source/Modulos/Facturas de cliente/Views/uDialogListaFacturasEnvioEMail.dfm @@ -1,24 +1,29 @@ inherited fDialogListaFacturasEnvioEMail: TfDialogListaFacturasEnvioEMail Caption = 'Enviar facturas por correo electr'#243'nico' ClientHeight = 432 - ExplicitWidth = 629 + ClientWidth = 735 + ExplicitWidth = 741 ExplicitHeight = 457 PixelsPerInch = 96 TextHeight = 13 inherited pnlBotones: TFlowPanel Top = 376 + Width = 735 ExplicitTop = 376 inherited Button1: TButton + Left = 639 Caption = '&Salir' + ExplicitLeft = 639 end inherited Button2: TButton - Left = 416 + Left = 528 Width = 96 - ExplicitLeft = 416 + ExplicitLeft = 528 ExplicitWidth = 96 end end inherited FlowPanel1: TFlowPanel + Width = 735 Height = 376 ExplicitHeight = 376 inherited lblInstruccion: TLabel @@ -38,6 +43,7 @@ inherited fDialogListaFacturasEnvioEMail: TfDialogListaFacturasEnvioEMail end inherited ListView1: TListView Top = 121 + Width = 658 Height = 232 Columns = < item @@ -58,10 +64,11 @@ inherited fDialogListaFacturasEnvioEMail: TfDialogListaFacturasEnvioEMail end item Caption = 'Estado' - MaxWidth = 200 - Width = 100 + MaxWidth = 250 + Width = 149 end> ExplicitTop = 121 + ExplicitWidth = 658 ExplicitHeight = 232 end end diff --git a/Source/Modulos/Facturas de cliente/Views/uDialogListaFacturasEnvioEMail.pas b/Source/Modulos/Facturas de cliente/Views/uDialogListaFacturasEnvioEMail.pas index 7841727b..151649ac 100644 --- a/Source/Modulos/Facturas de cliente/Views/uDialogListaFacturasEnvioEMail.pas +++ b/Source/Modulos/Facturas de cliente/Views/uDialogListaFacturasEnvioEMail.pas @@ -45,22 +45,27 @@ begin Application.ProcessMessages; try FFacturas.First; + FController.RecuperarCliente(FFacturas); + FFacturas.Cliente.DataTable.Active := True; try for i := 0 to FFacturas.DataTable.RecordCount - 1 do begin - if EsCadenaVacia(FFacturas.Cliente.EMAIL_ADMINISTRACION) then - Continue; - - if FController.EnviarFacturaPorEMail(FFacturas, True, FFacturas.Cliente.EMAIL_ADMINISTRACION) then + if not EsCadenaVacia(FFacturas.Cliente.EMAIL_ADMINISTRACION) then begin - ListView1.Items[i].SubItems[2] := 'Correo generado'; - ModalResult := mrOk; - end - else - ListView1.Items[i].SubItems[2] := 'Error al generar correo'; - Self.Update; - Application.ProcessMessages; + if FController.EnviarFacturaPorEMail(FFacturas, True, FFacturas.Cliente.EMAIL_ADMINISTRACION) then + begin + ListView1.Items[i].SubItems[2] := 'Correo generado'; + ModalResult := mrOk; + end + else + ListView1.Items[i].SubItems[2] := 'Error al generar correo'; + Self.Update; + Application.ProcessMessages; + end; + FFacturas.Next; + FController.RecuperarCliente(FFacturas); + FFacturas.Cliente.DataTable.Active := True; end; Button2.Enabled := False; finally diff --git a/Source/Modulos/Facturas de cliente/Views/uEditorFacturasCliente.pas b/Source/Modulos/Facturas de cliente/Views/uEditorFacturasCliente.pas index 1ac86e84..32d708c8 100644 --- a/Source/Modulos/Facturas de cliente/Views/uEditorFacturasCliente.pas +++ b/Source/Modulos/Facturas de cliente/Views/uEditorFacturasCliente.pas @@ -100,7 +100,8 @@ begin AFacturas := (Controller as IFacturasClienteController).ExtraerSeleccionados(Facturas, ViewGrid) as IBizFacturaCliente; if Assigned(AFacturas) then - FController.EnviarEmailFacturas(AFacturas); + if FController.EnviarEmailFacturas(AFacturas) then + RefrescarInterno; finally AFacturas := NIL; HideHourglassCursor; diff --git a/Source/Modulos/Facturas de proveedor/Reports/uRptFacturasProveedor_Server.dfm b/Source/Modulos/Facturas de proveedor/Reports/uRptFacturasProveedor_Server.dfm index c4bf1d77..45275d5c 100644 --- a/Source/Modulos/Facturas de proveedor/Reports/uRptFacturasProveedor_Server.dfm +++ b/Source/Modulos/Facturas de proveedor/Reports/uRptFacturasProveedor_Server.dfm @@ -1178,7 +1178,7 @@ object RptFacturasProveedor: TRptFacturasProveedor Top = 158 end object frxReport: TfrxReport - Version = '3.23.7' + Version = '4.3' DotMatrixReport = False EngineOptions.DoublePass = True IniFile = '\Software\Fast Reports' @@ -1186,6 +1186,7 @@ object RptFacturasProveedor: TRptFacturasProveedor PreviewOptions.OutlineWidth = 180 PreviewOptions.Zoom = 1.000000000000000000 PrintOptions.Printer = 'Default' + PrintOptions.PrintOnSheet = 0 ReportOptions.CreateDate = 37871.995398692100000000 ReportOptions.LastChange = 39465.864521631940000000 ReportOptions.VersionBuild = '1' @@ -1324,70 +1325,6 @@ object RptFacturasProveedor: TRptFacturasProveedor OnStartReport = 'frxReportOnStartReport' Left = 169 Top = 16 - Datasets = < - item - DataSet = frxDBCabecera - DataSetName = 'frxDBCabecera' - end - item - DataSet = frxDBDetalles - DataSetName = 'frxDBDetalles' - end - item - DataSet = frxDBDataset1 - DataSetName = 'frxDBVencimientos' - end> - Variables = < - item - Name = ' Paginacion' - Value = Null - end - item - Name = 'Pagina' - Value = Null - end - item - Name = 'TotalPaginas' - Value = Null - end> - Style = < - item - Name = 'Concepto normal' - Color = clNone - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -12 - Font.Name = 'Tahoma' - Font.Style = [] - end - item - Name = 'Concepto subtotal' - Color = clNone - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -12 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - end - item - Name = 'Cabecera de columna' - Color = 15790320 - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -12 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - Frame.Typ = [ftLeft, ftRight, ftTop, ftBottom] - end - item - Name = 'Concepto titulo' - Color = clNone - Font.Charset = ANSI_CHARSET - Font.Color = clWindowText - Font.Height = -13 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - end> end object frxDBCabecera: TfrxDBDataset UserName = 'frxDBCabecera' diff --git a/Source/Modulos/Facturas de proveedor/Reports/uRptFacturasProveedor_Server.pas b/Source/Modulos/Facturas de proveedor/Reports/uRptFacturasProveedor_Server.pas index 010b6c0a..834d45c5 100644 --- a/Source/Modulos/Facturas de proveedor/Reports/uRptFacturasProveedor_Server.pas +++ b/Source/Modulos/Facturas de proveedor/Reports/uRptFacturasProveedor_Server.pas @@ -34,7 +34,7 @@ type procedure DataModuleCreate(Sender: TObject); private FConnection: IDAConnection; - procedure GenerarFactura(const AFacturaID: integer); overload; + procedure _GenerarFactura(const AFacturaID: integer); overload; public function GenerarFactura(const AFacturaID : String): Binary; overload; end; @@ -71,24 +71,20 @@ var begin Result := Binary.Create; - FConnection.BeginTransaction; - try ID_Facturas := TStringList.Create; ID_Facturas.CommaText := AFacturaID; //Vamos generando todos y cada uno de los albaranes recibidos for i := 0 to ID_Facturas.Count - 1 do - GenerarFactura(StrToInt(ID_Facturas.Strings[i])); + _GenerarFactura(StrToInt(ID_Facturas.Strings[i])); frxReport.PreviewPages.SaveToStream(Result); - finally - FConnection.RollbackTransaction; end; end; -procedure TRptFacturasProveedor.GenerarFactura(const AFacturaID: integer); +procedure TRptFacturasProveedor._GenerarFactura(const AFacturaID: integer); var AStream: TMemoryStream; dsMaster: IDADataset; @@ -96,6 +92,7 @@ var dsVencimientos : IDADataset; begin AStream := TMemoryStream.Create; + FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" try dsMaster := schReport.NewDataset(FConnection, ds_InformeFacturasProveedor, ['ID'], [AFacturaID]); @@ -119,6 +116,7 @@ begin frxReport.PrepareReport(False); finally + FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" AStream.Free; dsMaster := Nil; dsDetail := Nil; diff --git a/Source/Modulos/Pedidos a proveedor/Reports/uRptPedidosProveedor_Server.dfm b/Source/Modulos/Pedidos a proveedor/Reports/uRptPedidosProveedor_Server.dfm index aac07404..2fc3c0f5 100644 --- a/Source/Modulos/Pedidos a proveedor/Reports/uRptPedidosProveedor_Server.dfm +++ b/Source/Modulos/Pedidos a proveedor/Reports/uRptPedidosProveedor_Server.dfm @@ -713,13 +713,14 @@ object RptPedidosProveedor: TRptPedidosProveedor Top = 158 end object frxReport: TfrxReport - Version = '3.23.7' + Version = '4.3' DotMatrixReport = False EngineOptions.DoublePass = True IniFile = '\Software\Fast Reports' PreviewOptions.Buttons = [pbPrint, pbLoad, pbSave, pbExport, pbZoom, pbFind, pbOutline, pbPageSetup, pbTools, pbEdit, pbNavigator, pbExportQuick] PreviewOptions.Zoom = 1.000000000000000000 PrintOptions.Printer = 'Por defecto' + PrintOptions.PrintOnSheet = 0 ReportOptions.CreateDate = 39065.872423495400000000 ReportOptions.LastChange = 39352.784043865700000000 ScriptLanguage = 'PascalScript' @@ -802,29 +803,6 @@ object RptPedidosProveedor: TRptPedidosProveedor OnStartReport = 'frxReportOnStartReport' Left = 169 Top = 16 - Datasets = < - item - DataSet = frxDBCabecera - DataSetName = 'frxDBCabecera' - end - item - DataSet = frxDBDetalles - DataSetName = 'frxDBDetalles' - end> - Variables = < - item - Name = ' Paginacion' - Value = Null - end - item - Name = 'TotalPaginas' - Value = Null - end - item - Name = 'Pagina' - Value = Null - end> - Style = <> end object frxDBCabecera: TfrxDBDataset UserName = 'frxDBCabecera' @@ -840,4 +818,18 @@ object RptPedidosProveedor: TRptPedidosProveedor Left = 344 Top = 16 end + object frxPDFExport1: TfrxPDFExport + ShowDialog = False + UseFileCache = True + ShowProgress = False + PrintOptimized = True + Outline = True + Author = 'FactuGES' + Subject = 'FactuGES' + Background = False + Creator = 'FactuGES' + HTMLTags = True + Left = 360 + Top = 344 + end end diff --git a/Source/Modulos/Pedidos a proveedor/Reports/uRptPedidosProveedor_Server.pas b/Source/Modulos/Pedidos a proveedor/Reports/uRptPedidosProveedor_Server.pas index 8fea3a21..3c6a8075 100644 --- a/Source/Modulos/Pedidos a proveedor/Reports/uRptPedidosProveedor_Server.pas +++ b/Source/Modulos/Pedidos a proveedor/Reports/uRptPedidosProveedor_Server.pas @@ -7,7 +7,7 @@ uses Dialogs, frxClass, frxDBSet, uDAScriptingProvider, uDADataTable, uDACDSDataTable, DB, uDAClasses, frxChart, frxGradient, frxChBox, frxCross, frxOLE, frxBarcode, frxRich, uDABINAdapter, uROTypes, - uDAInterfaces; + uDAInterfaces, FactuGES_Intf, frxExportPDF; type TRptPedidosProveedor = class(TDataModule) @@ -28,12 +28,14 @@ type frxReport: TfrxReport; schReport: TDASchema; DataDictionary: TDADataDictionary; + frxPDFExport1: TfrxPDFExport; procedure DataModuleCreate(Sender: TObject); private FConnection: IDAConnection; - procedure GenerarPedido(const AID : Integer); overload; + procedure _GenerarPedido(const AID : Integer); overload; public function GenerarPedido(const AID : String): Binary; overload; + function GenerarReportEnPDF(const ListaID : TIntegerArray): Binary; //const AConLogotipo: Boolean = False): Binary; end; implementation @@ -58,7 +60,7 @@ procedure TRptPedidosProveedor.DataModuleCreate(Sender: TObject); begin schReport.ConnectionManager := dmServer.ConnectionManager; FConnection := dmServer.DarNuevaConexion; - frxReport.EngineOptions.NewSilentMode := simReThrow; + frxReport.EngineOptions.NewSilentMode := simReThrow; end; function TRptPedidosProveedor.GenerarPedido(const AID: String): Binary; @@ -68,30 +70,44 @@ var begin Result := Binary.Create; - FConnection.BeginTransaction; - try ID_Pedidos := TStringList.Create; ID_Pedidos.CommaText := AID; //Vamos generando todos y cada uno de los albaranes recibidos for i := 0 to ID_Pedidos.Count - 1 do - GenerarPedido(StrToInt(ID_Pedidos.Strings[i])); + _GenerarPedido(StrToInt(ID_Pedidos.Strings[i])); frxReport.PreviewPages.SaveToStream(Result); - finally - FConnection.RollbackTransaction; end; end; -procedure TRptPedidosProveedor.GenerarPedido(const AID: Integer); +function TRptPedidosProveedor.GenerarReportEnPDF(const ListaID: TIntegerArray): Binary; //; const AConLogotipo: Boolean): Binary; +var + i: Integer; +begin +// FShowLogotipo := AConLogotipo; + Result := Binary.Create; + try + //Vamos generando todos y cada uno de los presupuestos recibidos + for i := 0 to ListaID.Count - 1 do + _GenerarPedido(ListaID.Items[i]); + + frxPDFExport1.Stream := Result; + frxReport.Export(frxPDFExport1) + finally + end; +end; + +procedure TRptPedidosProveedor._GenerarPedido(const AID: Integer); var AStream: TMemoryStream; dsMaster: IDADataset; dsDetail: IDADataset; begin AStream := TMemoryStream.Create; + FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" try dsMaster := schReport.NewDataset(FConnection, ds_InformeCabecera, ['ID'], [AID]); @@ -109,6 +125,7 @@ begin frxReport.PrepareReport(False); finally + FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" AStream.Free; dsMaster := Nil; dsDetail := Nil; diff --git a/Source/Modulos/Pedidos a proveedor/Servidor/srvPedidosProveedor_Impl.pas b/Source/Modulos/Pedidos a proveedor/Servidor/srvPedidosProveedor_Impl.pas index 3459de91..d988bc87 100644 --- a/Source/Modulos/Pedidos a proveedor/Servidor/srvPedidosProveedor_Impl.pas +++ b/Source/Modulos/Pedidos a proveedor/Servidor/srvPedidosProveedor_Impl.pas @@ -39,6 +39,7 @@ type { IsrvPedidosProveedor methods } function GetNextAutoInc(const GeneratorName: String): Integer; function GenerateReport(const ID: String): Binary; + function GenerarReportPDF(const ListaID: TIntegerArray; const ShowLogotipo: Boolean): Binary; end; implementation @@ -84,6 +85,19 @@ begin bpPedidosProveedor.BusinessRulesID := BIZ_SERVER_PEDIDOS_PROVEEDOR; end; +function TsrvPedidosProveedor.GenerarReportPDF(const ListaID: TIntegerArray; + const ShowLogotipo: Boolean): Binary; +var + AReportGenerator : TRptPedidosProveedor; +begin + AReportGenerator := TRptPedidosProveedor.Create(nil); + try + Result := AReportGenerator.GenerarReportEnPDF(ListaID); //, ShowLogotipo); + finally + FreeAndNIL(AReportGenerator); + end; +end; + function TsrvPedidosProveedor.GenerateReport(const ID: String): Binary; var AReportGenerator : TRptPedidosProveedor; diff --git a/Source/Modulos/Pedidos de cliente/Controller/PedidosCliente_controller.dpk b/Source/Modulos/Pedidos de cliente/Controller/PedidosCliente_controller.dpk index 842fe2f7..d851fdc7 100644 --- a/Source/Modulos/Pedidos de cliente/Controller/PedidosCliente_controller.dpk +++ b/Source/Modulos/Pedidos de cliente/Controller/PedidosCliente_controller.dpk @@ -50,6 +50,7 @@ contains uIEditorElegirArticulosPedidosCliente in 'View\uIEditorElegirArticulosPedidosCliente.pas', uIEditorDireccionEntregaPedidoCliente in 'View\uIEditorDireccionEntregaPedidoCliente.pas', uPedidosClienteReportController in 'uPedidosClienteReportController.pas', - uIEditorPedidosClientePreview in 'View\uIEditorPedidosClientePreview.pas'; + uIEditorPedidosClientePreview in 'View\uIEditorPedidosClientePreview.pas', + uIDialogListaPedidosCliEnvioEMail in 'View\uIDialogListaPedidosCliEnvioEMail.pas'; end. diff --git a/Source/Modulos/Pedidos de cliente/Controller/View/uIDialogListaPedidosCliEnvioEMail.pas b/Source/Modulos/Pedidos de cliente/Controller/View/uIDialogListaPedidosCliEnvioEMail.pas new file mode 100644 index 00000000..d4864089 --- /dev/null +++ b/Source/Modulos/Pedidos de cliente/Controller/View/uIDialogListaPedidosCliEnvioEMail.pas @@ -0,0 +1,21 @@ +unit uIDialogListaPedidosCliEnvioEMail; + +interface + +uses + uBizPedidosCliente, uPedidosClienteController; + +type + IDialogListaPedidosCliEnvioEMail = interface + ['{D51F7EC0-A75C-4BA9-9373-F1056F095B40}'] + function GetPedidos: IBizPedidoCliente; + procedure SetPedidos(const Value: IBizPedidoCliente); + property Pedidos: IBizPedidoCliente read GetPedidos write SetPedidos; + function ShowModal : Integer; + procedure Release; + end; + + +implementation + +end. diff --git a/Source/Modulos/Pedidos de cliente/Controller/uPedidosClienteController.pas b/Source/Modulos/Pedidos de cliente/Controller/uPedidosClienteController.pas index ad936afe..2dd674bb 100644 --- a/Source/Modulos/Pedidos de cliente/Controller/uPedidosClienteController.pas +++ b/Source/Modulos/Pedidos de cliente/Controller/uPedidosClienteController.pas @@ -52,6 +52,13 @@ type procedure Preview(APedido : IBizPedidoCliente; AllItems: Boolean = false); function Print(APedido : IBizPedidoCliente; AllItems: Boolean = false): Boolean; + function EnviarEmailPedidos(APedidos : IBizPedidoCliente): Boolean; + function GenerarEmailPedido(APedido : IBizPedidoCliente): Boolean; + function EnviarPedidoPorEMail(APedido: IBizPedidoCliente; + const AEnviarDirectamente: Boolean = True; + const ADireccionEMail: String = ''; const AAsuntoEMail: String = ''; + const ATextoEMail: String = ''): Boolean; + function ArticulosPendientes(const ID : Integer): IBizPedidoClienteArticulosPend; end; @@ -116,6 +123,13 @@ type procedure Preview(APedido : IBizPedidoCliente; AllItems: Boolean = false); function Print(APedido : IBizPedidoCliente; AllItems: Boolean = false): Boolean; + function EnviarEmailPedidos(APedidos : IBizPedidoCliente): Boolean; + function GenerarEmailPedido(APedido : IBizPedidoCliente): Boolean; + function EnviarPedidoPorEMail(APedido: IBizPedidoCliente; + const AEnviarDirectamente: Boolean = True; + const ADireccionEMail: String = ''; const AAsuntoEMail: String = ''; + const ATextoEMail: String = ''): Boolean; + function ArticulosPendientes(const ID : Integer): IBizPedidoClienteArticulosPend; end; @@ -127,7 +141,8 @@ uses uBizContactos, uDataTableUtils, uDataModuleUsuarios, Classes, schPedidosClienteClient_Intf, uDAInterfaces, uDateUtils, uIEditorPedidoCliente, uIEditorElegirPedidosCliente, uIEditorDireccionEntregaPedidoCliente, - schContactosClient_Intf, uPedidosClienteReportController; + schContactosClient_Intf, uPedidosClienteReportController, uIDialogListaPedidosCliEnvioEMail, + uSistemaFunc, uStringsUtils, uDialogElegirEMail, Forms, uEMailUtils; { TPedidosClienteController } @@ -556,6 +571,98 @@ begin end; end; +function TPedidosClienteController.EnviarEmailPedidos(APedidos: IBizPedidoCliente): Boolean; +var + ADialog : IDialogListaPedidosCliEnvioEMail; + ARespuesta : Integer; +begin + ADialog := NIL; + + if not Assigned(APedidos) then + raise Exception.Create ('Facturas no asignadas (EnviarPedidosCliPorEMail)'); + + if APedidos.DataTable.Active then + APedidos.DataTable.Active := True; + + ShowHourglassCursor; + try + CreateEditor('DialogListaPedidosCliEnvioEMail', IDialogListaPedidosCliEnvioEMail, 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 TPedidosClienteController.EnviarPedidoPorEMail( + APedido: IBizPedidoCliente; const AEnviarDirectamente: Boolean; + const ADireccionEMail, AAsuntoEMail, ATextoEMail: String): Boolean; +var + AReportController : IPedidosClienteReportController; + AFicheroTMP : TFileName; + AEMail : String; + AAsunto : String; + AListaEmail : TStringList; +begin + + if not Assigned(APedido) then + raise Exception.Create ('Pedido no asignada (EnviarFacturaPorEMail)'); + + if APedido.DataTable.Active then + APedido.DataTable.Active := True; + + RecuperarCliente(APedido); + APedido.Cliente.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.Cliente.EMAIL_ADMINISTRACION) then + AListaEmail.Add(APedido.Cliente.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 := TPedidosClienteReportController.Create; + try + AReportController.ExportToPDF(APedido.ID, AFicheroTMP); + Result := EnviarEMailMAPI(AAsunto, ATextoEMail, AFicheroTMP, '', '', APedido.Cliente.NOMBRE, AEMail, AEnviarDirectamente); + if Result then +// _AnadirMarcaEnvioCorreo(APedido); + finally + SysUtils.DeleteFile(AFicheroTMP); + AReportController := NIL; + HideHourglassCursor; + Application.ProcessMessages; + end; +end; + function TPedidosClienteController.EsEliminable(APedido: IBizPedidoCliente): Boolean; begin if not Assigned(APedido) then @@ -850,6 +957,23 @@ begin end; end; +function TPedidosClienteController.GenerarEmailPedido(APedido: IBizPedidoCliente): 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 + RecuperarCliente(APedido); + EnviarPedidoPorEMail(APedido, False, APedido.Cliente.EMAIL_ADMINISTRACION); + finally + HideHourglassCursor; + end; +end; + function TPedidosClienteController.GetClienteController: IClientesController; begin Result := FClienteController; diff --git a/Source/Modulos/Pedidos de cliente/Controller/uPedidosClienteReportController.pas b/Source/Modulos/Pedidos de cliente/Controller/uPedidosClienteReportController.pas index 859d3c62..768d2a0e 100644 --- a/Source/Modulos/Pedidos de cliente/Controller/uPedidosClienteReportController.pas +++ b/Source/Modulos/Pedidos de cliente/Controller/uPedidosClienteReportController.pas @@ -12,6 +12,7 @@ type ['{D0686358-251C-43C4-9927-6112F2F4D3B8}'] procedure Preview(const AID : String); function Print(const AID : String): Boolean; + function ExportToPDF(const AID: Integer; const AFileName : String = ''): Boolean; end; TPedidosClienteReportController = class(TInterfacedObject, IPedidosClienteReportController) @@ -24,6 +25,7 @@ type procedure Preview(const AID : String); function Print(const AID : String): Boolean; + function ExportToPDF(const AID: Integer; const AFileName : String = ''): Boolean; end; @@ -32,7 +34,7 @@ implementation uses uROTypes, uEditorRegistryUtils, uIEditorPedidosClientePreview, uEditorPreview, uDataModulePedidosCliente, uEditorBase, cxControls, - schPedidosClienteClient_Intf; + schPedidosClienteClient_Intf, uStringsUtils; { TPedidosClienteReportController } @@ -54,6 +56,29 @@ begin inherited; end; +function TPedidosClienteReportController.ExportToPDF(const AID: Integer; + const AFileName: String): Boolean; +var + AStream: Binary; +begin + Result := False; + if EsCadenaVacia(AFileName) then + Exit; + + ShowHourglassCursor; + try + AStream := FDataModule.GetRptPDF(AID, True); + try + AStream.SaveToFile(AFileName); + Result := True; + finally + FreeAndNil(AStream); + end; + finally + HideHourglassCursor; + end; +end; + procedure TPedidosClienteReportController.Preview(const AID : String); var AStream: Binary; diff --git a/Source/Modulos/Pedidos de cliente/Data/uDataModulePedidosCliente.pas b/Source/Modulos/Pedidos de cliente/Data/uDataModulePedidosCliente.pas index a68f961a..fff0118c 100644 --- a/Source/Modulos/Pedidos de cliente/Data/uDataModulePedidosCliente.pas +++ b/Source/Modulos/Pedidos de cliente/Data/uDataModulePedidosCliente.pas @@ -45,8 +45,8 @@ type function NewItem : IBizPedidoCliente; // Report -// function GetReport(const AID: String): Binary; function GetReport(const AID: String; const ShowLogotipo: Boolean = False): Binary; + function GetRptPDF(const AID: Integer; const ShowLogotipo: Boolean = False): Binary; end; implementation @@ -88,6 +88,20 @@ begin Result := (RORemoteService as IsrvPedidosCliente).GenerateReport(AID, ShowLogotipo) end; +function TDataModulePedidosCliente.GetRptPDF(const AID: Integer; + const ShowLogotipo: Boolean): Binary; +var + AParam : TIntegerArray; +begin + AParam := TIntegerArray.Create; + try + AParam.Add(AID); + Result := (RORemoteService as IsrvPedidosCliente).GenerarReportPDF(AParam, ShowLogotipo) + finally + FreeANDNIL(AParam) + end; +end; + function TDataModulePedidosCliente.NewItem: IBizPedidoCliente; begin Result := GetItem(ID_NULO) diff --git a/Source/Modulos/Pedidos de cliente/Model/Data/uIDataModulePedidosClienteReport.pas b/Source/Modulos/Pedidos de cliente/Model/Data/uIDataModulePedidosClienteReport.pas index caf4cc20..102267ea 100644 --- a/Source/Modulos/Pedidos de cliente/Model/Data/uIDataModulePedidosClienteReport.pas +++ b/Source/Modulos/Pedidos de cliente/Model/Data/uIDataModulePedidosClienteReport.pas @@ -9,6 +9,7 @@ type IDataModulePedidosClienteReport = interface ['{70CEBB06-376F-4363-B80F-DDA4324E0F85}'] function GetReport(const AID: String; const ShowLogotipo: Boolean = False): Binary; + function GetRptPDF(const AID: Integer; const ShowLogotipo: Boolean = False): Binary; end; implementation diff --git a/Source/Modulos/Pedidos de cliente/PedidosCliente_Group.bdsgroup b/Source/Modulos/Pedidos de cliente/PedidosCliente_Group.bdsgroup index 83491870..56bf935f 100644 --- a/Source/Modulos/Pedidos de cliente/PedidosCliente_Group.bdsgroup +++ b/Source/Modulos/Pedidos de cliente/PedidosCliente_Group.bdsgroup @@ -8,7 +8,9 @@ - + + + ..\..\Base\Base.bdsproj ..\..\Base\ControllerBase\ControllerBase.bdsproj ..\..\Base\GUIBase\GUIBase.bdsproj @@ -23,7 +25,10 @@ Plugin\PedidosCliente_plugin.bdsproj ..\..\Servidor\FactuGES_Server.bdsproj ..\..\Cliente\FactuGES.bdsproj - Base.bpl ControllerBase.bpl GUIBase.bpl Articulos_model.bpl Articulos_data.bpl Articulos_controller.bpl Articulos_view.bpl PedidosCliente_model.bpl PedidosCliente_data.bpl PedidosCliente_controller.bpl PedidosCliente_view.bpl PedidosCliente_plugin.bpl FactuGES_Server.exe FactuGES.exe + ..\Facturas de cliente\Views\FacturasCliente_view.bdsproj + ..\Facturas de cliente\Controller\FacturasCliente_controller.bdsproj + ..\Facturas de cliente\Data\FacturasCliente_data.bdsproj + Base.bpl ControllerBase.bpl GUIBase.bpl Articulos_model.bpl Articulos_data.bpl Articulos_controller.bpl Articulos_view.bpl PedidosCliente_model.bpl PedidosCliente_data.bpl PedidosCliente_controller.bpl PedidosCliente_view.bpl PedidosCliente_plugin.bpl FactuGES_Server.exe FactuGES.exe FacturasCliente_view.bpl FacturasCliente_controller.bpl FacturasCliente_data.bpl diff --git a/Source/Modulos/Pedidos de cliente/Reports/uRptPedidosCliente_Server.dfm b/Source/Modulos/Pedidos de cliente/Reports/uRptPedidosCliente_Server.dfm index d720a0c9..aebc8538 100644 --- a/Source/Modulos/Pedidos de cliente/Reports/uRptPedidosCliente_Server.dfm +++ b/Source/Modulos/Pedidos de cliente/Reports/uRptPedidosCliente_Server.dfm @@ -940,4 +940,18 @@ object RptPedidosCliente: TRptPedidosCliente Left = 344 Top = 16 end + object frxPDFExport1: TfrxPDFExport + ShowDialog = False + UseFileCache = True + ShowProgress = False + PrintOptimized = True + Outline = True + Author = 'FactuGES' + Subject = 'FactuGES' + Background = False + Creator = 'FactuGES' + HTMLTags = True + Left = 360 + Top = 344 + end end diff --git a/Source/Modulos/Pedidos de cliente/Reports/uRptPedidosCliente_Server.pas b/Source/Modulos/Pedidos de cliente/Reports/uRptPedidosCliente_Server.pas index 9c90c782..588d975f 100644 --- a/Source/Modulos/Pedidos de cliente/Reports/uRptPedidosCliente_Server.pas +++ b/Source/Modulos/Pedidos de cliente/Reports/uRptPedidosCliente_Server.pas @@ -7,7 +7,7 @@ uses Dialogs, frxClass, frxDBSet, uDAScriptingProvider, uDADataTable, uDACDSDataTable, DB, uDAClasses, frxChart, frxGradient, frxChBox, frxCross, frxOLE, frxBarcode, frxRich, uDABINAdapter, uROTypes, - uDAInterfaces; + uDAInterfaces, FactuGES_Intf, frxExportPDF; type TRptPedidosCliente = class(TDataModule) @@ -28,14 +28,16 @@ type schReport: TDASchema; DataDictionary: TDADataDictionary; frxReport: TfrxReport; + frxPDFExport1: TfrxPDFExport; procedure DataModuleCreate(Sender: TObject); procedure frxReportGetValue(const VarName: string; var Value: Variant); private FConnection: IDAConnection; - FShowLogotipo: Boolean; - procedure GenerarPedido(const AID : Integer); overload; + FShowLogotipo: Boolean; + procedure _GenerarPedido(const AID : Integer); overload; public function GenerarPedido(const AID : String; const AConLogotipo: Boolean = False): Binary; overload; + function GenerarReportEnPDF(const ListaID : TIntegerArray; const AConLogotipo: Boolean = False): Binary; end; implementation @@ -70,8 +72,6 @@ var begin Result := Binary.Create; - FConnection.BeginTransaction; - try FShowLogotipo := AConLogotipo; ID_Pedidos := TStringList.Create; @@ -79,12 +79,28 @@ begin //Vamos generando todos y cada uno de los albaranes recibidos for i := 0 to ID_Pedidos.Count - 1 do - GenerarPedido(StrToInt(ID_Pedidos.Strings[i])); + _GenerarPedido(StrToInt(ID_Pedidos.Strings[i])); frxReport.PreviewPages.SaveToStream(Result); - finally - FConnection.RollbackTransaction; + end; +end; + +function TRptPedidosCliente.GenerarReportEnPDF(const ListaID: TIntegerArray; + const AConLogotipo: Boolean): Binary; +var + i: Integer; +begin + FShowLogotipo := AConLogotipo; + Result := Binary.Create; + try + //Vamos generando todos y cada uno de los presupuestos recibidos + for i := 0 to ListaID.Count - 1 do + _GenerarPedido(ListaID.Items[i]); + + frxPDFExport1.Stream := Result; + frxReport.Export(frxPDFExport1) + finally end; end; @@ -95,13 +111,14 @@ begin Value := FShowLogotipo; end; -procedure TRptPedidosCliente.GenerarPedido(const AID: Integer); +procedure TRptPedidosCliente._GenerarPedido(const AID: Integer); var AStream: TMemoryStream; dsMaster: IDADataset; dsDetail: IDADataset; begin AStream := TMemoryStream.Create; + FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" try dsMaster := schReport.NewDataset(FConnection, ds_InformeCabecera, ['ID'], [AID]); @@ -119,6 +136,7 @@ begin frxReport.PrepareReport(False); finally + FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" AStream.Free; dsMaster := Nil; dsDetail := Nil; diff --git a/Source/Modulos/Pedidos de cliente/Servidor/srvPedidosCliente_Impl.pas b/Source/Modulos/Pedidos de cliente/Servidor/srvPedidosCliente_Impl.pas index f37992f5..bfbf1d38 100644 --- a/Source/Modulos/Pedidos de cliente/Servidor/srvPedidosCliente_Impl.pas +++ b/Source/Modulos/Pedidos de cliente/Servidor/srvPedidosCliente_Impl.pas @@ -39,6 +39,7 @@ type { IsrvPedidosCliente methods } function GetNextAutoInc(const GeneratorName: String): Integer; function GenerateReport(const ID: String; const ShowLogotipo: Boolean): Binary; + function GenerarReportPDF(const ListaID: TIntegerArray; const ShowLogotipo: Boolean): Binary; end; implementation @@ -81,6 +82,19 @@ begin bpPedidosCliente.BusinessRulesID := BIZ_SERVER_PEDIDOS_CLIENTE; end; +function TsrvPedidosCliente.GenerarReportPDF(const ListaID: TIntegerArray; + const ShowLogotipo: Boolean): Binary; +var + AReportGenerator : TRptPedidosCliente; +begin + AReportGenerator := TRptPedidosCliente.Create(nil); + try + Result := AReportGenerator.GenerarReportEnPDF(ListaID, ShowLogotipo); + finally + FreeAndNIL(AReportGenerator); + end; +end; + function TsrvPedidosCliente.GenerateReport(const ID: String; const ShowLogotipo: Boolean): Binary; var AReportGenerator : TRptPedidosCliente; diff --git a/Source/Modulos/Pedidos de cliente/Views/PedidosCliente_view.bdsproj b/Source/Modulos/Pedidos de cliente/Views/PedidosCliente_view.bdsproj index d24131f9..9ece3628 100644 --- a/Source/Modulos/Pedidos de cliente/Views/PedidosCliente_view.bdsproj +++ b/Source/Modulos/Pedidos de cliente/Views/PedidosCliente_view.bdsproj @@ -174,7 +174,7 @@ Intraweb 8.0 Design Package for Borland Development Studio 2006 -