From da8de6474355f3bc8c4bc8f755eba6d1ff141358 Mon Sep 17 00:00:00 2001 From: david Date: Thu, 7 Feb 2008 22:07:23 +0000 Subject: [PATCH] Facturas de cliente: informe en formato Word (sin terminar). git-svn-id: https://192.168.0.254/svn/Proyectos.Tecsitel_FactuGES2/trunk@269 0c75b7a4-871f-7646-8a2f-f78d34cc349f --- Source/Informes/FacturaCliente.rdx | Bin 0 -> 123904 bytes .../Reports/uRptWordFacturaCliente.dfm | 611 ++++++++++++++++++ .../Reports/uRptWordFacturaCliente.pas | 358 ++++++++++ .../Servidor/srvFacturasCliente_Impl.pas | 25 +- Source/Servicios/FactuGES.RODL | 8 + Source/Servicios/FactuGES_Intf.pas | 19 + Source/Servicios/FactuGES_Invk.pas | 29 + Source/Servicios/RODLFILE.res | Bin 24139 -> 24408 bytes Source/Servidor/FactuGES_Server.dpr | 3 +- Source/Servidor/FactuGES_Server.dproj | 10 + Source/Servidor/FactuGES_Server.groupproj | 16 +- 11 files changed, 1063 insertions(+), 16 deletions(-) create mode 100644 Source/Informes/FacturaCliente.rdx create mode 100644 Source/Modulos/Facturas de cliente/Reports/uRptWordFacturaCliente.dfm create mode 100644 Source/Modulos/Facturas de cliente/Reports/uRptWordFacturaCliente.pas diff --git a/Source/Informes/FacturaCliente.rdx b/Source/Informes/FacturaCliente.rdx new file mode 100644 index 0000000000000000000000000000000000000000..42c3b0881ade7247a79f0a2da3e220910ea645d9 GIT binary patch literal 123904 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 + Statements = < + item + Connection = 'IBX' + SQL = + 'select'#10' v_facturas_cliente.id, v_facturas_cliente.id_empresa,'#10 + + ' v_facturas_cliente.referencia, v_facturas_cliente.tipo,'#10' v_' + + 'facturas_cliente.fecha_factura, v_facturas_cliente.base_imponibl' + + 'e,'#10' v_facturas_cliente.situacion, v_facturas_cliente.descuento' + + ','#10' v_facturas_cliente.importe_descuento, v_facturas_cliente.iv' + + 'a,'#10' v_facturas_cliente.importe_iva, v_facturas_cliente.re,'#10' ' + + 'v_facturas_cliente.importe_re, v_facturas_cliente.importe_total,' + + #10' v_facturas_cliente.observaciones, v_facturas_cliente.nif_cif' + + ','#10' v_facturas_cliente.id_cliente, v_facturas_cliente.nombre,'#10' ' + + ' v_facturas_cliente.calle, v_facturas_cliente.provincia,'#10' v_f' + + 'acturas_cliente.poblacion, v_facturas_cliente.codigo_postal,'#10' ' + + 'v_facturas_cliente.recargo_equivalencia, v_facturas_cliente.impo' + + 'rte_neto,'#10' v_facturas_cliente.importe_porte, formas_pago.descr' + + 'ipcion as FORMA_PAGO'#10'from v_facturas_cliente'#10' left outer join ' + + 'formas_pago on (formas_pago.id = v_facturas_cliente.id_forma_pag' + + 'o)'#10'WHERE V_FACTURAS_CLIENTE.ID = :ID'#10 + StatementType = stSQL + ColumnMappings = < + item + DatasetField = 'ID' + TableField = 'ID' + end + item + DatasetField = 'ID_EMPRESA' + TableField = 'ID_EMPRESA' + end + item + DatasetField = 'REFERENCIA' + TableField = 'REFERENCIA' + end + item + DatasetField = 'OBSERVACIONES' + TableField = 'OBSERVACIONES' + end + item + DatasetField = 'ID_CLIENTE' + TableField = 'ID_CLIENTE' + end + item + DatasetField = 'NIF_CIF' + TableField = 'NIF_CIF' + end + item + DatasetField = 'NOMBRE' + TableField = 'NOMBRE' + end + item + DatasetField = 'IMPORTE_TOTAL' + TableField = 'IMPORTE_TOTAL' + end + item + DatasetField = 'CALLE' + TableField = 'CALLE' + end + item + DatasetField = 'POBLACION' + TableField = 'POBLACION' + end + item + DatasetField = 'PROVINCIA' + TableField = 'PROVINCIA' + end + item + DatasetField = 'CODIGO_POSTAL' + TableField = 'CODIGO_POSTAL' + end + item + DatasetField = 'TIPO' + TableField = 'TIPO' + end + item + DatasetField = 'FECHA_FACTURA' + TableField = 'FECHA_FACTURA' + end + item + DatasetField = 'BASE_IMPONIBLE' + TableField = 'BASE_IMPONIBLE' + end + item + DatasetField = 'SITUACION' + TableField = 'SITUACION' + end + item + DatasetField = 'DESCUENTO' + TableField = 'DESCUENTO' + end + item + DatasetField = 'IMPORTE_DESCUENTO' + TableField = 'IMPORTE_DESCUENTO' + end + item + DatasetField = 'IVA' + TableField = 'IVA' + end + item + DatasetField = 'IMPORTE_IVA' + TableField = 'IMPORTE_IVA' + end + item + DatasetField = 'RE' + TableField = 'RE' + end + item + DatasetField = 'IMPORTE_RE' + TableField = 'IMPORTE_RE' + end + item + DatasetField = 'RECARGO_EQUIVALENCIA' + TableField = 'RECARGO_EQUIVALENCIA' + end + item + DatasetField = 'IMPORTE_NETO' + TableField = 'IMPORTE_NETO' + end + item + DatasetField = 'IMPORTE_PORTE' + TableField = 'IMPORTE_PORTE' + end + item + DatasetField = 'FORMA_PAGO' + TableField = 'FORMA_PAGO' + end> + end> + Name = 'Informe_Cabecera' + Fields = < + item + Name = 'ID' + DataType = datInteger + Required = True + InPrimaryKey = True + end + item + Name = 'ID_EMPRESA' + DataType = datInteger + end + item + Name = 'REFERENCIA' + DataType = datString + Size = 255 + end + item + Name = 'TIPO' + DataType = datString + Size = 1 + end + item + Name = 'FECHA_FACTURA' + DataType = datDateTime + end + item + Name = 'BASE_IMPONIBLE' + DataType = datCurrency + end + item + Name = 'SITUACION' + DataType = datString + Size = 19 + end + item + Name = 'DESCUENTO' + DataType = datFloat + end + item + Name = 'IMPORTE_DESCUENTO' + DataType = datCurrency + end + item + Name = 'IVA' + DataType = datFloat + end + item + Name = 'IMPORTE_IVA' + DataType = datCurrency + end + item + Name = 'RE' + DataType = datFloat + end + item + Name = 'IMPORTE_RE' + DataType = datCurrency + end + item + Name = 'IMPORTE_TOTAL' + DataType = datCurrency + end + item + Name = 'OBSERVACIONES' + DataType = datMemo + end + item + Name = 'NIF_CIF' + DataType = datString + Size = 15 + end + item + Name = 'ID_CLIENTE' + DataType = datInteger + end + item + Name = 'NOMBRE' + DataType = datString + Size = 255 + end + item + Name = 'CALLE' + DataType = datString + Size = 255 + end + item + Name = 'PROVINCIA' + DataType = datString + Size = 255 + end + item + Name = 'POBLACION' + DataType = datString + Size = 255 + end + item + Name = 'CODIGO_POSTAL' + DataType = datString + Size = 10 + end + item + Name = 'RECARGO_EQUIVALENCIA' + DataType = datSmallInt + end + item + Name = 'IMPORTE_NETO' + DataType = datCurrency + end + item + Name = 'IMPORTE_PORTE' + DataType = datCurrency + end + item + Name = 'FORMA_PAGO' + DataType = datString + Size = 255 + end> + ReadOnly = True + end + item + Params = < + item + Name = 'ID_FACTURA' + Value = '' + ParamType = daptInput + end> + Statements = < + item + Connection = 'IBX' + ConnectionType = 'Interbase' + Default = True + SQL = + 'SELECT'#10' ID, ID_FACTURA, POSICION, TIPO_DETALLE, CONCEPTO, CAN' + + 'TIDAD,'#10' IMPORTE_UNIDAD, DESCUENTO, IMPORTE_TOTAL, VISIBLE'#10'FRO' + + 'M FACTURAS_CLIENTE_DETALLES'#10'WHERE ID_FACTURA = :ID_FACTURA AND V' + + 'ISIBLE = 1 AND {Where}'#10'ORDER BY ID_FACTURA, POSICION;'#10 + StatementType = stSQL + ColumnMappings = < + item + DatasetField = 'ID' + TableField = 'ID' + end + item + DatasetField = 'POSICION' + TableField = 'POSICION' + end + item + DatasetField = 'TIPO_DETALLE' + TableField = 'TIPO_DETALLE' + end + item + DatasetField = 'CONCEPTO' + TableField = 'CONCEPTO' + end + item + DatasetField = 'IMPORTE_TOTAL' + TableField = 'IMPORTE_TOTAL' + end + item + DatasetField = 'CANTIDAD' + TableField = 'CANTIDAD' + end + item + DatasetField = 'IMPORTE_UNIDAD' + TableField = 'IMPORTE_UNIDAD' + end + item + DatasetField = 'ID_FACTURA' + TableField = 'ID_FACTURA' + end + item + DatasetField = 'DESCUENTO' + TableField = 'DESCUENTO' + end + item + DatasetField = 'VISIBLE' + TableField = 'VISIBLE' + end> + end> + Name = 'Informe_Detalles' + Fields = < + item + Name = 'ID' + DataType = datInteger + InPrimaryKey = True + end + item + Name = 'ID_FACTURA' + DataType = datInteger + end + item + Name = 'POSICION' + DataType = datInteger + end + item + Name = 'TIPO_DETALLE' + DataType = datString + Size = 10 + end + item + Name = 'CONCEPTO' + DataType = datString + Size = 2000 + end + item + Name = 'CANTIDAD' + DataType = datInteger + end + item + Name = 'IMPORTE_UNIDAD' + DataType = datCurrency + end + item + Name = 'DESCUENTO' + DataType = datFloat + end + item + Name = 'IMPORTE_TOTAL' + DataType = datCurrency + end + item + Name = 'VISIBLE' + DataType = datSmallInt + end> + ReadOnly = True + end> + JoinDataTables = <> + UnionDataTables = <> + Commands = <> + RelationShips = <> + UpdateRules = <> + Version = 0 + Left = 48 + Top = 16 + end + object DataDictionary: TDADataDictionary + Fields = <> + Left = 46 + Top = 142 + end + object DABin2DataStreamer: TDABin2DataStreamer + Left = 48 + Top = 80 + end + object tbl_Cabecera: TDAMemDataTable + RemoteUpdatesOptions = [] + Fields = < + item + Name = 'ID' + DataType = datInteger + Required = True + InPrimaryKey = True + end + item + Name = 'ID_EMPRESA' + DataType = datInteger + end + item + Name = 'REFERENCIA' + DataType = datString + Size = 255 + end + item + Name = 'TIPO' + DataType = datString + Size = 1 + end + item + Name = 'FECHA_FACTURA' + DataType = datDateTime + end + item + Name = 'BASE_IMPONIBLE' + DataType = datCurrency + end + item + Name = 'SITUACION' + DataType = datString + Size = 19 + end + item + Name = 'DESCUENTO' + DataType = datFloat + end + item + Name = 'IMPORTE_DESCUENTO' + DataType = datCurrency + end + item + Name = 'IVA' + DataType = datFloat + end + item + Name = 'IMPORTE_IVA' + DataType = datCurrency + end + item + Name = 'RE' + DataType = datFloat + end + item + Name = 'IMPORTE_RE' + DataType = datCurrency + end + item + Name = 'IMPORTE_TOTAL' + DataType = datCurrency + end + item + Name = 'OBSERVACIONES' + DataType = datMemo + end + item + Name = 'NIF_CIF' + DataType = datString + Size = 15 + end + item + Name = 'ID_CLIENTE' + DataType = datInteger + end + item + Name = 'NOMBRE' + DataType = datString + Size = 255 + end + item + Name = 'CALLE' + DataType = datString + Size = 255 + end + item + Name = 'PROVINCIA' + DataType = datString + Size = 255 + end + item + Name = 'POBLACION' + DataType = datString + Size = 255 + end + item + Name = 'CODIGO_POSTAL' + DataType = datString + Size = 10 + end + item + Name = 'RECARGO_EQUIVALENCIA' + DataType = datSmallInt + end + item + Name = 'IMPORTE_NETO' + DataType = datCurrency + end + item + Name = 'IMPORTE_PORTE' + DataType = datCurrency + end + item + Name = 'FORMA_PAGO' + DataType = datString + Size = 255 + end> + Params = < + item + Name = 'ID' + Value = '' + ParamType = daptInput + end> + LogChanges = False + StreamingOptions = [soDisableEventsWhileStreaming] + RemoteFetchEnabled = False + LocalSchema = schReport + LocalDataStreamer = DABin2DataStreamer + DetailOptions = [dtCascadeOpenClose, dtCascadeApplyUpdates, dtAutoFetch, dtCascadeDelete, dtCascadeUpdate, dtDisableLogOfCascadeDeletes, dtDisableLogOfCascadeUpdates, dtIncludeInAllInOneFetch] + MasterOptions = [moCascadeOpenClose, moCascadeApplyUpdates, moCascadeDelete, moCascadeUpdate, moDisableLogOfCascadeDeletes, moDisableLogOfCascadeUpdates] + LogicalName = 'Informe_Cabecera' + IndexDefs = <> + Left = 168 + Top = 16 + end + object tbl_Detalles: TDAMemDataTable + RemoteUpdatesOptions = [] + Fields = < + item + Name = 'ID' + DataType = datInteger + InPrimaryKey = True + end + item + Name = 'ID_FACTURA' + DataType = datInteger + end + item + Name = 'POSICION' + DataType = datInteger + end + item + Name = 'TIPO_DETALLE' + DataType = datString + Size = 10 + end + item + Name = 'CONCEPTO' + DataType = datString + Size = 2000 + end + item + Name = 'CANTIDAD' + DataType = datInteger + end + item + Name = 'IMPORTE_UNIDAD' + DataType = datCurrency + end + item + Name = 'DESCUENTO' + DataType = datFloat + end + item + Name = 'IMPORTE_TOTAL' + DataType = datCurrency + end + item + Name = 'VISIBLE' + DataType = datSmallInt + end> + Params = < + item + Name = 'ID_FACTURA' + Value = '' + ParamType = daptInput + end> + MasterParamsMappings.Strings = ( + 'ID_PRESUPUESTO=ID_PRESUPUESTO') + LogChanges = False + StreamingOptions = [soDisableEventsWhileStreaming] + RemoteFetchEnabled = False + LocalSchema = schReport + LocalDataStreamer = DABin2DataStreamer + DetailOptions = [dtCascadeOpenClose, dtCascadeApplyUpdates, dtAutoFetch, dtCascadeDelete, dtCascadeUpdate, dtDisableLogOfCascadeDeletes, dtDisableLogOfCascadeUpdates, dtIncludeInAllInOneFetch] + MasterOptions = [moCascadeOpenClose, moCascadeApplyUpdates, moCascadeDelete, moCascadeUpdate, moDisableLogOfCascadeDeletes, moDisableLogOfCascadeUpdates] + LogicalName = 'Informe_Detalles' + IndexDefs = <> + Left = 264 + Top = 16 + end + object tbl_Empresa: TDAMemDataTable + RemoteUpdatesOptions = [] + Fields = <> + Params = < + item + Name = 'ID' + Value = '31' + ParamType = daptInput + end> + LogChanges = False + StreamingOptions = [soDisableEventsWhileStreaming] + RemoteFetchEnabled = False + DetailOptions = [dtCascadeOpenClose, dtCascadeApplyUpdates, dtAutoFetch, dtCascadeDelete, dtCascadeUpdate, dtDisableLogOfCascadeDeletes, dtDisableLogOfCascadeUpdates, dtIncludeInAllInOneFetch] + MasterOptions = [moCascadeOpenClose, moCascadeApplyUpdates, moCascadeDelete, moCascadeUpdate, moDisableLogOfCascadeDeletes, moDisableLogOfCascadeUpdates] + LogicalName = 'Empresa' + IndexDefs = <> + Left = 168 + Top = 80 + end +end diff --git a/Source/Modulos/Facturas de cliente/Reports/uRptWordFacturaCliente.pas b/Source/Modulos/Facturas de cliente/Reports/uRptWordFacturaCliente.pas new file mode 100644 index 00000000..1d4865c7 --- /dev/null +++ b/Source/Modulos/Facturas de cliente/Reports/uRptWordFacturaCliente.pas @@ -0,0 +1,358 @@ +unit uRptWordFacturaCliente; + +interface + +uses + SysUtils, Classes, AHWord97, IB, IBCustomDataSet, IBDatabase, + Word2000, + uDAInterfaces, uDADataStreamer, uDABin2DataStreamer, uDAClasses, + uDAScriptingProvider, uDADataTable, uDAMemDataTable; + +type + TRptWordFacturaCliente = class(TDataModule) + DABin2DataStreamer: TDABin2DataStreamer; + tbl_Cabecera: TDAMemDataTable; + tbl_Detalles: TDAMemDataTable; + tbl_Empresa: TDAMemDataTable; + schReport: TDASchema; + DataDictionary: TDADataDictionary; + procedure DataModuleCreate(Sender: TObject); + private + FConnection: IDAConnection; + FPlantilla : string; + FWordApp : TWordApp; + FDocumento : TWordDoc; + FNumCapitulos : Integer; + FCodigoFactura : string; + FNombreFichero : String; + function DarNumCapitulos : Integer; + procedure InsertarConceptos(Tabla : Table); + function Generar : Boolean; + function RellenarCabecera : boolean; virtual; + function RellenarInforme : boolean; virtual; + procedure _GenerarFactura(const AID: String); + public + function Exportar(Codigo, Fichero : String): Boolean; + constructor Create (AOwner : TComponent); override; + destructor Destroy; override; + end; + +implementation + +{ TRptWordFacturaCliente } + +{$R *.dfm} + +uses + Windows, Variants, Dialogs, uDataModuleServer, uStringsUtils, uSistemaFunc, + srvEmpresas_Impl, uROTypes, uROClasses; + +const + rptInforme = 'AlbaranCliente.rdx'; + +constructor TRptWordFacturaCliente.Create(AOwner: TComponent); +begin + inherited; + FDocumento := NIL; + FPlantilla := DarRutaInformes + rptInforme; +end; + +function TRptWordFacturaCliente.DarNumCapitulos: Integer; +var + AuxNumCapitulos : integer; +begin + AuxNumCapitulos := 0; + tbl_Cabecera.First; + while not tbl_Cabecera.Eof do + begin + if tbl_Cabecera.FieldByName('TIPO_DETALLE').AsString = 'Titulo' then + AuxNumCapitulos := AuxNumCapitulos + 1; + tbl_Cabecera.Next; + end; + tbl_Cabecera.First; + Result := AuxNumCapitulos; +end; + +destructor TRptWordFacturaCliente.Destroy; +begin + if FDocumento <> NIL then + FDocumento.Free; + FDocumento := NIL; + inherited; +end; + +function TRptWordFacturaCliente.Exportar(Codigo, Fichero: String): Boolean; +begin + if EsCadenaVacia(Fichero) then + begin + Result := False; + raise Exception.Create('Falta indicar el fichero donde se exportará el listado.'); + end; + + FNombreFichero := Fichero; + FCodigoFactura := Codigo; + _GenerarFactura(Codigo); + Result := True; +end; + +procedure TRptWordFacturaCliente.DataModuleCreate(Sender: TObject); +begin + schReport.ConnectionManager := dmServer.ConnectionManager; + FConnection := dmServer.DarNuevaConexion; +end; + +function TRptWordFacturaCliente.Generar : Boolean; +var + Aux : OleVariant; +begin + FWordApp := TWordApp.Create (False, False); + with FWordApp do + begin + Visible := False; + ScreenUpdating := False; + end; + + FDocumento := TWordDoc.CreateNewDoc(FWordApp, FPlantilla); + FWordApp.ScreenUpdating := False; + try + if not RellenarCabecera then + RaiseError('Se producido un error al generar la cabecera en MS Word.'); + + if not RellenarInforme then + RaiseError('Se producido un error al generar el informe en MS Word.'); + + FDocumento.SaveAs(FNombreFichero); + FWordApp.CloseApp(wdDoNotSaveChanges); + Result := True; + finally + FDocumento := NIL; + FWordApp := NIL; + end; +end; + +procedure TRptWordFacturaCliente.InsertarConceptos(Tabla : Table); +var + numRows, numCols, mergeSplit, shiftCells : OleVariant; + iContador : Integer; + TotalConceptos : Double; +begin + numRows := 2; + numCols := 1; + mergeSplit := False; + shiftCells := False; + iContador := 2; // Empezar en la 2ª fila de celdas. La primera es la + // cabecera de la tabla. + + with Tabla, tbl_Detalles do + begin + while not EOF do + begin + if FieldByName('TIPO_DETALLE').AsString <> 'Concepto' then + Break; + // Partir la celda actual en 2 filas de 1 columna. + Rows.Item(iContador).Cells.Split (numRows, numCols, mergesplit); + Cell(iContador, 1).Range.Text := FieldByName('CONCEPTO').AsString; + Cell(iContador, 2).Range.Text := FieldByName('CANTIDAD').AsString; + Cell(iContador, 3).Range.Text := FormatFloat(DISPLAY_EUROS2, FieldByName('IMPORTE_UNIDAD').AsFloat); + Cell(iContador, 4).Range.Text := FormatFloat(DISPLAY_EUROS2, FieldByName('IMPORTE_TOTAL').AsFloat); + TotalConceptos := TotalConceptos + FieldByName('IMPORTE_TOTAL').AsFloat; + Next; + Inc (iContador); + end; + // Borrar la fila vacía que sobra + Rows.Item(iContador).Cells.Delete(shiftCells); + Cell(iContador, 1).Range.Text := 'Total: ' + FormatFloat(DISPLAY_EUROS2, TotalConceptos); + AutoFitBehavior(wdAutoFitWindow); + end; +end; + +function TRptWordFacturaCliente.RellenarCabecera: boolean; +var + NombreFichero, + Texto, + FicheroTemporal : String; + LinkToFile, SaveWithDocument, _Range : OleVariant; + Imagen : InlineShape; + _ShiftCells : OleVariant; + +begin + + //PARA DIBUJAR EL LOGOTIPO MULTIEMPRESA + {--------------------------- PENDIENTE + if (EmpresaActiva.Logotipo <> Nil) then + begin + //Activamos cabecera + FWordApp.Application.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader; + LinkToFile := False; + SaveWithDocument := True; + _Range := EmptyParam; + FicheroTemporal := DarFicheroTemporal; + EmpresaActiva.Logotipo.SaveToFile (FicheroTemporal); + Imagen := FWordApp.Application.ActiveWindow.ActivePane.Selection.InlineShapes.AddPicture(ficherotemporal, LinkToFile, SaveWithDocument, _Range); + + //Formateamos imagen + if ((Imagen.Get_Width > ANCHO_LOGO_INF)) then + begin + Imagen.Set_Height(((ANCHO_LOGO_INF * Imagen.Get_Height) /Imagen.Get_Width)); + Imagen.Set_Width(ANCHO_LOGO_INF); + end; + end; + ---------------------------- } + + with FDocumento, tbl_Cabecera do + begin + ReplaceBookmark('CodigoFacturaCab', FCodigoFactura); + ReplaceBookmark('FechaFacturaCab', FieldByName('FECHA_FACTURA').AsString); + ReplaceBookmark('VencimientoCab', ''{FieldByName('FECHAVENCIMIENTO').AsString}); + ReplaceBookmark('FormaPagoCab', FieldByName('FORMA_PAGO').AsString); + ReplaceBookmark('BancoCab', ''{FieldByName('BANCO').AsString}); + + ReplaceBookmark('NombreClienteCab', FieldByName('NOMBRE').AsString); + ReplaceBookmark('CIFClienteCab', FieldByName('NIF_CIF').AsString); + + ReplaceBookmark('DireccionClienteCab', FieldByName('CALLE').AsString); + ReplaceBookmark('PoblacionClienteCab', + FieldByName('CODIGO_POSTAL').AsString + ' ' + + FieldByName('POBLACION').AsString + ' ' + FieldByName('PROVINCIA').AsString); + + ReplaceBookmark('BaseImponible', FormatFloat(DISPLAY_EUROS2, FieldByName('BASE_IMPONIBLE').AsFloat)); + // ???????? ReplaceBookmark('BaseImponible2', FormatFloat(DISPLAY_EUROS2, FieldByName('BASE_IMPONIBLE2').AsFloat); + + if (FieldByName('DESCUENTO').AsInteger = 0) then + begin + ReplaceBookmark('BaseImponibleTexto', 'Base imponible'); + FWordApp.GotoBookmark('CeldasDescuento'); + _ShiftCells := wdDeleteCellsShiftLeft; + FWordApp.Application.Selection.Cells.Delete(_ShiftCells); + end + else begin + ReplaceBookmark('Descuento', FieldByName('DESCUENTO').AsString); + ReplaceBookmark('ImporteDto', FormatFloat(DISPLAY_EUROS2, FieldByName('IMPORTE_DESCUENTO').AsFloat)); + end; + if EsCadenaVacia(FieldByName('IVA').AsString) then + ReplaceBookmark('IVA', '0') + else + ReplaceBookmark('IVA', FieldByName('IVA').AsString); + ReplaceBookmark('ImporteIVA', FormatFloat(DISPLAY_EUROS2, FieldByName('IMPORTE_IVA').AsFloat)); + ReplaceBookmark('ImporteTotal', FormatFloat(DISPLAY_EUROS2, FieldByName('IMPORTE_TOTAL').AsFloat)); + + Texto := FieldByName('OBSERVACIONES').AsString; + if not EsCadenaVacia(Texto) then + begin + NombreFichero := DarFicheroTemporal; + EscribirEnFichero(NombreFichero, Texto); + FWordApp.InsertFile(NombreFichero, 'Descripcion'); + SysUtils.DeleteFile(NombreFichero); + end; + + ReplaceBookmark('NombreEmpresa', tbl_Empresa.FieldByName('NOMBRE').AsString); + ReplaceBookmark('CifEmpresa', tbl_Empresa.FieldByName('NIF_CIF').AsString); + ReplaceBookmark('DireccionEmpresa', + Format('%s. %s %s', [tbl_Empresa.FieldByName('CALLE').AsString, + tbl_Empresa.FieldByName('CODIGO_POSTAL').AsString, tbl_Empresa.FieldByName('POBLACION').AsString])); + ReplaceBookmark('TelefonoEmpresa', tbl_Empresa.FieldByName('TELEFONO_1').AsString); + ReplaceBookmark('FaxEmpresa', tbl_Empresa.FieldByName('FAX').AsString); + ReplaceBookmark('CorreoEmpresa', tbl_Empresa.FieldByName('EMAIL_1').AsString); + + ReplaceBookmark('DatosRegistroMercantil', tbl_Empresa.FieldByName('REGISTRO_MERCANTIL').AsString); + Close; + end; + Result := True; +end; + +function TRptWordFacturaCliente.RellenarInforme : boolean; +var + numRows, numCols, mergesplit : OleVariant; + iRowCount : Integer; + TipoConAnterior : String; + Seleccion : TWordRange; + TotalCapitulo : Double; + EsCapitulo : Boolean; +begin + Result := False; + iRowCount := 2; + numrows := 2; + numcols := 1; + mergeSplit := False; + TipoConAnterior := ''; + TotalCapitulo := 0; + EsCapitulo := False; + + with FDocumento.Document.Tables.Item(1), tbl_detalles do + begin + First; + while not tbl_detalles.EOF do + begin + if (TipoConAnterior = 'Concepto') and (FieldByName('TIPO_DETALLE').AsString = 'Titulo') then + begin + Rows.Item (iRowCount).Cells.Split (numRows, numCols, mergesplit); + if EsCapitulo then + begin + Rows.Item (iRowCount).Cells.Split (numRows, numCols, mergesplit); + Cell(iRowCount, 2).Range.Text := 'TOTAL DEL CAPÍTULO'; + Cell(iRowCount, 5).Range.Text := FormatFloat(DISPLAY_EUROS2, TotalCapitulo); + TotalCapitulo := 0; + Inc (iRowCount); + end; + Inc (iRowCount); + end; + Rows.Item (iRowCount).Cells.Split (numRows, numCols, mergesplit); + if FieldByName('TIPO_DETALLE').AsString = 'Titulo' then + begin + Cell(iRowCount, 2).Range.Text := FieldByName('CONCEPTO').AsString; + Rows.Item(iRowCount).Select; + Seleccion := FDocumento.AddRangeFromSelection; + Seleccion.Bold := True; + TotalCapitulo := 0; + EsCapitulo := True; + end + else begin + Cell(iRowCount, 1).Range.Text := FieldByName('REFERENCIA').AsString; + Cell(iRowCount, 2).Range.Text := FieldByName('CONCEPTO').AsString; + Cell(iRowCount, 3).Range.Text := FieldByName('CANTIDAD').AsString; { + ' ' + + FieldByName('UNIDADESMEDIDA').AsString;} + Cell(iRowCount, 4).Range.Text := FormatFloat(DISPLAY_EUROS2, FieldByName('IMPORTE_UNIDAD').AsFloat); + Cell(iRowCount, 5).Range.Text := FormatFloat(DISPLAY_EUROS2, FieldByName('IMPORTE_TOTAL').AsFloat); + TotalCapitulo := TotalCapitulo + FieldByName('IMPORTE_TOTAL').AsFloat; + end; + TipoConAnterior := FieldByName('TIPO_DETALLE').AsString; + Next; + Inc (iRowCount); + end; + if EsCapitulo then + begin + Rows.Item (iRowCount).Cells.Split (numRows, numCols, mergesplit); + Cell(iRowCount, 2).Range.Text := 'TOTAL DEL CAPÍTULO'; + Cell(iRowCount, 5).Range.Text := FormatFloat(DISPLAY_EUROS2, TotalCapitulo); + TotalCapitulo := 0; + end; + Close; + end; + Result := True; +end; + +procedure TRptWordFacturaCliente._GenerarFactura(const AID: String); +var + ACopiaPlantilla : String; +begin + tbl_Cabecera.ParamByName('ID').AsString := AID; + tbl_Detalles.ParamByName('ID_FACTURA').AsString := AID; + + tbl_Cabecera.Active := True; + tbl_Detalles.Active := True; + + FCodigoFactura := AID; + + ACopiaPlantilla := DarFicheroTemporal; + CopiarFichero(FPlantilla, ACopiaPlantilla); + FPlantilla := ACopiaPlantilla; + try + if RecuperarEmpresa(tbl_Cabecera.FieldByName('ID_EMPRESA').AsInteger, tbl_Empresa) then + Generar; + finally + SysUtils.DeleteFile(ACopiaPlantilla); + end; +end; + + +end. diff --git a/Source/Modulos/Facturas de cliente/Servidor/srvFacturasCliente_Impl.pas b/Source/Modulos/Facturas de cliente/Servidor/srvFacturasCliente_Impl.pas index 1a14d34d..ff582306 100644 --- a/Source/Modulos/Facturas de cliente/Servidor/srvFacturasCliente_Impl.pas +++ b/Source/Modulos/Facturas de cliente/Servidor/srvFacturasCliente_Impl.pas @@ -36,17 +36,18 @@ type protected { IsrvFacturasCliente methods } function GenerateReport(const FacturaID: String): Binary; + function GenerateReportEnWord(const ID: Integer): Binary; end; implementation {$R *.dfm} uses - {Generated:} FactuGES_Invk, Dialogs, + {Generated:} FactuGES_Invk, Dialogs, uSistemaFunc, uDataModuleServer, uDatabaseUtils, uUsersManager, schFacturasClienteClient_Intf, uRestriccionesUsuarioUtils, // uRptFacturasCliente_Server, - uBizFacturasClienteServer; + uBizFacturasClienteServer, uRptWordFacturaCliente; procedure Create_srvFacturasCliente(out anInstance : IUnknown); begin @@ -95,6 +96,26 @@ begin } end; +function TsrvFacturasCliente.GenerateReportEnWord(const ID: Integer): Binary; +var + AReportGenerator : TRptWordFacturaCliente; + AFicheroTMP : TFileName; +begin + Result := NIL; + AFicheroTMP := DarFicheroTemporal; + AReportGenerator := TRptWordFacturaCliente.Create(nil); + try + if AReportGenerator.Exportar(IntToStr(ID), AFicheroTMP) then + begin + Result := Binary.Create; + Result.LoadFromFile(AFicheroTMP); + SysUtils.DeleteFile(AFicheroTMP) + end; + finally + FreeAndNIL(AReportGenerator); + end; +end; + initialization TROClassFactory.Create('srvFacturasCliente', Create_srvFacturasCliente, TsrvFacturasCliente_Invoker); diff --git a/Source/Servicios/FactuGES.RODL b/Source/Servicios/FactuGES.RODL index d6d379d8..dc49ae00 100644 --- a/Source/Servicios/FactuGES.RODL +++ b/Source/Servicios/FactuGES.RODL @@ -242,6 +242,14 @@ + + + + + + + + diff --git a/Source/Servicios/FactuGES_Intf.pas b/Source/Servicios/FactuGES_Intf.pas index aa06f252..5adef2ee 100644 --- a/Source/Servicios/FactuGES_Intf.pas +++ b/Source/Servicios/FactuGES_Intf.pas @@ -453,6 +453,7 @@ type IsrvFacturasCliente = interface(IDataAbstractService) ['{56B4FFF0-AB1B-46B2-BA16-ABD5360F6311}'] function GenerateReport(const FacturaID: String): Binary; + function GenerateReportEnWord(const ID: Integer): Binary; end; { CosrvFacturasCliente } @@ -466,6 +467,7 @@ type function __GetInterfaceName:string; override; function GenerateReport(const FacturaID: String): Binary; + function GenerateReportEnWord(const ID: Integer): Binary; end; { IsrvFacturasProveedor } @@ -1317,6 +1319,23 @@ begin end end; +function TsrvFacturasCliente_Proxy.GenerateReportEnWord(const ID: Integer): Binary; +begin + try + result := nil; + __Message.InitializeRequestMessage(__TransportChannel, 'FactuGES', __InterfaceName, 'GenerateReportEnWord'); + __Message.Write('ID', TypeInfo(Integer), ID, []); + __Message.Finalize; + + __TransportChannel.Dispatch(__Message); + + __Message.Read('Result', TypeInfo(Binary), result, []); + finally + __Message.UnsetAttributes(__TransportChannel); + __Message.FreeStream; + end +end; + { CosrvFacturasProveedor } class function CosrvFacturasProveedor.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IsrvFacturasProveedor; diff --git a/Source/Servicios/FactuGES_Invk.pas b/Source/Servicios/FactuGES_Invk.pas index e403e0ae..56b4951c 100644 --- a/Source/Servicios/FactuGES_Invk.pas +++ b/Source/Servicios/FactuGES_Invk.pas @@ -133,6 +133,7 @@ type protected published procedure Invoke_GenerateReport(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions); + procedure Invoke_GenerateReportEnWord(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions); end; TsrvFacturasProveedor_Invoker = class(TDataAbstractService_Invoker) @@ -522,6 +523,34 @@ begin end; end; +procedure TsrvFacturasCliente_Invoker.Invoke_GenerateReportEnWord(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions); +{ function GenerateReportEnWord(const ID: Integer): Binary; } +var + ID: Integer; + lResult: Binary; + __lObjectDisposer: TROObjectDisposer; +begin + lResult := nil; + try + __Message.Read('ID', TypeInfo(Integer), ID, []); + + lResult := (__Instance as IsrvFacturasCliente).GenerateReportEnWord(ID); + + __Message.InitializeResponseMessage(__Transport, 'FactuGES', 'srvFacturasCliente', 'GenerateReportEnWordResponse'); + __Message.Write('Result', TypeInfo(Binary), lResult, []); + __Message.Finalize; + __Message.UnsetAttributes(__Transport); + + finally + __lObjectDisposer := TROObjectDisposer.Create(__Instance); + try + __lObjectDisposer.Add(lResult); + finally + __lObjectDisposer.Free(); + end; + end; +end; + { TsrvFacturasProveedor_Invoker } procedure TsrvFacturasProveedor_Invoker.Invoke_GenerateReport(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions); diff --git a/Source/Servicios/RODLFILE.res b/Source/Servicios/RODLFILE.res index 74f27a538093a75ccc39a914ed2ee321494e3e4e..8c757af03e081b7e5a5e210a15dcb4ea07daf238 100644 GIT binary patch delta 73 zcmX@Thw;Wf#t8~c9Pt~KjIAg4+v}(pm^d1lI=Y(cS~@zL>6)0ExB*!vj=BaWE*3_X cMwX_Qu4a=r3Ykw{VCFLUf=T!0dDd%{056ml#Q*>R delta 24 gcmcbykMZ;##t8~czhgHl8Cy>d@bcWe+Ged10Eg=eN&o-= diff --git a/Source/Servidor/FactuGES_Server.dpr b/Source/Servidor/FactuGES_Server.dpr index 9de6c583..044397ec 100644 --- a/Source/Servidor/FactuGES_Server.dpr +++ b/Source/Servidor/FactuGES_Server.dpr @@ -112,7 +112,8 @@ uses schReferenciasServer_Intf in '..\Modulos\Referencias\Model\schReferenciasServer_Intf.pas', schReferenciasClient_Intf in '..\Modulos\Referencias\Model\schReferenciasClient_Intf.pas', uRptFichasEmpleado_Server in '..\Modulos\Contactos\Reports\uRptFichasEmpleado_Server.pas' {RptFichasEmpleado: TDataModule}, - uRptEtiquetasContacto_Server in '..\Modulos\Contactos\Reports\uRptEtiquetasContacto_Server.pas' {RptEtiquetasContacto: TDataModule}; + uRptEtiquetasContacto_Server in '..\Modulos\Contactos\Reports\uRptEtiquetasContacto_Server.pas' {RptEtiquetasContacto: TDataModule}, + uRptWordFacturaCliente in '..\Modulos\Facturas de cliente\Reports\uRptWordFacturaCliente.pas' {RptWordFacturaCliente: TDataModule}; {$R *.res} {$R ..\Servicios\RODLFile.res} diff --git a/Source/Servidor/FactuGES_Server.dproj b/Source/Servidor/FactuGES_Server.dproj index b46792b0..cf71a968 100644 --- a/Source/Servidor/FactuGES_Server.dproj +++ b/Source/Servidor/FactuGES_Server.dproj @@ -36,6 +36,12 @@ FalseTrueFalseTrueFalse1000FalseFalseFalseFalseFalse308212521.0.0.0 + + + + + + ExpressPrinting System by Developer Express Inc. Microsoft Office 2000 Sample Automation Server Wrapper Components Microsoft Office XP Sample Automation Server Wrapper Components @@ -114,6 +120,10 @@
RptFacturasCliente
TDataModule + +
RptWordFacturaCliente
+ TDataModule +
srvFacturasCliente
TDataAbstractService diff --git a/Source/Servidor/FactuGES_Server.groupproj b/Source/Servidor/FactuGES_Server.groupproj index 25d9bbbc..d86d61e8 100644 --- a/Source/Servidor/FactuGES_Server.groupproj +++ b/Source/Servidor/FactuGES_Server.groupproj @@ -4,7 +4,6 @@ - @@ -22,23 +21,14 @@ - - - - - - - - - - + - + - + \ No newline at end of file