{
===============================================================================
  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.0
  Fecha versión actual: 26-01-2003
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
===============================================================================
}

unit DetallesLibro;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, DBGrids, ComCtrls, RdxBotones, ToolWin, ExtCtrls,
  Menus, am2000menuitem, am2000popupmenu, am2000, Db, DBTables,
  RXDBCtrl, RdxPaneles, RdxBarras, RdxDBFrame, RdxFrame,
  cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxEdit, cxDBData, cxGridTableView,
  cxGridCustomTableView, cxGridDBTableView, cxGridLevel, cxClasses, cxControls,
  cxGridCustomView, cxGrid, Configuracion, StdCtrls, Buttons, 
  AdvPanel, cxContainer, cxTextEdit,
  cxMaskEdit, cxDropDownEdit, cxLookupEdit, cxDBLookupEdit,
  cxDBLookupComboBox, ActnList, RdxFrameDetallesLibro, ImgList,

  RdxEmpresaActiva, am2000utils, cxDataStorage;

type
  TfrDetallesLibro = class(TRdxFrameDetallesLibro)
    dsDetallesLibro: TDataSource;
    brSeleccion: TRdxBarraInferior;
    bSeleccionar: TRdxBoton;
    bCancelar: TRdxBoton;
    BarraDetallesLibro: TRdxBarraSuperior;
    MenuOpciones: TPopupMenu2000;
    mnuAnadir: TMenuItem2000;
    mnuEliminar: TMenuItem2000;
    VistaDetalles: TcxGridDBTableView;
    gridDetallesLibroLevel1: TcxGridLevel;
    gridDetallesLibro: TcxGrid;
    mnuConsultar: TMenuItem2000;
    pnlCuerpo: TPanel;
    Acciones: TActionList;
    actModificar: TAction;
    actConsultar: TAction;
    actSeleccionar: TAction;
    actCancelar: TAction;
    actImprimir: TAction;
    mnuImprimir: TMenuItem2000;
    actAnular: TAction;
    menuAnadir: TPopupMenu2000;
    mnuEntrada: TMenuItem2000;
    mnuSalida: TMenuItem2000;
    actAnadirEnt: TAction;
    actAnadirSal: TAction;
    bAnadir: TRdxBotonMenu;
    bEliminar: TRdxBotonSuperior;
    bConsultar: TRdxBotonSuperior;
    bAnular: TRdxBotonSuperior;
    bCerrar: TRdxBotonSuperior;
    actCerrar: TAction;
    bSeparador1: TShape;
    mnuAnular: TMenuItem2000;
    mnuCerrar: TMenuItem2000;
    mnuSep: TMenuItem2000;
    RdxBotonSuperior1: TRdxBotonSuperior;
    bImprimir: TRdxBotonSuperior;
    bSeparador2: TShape;
    actCambioTrimestre: TAction;
    imgSombra: TImage;
    pnlCuerpo2: TRdxPanel;
    pnlExtra: TRdxBarraSuperior;
    bRefrescar: TRdxBoton;
    actGestionVentas: TAction;
    actGestionCompras: TAction;
    menuGestionar: TPopupMenu2000;
    MenuItem20001: TMenuItem2000;
    MenuItem20002: TMenuItem2000;
    bGestionar: TRdxBotonMenu;
    Panel1: TPanel;
    eNombre: TLabel;
    Buscar: TcxTextEdit;
    RdxBoton1: TRdxBoton;
    procedure actAnadirEntExecute(Sender: TObject);
    procedure actAnadirSalExecute(Sender: TObject);
    procedure actModificarExecute(Sender: TObject);
    procedure actConsultarExecute(Sender: TObject);
    procedure actAnularExecute(Sender: TObject);
    procedure actSeleccionarExecute(Sender: TObject);
    procedure actCancelarExecute(Sender: TObject);
    procedure actImprimirExecute(Sender: TObject);
    procedure bLimpiarClick(Sender: TObject);
    procedure RdxFrameDetallesLibroShow(Sender: TObject);
    procedure VistaDetallesDblClick(Sender: TObject);
    procedure VistaDetallesCustomDrawCell(
      Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
      AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
    procedure actCerrarExecute(Sender: TObject);
    procedure actCambioTrimestreExecute(Sender: TObject);
    procedure actRefrescarDatosExecute(Sender: TObject);
    procedure actGestionVentasExecute(Sender: TObject);
    procedure actGestionComprasExecute(Sender: TObject);
    procedure BuscarPropertiesChange(Sender: TObject);
  private
    FListaTipoLibro: TStringList;
    procedure ActualizarBotones;
  protected
    procedure SetTipoLibro (Value : Variant); override;
    procedure BuscarLibro; override;
    procedure BuscarNumEntrada; override;
    procedure FreeContenido; override;
  public
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
  end;

var
  frDetallesLibro: TfrDetallesLibro;

implementation
{$R *.DFM}
uses
  IBCustomDataSet, BaseDatos, Entidades, Variants,
  Mensajes, IBSQL, IBDatabase, IB, Excepciones, TablaLibros, Literales,
  DetalleLibro, ImprimirLibro, StrFunc, Constantes,
  TrimestrePredeterminado, TablaEmpresas, InformeTrimestral;

////////////////////////////////////////////////////////////////////////////////
// PRIVATE
////////////////////////////////////////////////////////////////////////////////
procedure TfrDetallesLibro.ActualizarBotones;
begin
  if BaseDatos.IsReadOnly then
  begin
    actAnadirEnt.Enabled := False;
    actAnadirSal.Enabled := False;
    actModificar.Enabled := False;
    actConsultar.Enabled := True;
    actImprimir.Enabled := True;
    actAnular.Enabled := False;
    actCerrar.Enabled := False;
    Exit;
  end;

  if TablaDetallesLibro.RecordCount = 0 then
  begin
    actAnadirEnt.Enabled := True;
    actAnadirSal.Enabled := True;
    actModificar.Enabled := False;
    actConsultar.Enabled := False;
    actImprimir.Enabled := False;
    actAnular.Enabled := False;
    actCerrar.Enabled := False;
  end
  else begin
    actAnadirEnt.Enabled := True;
    actAnadirSal.Enabled := True;
    actModificar.Enabled := True;
    actConsultar.Enabled := True;
    actImprimir.Enabled := True;
    actAnular.Enabled := True;
    actCerrar.Enabled := True;
  end;
end;

////////////////////////////////////////////////////////////////////////////////
// PROTECTED
////////////////////////////////////////////////////////////////////////////////
procedure TfrDetallesLibro.SetTipoLibro(Value: Variant);
begin
  inherited;
  BarraDetallesLibro.Caption := FListaTipoLibro.Values[Value];
  VistaDetalles.Controller.GoToFirst;
end;

procedure TfrDetallesLibro.BuscarLibro;
begin
  if Transaccion = NIL then
    exit;

  try
    TablaDetallesLibro.DisableControls;
    TablaDetallesLibro.Close;

//    if not esCadenaVacia(TipoLibro) then
    TablaDetallesLibro.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    TablaDetallesLibro.ParamByName('TIPOLIBRO').AsString := TipoLibro;
    TablaDetallesLibro.Prepare;
    TablaDetallesLibro.Open;
    dmTablaLibros.InicializarTablaDetallesLibro(@TablaDetallesLibro);
    ActualizarBotones;
    TablaDetallesLibro.EnableControls;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrDetallesLibro.BuscarNumEntrada;
begin
  with TablaDetallesLibro do
  begin
    DisableControls;
    Close;
    Open;
    dmTablaLibros.InicializarTablaDetallesLibro(@TablaDetallesLibro);
    ActualizarBotones;
    EnableControls;
  end;
  
  if not TablaDetallesLibro.Locate('NUMENTRADA',NumEntrada,[]) then
    VistaDetalles.Controller.GoToFirst
  else
    VistaDetalles.Controller.TopRowIndex := VistaDetalles.Controller.FocusedRowIndex;

end;

procedure TfrDetallesLibro.FreeContenido;
begin
  if (Contenido is TRdxFrameDetallesLibro) then begin
    TipoLibro := (Contenido as TRdxFrameDetallesLibro).TipoLibro;
    NumEntrada := (Contenido as TRdxFrameDetallesLibro).NumEntrada;
  end;
  inherited FreeContenido;
  gridDetallesLibro.SetFocus;
end;

////////////////////////////////////////////////////////////////////////////////
// PUBLIC
////////////////////////////////////////////////////////////////////////////////
constructor TfrDetallesLibro.Create (AOwner : TComponent);
begin
  inherited Create(AOwner);
  Entidad := entEntLibro;
  
  FListaTipoLibro := TStringList.Create;
  dmTablaLibros.darLibros(FListaTipoLibro);

  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaDetallesLibro := TIBDataSet.Create(Self);
  dsDetallesLibro.DataSet := TablaDetallesLibro;

  with TablaDetallesLibro do
  begin
    DisableControls;
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaLibros.sqlGridDetallesLibro);
    ActualizarBotones;
    EnableControls;
  end;

  dmTablaLibros.InicializarGridDetallesLibro(VistaDetalles);
  VistaDetalles.OnDblClick := VistaDetallesDblClick;
  VistaDetalles.Controller.GoToFirst;
