{
===============================================================================
  Copyright (©) 2001. Rodax Software.
===============================================================================
  Los contenidos de este fichero son propiedad de Rodax Software titular del
  copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado,
  en su totalidad o en parte, con el permiso escrito de Rodax Software, o de
  acuerdo con los términos y condiciones establecidas en el acuerdo/contrato
  bajo el que se suministra.
  -----------------------------------------------------------------------------
  Web:  www.rodax-software.com
===============================================================================
  Fecha primera versión: 01-10-2001
  Versión actual: 1.0.4
  Fecha versión actual: 18-03-2005
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    15-10-2001    Se ha cambiado la fuente del rich-edit de Tahoma a Garamond
                  para que coincida con la fuente que se usa en la plantilla
                  de Word.

    22-03-2003    Se han puesto componentes con calendario.

    26-04-2004    Se rellena atomáticamente la fecha de emisión.

    18-03-2005    Poder enviar las cartas firmadas o no, por correo electrónico
===============================================================================
}

unit EditorCartas;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  RDXFRAME, StdCtrls, RdxComboBox, RdxBotones, RdxCampos,
  ExtCtrls, Tipos, RdxBarras, RdxTitulos, Configuracion,
  Grids, DBGrids, RdxPaneles, RdxRadioButton, RdxShape, RdxDialogos,
  ComCtrls, RdxRichEdit, TablaProveedores, TablaClientes, dxCntner,
  dxEditor, dxExEdtr, dxEdLib, cxControls, cxContainer, cxEdit, cxTextEdit,
  cxMaskEdit, cxDropDownEdit, cxCalendar, cxButtonEdit;

type
  TfrEditorCartas = class(TRdxFrame)
    eInformacion: TLabel;
    Panel: TRdxPanel;
    pnlDatos: TRdxPanel;
    cDatos: TRdxCabecera;
    eCodigo: TLabel;
    eNombre: TLabel;
    ePersonaContacto: TLabel;
    eCalle: TLabel;
    ePiso: TLabel;
    eNumero: TLabel;
    eCodigoPostal: TLabel;
    ePoblacion: TLabel;
    eFecha: TLabel;
    Carta: TRdxRichEdit;
    Calle: TRdxEdit;
    Poblacion: TRdxEdit;
    Nombre: TRdxEdit;
    Numero: TRdxEdit;
    Piso: TRdxEdit;
    CodigoPostal: TRdxEdit;
    PersonaContacto: TRdxEdit;
    brOperacion: TRdxBarraInferior;
    bImprimir: TRdxBoton;
    bCancelar: TRdxBoton;
    bExportar: TRdxBoton;
    eCarta: TLabel;
    Fecha: TcxDateEdit;
    CodigoProvCli: TcxButtonEdit;
    bEnviar: TRdxBoton;
    procedure bImprimirClick(Sender: TObject);
    procedure bCancelarClick(Sender: TObject);
    procedure bExportarClick(Sender: TObject);
    procedure bEnviarClick(Sender: TObject);

    procedure CodigoProvCliPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure CodigoProvCliPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
  private
    DatosProveedor : TDatosProveedor;
    DatosCliente : TDatosCliente;
    function ComprobarDatos: boolean;
    procedure rellenarCampos(DatosProveedor:TDatosProveedor); overload;
    procedure rellenarCampos(DatosCliente:TDatosCliente); overload;
    procedure ImprimirCarta;
    procedure ExportarCarta;
  protected
    FCodigo : Variant;
    procedure SetCodigo(Value : Variant);
    function CambiarEntidad(EntidadAnterior, Entidad : TRdxEntidad): Boolean; override;
    procedure FreeContenido; override;
  public
    property Codigo : Variant read FCodigo write SetCodigo;
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
  end;

var
  frEditorCartas: TfrEditorCartas;

implementation

{$R *.DFM}

uses
  Proveedores, Clientes, Mensajes, StrFunc, InformeCarta, SysFunc, NumFunc,  
  RdxFrameArticulos, Almacenes, Colores, Literales, Correo, Constantes;

constructor TfrEditorCartas.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  FCodigo := NULL;
  DatosProveedor := TDatosProveedor.Create;
  DatosCliente := TDatosCliente.Create;
  Fecha.Date := Date;
end;

destructor TfrEditorCartas.Destroy;
begin
  DatosProveedor.Free;
  DatosCliente.Free;
  inherited;
end;

procedure TfrEditorCartas.bCancelarClick(Sender: TObject);
begin
  CloseFrame;
end;

procedure TfrEditorCartas.ExportarCarta;
var
  FInformeCarta : TInformeCarta;
  Fichero : String;

