unit uRptWordPedidoProveedor;

interface

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

type
  TRptWordPedidoProveedor = 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;
    FCodigoPedido : string;
    FNombreFichero : String;
    FImportes : Boolean;
    procedure InsertarConceptos(Tabla : Table);
    function Generar : Boolean;

    function RellenarDatosPedido : Boolean;
    function RellenarDatosDetalle : Boolean;

    procedure _GenerarPedido(const AID: String);
  public
    function Exportar(Codigo, Fichero : String): Boolean;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  end;

implementation

{ TRptWordPedidoProveedor }

{$R *.dfm}

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

const
  rptInforme = 'PedidoProveedor.rdx';  
  
constructor TRptWordPedidoProveedor.Create(AOwner: TComponent);
begin
  inherited;
  FDocumento := NIL;
  FPlantilla := DarRutaInformes + rptInforme;
end;

destructor TRptWordPedidoProveedor.Destroy;
begin
  if FDocumento <> NIL then
    FDocumento.Free;
  FDocumento := NIL;
  inherited;
end;

function TRptWordPedidoProveedor.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;
  FCodigoPedido := Codigo;
  _GenerarPedido(Codigo);
  Result := True;
end;

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

function TRptWordPedidoProveedor.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 RellenarDatosPedido then
      RaiseError('Se producido un error al generar la cabecera en MS Word.');

    if not RellenarDatosDetalle 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 TRptWordPedidoProveedor.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 TRptWordPedidoProveedor.RellenarDatosDetalle : Boolean;
var
  numRows, numCols, mergesplit : OleVariant;
  MaxCols, iRowCount : Integer;
begin
  iRowCount := 2;
  numrows := 2;
  numcols := 1;
  mergeSplit := False;
  MaxCols := 12;

  with FDocumento.Document.Tables.Item(1), tbl_Detalles do
  begin
    tbl_Detalles.First;
    while not tbl_Detalles.EOF do
    begin
        Rows.Item (iRowCount).Cells.Split (numRows, numCols, mergesplit);
        Cell(iRowCount, 1).Range.Text := FieldByName('REFERENCIA_PROVEEDOR').AsString;
        Cell(iRowCount, 2).Range.Text := FieldByName('REFERENCIA_FABRICANTE').AsString;
        Cell(iRowCount, 3).Range.Text := FieldByName('CONCEPTO').AsString;
        Cell(iRowCount, 4).Range.Text := FieldByName('CANTIDAD').AsString + ' ' + FieldByName('UNIDAD_MEDIDA').AsString;

        if FImportes then
          Cell(iRowCount, 5).Range.Text := FormatFloat(DISPLAY_EUROS2, FieldByName('IMPORTE_UNIDAD').AsFloat)
        else
          Cell(iRowCount, 5).Range.Text := '';

        if FImportes then
          Cell(iRowCount, 6).Range.Text := FormatFloat(DISPLAY_EUROS2, FieldByName('IMPORTE_TOTAL').AsFloat)
        else
          Cell(iRowCount, 6).Range.Text := '';
        Next;
        Inc (iRowCount);
    end;

    Rows.Item(iRowCount).Delete;

    {while iRowCount <= MaxCols do
    begin
        Rows.Item (iRowCount).Cells.Split (numRows, numCols, mergesplit);
        inc (iRowCount);
    end;}
  end;
  Result := True;  
end;

function TRptWordPedidoProveedor.RellenarDatosPedido : Boolean;
var
  DireccionEntrega, FicheroTemporal : String;
  LinkToFile, SaveWithDocument, _Range : OleVariant;
  Imagen : InlineShape;

begin

  //PARA DIBUJAR EL LOGOTIPO MULTIEMPRESA
  {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('CodigoPedido', FieldByName('REFERENCIA').AsString);
    ReplaceBookmark('FechaPedido', FieldByName('FECHA_PEDIDO').AsString);

    // En la dirección mostrar aquellos campos que estén rellenos.
    DireccionEntrega := '';
    if not EsCadenaVacia(FieldByName('CALLE_ALMACEN').AsString) then
      DireccionEntrega := DireccionEntrega + FieldByName('CALLE_ALMACEN').AsString;
    if not EsCadenaVacia(FieldByName('CODIGO_POSTAL_ALMACEN').AsString) then
      DireccionEntrega := DireccionEntrega + ', ' + FieldByName('CODIGO_POSTAL_ALMACEN').AsString;
    if not EsCadenaVacia(FieldByName('POBLACION_ALMACEN').AsString) then
      DireccionEntrega := DireccionEntrega + ', ' + FieldByName('POBLACION_ALMACEN').AsString;
    if not EsCadenaVacia(FieldByName('PROVINCIA_ALMACEN').AsString) then
      DireccionEntrega := DireccionEntrega + ', ' + FieldByName('PROVINCIA_ALMACEN').AsString;
    ReplaceBookmark('LugarEntrega', DireccionEntrega);

    {    ReplaceBookmark('LugarEntrega', FieldByName('CALLEALMACEN').AsString + ' ' +
      FieldByName('NUMEROALMACEN').AsString + ', '  + FieldByName('PISOALMACEN').AsString + ', ' +
      FieldByName('CODIGOPOSTALALMACEN').AsString + ' ' + FieldByName('POBLACIONALMACEN').AsString + ', ' + FieldByName('PROVINCIAALMACEN').AsString);}

    ReplaceBookmark('PersonaEntrega', FieldByName('PERSONA_CONTACTO_ALMACEN').AsString);
    if FieldByName('FECHA_ENTREGA').IsNull then
       ReplaceBookmark('FechaEntrega', '')
    else
       ReplaceBookmark('FechaEntrega', 'FECHA DE ENTREGA PREVISTA: ' + FieldByName('FECHA_ENTREGA').AsString);
    
	ReplaceBookmark('NombreProveedor', FieldByName('NOMBRE').AsString);
    ReplaceBookmark('FaxProveedor', FieldByName('FAX').AsString);
    ReplaceBookmark('PersonaContactoProveedor', FieldByName('PERSONA_CONTACTO').AsString);
    ReplaceBookmark('CodigoClienteProveedor', FieldByName('CODIGO_CLIENTE').AsString);

    if FImportes then
      ReplaceBookmark('ImporteTotal', FormatFloat(DISPLAY_EUROS2, FieldByName('IMPORTE_TOTAL').AsFloat))
    else
      ReplaceBookmark('ImporteTotal', '');

    ReplaceBookmark('NotasPedido', FieldByName('OBSERVACIONES').AsString);

    ReplaceBookmark('NombreEmpresa', tbl_Empresa.FieldByName('NOMBRE').AsString);
    ReplaceBookmark('NombreEmpresa2', 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);
  end;
  Result := True;  
end;

procedure TRptWordPedidoProveedor._GenerarPedido(const AID: String);
var
  ACopiaPlantilla : String;
begin
  tbl_Cabecera.ParamByName('ID').AsString := AID;
  tbl_Detalles.ParamByName('ID_PEDIDO').AsString := AID;

  tbl_Cabecera.Active := True;
  tbl_Detalles.Active := True;

  FCodigoPedido := 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;
end;


end.
