{
===============================================================================
  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.7
  Fecha versión actual: 08-03-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    09-10-2001    Al pulsar la tecla ESC se activa el botón 'Cancelar'. Sólo
                  pasa cuando este frame está en una ventana modal.

    29-10-2001    Hacer más grande la ventana modal para facturar un
                  albarán.

    18-01-2002    Se han coloreado las filas del grid dependiendo de la
                  situación de la factura.

    07-04-2002    Se ha adaptado para la transacción única.

    06-05-2002    Adaptación al grid 'TdxDBGrid'.

    08-04-2003    P263. Agrupar por años los albaranes.

    08-03-2004    Al hacer doble click sobre el grid, se pasará a modificar el
                  registro o se seleccionará, dependiendo del modo en el que
                  se encuentre la pantalla.

    08-03-2004    p272. Adaptación a multiempresa.

===============================================================================
}

unit AlbaranesClientes;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  RdxFrameAlbaranes, Grids, DBGrids, ComCtrls, RdxBotones, ToolWin, ExtCtrls,
  Tipos, Menus, am2000menuitem, am2000popupmenu, am2000, Db, DBTables,
  RdxPaneles, RdxBarras, RXDBCtrl, dxCntner, dxTL, dxDBCtrl,
  dxDBGrid, StdCtrls, RdxComboBox, pngimage;

type
  TfrAlbaranesClientes = class(TRdxFrameAlbaranes)
    dsAlbaranes: TDataSource;
    BarraAlbaranes: TRdxBarraSuperior;
    bAnadir: TRdxBotonSuperior;
    bModificar: TRdxBotonSuperior;
    bEliminar: TRdxBotonSuperior;
    bConsultar: TRdxBotonSuperior;
    bBuscar: TRdxBotonSuperior;
    pnlCuerpo: TRdxPanel;
    pnlGridAlbaranesCliente: TPanel;
    pnlExtra: TRdxBarraSuperior;
    bFacturar: TRdxBoton;
    bImprimir: TRdxBoton;
    bExportar: TRdxBoton;
    brSeleccion: TRdxBarraInferior;
    bSeleccionar: TRdxBoton;
    bCancelarGuardar: TRdxBoton;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    gridAlbaranes: TdxDBGrid;
    imgSombra: TImage;
    RdxPanel1: TRdxPanel;
    Label1: TLabel;
    cbxAno: TRdxComboBox;
    bEnviarCorreo: TRdxBoton;
    procedure bAnadirClick(Sender: TObject);
    procedure bModificarClick(Sender: TObject);
    procedure bConsultarClick(Sender: TObject);
    procedure bBuscarClick(Sender: TObject);
    procedure bEliminarClick(Sender: TObject);
    procedure bFacturarClick(Sender: TObject);
    procedure bImprimirClick(Sender: TObject);
    procedure bSalirClick(Sender: TObject);
    procedure bSeleccionarClick(Sender: TObject);
    procedure bCancelarGuardarClick(Sender: TObject);
    procedure Facturas1Click(Sender: TObject);
    procedure bExportarClick(Sender: TObject);
    procedure gridAlbaranesRefreshButton(Sender: TObject);
    procedure gridAlbaranesCustomDrawCell(Sender: TObject;
      ACanvas: TCanvas; ARect: TRect; ANode: TdxTreeListNode;
      AColumn: TdxTreeListColumn; ASelected, AFocused,
      ANewItemRow: Boolean; var AText: String; var AColor: TColor;
      AFont: TFont; var AAlignment: TAlignment; var ADone: Boolean);
    procedure cbxAnoChange(Sender: TObject);
    procedure gridAlbaranesDblClick(Sender: TObject);
    procedure bEnviarCorreoClick(Sender: TObject);
  private
    FCodigoCliente: String;
    procedure SetCodigoCliente(Value : String);
    procedure ActualizarBotones;
  protected
    procedure BuscarAlbaran; override;
    procedure FreeContenido; override;
    procedure VerModal; override;
    procedure CambiarModo(ModoAnterior, Modo : TRdxModo); override;
    procedure ActualizarBarras; override;
  public
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property CodigoCliente : String read FCodigoCliente write SetCodigoCliente;
    property TablaAlbaranes;
    property Entidad;
  end;