begin
  if not DarFicheroExportar(Fichero) then
    Exit;

  FInformeCarta := TInformeCarta.Create(Self);
  try
    FInformeCarta.FNombre := Nombre.Text;
    FInformeCarta.FDireccion := Format('%s, %s. %s',[Calle.Text,Numero.Text,Piso.Text]);
    FInformeCarta.FPoblacion := Format('%s  %s',[Poblacion.Text,CodigoPostal.Text]);
    FInformeCarta.FPersonaContacto :=  PersonaContacto.Text;
    FInformeCarta.FFecha := Fecha.Text;
    FInformeCarta.FNombreFicheroCarta := DarFicheroTemporal;
    Carta.Lines.SaveToFile(FInformeCarta.FNombreFicheroCarta);
    FInformeCarta.Exportar(Fichero);
    DeleteFile(FInformeCarta.FNombreFicheroCarta);
  finally
    FInformeCarta.Free;
  end;
end;

procedure TfrEditorCartas.FreeContenido;
begin
  if (ContenidoModal is TfrProveedores) then
    Codigo := (ContenidoModal as TfrProveedores).CodigoProveedor;
  if (ContenidoModal is TfrClientes) then
    Codigo := (ContenidoModal as TfrClientes).CodigoCliente;
  inherited FreeContenido;
end;

procedure TfrEditorCartas.SetCodigo(Value: Variant);
begin
  if VarIsNull(Value) then
    Exit;

  FCodigo := Value;

  case Entidad of
  entProveedor: begin
                  DatosProveedor.Codigo := FCodigo;
                  if dmTablaProveedores.darDatosProveedor(DatosProveedor) then
                    rellenarCampos(DatosProveedor)
                  else
                    raise Exception.CreateFmt(msgProCodProvNoExiste, [FCodigo]);
                end;
  entCliente: begin
                DatosCliente.Codigo := FCodigo;
                if dmTablaClientes.darDatosCliente(DatosCliente) then
                  rellenarCampos(DatosCliente)
                else
                  raise Exception.CreateFmt(msgProCodProvNoExiste, [FCodigo]);
              end;
  end;
end;

procedure TfrEditorCartas.bImprimirClick(Sender: TObject);
begin
  if not ComprobarDatos then
    Exit;

  ImprimirCarta;
  CloseFrame;
end;

procedure TfrEditorCartas.bExportarClick(Sender: TObject);
begin
  if not ComprobarDatos then
    Exit;

  ExportarCarta;
  CloseFrame;
end;

procedure TfrEditorCartas.ImprimirCarta;
var
  FInformeCarta : TInformeCarta;
begin
  FInformeCarta := TInformeCarta.Create(Self);
  try
    FInformeCarta.FNombre := Nombre.Text;
    FInformeCarta.FDireccion := Format('%s, %s. %s',[Calle.Text,Numero.Text,Piso.Text]);
    FInformeCarta.FPoblacion := Format('%s  %s',[Poblacion.Text,CodigoPostal.Text]);
    FInformeCarta.FPersonaContacto :=  PersonaContacto.Text;
    FInformeCarta.FFecha := Fecha.Text;
    FInformeCarta.FNombreFicheroCarta := DarFicheroTemporal;
    Carta.Lines.SaveToFile(FInformeCarta.FNombreFicheroCarta);
    FInformeCarta.Imprimir;
    DeleteFile(FInformeCarta.FNombreFicheroCarta);
  finally
    FInformeCarta.Free;
  end;
end;

function TfrEditorCartas.CambiarEntidad(EntidadAnterior,Entidad: TRdxEntidad): Boolean;
begin
  inherited CambiarEntidad(EntidadAnterior, Entidad);
  if Entidad = entCliente then
  begin
    cDatos.Caption := 'Datos del cliente';
    eCodigo.Caption := 'Código de cliente';
  end;
  ConfigurarFrame(Self, Self.Entidad);
end;

procedure TfrEditorCartas.rellenarCampos(DatosProveedor: TDatosProveedor);
begin
  CodigoProvCli.Text := DatosProveedor.Codigo;
  Nombre.Text := DatosProveedor.Nombre;
  Calle.Text := DatosProveedor.Calle;
  Numero.Text := DatosProveedor.Numero;
  Piso.Text := DatosProveedor.Piso;
  Poblacion.Text := DatosProveedor.Poblacion;
  CodigoPostal.Text := DatosProveedor.CodigoPostal;
  PersonaContacto.Text := DatosProveedor.PersonaContacto;
end;

procedure TfrEditorCartas.rellenarCampos(DatosCliente: TDatosCliente);
begin
  CodigoProvCli.Text := DatosCliente.Codigo;
  Nombre.Text := DatosCliente.Nombre;
  Calle.Text := DatosCliente.Calle;
  Numero.Text := DatosCliente.Numero;
  Piso.Text := DatosCliente.Piso;
  Poblacion.Text := DatosCliente.Poblacion;
  CodigoPostal.Text := DatosCliente.CodigoPostal;
  PersonaContacto.Text := DatosCliente.PersonaContacto;
end;

