{
===============================================================================
  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: 25-12-2002
  Versión actual: 1.0.1
  Fecha versión actual: 02-02-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    02-02-2004    Se ha eliminado el atributo SERIE (P8 MULTIEMPRESA)
                  Se ha adaptado a los nuevos contadores
===============================================================================
}

unit FacturasClientes;

interface

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

  RdxEmpresaActiva, am2000utils, cxDataStorage;

type
  TfrFacturasClientes = class(TRdxFrameFacturasCliente)
    dsFacturas: TDataSource;
    BarraFacturas: TRdxBarraSuperior;
    bModificar: TRdxBotonSuperior;
    bEliminar: TRdxBotonSuperior;
    bConsultar: TRdxBotonSuperior;
    pnlCuerpo: TRdxPanel;
    pnlGrid: TRdxPanel;
    brSeleccion: TRdxBarraInferior;
    bSeleccionar: TRdxBoton;
    bCancelar: TRdxBoton;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    gridFacturas: TcxGrid;
    gridFacturasDBTableView1: TcxGridDBTableView;
    gridFacturasLevel1: TcxGridLevel;
    bSeparador1: TShape;
    MenuOpciones: TPopupMenu2000;
    miAnadir: TMenuItem2000;
    miModificar: TMenuItem2000;
    miEliminar: TMenuItem2000;
    miConsultar: TMenuItem2000;
    miSeparador: TMenuItem2000;
    miImprimir: TMenuItem2000;
    bImprimir: TRdxBotonSuperior;
    menuAnadir: TPopupMenu2000;
    mnFacturaA: TMenuItem2000;
    MenuItem20004: TMenuItem2000;
    bAnadir: TRdxBotonMenu;
    pnlExtra: TRdxBarraSuperior;
    Acciones: TActionList;
    actAnadir: TAction;
    actModificar: TAction;
    actEliminar: TAction;
    actConsultar: TAction;
    actImprimir: TAction;
    actSeleccionar: TAction;
    actCancelar: TAction;
    actAceptar: TAction;
    MenuItem6: TMenuItem2000;
    MenuItem2: TMenuItem2000;
    actAnadirFContrato: TAction;
    Panel1: TPanel;
    bSeparador2: TShape;
    eFamilia: TLabel;
    cbxDocumento: TcxComboBox;
    actAnadirAbono: TAction;
    imgSombra: TImage;
    bRefrescar: TRdxBoton;
    Shape1: TShape;
    RdxBotonSuperior1: TRdxBotonSuperior;
    actConsultarCobros: TAction;
    Shape2: TShape;
    bFacturar: TRdxBoton;
    actCambiarSituacion: TAction;
    Panel2: TPanel;
    eNombre: TLabel;
    Buscar: TcxTextEdit;
    bLimpiar: TRdxBoton;
    procedure RdxFrameFacturasClienteShow(Sender: TObject);
    procedure actImprimirExecute(Sender: TObject);
    procedure actAnadirExecute(Sender: TObject);
    procedure actAnadirBExecute(Sender: TObject);
    procedure actModificarExecute(Sender: TObject);
    procedure actEliminarExecute(Sender: TObject);
    procedure actConsultarExecute(Sender: TObject);
    procedure actSeleccionarExecute(Sender: TObject);
    procedure actCancelarExecute(Sender: TObject);
    procedure actAceptarExecute(Sender: TObject);
    procedure gridFacturasDBTableView1DblClick(Sender: TObject);
    procedure gridFacturasDBTableView1CustomDrawCell(
      Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
      AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
    procedure actAnadirAbonoExecute(Sender: TObject);
    procedure actAnadirAbonoBExecute(Sender: TObject);
    procedure actAnadirFContratoExecute(Sender: TObject);
    procedure cbxDocumentoPropertiesEditValueChanged(Sender: TObject);
    procedure actRefrescarDatosExecute(Sender: TObject);
    procedure actConsultarCobrosExecute(Sender: TObject);
    procedure actCambiarSituacionExecute(Sender: TObject);
    procedure BuscarPropertiesChange(Sender: TObject);
    procedure bLimpiarClick(Sender: TObject);
  private
    FCodigoCliente : String;
    FCodigoContrato : Variant;
    procedure ActualizarBotones;
    procedure FiltrarDatos;
  protected
    procedure FreeContenido; override;
    procedure SetContenido (NuevoFrame : TRdxFrame); override;
    procedure BuscarFactura; override;
    procedure VerModal; override;
    procedure CambiarModo(ModoAnterior, Modo : TRdxModo); override;
  public
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  end;

var
  frFacturasClientes: TfrFacturasClientes;

implementation

{$R *.DFM}
uses
  BaseDatos, TablaFacturasCliente, IBDatabase, FacturaCliente, Literales,
  IBCustomDataSet, Mensajes, Entidades, Variants, ImprimirFacturasCliente,
  Constantes, RdxFrameContratos, ContratosClientes, StrFunc,
  FacturarContrato, TablaDocumentos, TablaEmpresas, ListadoPagosCliente,
  CambiarSituacionFacturas;

procedure TfrFacturasClientes.BuscarFactura;
begin
  with TablaFacturas do
  begin
    DisableControls;
    Close;
    Open;
    dmTablaFacturasCliente.InicializarTablaFacturas(@TablaFacturas);
    ActualizarBotones;

    EnableControls;
    if not Locate('CODIGO', CodigoFactura, []) then
      gridFacturasDBTableView1.Controller.GoToFirst
    else
      gridFacturasDBTableView1.Controller.TopRowIndex := gridFacturasDBTableView1.Controller.FocusedRowIndex;
  end;
end;

constructor TfrFacturasClientes.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Entidad := entFacturaCliente;

  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaFacturas := TIBDataSet.Create(Self);
  dsFacturas.DataSet := TablaFacturas;

  with TablaFacturas do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaFacturasCliente.sqlConsultarGridFacturas);
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    Prepare;
    Open;
    ActualizarBotones;
  end;
  dmTablaFacturasCliente.InicializarTablaFacturas(@TablaFacturas);
  dmTablaFacturasCliente.InicializarGridFacturas(gridFacturas);

  gridFacturasDBTableView1.OnDblClick := gridFacturasDBTableView1DblClick;
  gridFacturasDBTableView1.Controller.GoToFirst;

  cbxDocumento.Properties.Items.Add('Todos');
  cbxDocumento.Properties.Items.AddStrings(dmTablaDocumentos.DarDocumentos);
  cbxDocumento.ItemIndex := 0;