end;

destructor TfrDetallesLibro.Destroy;
begin
  TablaDetallesLibro.Close;
  TablaDetallesLibro.Unprepare;
  TablaDetallesLibro.Free;

  FListaTipoLibro.Free;
  FListaTipoLibro := NIL;
  inherited;
end;

procedure TfrDetallesLibro.actAnadirEntExecute(Sender: TObject);
var
  lfrContenido : TfrDetalleLibro;
begin
  lfrContenido := TfrDetalleLibro.Create(Self);
  lfrContenido.TipoLibro := TipoLibro;
  Contenido := lfrContenido;
  Contenido.Entidad := entEntLibro;
  Contenido.Modo := Anadir;
end;

procedure TfrDetallesLibro.actAnadirSalExecute(Sender: TObject);
var
  lfrContenido : TfrDetalleLibro;
begin
  lfrContenido := TfrDetalleLibro.Create(Self);
  lfrContenido.TipoLibro := TipoLibro;
  Contenido := lfrContenido;
  Contenido.Entidad := entSalLibro;
  Contenido.Modo := Anadir;
end;

procedure TfrDetallesLibro.actModificarExecute(Sender: TObject);
var
  lfrContenido : TfrDetalleLibro;
begin
  lfrContenido := TfrDetalleLibro.Create(Self);
  lfrContenido.TipoLibro := TipoLibro;
  Contenido := lfrContenido;
  Contenido.Modo := Modificar;