var
  frAlbaranesClientes: TfrAlbaranesClientes;

implementation
{$R *.DFM}

uses
  AlbaranCliente, BuscarAlbaranCliente, FacturaCliente, SysFunc, 
  TablaAlbaranesCliente, BaseDatos, Configuracion,
  IBCustomDataSet, FacturasClientes, Mensajes, InformeAlbaranCliente,
  StrFunc, Constantes, Literales, RdxEmpresaActiva, Correo, TablaClientes;

procedure TfrAlbaranesClientes.FreeContenido;
begin
  if (Contenido is TRdxFrameAlbaranes) then
    CodigoAlbaran := (Contenido as TRdxFrameAlbaranes).CodigoAlbaran;
  inherited FreeContenido;
  BuscarAlbaran;
end;

procedure TfrAlbaranesClientes.bAnadirClick(Sender: TObject);
begin
  inherited;
  Contenido := TfrAlbaranCliente.Create(Self);
  Contenido.Modo := Anadir;
end;

procedure TfrAlbaranesClientes.bModificarClick(Sender: TObject);
begin
  CodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString;
  if dmTablaAlbaranesCliente.AlbaranFacturado(EmpresaActiva.Codigo, CodigoAlbaran) then
  begin
    VerMensaje(msgAlbNoModificar);
    Exit;
  end;
  Contenido := TfrAlbaranCliente.Create(Self);
  Contenido.Modo := Modificar;
end;

procedure TfrAlbaranesClientes.bConsultarClick(Sender: TObject);
begin
  CodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString;
  Contenido := TfrAlbaranCliente.Create(Self);
  Contenido.Modo := Consultar;
end;

procedure TfrAlbaranesClientes.bBuscarClick(Sender: TObject);
begin
  CodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString;
  Contenido := TfrBuscarAlbaranCliente.Create(Self);
end;

procedure TfrAlbaranesClientes.bEliminarClick(Sender: TObject);
begin
  CodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString;
  if dmTablaAlbaranesCliente.AlbaranFacturado(EmpresaActiva.Codigo, CodigoAlbaran) then
  begin
    VerMensaje(msgAlbNoEliminar);
    Exit;
  end;
  Contenido := TfrAlbaranCliente.Create(Self);
  Contenido.Modo := Eliminar;
end;

procedure TfrAlbaranesClientes.bFacturarClick(Sender: TObject);
begin
  CodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString;

  if dmTablaAlbaranesCliente.AlbaranFacturado(EmpresaActiva.Codigo, CodigoAlbaran) then
  begin
    VerMensajeFmt(msgAlbYaFacturado, [FCodigoAlbaran]);
    Exit;
  end;

  CaptionModal := 'Facturar albarán de cliente';
  WidthModal := 758;
  ModoModal := Anadir;
  EntidadModal := entFacturaCliente;
  ContenidoModal := TfrFacturaCliente.Create(Self);
end;

procedure TfrAlbaranesClientes.bImprimirClick(Sender: TObject);
var
  FInformeAlbaran : TInformeAlbaranCliente;
begin
  CodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString;
  FCodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString;
  FInformeAlbaran := TInformeAlbaranCliente.Create(Self);
  try
    FInformeAlbaran.Imprimir(FCodigoAlbaran);
  finally
    FInformeAlbaran.Free;
  end;
end;

procedure TfrAlbaranesClientes.ActualizarBarras;
begin
  inherited;
  case Modo of
    Facturar  : begin
                  if BarraSeleccion <> NIL then BarraSeleccion.Visible := True;
                  if BarraSalir <> NIL then BarraSalir.Visible := False;
                  if BarraOperacion <> NIL then BarraOperacion.Visible := False;
                end;
  end;
end;