function TfrEditorCartas.ComprobarDatos: boolean;
begin
  Result := False;
  if EsCadenaVacia(Nombre.Text) then
  begin
    Case Entidad of
    entProveedor : VerMensaje(msgCarFaltaProv);
    entCliente   : VerMensaje(msgCarFaltaCli);
    end;
    Nombre.SetFocus;
    Exit;
  end;
  if EsCadenaVacia(Calle.Text) then
  begin
    VerMensaje(msgCarFaltaDir);
    Calle.SetFocus;
    Exit;
  end;
  if EsCadenaVacia(Poblacion.Text) then
  begin
    VerMensaje(msgCarFaltaPob);
    Poblacion.SetFocus;
    Exit;
  end;
  if EsCadenaVacia(CodigoPostal.Text) then
  begin
    VerMensaje(msgCarFaltaCP);
    CodigoPostal.SetFocus;
    Exit;
  end;
  if EsCadenaVacia(Carta.Lines.Text) then
  begin
    VerMensaje(msgCarFaltaCarta);
    Carta.SetFocus;
    Exit;
  end;
  Result := True;
end;

procedure TfrEditorCartas.CodigoProvCliPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  Case Entidad of
  entProveedor: ContenidoModal := TfrProveedores.Create(Self);
  entCliente  : ContenidoModal := TfrClientes.Create(Self);
  end;
end;

procedure TfrEditorCartas.CodigoProvCliPropertiesValidate(Sender: TObject;
  var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
begin
  if EsCadenaVacia (DisplayValue) then
    Exit;

  Case Entidad of
  entProveedor: begin
                  if (dmTablaProveedores.validarCodigo(DisplayValue)) then begin
                    //Comprueba que le numero es lo sufucientemente pequeño para ser un entero
                    if not EsInteger(DisplayValue) then
                    begin
                      VerMensajeFmt(msgProCodProvIncorrecto,[DisplayValue]);
                      DisplayValue := '0';
                      CodigoProvCli.SetFocus;
                    end
                    else
                    begin
                      DisplayValue := dmTablaProveedores.formatearCodigo(DisplayValue);
                      if (not dmTablaProveedores.existeCodigo(DisplayValue)) then begin
                        VerMensajeFmt(msgProCodProvNoExiste, [DisplayValue]);
                        CodigoProvCli.SetFocus;
                        Exit;
                      end;
                      Codigo := CodigoProvCli.Text;
                    end
                  end
                  else begin
                    VerMensajeFmt(msgProCodProvIncorrecto, [DisplayValue]);
                    CodigoProvCli.SetFocus;
                    Exit;
                  end;
                end;
  entCliente: begin
                 if (dmTablaClientes.validarCodigo(CodigoProvCli.Text)) then begin
                    //Comprueba que le numero es lo sufucientemente pequeño para ser un entero
                    if not EsInteger(DisplayValue) then
                    begin
                      VerMensajeFmt(msgCliCodCliIncorrecto,[DisplayValue]);
                      DisplayValue := '0';
                      CodigoProvCli.SetFocus;
                    end
                    else
                    begin
                      DisplayValue:= dmTablaClientes.formatearCodigo(CodigoProvCli.Text);
                      if (not dmTablaClientes.existeCodigo(DisplayValue)) then begin
                        VerMensajeFmt(msgCliCodCliNoExiste, [DisplayValue]);
                        CodigoProvCli.SetFocus;
                        Exit;
                      end;
                      Codigo := DisplayValue;
                    end
                  end
                  else begin
                    VerMensajeFmt(msgCliCodCliIncorrecto, [DisplayValue]);
                    CodigoProvCli.SetFocus;
                    Exit;
                  end;
                end;
  end;
end;

procedure TfrEditorCartas.bEnviarClick(Sender: TObject);
var
  Datos: TDatosCorreo;
  Codigo, Fichero : String;
  FInformeCarta : TInformeCarta;

begin
  Codigo := CodigoProvCli.Text;
  Datos:= Nil;
  Fichero := Codigo;
  Fichero := DarRutaTemporal + StringReplace(Fichero, CTE_SEPSERIADO, CTE_SEPSERIADO2, [rfReplaceAll, rfIgnoreCase]);
  Fichero := Fichero + CTE_DOC;

  FInformeCarta := TInformeCarta.Create(Self);
  try
    FInformeCarta.FNombre := Nombre.Text;
    FInformeCarta.FDireccion := Format('%s, %s. %s',[Calle.Text,Numero.Text,Piso.Text]);
    FInformeCarta.FPoblacion := Format('%s  %s',[Poblacion.Text,CodigoPostal.Text]);
    FInformeCarta.FPersonaContacto :=  PersonaContacto.Text;
    FInformeCarta.FFecha := Fecha.Text;
    FInformeCarta.FNombreFicheroCarta := DarFicheroTemporal;
    Carta.Lines.SaveToFile(FInformeCarta.FNombreFicheroCarta);
    FInformeCarta.Exportar(Fichero);
  finally
    FInformeCarta.Free;
  end;

  try
  //Creamos el correo
  Datos:= TDatosCorreo.Create;
  if Entidad = entCliente then
    Datos.Direcciones.add(dmTablaClientes.darCorreo(Codigo))
  else
    Datos.Direcciones.add(dmTablaProveedores.darCorreo(Codigo));

  Datos.Adjuntos.Add(Fichero);
  enviarCorreo(Datos);
  finally
    FreeAndNil(Datos);
  end;
end;

end.
