unit uRptWordCertificadoTrabajo_Server;

interface

uses
  SysUtils, Classes, AHWord97, IB, IBCustomDataSet, IBDatabase,
  Word2000,
  uDAInterfaces, uDADataStreamer, uDABin2DataStreamer, uDAClasses,
  uDAScriptingProvider, uDADataTable, uDAMemDataTable;

type
  TCapitulo = record
    Tipo : string;
    Nombre : string;
    Total : double;
  end;

  TRptWordCertificadoTrabajo = class(TDataModule)
    DABin2DataStreamer: TDABin2DataStreamer;
    tbl_Cabecera: TDAMemDataTable;
    tbl_Capitulos: TDAMemDataTable;
    tbl_Empresa: TDAMemDataTable;
    schReport: TDASchema;
    DataDictionary: TDADataDictionary;
    procedure DataModuleCreate(Sender: TObject);
  private
    FConnection: IDAConnection;
    FImportes : Boolean;
//    FDesBonificacion : Variant;
//    FImpBonificacion : Double;
    FPlantilla : string;
    FWordApp : TWordApp;
    FDocumento : TWordDoc;
    FNumCapitulos : Integer;
    FNumCapOpc : Integer;
    FContadorCap : Integer;
    FCodigoPresupuesto : Integer;
    FNombreFichero : String;
    ListaCapitulos : array[1..1000] of TCapitulo;
    function Generar : Boolean;
    function RellenarInforme : boolean; virtual;
    procedure _GenerarCertificado(const AID : Integer);
  public
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    function Exportar(const AIDPresupuesto: Integer; const AFichero : String): Boolean;
  end;


implementation

{$R *.dfm}

uses
  Windows, Variants, Dialogs, uDataModuleServer, uStringsUtils, uSistemaFunc,
  srvEmpresas_Impl, uROTypes, uROClasses;

const
  rptInforme = 'CertificadoTrabajos.rdx';


constructor TRptWordCertificadoTrabajo.Create(AOwner: TComponent);
begin
  inherited;
  FDocumento := NIL;
  FImportes := True;
  FNumCapitulos := 0;

  FPlantilla := DarRutaInformes + rptInforme;
end;

procedure TRptWordCertificadoTrabajo.DataModuleCreate(Sender: TObject);
begin
  schReport.ConnectionManager := dmServer.ConnectionManager;
  FConnection := dmServer.DarNuevaConexion;
end;

destructor TRptWordCertificadoTrabajo.Destroy;
begin
  if FDocumento <> NIL then
    FDocumento.Free;
  FDocumento := NIL;

  inherited;
end;

function TRptWordCertificadoTrabajo.Exportar(const AIDPresupuesto: Integer;
  const AFichero : String): Boolean;
begin
  if EsCadenaVacia(AFichero) then
    RaiseError('Falta indicar el fichero donde se exportará el listado.');

  FNombreFichero := AFichero;
  FCodigoPresupuesto := AIDPresupuesto;
  _GenerarCertificado(AIDPresupuesto);
  Result := True;
end;

function TRptWordCertificadoTrabajo.Generar : Boolean;
begin
  FWordApp := TWordApp.Create (False, False);
  with FWordApp do
  begin
    Visible := False;
    ScreenUpdating := False;
  end;

  FDocumento := TWordDoc.CreateNewDoc(FWordApp, FPlantilla);
  FWordApp.SaveActiveDocAs(FNombreFichero);
  try
    if not RellenarInforme then
      RaiseError('Se producido un error al generar el informe en MS Word.');

    FWordApp.CloseApp(wdSaveChanges);
    Result := True;
  finally
    FDocumento := NIL;
    FWordApp := NIL;
  end;
end;


function TRptWordCertificadoTrabajo.RellenarInforme: boolean;
var
  NombreCapitulo : string;
  ADescripcion : string;
  ANombreFichero : string;
begin
  with FDocumento, tbl_Cabecera do
  begin
    ReplaceBookmark('Cliente', FieldByName('NOMBRE').AsString);
    ReplaceBookmark('Direccion', FieldByName('CALLE').AsString + ' ' +
       FieldByName('CODIGO_POSTAL').AsString + ' ' +
       FieldByName('POBLACION').AsString + ' ' + FieldByName('PROVINCIA').AsString);

    ReplaceBookmark('Referencia', FieldByName('REFERENCIA').AsString);
  end;

  FContadorCap := 0;
  FNumCapOpc := 0;
  with FDocumento, tbl_Capitulos do
  begin
    First;
    ADescripcion := '';
    while not Eof do
    begin
      if (FieldByName('TIPO_DETALLE').AsString = 'Titulo') or
         (FieldByName('TIPO_DETALLE').AsString = 'Opcional') then
      begin
        NombreCapitulo := '';
        if (FieldByName('TIPO_DETALLE').AsString = 'Titulo') then
          NombreCapitulo := 'Capítulo ' + IntToStr(FContadorCap + 1) + '. ' + FieldByName('CONCEPTO').AsString
        else begin
          NombreCapitulo := 'Capítulo opcional. ' + FieldByName('CONCEPTO').AsString;
          Inc(FNumCapOpc);
        end;
        ADescripcion := ADescripcion + #13#10 + NombreCapitulo;

        Inc(FContadorCap);
        ListaCapitulos[FContadorCap].Tipo := FieldByName('TIPO_DETALLE').AsString;
        ListaCapitulos[FContadorCap].Nombre := NombreCapitulo;
        Next;
      end
      else begin
        if FContadorCap = 0 then
        begin
          Inc(FContadorCap);  // Se considera el conjunto de conceptos sueltos como un capítulo.
          { Pegar una tabla para rellenarla }
        end;
        Next;
      end;
    end;
    FNumCapitulos := FContadorCap;
    ReplaceBookmark('Capitulos', ADescripcion);
  end;

  ANombreFichero := DarFicheroTemporal;
  EscribirEnFichero(ANombreFichero, tbl_Cabecera.FieldByName('PORTADA').AsString);
  FWordApp.InsertFile(ANombreFichero, 'Portada');
  SysUtils.DeleteFile(ANombreFichero);

  Result := True;
end;


procedure TRptWordCertificadoTrabajo._GenerarCertificado(const AID: Integer);
var
  ACopiaPlantilla: string;
begin
  FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO"
  try
    tbl_Cabecera.ParamByName('ID').AsInteger := AID;
    tbl_Capitulos.ParamByName('ID_PRESUPUESTO').AsInteger := AID;

    tbl_Cabecera.Active := True;
    tbl_Capitulos.Active := True;

    FCodigoPresupuesto := AID;

    if RecuperarEmpresa(tbl_Cabecera.FieldByName('ID_EMPRESA').AsInteger, tbl_Empresa) then
    begin
      ACopiaPlantilla := DarFicheroTemporal;
      CopiarFichero(FPlantilla, ACopiaPlantilla);
      FPlantilla := ACopiaPlantilla;
      try
        Generar;
      finally
        SysUtils.DeleteFile(ACopiaPlantilla);
      end;
    end;
  finally
    FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO"
  end;
end;

end.