end;

destructor TfrFacturasClientes.Destroy;
begin
  TablaFacturas.Close;
  TablaFacturas.UnPrepare;
  TablaFacturas.Free;
  inherited;
end;

procedure TfrFacturasClientes.FreeContenido;
begin
  if (ContenidoModal is TRdxFrameContratos) then
    FCodigoContrato := (ContenidoModal as TRdxFrameContratos).CodigoContrato;

  if (Contenido is TRdxFrameFacturasCliente) then
  begin
    CodigoFactura := (Contenido as TRdxFrameFacturasCliente).CodigoFactura;
  end;
  
  inherited FreeContenido;
  gridFacturas.SetFocus;
end;

procedure TfrFacturasClientes.ActualizarBotones;
begin
  if BaseDatos.IsReadOnly then
  begin
    actAnadir.Enabled := False;
    actModificar.Enabled := False;
    actEliminar.Enabled := False;
    actConsultar.Enabled := True;
    actImprimir.Enabled := True;
    actConsultarCobros.Enabled := True;
    Exit;
  end;

  if TablaFacturas.RecordCount = 0 then
  begin
    actAnadir.Enabled := True;
    actModificar.Enabled := False;
    actEliminar.Enabled := False;
    actConsultar.Enabled := False;
    actImprimir.Enabled := False;
    actConsultarCobros.Enabled := False;
  end
  else begin
    actAnadir.Enabled := True;
    actModificar.Enabled := True;
    actEliminar.Enabled := True;
    actConsultar.Enabled := True;
    actImprimir.Enabled := True;
    actConsultarCobros.Enabled := True;
  end;
