{
===============================================================================
  Copyright (©) 2002. 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: 26-01-2003
  Versión actual: 1.0.1
  Fecha versión actual: 07-06-2003
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    07-06-2003    Se almacenaba correctamente el valor 'TIPOENTRADA' en la tabla
                  cuando era una salida. Siempre ponía 'E'.
===============================================================================
}

unit DetalleLibro;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  RdxBotones, StdCtrls, RdxMemo, RdxComboBox, RdxCampos, ExtCtrls,
  RdxTitulos, ComCtrls, RdxCheckBox, Grids, DBGrids, RdxPaneles,
  RdxBarras, Db, RdxFrame, RdxDBFrame, RXDBCtrl,
  RdxPageControl, IB, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData,
  cxEdit, cxDBData, cxClasses, cxControls, RxMemDS, Configuracion, cxMemo,
  cxDBEdit, cxContainer, cxTextEdit, cxMaskEdit, cxButtonEdit, AdvPanel,
  cxDropDownEdit, cxCalendar, RdxFrameDetallesLibro, Entidades,

  RdxEmpresaActiva;  

type
  TfrDetalleLibro = class(TRdxFrameDetallesLibro)
    pnlCuerpo: TPanel;
    brDoble: TRdxBarraInferior;
    bGuardar: TRdxBoton;
    bCancelar: TRdxBoton;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    pnlTitulo: TRdxPanelTituloOperacion;
    dsDetallesLibro: TDataSource;
    pnlDetalleLibro: TAdvPanel;
    eNumEntrada: TLabel;
    eCuantia: TLabel;
    eFechaEntrada: TLabel;
    eDescripcion: TLabel;
    NumeroEntrada: TcxDBButtonEdit;
    Cuantia: TcxDBTextEdit;
    Descripcion: TcxDBMemo;
    FechaEntrada: TcxDBDateEdit;
    procedure bAceptarClick(Sender: TObject);
    procedure bSalirClick(Sender: TObject);
    procedure bCancelarClick(Sender: TObject);
    procedure CodigoPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
  private
    //Por si en un futuro permitimos introducir el codigo de entrada a mano
    procedure asignarCodigoCajaA;
    procedure asignarCodigoCajaB;
    procedure asignarCodigoBancoA;
    procedure asignarCodigoBancoB;
  protected
    procedure ActivarModoAnadir; override;
    procedure ActivarModoModificar; override;
    procedure ActivarModoConsultar; override;
    function AnadirDatos : Boolean; override;
    function ModificarDatos : Boolean; override;
    function CancelarAnadir : Boolean; override;
    function CancelarModificar : Boolean; override;
    function ComprobarDatos : Boolean; override;
    procedure VerModal; override;
    procedure FreeContenido; override;
    procedure SetNumEntrada (Value : Variant); override;
    procedure BuscarNumEntrada; override;
    procedure CuantiaSetText(Sender: TField; const Text: String);
  public
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
  end;

var
  frDetalleLibro: TfrDetalleLibro;

implementation
{$R *.DFM}

uses
  IBCustomDataSet, Mensajes, Variants, BaseDatos, StrFunc, Constantes,
  Excepciones, IBErrorCodes, Literales, TablaLibros, DetallesLibro,
  TablaEmpresas;

////////////////////////////////////////////////////////////////////////////////
// PRIVATE
////////////////////////////////////////////////////////////////////////////////
procedure TfrDetalleLibro.asignarCodigoCajaA;
begin
{
  if (Length(NumeroEntrada.Text) = 0) then
    NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.darNuevoCodigoCajaA;
    
  if (dmTablaLibros.validarCodigoCajaA(NumeroEntrada.Text)) then
  begin
    NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.formatearCodigoCajaA(NumeroEntrada.Text);
    if (dmTablaLibros.existeDetalleLibro(CodigoLibro, NumeroEntrada.Text)) then begin
      VerMensajeFmt(msgLibNumEntRepetida, [NumeroEntrada.Text]);
      NumeroEntrada.SetFocus;
    end;
  end
  else begin
    VerMensajeFmt(msgLibNumEntIncorrecta, [NumeroEntrada.Text]);
    NumeroEntrada.SetFocus;
  end;
}
end;