end;

procedure TfrDetallesLibro.actConsultarExecute(Sender: TObject);
var
  lfrContenido : TfrDetalleLibro;
begin
  lfrContenido := TfrDetalleLibro.Create(Self);
  lfrContenido.TipoLibro := TipoLibro;
  Contenido := lfrContenido;
  Contenido.Modo := Consultar;
end;

procedure TfrDetallesLibro.actAnularExecute(Sender: TObject);
var
  lDatosDetalleLibro : TDatosDetalleLibro;
  Importe : Double;
  lsAux : Variant;
begin
  //En el caso de ser un cierre no se anulara nunca
  if (TablaDetallesLibro.FieldByName('TIPOENTRADA').AsString = CTE_CIERRE) then
      exit;

  if VerMensajePregunta('Esta seguro que desea anular la entrada seleccionada') = mrYES then
  begin
    lDatosDetalleLibro := TDatosDetalleLibro.Create;
    lDatosDetalleLibro.TipoLibro := TipoLibro;
    lDatosDetalleLibro.NumEntrada := TablaDetallesLibro.FieldByName('NUMENTRADA').AsString;

    //Descripcion
    lsAux := msgCliSep5;
    lsAux := lsAux + lDatosDetalleLibro.NumEntrada;
    lsAux := lsAux + msgCliSep4;

    if dmTablaLibros.darDatosDetalleLibro(lDatosDetalleLibro) then
    begin

      //Añadimos descripcion
      lsAux := lsAux + lDatosDetalleLibro.Descripcion;
      lDatosDetalleLibro.Descripcion := lsAux;

      //Demás operaciones
      lDatosDetalleLibro.NumEntrada := dmTablaLibros.darNumEntrada(lDatosDetalleLibro.TipoLibro);
      Importe := (-1) * lDatosDetalleLibro.Cuantia;
      if Importe < 0
      then lDatosDetalleLibro.TipoEntrada := CTE_SAL
      else lDatosDetalleLibro.TipoEntrada := CTE_ENT;
      lDatosDetalleLibro.Cuantia := Importe;
      lDatosDetalleLibro.ImporteAnt := dmTablaLibros.darUltimoImportePos(lDatosDetalleLibro.TipoLibro);
      lDatosDetalleLibro.ImportePos := lDatosDetalleLibro.ImporteAnt + Importe;
      if dmTablaLibros.AnadirDetalleLibro(lDatosDetalleLibro) then begin
        if dmTablaLibros.incrementarNumEntrada(lDatosDetalleLibro.TipoLibro) then
          commit
        else begin
          rollback;
          verMensaje('No se ha podido anular la entrada');
        end
      end
      else begin
        rollback;
        verMensaje('No se ha podido anular la entrada');
      end;
    end
    else verMensaje('Log: error en laq recogida de datos');
    lDatosDetalleLibro.Free;
    BuscarNumEntrada;
  end;