end;

procedure TfrFacturasClientes.RdxFrameFacturasClienteShow(Sender: TObject);
begin
  gridFacturas.SetFocus;
end;

procedure TfrFacturasClientes.SetContenido(NuevoFrame: TRdxFrame);
begin
  inherited;
  if (Contenido is TfrImprimirFacturasCliente) then
    (Contenido as TfrImprimirFacturasCliente).CodigoFactura := FCodigoFactura;
  if (Contenido is TfrListadoPagosCliente) then
    (Contenido as TfrListadoPagosCliente).CodigoCliente := TablaFacturas.FieldByName('CODIGOCLIENTE').AsVariant;
end;

procedure TfrFacturasClientes.actImprimirExecute(Sender: TObject);
begin
  Contenido := TfrImprimirFacturasCliente.Create(Self);
  Contenido.Modo := Imprimir;
end;

procedure TfrFacturasClientes.actAnadirExecute(Sender: TObject);
begin
  Contenido := TfrFacturaCliente.Create(Self);
  Contenido.Entidad := entFacturaVarios;
  Contenido.Modo := Anadir;
end;

procedure TfrFacturasClientes.actAnadirBExecute(Sender: TObject);
begin
  Contenido := TfrFacturaCliente.Create(Self);
  Contenido.Entidad := entFacturaVarios;
  Contenido.Modo := Anadir;
end;

procedure TfrFacturasClientes.actModificarExecute(Sender: TObject);
begin
  Contenido := TfrFacturaCliente.Create(Self);
  Contenido.Modo := Modificar;
end;

procedure TfrFacturasClientes.actEliminarExecute(Sender: TObject);
begin
  Contenido := TfrFacturaCliente.Create(Self);
  Contenido.Modo := Eliminar;
end;

procedure TfrFacturasClientes.actConsultarExecute(Sender: TObject);
begin
  Contenido := TfrFacturaCliente.Create(Self);
  Contenido.Modo := Consultar;
end;

procedure TfrFacturasClientes.actSeleccionarExecute(Sender: TObject);
begin
  CodigoFactura := TablaFacturas.FieldByName('CODIGO').AsString;
  CloseFrame;
end;

procedure TfrFacturasClientes.actCancelarExecute(Sender: TObject);
begin
  FCodigoFactura := NULL;
  CloseFrame;
end;

procedure TfrFacturasClientes.actAceptarExecute(Sender: TObject);
begin
  CloseFrame;
end;

procedure TfrFacturasClientes.gridFacturasDBTableView1DblClick(
  Sender: TObject);
begin
  if Modo = Seleccionar then
    actSeleccionar.Execute
  else
    actModificar.Execute;
end;

procedure TfrFacturasClientes.gridFacturasDBTableView1CustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  IndiceCol : Integer;
begin
  if not AViewInfo.Selected then
  begin
    IndiceCol := (Sender as TcxGridDBTableView).GetColumnByFieldName('CLASEFACTURA').Index;
    if UpperCase(AViewInfo.GridRecord.DisplayTexts[IndiceCol]) = CTE_CF_ABONO then
      ACanvas.Canvas.Font.Color := $000000CC;
  end;
end;

procedure TfrFacturasClientes.actAnadirAbonoExecute(Sender: TObject);
begin
  Contenido := TfrFacturaCliente.Create(Self);
  Contenido.Entidad := entAbonoVarios;
  Contenido.Modo := Anadir;
end;

procedure TfrFacturasClientes.actAnadirAbonoBExecute(Sender: TObject);
begin
  Contenido := TfrFacturaCliente.Create(Self);
  Contenido.Entidad := entAbonoVarios;
  Contenido.Modo := Anadir;
end;

procedure TfrFacturasClientes.actAnadirFContratoExecute(Sender: TObject);
var
  CodAux : String;