procedure TfrDetalleLibro.asignarCodigoCajaB;
begin
{
  if (Length(NumeroEntrada.Text) = 0) then
    NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.darNuevoCodigoCajaB;
    
  if (dmTablaLibros.validarCodigoCajaB(NumeroEntrada.Text)) then
  begin
    NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.formatearCodigoCajaB(NumeroEntrada.Text);
    if (dmTablaLibros.existeDetalleLibro(CodigoLibro, NumeroEntrada.Text)) then begin
      VerMensajeFmt(msgLibNumEntRepetida, [NumeroEntrada.Text]);
      NumeroEntrada.SetFocus;
    end;
  end
  else begin
    VerMensajeFmt(msgLibNumEntIncorrecta, [NumeroEntrada.Text]);
    NumeroEntrada.SetFocus;
  end;
}
end;

procedure TfrDetalleLibro.asignarCodigoBancoA;
begin
{
  if (Length(NumeroEntrada.Text) = 0) then
    NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.darNuevoCodigoBancoA;
    
  if (dmTablaLibros.validarCodigoBancoA(NumeroEntrada.Text)) then
  begin
    NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.formatearCodigoBancoA(NumeroEntrada.Text);
    if (dmTablaLibros.existeDetalleLibro(CodigoLibro, NumeroEntrada.Text)) then begin
      VerMensajeFmt(msgLibNumEntRepetida, [NumeroEntrada.Text]);
      NumeroEntrada.SetFocus;
    end;
  end
  else begin
    VerMensajeFmt(msgLibNumEntIncorrecta, [NumeroEntrada.Text]);
    NumeroEntrada.SetFocus;
  end;
}
end;

procedure TfrDetalleLibro.asignarCodigoBancoB;
begin
{
  if (Length(NumeroEntrada.Text) = 0) then
    NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.darNuevoCodigoBancoB;
    
  if (dmTablaLibros.validarCodigoBancoB(NumeroEntrada.Text)) then
  begin
    NumeroEntrada.DataBinding.Field.AsString := dmTablaLibros.formatearCodigoBancoB(NumeroEntrada.Text);
    if (dmTablaLibros.existeDetalleLibro(CodigoLibro, NumeroEntrada.Text)) then begin
      VerMensajeFmt(msgLibNumEntRepetida, [NumeroEntrada.Text]);
      NumeroEntrada.SetFocus;
    end;
  end
  else begin
    VerMensajeFmt(msgLibNumEntIncorrecta, [NumeroEntrada.Text]);
    NumeroEntrada.SetFocus;
  end;
}
end;

////////////////////////////////////////////////////////////////////////////////
// PROTECTED
////////////////////////////////////////////////////////////////////////////////
procedure TfrDetalleLibro.ActivarModoAnadir;
var
  CodNuevo : Variant;
begin

  dsDetallesLibro.AutoEdit := True;
  NumeroEntrada.Properties.Buttons[0].Visible := False;
  NumeroEntrada.Properties.ReadOnly := True;
  FechaEntrada.Properties.ReadOnly := False;
  Cuantia.Properties.ReadOnly := False;


  try
    if (TipoLibro = 'C') then
      CodNuevo := dmTablaLibros.DarNuevoCodigoCaja
    else if (TipoLibro = 'B') then
      CodNuevo := dmTablaLibros.DarNuevoCodigoBanco
    else
      VerMensaje('LOG: fallo gordo con los contadores de libros');

    with TablaDetallesLibro do
    begin
      Close;
      Prepare;
      Open;
      Insert;
      FieldByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      FieldByName('TIPOLIBRO').AsString := TipoLibro;
      FieldByName('NUMENTRADA').AsString := CodNuevo;
      FieldByName('TIPOENTRADA').AsString := 'E';
      FieldByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha;
      FieldByName('USUARIO').AsString := dmBaseDatos.Usuario;
      FieldByName('FECHAENTRADA').AsDateTime := dmBaseDatos.DarFecha;
      FieldByName('CUANTIA').AsString := '0';
      FieldByName('CUANTIA').OnSetText := CuantiaSetText;
    end;

    dmTablaLibros.InicializarTablaDetallesLibro(@TablaDetallesLibro);

    Visible := True;
    Descripcion.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrDetalleLibro.ActivarModoModificar;