end;

procedure TfrDetallesLibro.actSeleccionarExecute(Sender: TObject);
begin
  if TablaDetallesLibro.RecordCount = 0 then
  begin
    VerMensaje(msgLibNoExisteEnt);
    exit;
  end;

  NumEntrada := TablaDetallesLibro.FieldByName('NUMENTRADA').AsString;
  CloseFrame;
end;

procedure TfrDetallesLibro.actCancelarExecute(Sender: TObject);
begin
  NumEntrada := NULL;
  CloseFrame;
end;

procedure TfrDetallesLibro.bLimpiarClick(Sender: TObject);
begin
  Buscar.Text := '';
end;

procedure TfrDetallesLibro.RdxFrameDetallesLibroShow(Sender: TObject);
begin
  gridDetallesLibro.SetFocus;
end;

procedure TfrDetallesLibro.VistaDetallesDblClick(Sender: TObject);
begin
  if Modo = Seleccionar then
    actSeleccionar.Execute
  else
    actConsultar.Execute;
end;

procedure TfrDetallesLibro.actImprimirExecute(Sender: TObject);
var
  lfrContenido :  TfrImprimirLibro;
begin
  lfrContenido := TfrImprimirLibro.Create(Self);
  lfrContenido.TipoLibro := TipoLibro;
  Contenido := lfrContenido;
  Contenido.Modo := Imprimir;
end;

procedure TfrDetallesLibro.VistaDetallesCustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  IndiceCol : Integer;
begin
  if not AViewInfo.Selected then
  begin
    IndiceCol := (Sender as TcxGridDBTableView).GetColumnByFieldName('TIPOENTRADA').Index;
    if UpperCase(Copy(AViewInfo.GridRecord.DisplayTexts[IndiceCol], 1, 1)) = CTE_CIERRE then
    begin
      ACanvas.Canvas.Brush.Color := $006D1555;
      ACanvas.Canvas.Font.Color := clWhite;
    end;

    IndiceCol := (Sender as TcxGridDBTableView).GetColumnByFieldName('CUANTIA').Index;
    if (IndiceCol = AViewInfo.Item.Index) then
    begin
      if Copy(Trim(AViewInfo.GridRecord.DisplayTexts[IndiceCol]), 1, 1) = '-' then
      begin
        ACanvas.Canvas.Font.Color := $000000CC;
      end;
    end;
  end;
end;

procedure TfrDetallesLibro.actCerrarExecute(Sender: TObject);
begin
  if dmTablaLibros.CerrarLibro(TablaDetallesLibro.FieldByName('TIPOLIBRO').AsString) then
    Commit
  else
    Rollback;
  BuscarNumEntrada;
end;

procedure TfrDetallesLibro.actCambioTrimestreExecute(Sender: TObject);
begin
  fTrimestrePredeterminado := TfTrimestrePredeterminado.Create(Self);
  fTrimestrePredeterminado.Entidad := entEntLibro;  
  try
    fTrimestrePredeterminado.ShowModal;
  finally
    fTrimestrePredeterminado.Free;
  end;
end;

procedure TfrDetallesLibro.actRefrescarDatosExecute(Sender: TObject);
begin
  BuscarLibro;
  VistaDetalles.DataController.GotoFirst;
end;

procedure TfrDetallesLibro.actGestionVentasExecute(Sender: TObject);
begin
  CaptionModal := 'Gestionar trimestre de ventas';
  HeightModal := 600;
  WidthModal := 950;
  ModoModal := Consultar;
  EntidadModal := entInformeTrimestralVentas;
  ContenidoModal := TfrInformeTrimestral.Create(Self);
end;

procedure TfrDetallesLibro.actGestionComprasExecute(Sender: TObject);
begin
  CaptionModal := 'Gestionar trimestre de compras';
  HeightModal := 600;
  WidthModal := 950;
  ModoModal := Consultar;
  EntidadModal := entInformeTrimestralCompras;
  ContenidoModal := TfrInformeTrimestral.Create(Self);
end;

procedure TfrDetallesLibro.BuscarPropertiesChange(Sender: TObject);
begin
  FiltrarGrid(gridDetallesLibro, Buscar.Text);
end;

end.