begin
  // Mostrar la lista de contratos que se pueden facturar
  CaptionModal := 'Elija el contrato que quiere facturar';
  ContenidoModal := TfrContratosClientes.Create(Self);

  if (not EsCadenaVacia(FCodigoContrato)) then
  begin
    frFacturarContrato := TfrFacturarContrato.Create(Self);
    with frFacturarContrato do
    begin
      try
        CodigoContrato := FCodigoContrato;
        ShowModal;

        if ModalResult = mrYes then
        begin
          Commit;
          Self.CodigoFactura := frFacturarContrato.CodigoFactura;
          Contenido := TfrFacturaCliente.Create(Self);
          Contenido.Modo := Modificar;
          Contenido.Visible := True;
        end
        else
          Rollback;
      finally
        Free;
      end;
    end;
  end;
end;

procedure TfrFacturasClientes.VerModal;
begin
  if (ContenidoModal is TRdxFrameContratos) then
    (ContenidoModal as TRdxFrameContratos).Modo := Facturar;
  inherited;
end;

procedure TfrFacturasClientes.cbxDocumentoPropertiesEditValueChanged(
  Sender: TObject);
begin
//  FiltrarDatos;
end;

procedure TfrFacturasClientes.FiltrarDatos;
var
  Columna : TcxGridDBColumn;
  AItemList: TcxFilterCriteriaItemList;
  TextoDocumento : String;
begin
  TextoDocumento := cbxDocumento.Text;
  with gridFacturas.ActiveView.DataController.Filter do
  begin
    BeginUpdate;
    try
      Columna := (gridFacturas.ActiveView as TcxGridDBTableView).GetColumnByFieldName('DESCRIPCION');
      if UpperCase(TextoDocumento) = 'TODOS' then
      begin
        Columna.Visible := True;
        Entidad := entFacturaCliente;
        Root.Clear;
        Active := True;
      end
      else begin
        Columna.Visible := False;
        Root.Clear;
        AItemList := Root.AddItemList(fboAnd);
        AItemList.AddItem(Columna, foEqual, TextoDocumento, 'Descripcion');
        Active := True;
        Entidad := dmTablaDocumentos.DarEntidadDocumento(entFacturaCliente, TablaFacturas.FieldByName('CODIGODOCUMENTO').AsString);
      end;
    finally
      EndUpdate;
      gridFacturas.ActiveView.DataController.GotoFirst;
    end;
  end;
end;

procedure TfrFacturasClientes.CambiarModo(ModoAnterior, Modo: TRdxModo);
begin
  inherited;
  dmTablaFacturasCliente.InicializarTablaFacturas(@TablaFacturas);
end;

procedure TfrFacturasClientes.actRefrescarDatosExecute(Sender: TObject);
begin
  FCodigoFactura := TablaFacturas.FieldByName('CODIGO').AsString;
  BuscarFactura;
end;

procedure TfrFacturasClientes.actConsultarCobrosExecute(Sender: TObject);
begin
  Contenido := TfrListadoPagosCliente.Create(Self);
  Contenido.Modo := Consultar;
 (Contenido as TfrListadoPagosCliente).activarFacturasCobrosCliente;
end;

procedure TfrFacturasClientes.actCambiarSituacionExecute(Sender: TObject);
var
  IndiceCol1 : Integer;
  IndiceSel : Integer;
  fCambiarSituacionFacturas : TfrCambiarSituacionFacturas;

begin
  fCambiarSituacionFacturas := TfrCambiarSituacionFacturas.Create(Self);

  //Rellenamos la propiedad de la unidad CambiarSituacion con los códigos seleccionados
  IndiceCol1 := gridFacturasDBTableView1.GetColumnByFieldName('CODIGO').Index;
  for IndiceSel:=0 to gridFacturasDBTableView1.Controller.SelectedRowCount-1 do
      fCambiarSituacionFacturas.CodigosFacturas.Append(gridFacturasDBTableView1.Controller.SelectedRows[IndiceSel].Values[IndiceCol1]);

  try
    fCambiarSituacionFacturas.ShowModal;
  finally
    fCambiarSituacionFacturas.Free;
    bRefrescar.Click;
  end;
end;

procedure TfrFacturasClientes.BuscarPropertiesChange(Sender: TObject);
begin
  FiltrarGrid(gridFacturas, Buscar.Text);
end;

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

end.