begin

  dsDetallesLibro.AutoEdit := True;
  NumeroEntrada.Properties.Buttons[0].Visible := True;
  NumeroEntrada.Properties.ReadOnly := True;
  FechaEntrada.Properties.ReadOnly := True;
  Cuantia.Properties.ReadOnly := True;

  try
    with TablaDetallesLibro do
    begin
      Prepare;
      Open;
      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgLibNoExisteEnt, [NumEntrada]);
        CancelarAnadir;
        CloseFrame;
        Exit;
      end;
      // Bloquear la entrada
      Edit;
      Post;
      Edit;
    end;

    dmTablaLibros.InicializarTablaDetallesLibro(@TablaDetallesLibro);

    Visible := True;
    bGuardar.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrDetalleLibro.ActivarModoConsultar;
begin

  dsDetallesLibro.AutoEdit := False;
  NumeroEntrada.Properties.Buttons[0].Visible := True;

  try
    with TablaDetallesLibro do
    begin
      Prepare;
      Open;
      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgLibNoExisteEnt, [NumEntrada]);
        CancelarAnadir;
        CloseFrame;
        Exit;
      end;
    end;

    dmTablaLibros.InicializarTablaDetallesLibro(@TablaDetallesLibro);

    Visible := True;
    bSalir.SetFocus;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrDetalleLibro.AnadirDatos : boolean;
var
  Importe : Double;
begin
  Result := False;
  try
    if Entidad = entEntLibro then
    begin
      Importe := TablaDetallesLibro.FieldByName('CUANTIA').AsFloat;
      TablaDetallesLibro.FieldByName('TIPOENTRADA').AsString := CTE_ENT;
    end
    else if Entidad = entSalLibro then
    begin
      Importe := (-1) * TablaDetallesLibro.FieldByName('CUANTIA').AsFloat;
      TablaDetallesLibro.FieldByName('TIPOENTRADA').AsString := CTE_SAL;
    end
    else VerMensaje('LOG:Error no esta asignada la entidad');

    TablaDetallesLibro.FieldByName('IMPORTEANT').AsFloat := dmTablaLibros.darUltimoImportePos(TipoLibro);
    TablaDetallesLibro.FieldByName('IMPORTEPOS').AsFloat := TablaDetallesLibro.FieldByName('IMPORTEANT').AsFloat + Importe;
    TablaDetallesLibro.FieldByName('CUANTIA').AsFloat := Importe;
    TablaDetallesLibro.Post;

    TipoLibro := TablaDetallesLibro.FieldByName('TIPOLIBRO').AsString;
    NumEntrada := TablaDetallesLibro.FieldByName('NUMENTRADA').AsString;

    if (TipoLibro = 'C') then
      dmTablaLibros.IncrementarCodigoCaja
    else if (TipoLibro = 'B') then
      dmTablaLibros.IncrementarCodigoBanco
    else
      VerMensaje('LOG: fallo gordo con los contadores de libros');

    Commit;

    TablaDetallesLibro.Close;

    Result := True;
  except
    on E : EIBError do begin
      if E.IBErrorCode = isc_unique_key_violation then
      begin
        VerMensajeFmt(msgLibNumEntRepetida, [NumEntrada.DataBinding.Field.AsString]);
        TablaDetallesLibro.Edit;
      end
      else
        TratarExcepcion(E);
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrDetalleLibro.ModificarDatos : boolean;
begin
  Result := False;
  try
    TablaDetallesLibro.Post;
    Commit;
    TablaDetallesLibro.Close;
    Result := True;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : VerMensajeFmt(msgLibEntBloqueada, [NumeroEntrada.DataBinding.Field.AsString]);
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrDetalleLibro.CancelarAnadir: Boolean;
begin
  Result := False;
  try
    RollBack;
    TablaDetallesLibro.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrDetalleLibro.ComprobarDatos: Boolean;
begin
  Result := False;

  if EsCadenaVacia(Descripcion.Text) then
  begin
    VerMensaje(msgLibFaltaDescEnt);
    Descripcion.SetFocus;
    Exit;
  end;
  Result := True;