procedure TfrAlbaranesClientes.ActualizarBotones;
begin
  if BaseDatos.IsReadOnly then
  begin
    bAnadir.Enabled := False;
    bModificar.Enabled := False;
    bEliminar.Enabled := False;
    bConsultar.Enabled := True;
    bBuscar.Enabled := True;
    bFacturar.Enabled := False;
    bExportar.Enabled := True;
    bImprimir.Enabled := True;
    Exit;
  end;

  if TablaAlbaranes.RecordCount = 0 then
  begin
    bAnadir.Enabled := True;
    bModificar.Enabled := False;
    bEliminar.Enabled := False;
    bConsultar.Enabled := False;
    bBuscar.Enabled := False;
    bFacturar.Enabled := False;
    bExportar.Enabled := False;
    bImprimir.Enabled := False;
  end
  else begin
    bAnadir.Enabled := True;
    bModificar.Enabled := True;
    bEliminar.Enabled := True;
    bConsultar.Enabled := True;
    bBuscar.Enabled := True;
    bFacturar.Enabled := True;
    bExportar.Enabled := True;
    bImprimir.Enabled := True;
  end;
end;

procedure TfrAlbaranesClientes.BuscarAlbaran;
begin
  with TablaAlbaranes do
  begin
    DisableControls;
    Close;
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    Prepare;
    Open;
    dmTablaAlbaranesCliente.InicializarTablaAlbaranes(@TablaAlbaranes);
    ActualizarBotones;
    EnableControls;
    Locate('CODIGO', CodigoAlbaran, []);
  end;
end;

procedure TfrAlbaranesClientes.CambiarModo(ModoAnterior, Modo: TRdxModo);
begin
  with TablaAlbaranes do
  begin
    Close;
    case Modo of
      Facturar : SelectSQL.Assign(dmTablaAlbaranesCliente.sqlConsultarGridAlbaranesFacturar);
    end;
  end;
  inherited;
end;

constructor TfrAlbaranesClientes.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Entidad := entAlbaranCliente;
  ConfigurarFrame(Self, Self.Entidad);
  
  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaAlbaranes := TIBDataSet.Create(Self);
  dsAlbaranes.DataSet := TablaAlbaranes;

  with TablaAlbaranes do
  begin
    DisableControls;
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaAlbaranesCliente.sqlConsultarGridAlbaranes);
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    Prepare;
    Open;
    ActualizarBotones;
    EnableControls;
  end;
  dmTablaAlbaranesCliente.InicializarTablaAlbaranes(@TablaAlbaranes);
  dmTablaAlbaranesCliente.InicializarGridAlbaranes(gridAlbaranes);
  gridAlbaranes.GotoFirst;

  cbxAno.Items := dmTablaAlbaranesCliente.DarListaAnos(EmpresaActiva.Codigo);
  cbxAno.ItemIndex := 0;
end;

destructor TfrAlbaranesClientes.Destroy;
begin
  TablaAlbaranes.Close;
  TablaAlbaranes.UnPrepare;
  TablaAlbaranes.Free;
  inherited;
end;

procedure TfrAlbaranesClientes.SetCodigoCliente(Value: String);
begin
  if FCodigoCliente = Value then
    exit;
  FCodigoCliente := Value;
  with TablaAlbaranes do
  begin
    DisableControls;
    Close;
    SelectSQL.Assign(dmTablaAlbaranesCliente.sqlConsultarGridAlbaranesCli);
    ParamByName('CODIGOCLIENTE').AsString := FCodigoCliente;
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;    
    Prepare;
    Open;
    dmTablaAlbaranesCliente.InicializarTablaAlbaranes(@TablaAlbaranes);
    ActualizarBotones;        
    EnableControls;
    Locate('CODIGO', CodigoAlbaran, []);
  end;
end;

procedure TfrAlbaranesClientes.VerModal;
begin
  FCodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString;
  if (ContenidoModal is TfrFacturaCliente) then
    (ContenidoModal as TfrFacturaCliente).CodigoAlbaran := CodigoAlbaran;
  inherited;
end;

procedure TfrAlbaranesClientes.bSalirClick(Sender: TObject);
begin
  CloseFrame;
end;

procedure TfrAlbaranesClientes.bSeleccionarClick(Sender: TObject);
begin
  CodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString;
  CloseFrame;
end;

procedure TfrAlbaranesClientes.bCancelarGuardarClick(Sender: TObject);
begin
  FCodigoAlbaran := '';
  CloseFrame;
