diff --git a/Source/Informes/FacturaCliente.rdx b/Source/Informes/FacturaCliente.rdx
new file mode 100644
index 00000000..42c3b088
Binary files /dev/null and b/Source/Informes/FacturaCliente.rdx differ
diff --git a/Source/Modulos/Facturas de cliente/Reports/uRptWordFacturaCliente.dfm b/Source/Modulos/Facturas de cliente/Reports/uRptWordFacturaCliente.dfm
new file mode 100644
index 00000000..ecf1851c
--- /dev/null
+++ b/Source/Modulos/Facturas de cliente/Reports/uRptWordFacturaCliente.dfm
@@ -0,0 +1,611 @@
+object RptWordFacturaCliente: TRptWordFacturaCliente
+ OldCreateOrder = False
+ OnCreate = DataModuleCreate
+ Height = 245
+ Width = 341
+ object schReport: TDASchema
+ ConnectionManager = dmServer.ConnectionManager
+ DataDictionary = DataDictionary
+ Datasets = <
+ item
+ Params = <
+ item
+ Name = 'ID'
+ Value = ''
+ ParamType = daptInput
+ end>
+ 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 74f27a53..8c757af0 100644
Binary files a/Source/Servicios/RODLFILE.res and b/Source/Servicios/RODLFILE.res differ
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 @@
TDataModule
+
+
+ TDataModule
+
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