end;

procedure TfrDetalleLibro.VerModal;
begin
  if (ContenidoModal is TRdxFrameDetallesLibro) then
    (ContenidoModal as TRdxFrameDetallesLibro).TipoLibro := TipoLibro;
    (ContenidoModal as TRdxFrameDetallesLibro).NumEntrada := NumEntrada;
  inherited;
end;

procedure TfrDetalleLibro.FreeContenido;
begin
  if (ContenidoModal is TRdxFrameDetallesLibro) then begin
    TipoLibro := (ContenidoModal as TRdxFrameDetallesLibro).TipoLibro;
    NumEntrada := (ContenidoModal as TRdxFrameDetallesLibro).NumEntrada;
    ActivarModo;
  end;
  inherited FreeContenido;
end;

procedure TfrDetalleLibro.BuscarNumEntrada;
begin
  if Transaccion = NIL then
    exit;
  try
    TablaDetallesLibro.Close;

    // Buscar la fila a tratar si es necesario
    if not esCadenaVacia(TipoLibro) and not esCadenaVacia(NumEntrada) then
    begin
        TablaDetallesLibro.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
        TablaDetallesLibro.ParamByName('TIPOLIBRO').AsString := TipoLibro;
        TablaDetallesLibro.ParamByName('NUMENTRADA').AsString := NumEntrada;
    end;
    TablaDetallesLibro.Prepare;
    TablaDetallesLibro.Open;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrDetalleLibro.CuantiaSetText(Sender: TField; const Text: String);
begin
  if EsCadenaVacia(Text) then begin
    Sender.AsString := '0';
    exit;
  end;

  try
    if StrToFloat(Text) < 0
    then begin
      VerMensaje (msgImportePositivo);
      Sender.AsFloat := (-1) * StrToFloat(Text)
    end
    else Sender.AsString := Text;
  except
    on E : EConvertError do begin
      Sender.AsString := '0'
    end;
  end;
end;

////////////////////////////////////////////////////////////////////////////////
// PUBLIC
////////////////////////////////////////////////////////////////////////////////
constructor TfrDetalleLibro.Create (AOwner : TComponent);
begin
  inherited Create(AOwner);
  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;

  TablaDetallesLibro := TIBDataSet.Create(Self);
  dsDetallesLibro.DataSet := TablaDetallesLibro;

  with TablaDetallesLibro do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaLibros.sqlConsultarDetalleLibro);
    InsertSQL.Assign(dmTablaLibros.sqlInsertarDetalleLibro);
    ModifySQL.Assign(dmTablaLibros.sqlModificarDetalleLibro);
    DeleteSQL.Assign(dmTablaLibros.sqlEliminarDetalleLibro);
    RefreshSQL.Assign(dmTablaLibros.sqlConsultarDetalleLibro);
  end;
end;

destructor TfrDetalleLibro.Destroy;
begin
  TablaDetallesLibro.Close;
  TablaDetallesLibro.UnPrepare;
  TablaDetallesLibro.Free;
  inherited;
end;

procedure TfrDetalleLibro.bAceptarClick(Sender: TObject);
begin
  if (RealizarOperacion) then
    CloseFrame;
end;

procedure TfrDetalleLibro.bSalirClick(Sender: TObject);
begin
  try
    Rollback;
    CloseFrame;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrDetalleLibro.bCancelarClick(Sender: TObject);
begin
  if (TratarCambios = IDOK) then
    CloseFrame;
end;

procedure TfrDetalleLibro.CodigoPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer);
begin
  if (TratarCambios = IDCANCEL) then
    exit;
  ContenidoModal := TfrDetallesLibro.Create(Self);
end;

function TfrDetalleLibro.CancelarModificar: Boolean;
begin
  Result := False;
  try
    RollBack;
    TablaDetallesLibro.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrDetalleLibro.SetNumEntrada(Value: Variant);
begin
  inherited;
  if VarIsNull(Value) then
     exit;

  if (Modo <> Anadir) then begin
    if (TablaDetallesLibro.FieldByName('CUANTIA').AsFloat < 0)
    then Entidad := entSalLibro
    else Entidad := entEntLibro;
  end;
end;

end.