end;

procedure TfrAlbaranesClientes.Facturas1Click(Sender: TObject);
begin
  CodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString;
  CaptionModal := Format('Factura del albarán %s', [TablaAlbaranes.FieldByName('CODIGO').AsString]);
  WidthModal := 815;
  HeightModal := 600;
  ModoModal := Consultar;
  ContenidoModal := TfrFacturasClientes.Create(Self);
end;

procedure TfrAlbaranesClientes.bExportarClick(Sender: TObject);
var
  FInformeAlbaran : TInformeAlbaranCliente;
  Fichero : String;
begin
  CodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString;
  if not DarFicheroExportar(Fichero) then
    Exit;
  FCodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString;
  FInformeAlbaran := TInformeAlbaranCliente.Create(Self);
  try
    FInformeAlbaran.Exportar(FCodigoAlbaran, Fichero);
  finally
    FInformeAlbaran.Free;
  end;
end;

procedure TfrAlbaranesClientes.gridAlbaranesRefreshButton(Sender: TObject);
begin
  BuscarAlbaran;
end;

procedure TfrAlbaranesClientes.gridAlbaranesCustomDrawCell(Sender: TObject;
  ACanvas: TCanvas; ARect: TRect; ANode: TdxTreeListNode;
  AColumn: TdxTreeListColumn; ASelected, AFocused, ANewItemRow: Boolean;
  var AText: String; var AColor: TColor; AFont: TFont;
  var AAlignment: TAlignment; var ADone: Boolean);
var
  IndiceCol : Integer;
begin
  if not ASelected then
  begin
    IndiceCol := (Sender as TdxDBGrid).ColumnByFieldName('CODIGOFACTURA').Index;
    if not EsCadenaVacia(ANode.Strings[IndiceCol]) then
      AFont.Color := COLOR_FACTURADO;
  end;
end;

procedure TfrAlbaranesClientes.cbxAnoChange(Sender: TObject);
begin
  if cbxAno.Text = CTE_TODOS then begin
    gridAlbaranes.Filter.Remove(gridAlbaranes.FindColumnByFieldName(CTE_ANO));
    gridAlbaranes.Filter.Clear;
  end
  else begin
    gridAlbaranes.Filter.Clear;
    gridAlbaranes.Filter.Add(gridAlbaranes.FindColumnByFieldName(CTE_ANO), cbxAno.Text, cbxAno.Text);
  end;

  gridAlbaranes.SetFocus;
  gridAlbaranes.GotoFirst;
//Falta seleccionar tupla
end;

procedure TfrAlbaranesClientes.gridAlbaranesDblClick(Sender: TObject);
begin
  if Modo = Seleccionar then
    bSeleccionar.Click
  else
    bModificar.Click;
end;

procedure TfrAlbaranesClientes.bEnviarCorreoClick(Sender: TObject);
var
  FInforme : TInformeAlbaranCliente;
  Fichero : String;
  Datos: TDatosCorreo;
  CodigoCliente: String;

begin
  CodigoAlbaran := TablaAlbaranes.FieldByName('CODIGO').AsString;
  CodigoCliente := TablaAlbaranes.FieldByName('CODIGOCLIENTE').AsString;
  Datos:= Nil;
  Fichero := CodigoAlbaran;
  Fichero := DarRutaTemporal + StringReplace(Fichero, CTE_SEPSERIADO, CTE_SEPSERIADO2, [rfReplaceAll, rfIgnoreCase]);
  Fichero := Fichero + CTE_DOC;

  //Generamos el fichero para luego adjuntaro al correo
  FInforme:= TInformeAlbaranCliente.Create(Self);
  try
    FInforme.Exportar(CodigoAlbaran, Fichero);
  finally
    FInforme.Free;
  end;

  try
  //Creamos el correo
  Datos:= TDatosCorreo.Create;
  Datos.Direcciones.add(dmTablaClientes.darCorreo(CodigoCliente));
  Datos.Adjuntos.Add(Fichero);
  enviarCorreo(Datos);
  finally
    FreeAndNil(Datos);
  end;
end;

end.
