{
===============================================================================
  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: 16-11-2002
  Versión actual: 1.0.1
  Fecha versión actual: 29-01-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    29-01-2004    Utilizar el trimestre por defecto.
===============================================================================
}

unit ComisionesVendedores;

interface

uses
  Windows, Db, StdCtrls, RdxMemo, RdxCampos, RdxTitulos, Forms, RdxPaneles,
  RdxBotones, Controls, ExtCtrls, RdxBarras, Classes, RdxFrameComisiones,
  RdxFrame, RXDBCtrl, RxMemDS, ComCtrls, cxDBEdit, cxMaskEdit, cxButtonEdit,
  Configuracion, cxControls, cxContainer, cxEdit, cxTextEdit, cxMemo, AdvPanel,
  cxSpinEdit, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDBData,
  cxGridLevel, cxClasses, cxGridCustomView, cxGridCustomTableView,
  cxGridTableView, cxGridDBTableView, cxGrid, cxDropDownEdit, cxCalendar,
  InformeComisionesVendedores, vistaPrevia,
  RdxRadioButton, TablaTrimestres, ActnList,    Entidades,

  RdxEmpresaActiva, cxDataStorage;

type
  TfrComisionesVendedores = class(TRdxFrameComisiones)
    brSimple: TRdxBarraInferior;
    dsFacturas: TDataSource;
    Titulo: TRdxPanelTituloOperacion;
    pnlDatos: TAdvPanel;
    pnlCuerpo: TPanel;
    pnlGridArticulos: TPanel;
    gridFacturas: TcxGrid;
    gridFacturasDBTableView1: TcxGridDBTableView;
    gridFacturasLevel1: TcxGridLevel;
    Panel1: TPanel;
    gridVendedores: TcxGrid;
    gridVendedoresDBTableView1: TcxGridDBTableView;
    gridVendedoresLevel1: TcxGridLevel;
    dsVendedores: TDataSource;
    Panel2: TPanel;
    bVistaPrevia: TRdxBoton;
    bImprimir: TRdxBoton;
    bCancelar: TRdxBoton;
    ImporteTotal: TLabel;
    Panel3: TPanel;
    FechaInicial: TcxDateEdit;
    eFechaFin: TLabel;
    FechaFinal: TcxDateEdit;
    Panel4: TPanel;
    Label1: TLabel;
    rbFechas: TRdxRadioButton;
    rbTrimestre: TRdxRadioButton;
    cbxTrimestres: TcxComboBox;
    pnlBarraGrid: TRdxPanel;
    bSeleccionar: TRdxBoton;
    bDeseleccionar: TRdxBoton;
    bAgregar: TRdxBoton;
    procedure actCancelarExecute(Sender: TObject);
    procedure bImprimirClick(Sender: TObject);
    procedure bCancelarClick(Sender: TObject);
    procedure bVistaPreviaClick(Sender: TObject);
    procedure FechaInicialPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure gridFacturasDBTableView1CustomDrawCell(
      Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
      AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
    procedure FechaFinalPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure cbxTrimestresPropertiesEditValueChanged(Sender: TObject);
    procedure rbTrimestreClick(Sender: TObject);
    procedure rbFechasClick(Sender: TObject);
    procedure bSeleccionarClick(Sender: TObject);
    procedure bDeseleccionarClick(Sender: TObject);
    procedure bAgregarClick(Sender: TObject);
  private
    FListaTrimestres : TListaTrimestres;
    FTotal : Double;
    FInformeComisionesVendedores : TdmInformeComisionesVendedores;
    FCodigoFactura: Variant;
    procedure SetTotal (Value : Double);
    property Total: Double read FTotal write SetTotal;
    procedure CalcularTotal;
    procedure CalcularComisiones;
    procedure setCodigoFactura(const Value: Variant);
  protected
    procedure SeleccionChange(Sender: TObject);
    procedure ActivarModoConsultar; override;
    procedure FreeContenido; override;
    procedure BuscarFacturas; override;
  public
    property CodigoFactura: Variant read FCodigoFactura write setCodigoFactura;

    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
  end;

var
  frComisionesVendedores: TfrComisionesVendedores;

implementation
{$R *.DFM}

uses
  TablaVendedores, Mensajes, IB, Colores, IBDatabase, Vendedores,
  Provincias, RdxFrameProvincias, Poblaciones, RdxFramePoblaciones,
  TablaProvincias, BaseDatos, IBCustomDataSet, Sysutils, Constantes,
  StrFunc, TablaPoblaciones, Excepciones, IBErrorCodes,
  Variants, NumFunc, Literales, TablaFacturasCliente, RdxFrameFacturasCliente,
  DateFunc, cxCheckBox, cxDateUtils, Graphics, TablaEmpresas, FacturasClientes;

procedure TfrComisionesVendedores.ActivarModoConsultar;
begin
  FechaIni := FechaInicial.Date;
  FechaFin := FechaFinal.Date;
  BuscarFacturas;
  Visible := True;
  FechaFinal.SetFocus;
end;

procedure TfrComisionesVendedores.BuscarFacturas;
begin
  if Transaccion = NIL then
    Exit;
  try
    TablaFacturasMem.DisableControls;
    TablaFacturasMem.Close;
    TablaFacturas.Close;

    // Buscar la fila a tratar si es necesario
    if not EsCadenaVacia(FechaIni) and not EsCadenaVacia(FechaFin) then begin
        TablaFacturas.ParamByName('FECHAINI').AsDate  := FechaIni;
        TablaFacturas.ParamByName('FECHAFIN').AsDate := FechaFin;
    end;

    TablaFacturas.ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    TablaFacturas.Prepare;
    TablaFacturas.Open;
    TablaFacturasMem.Open;
    TablaFacturasMem.LoadFromDataSet(TablaFacturas, -1, lmCopy);
    dmTablaFacturasCliente.InicializarTablaFacturas(@TablaFacturasMem);
    CalcularTotal;
    CalcularComisiones;
    TablaFacturasMem.EnableControls;
    gridFacturas.ActiveView.DataController.GotoFirst;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

constructor TfrComisionesVendedores.Create (AOwner : TComponent);
begin
  inherited Create(AOwner);
  Entidad := entComisiones;

  Total := 0;
  FInformeComisionesVendedores := TdmInformeComisionesVendedores.Create(Self);
  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaFacturas := TIBDataSet.Create(Self);
  TablaVendedores := TIBDataSet.Create(Self);

  with TablaFacturas do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaFacturasCliente.sqlConsultarGridFacturasComisiones);
    RefreshSQL.Assign(dmTablaFacturasCliente.sqlConsultarGridFacturasComisiones);
  end;

  with TablaVendedores do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaVendedores.sqlConsultarGridVendedoresComisiones);
    RefreshSQL.Assign(dmTablaVendedores.sqlConsultarGridVendedoresComisiones);
    Prepare;
    Open;
  end;

  TablaVendedoresMem := TRxMemoryData.Create(Self);
  dsVendedores.DataSet := TablaVendedoresMem;
  TablaVendedoresMem.CopyStructure(TablaVendedores);
  TablaVendedoresMem.LoadFromDataSet(TablaVendedores, -1, lmCopy);
  dmTablaVendedores.InicializarTablaVendedores(@TablaVendedoresMem);
  TablaVendedoresMem.Open;

  TablaFacturasMem := TRxMemoryData.Create(Self);
  dsFacturas.DataSet := TablaFacturasMem;
  TablaFacturasMem.CopyStructure(TablaFacturas);
  TablaFacturasMem.LoadFromDataSet(TablaFacturas, -1, lmCopy);
  TablaFacturasMem.Open;

  dmTablaFacturasCliente.InicializarGridFacturasComisiones(gridFacturasDBTableView1);
  with TcxCheckBoxProperties(gridFacturasDBTableView1.GetColumnByFieldName('SELECCION').Properties) do begin
        OnChange := SeleccionChange
  end;
  dmTablaVendedores.InicializarGridVendedoresComisiones(gridVendedoresDBTableView1);
  gridFacturas.ActiveView.DataController.GotoFirst;

  FListaTrimestres := TListaTrimestres.Create(tlcTriTodos);
  cbxTrimestres.ItemIndex := FListaTrimestres.cargarLista(cbxTrimestres.Properties.Items);

  FechaInicial.Date := DarDiaInicioMesDat;
  FechaFinal.Date := DarDiaFinalMesDat;

  bCancelar.Cancel := True;
end;

destructor TfrComisionesVendedores.Destroy;
begin
  FInformeComisionesVendedores.Free;
  FInformeComisionesVendedores:= Nil;

  TablaFacturas.Close;
  TablaFacturas.UnPrepare;
  TablaFacturas.Free;

  TablaFacturasMem.Close;
  TablaFacturasMem.Free;

  TablaVendedores.Close;
  TablaVendedores.UnPrepare;
  TablaVendedores.Free;

  TablaVendedoresMem.Close;
  TablaVendedoresMem.Free;

  FListaTrimestres.Free;
  FListaTrimestres:= Nil;

  inherited;
end;

procedure TfrComisionesVendedores.actCancelarExecute(Sender: TObject);
begin
  CloseFrame
end;

procedure TfrComisionesVendedores.SeleccionChange(Sender: TObject);
begin
  if (TablaFacturasMem.FieldByName('SELECCION').AsString = '0') then
    Total := Total - TablaFacturasMem.FieldByName('IMPORTETOTAL').AsFloat
  else
    Total := Total + TablaFacturasMem.FieldByName('IMPORTETOTAL').AsFloat;
  CalcularComisiones;
end;

procedure TfrComisionesVendedores.calcularTotal;
var
  ldTotal : Double;
begin
    TablaFacturasMem.DisableControls;
    TablaFacturasMem.First;
    ldTotal := 0;
    while not TablaFacturasMem.Eof do
    begin
      ldTotal := ldTotal + TablaFacturasMem.FieldByName('IMPORTETOTAL').AsFloat;
      TablaFacturasMem.Next;
    end;
    TablaFacturasMem.First;
    Total := ldTotal;
    TablaFacturasMem.EnableControls;
end;

procedure TfrComisionesVendedores.calcularComisiones;
begin
    TablaVendedoresMem.DisableControls;
    TablaVendedoresMem.First;
    while not TablaVendedoresMem.Eof do
    begin
      TablaVendedoresMem.Edit;
      TablaVendedoresMem.FieldByName('IMPORTE').Asfloat := (FTotal * TablaVendedoresMem.FieldByName('PORCENTAJE').Asfloat) / 100;
      TablaVendedoresMem.Post;
      TablaVendedoresMem.Next;
    end;
    TablaVendedoresMem.First;
    TablaVendedoresMem.EnableControls;
end;

procedure TfrComisionesVendedores.bImprimirClick(Sender: TObject);
begin
  FInformeComisionesVendedores.SetTablaComisionesVendedores(TablaVendedoresMem);
  FInformeComisionesVendedores.FechaInicio := DateToStr(FechaIni);
  FInformeComisionesVendedores.FechaFin := DateToStr(FechaFin);
  FInformeComisionesVendedores.Preview := nil;
  FInformeComisionesVendedores.Imprimir;
end;

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

procedure TfrComisionesVendedores.SetTotal(Value: Double);
begin
  FTotal := Value;
  ImporteTotal.Caption := 'Suma total de las facturas: ' + FormatFloat('#,##0.00 €', FTotal) + '        ';
end;

procedure TfrComisionesVendedores.bVistaPreviaClick(Sender: TObject);
var
  FVistaPrevia : TfrVistaPrevia;

begin
  FInformeComisionesVendedores.SetTablaComisionesVendedores(TablaVendedoresMem);
  FInformeComisionesVendedores.FechaInicio := DateToStr(FechaIni);
  FInformeComisionesVendedores.FechaFin := DateToStr(FechaFin);

  FVistaPrevia := TfrVistaPrevia.Create(Self);
  FInformeComisionesVendedores.Preview := FVistaPrevia.Preview;
  FInformeComisionesVendedores.Previsualizar;

  CaptionModal := 'Informe de comisiones';
  WidthModal := 800;
  HeightModal := 600;
  ModoModal := Consultar;
  EntidadModal := entComisiones;
  ContenidoModal := FVistaPrevia;
end;

procedure TfrComisionesVendedores.FechaInicialPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
var
  ADate : TDateTime;
begin
  try
    if DisplayValue > FechaFinal.Date then
    begin
      ErrorText := msgFechasMal;
      Error := True;
      Exit;
    end;
    TextToDateEx(DisplayValue, ADate);
    FechaIni := ADate;
  except
    Error := True;
    ErrorText := msgFechaNoValida;
  end;
end;

procedure TfrComisionesVendedores.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;
  IndiceCol := (Sender as TcxGridDBTableView).GetColumnByFieldName('SELECCION').Index;
  if UpperCase(AViewInfo.GridRecord.DisplayTexts[IndiceCol]) = 'FALSE' then
  begin
    ACanvas.Canvas.Font.Style := [fsStrikeOut];
    if not AViewInfo.Selected then
      ACanvas.Canvas.Font.Color := clGray;
  end;
end;

procedure TfrComisionesVendedores.FechaFinalPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
var
  ADate : TDateTime;
begin
  try
    if DisplayValue < FechaInicial.Date then
    begin
      ErrorText := msgFechasMal;
      Error := True;
      Exit;
    end;
    TextToDateEx(DisplayValue, ADate);
    FechaFin := ADate;
  except
    Error := True;
    ErrorText := msgFechaNoValida;
  end;
end;

procedure TfrComisionesVendedores.cbxTrimestresPropertiesEditValueChanged(
  Sender: TObject);
var
  i : integer;
  FCodigoTrimestre : String;
begin
  FCodigoTrimestre := FListaTrimestres.getCodItem(cbxTrimestres.ItemIndex);
  FechaInicial.Date := dmTablaTrimestres.darFechaIniTrimestre(FCodigoTrimestre);
  FechaFinal.Date := dmTablaTrimestres.darFechaFinTrimestre(FCodigoTrimestre);
  FechaIni := FechaInicial.Date;
  FechaFin := FechaFinal.Date;
end;

procedure TfrComisionesVendedores.rbTrimestreClick(Sender: TObject);
begin
  cbxTrimestres.Enabled := True;
  FechaInicial.Enabled := False;
  FechaFinal.Enabled := False;
  cbxTrimestresPropertiesEditValueChanged(Sender);
end;

procedure TfrComisionesVendedores.rbFechasClick(Sender: TObject);
begin
  cbxTrimestres.Enabled := False;
  FechaInicial.Enabled := True;
  FechaFinal.Enabled := True;
end;

procedure TfrComisionesVendedores.bSeleccionarClick(Sender: TObject);
begin
  with TablaFacturasMem do
  begin
    DisableControls;
    First;
    while not EOF do
    begin
      if (FieldByName('SELECCION').AsString <> '1') then
      begin
        Edit;
        FieldByName('SELECCION').AsString := '1';
        Post;
      end;
      Next;
    end;
    First;
    EnableControls;
  end;
  CalcularTotal;
  CalcularComisiones;  
end;

procedure TfrComisionesVendedores.bDeseleccionarClick(Sender: TObject);
begin
  with TablaFacturasMem do
  begin
    DisableControls;
    First;
    while not EOF do
    begin
      if (FieldByName('SELECCION').AsString <> '0') then
      begin
        Edit;
        FieldByName('SELECCION').AsString := '0';
        Post;
      end;
      Next;
    end;
    First;
    EnableControls;
  end;
  Total := 0;
  CalcularComisiones;  
end;

procedure TfrComisionesVendedores.FreeContenido;
begin
  if (ContenidoModal is TRdxFrameFacturasCliente) then begin
    CodigoFactura := (ContenidoModal as TRdxFrameFacturasCliente).CodigoFactura;
  end;
  inherited FreeContenido;
end;

procedure TfrComisionesVendedores.bAgregarClick(Sender: TObject);
begin
  ContenidoModal := TfrFacturasClientes.Create(Self);
end;

procedure TfrComisionesVendedores.setCodigoFactura(const Value: Variant);
var
  Datos : TDatosFacturaCliente;

begin
  if esCadenaVacia(Value) then
     Exit;

  FCodigoFactura := Value;

  Datos := TDatosFacturaCliente.Create;
  Datos.Codigo := FCodigoFactura;
  dmTablaFacturasCliente.DarDatosFactura(Datos);
  with TablaFacturasMem do begin
    Append;
    FieldByName('CODIGO').AsString := Datos.Codigo;
    FieldByName('SITUACION').AsString := Datos.Situacion;
    FieldByName('FECHAALTA').AsDateTime := Datos.FechaAlta ;
    FieldByName('FECHAFACTURA').AsDateTime := Datos.FechaFactura;
    FieldByName('CODIGOCLIENTE').AsString := Datos.CodigoCliente;
    FieldByName('NIFCIF').AsString := Datos.NIFCIF;
    FieldByName('NOMBRE').AsString := Datos.Nombre;
    FieldByName('IMPORTETOTAL').AsFloat := Datos.ImporteTotal;
    FieldByName('CLASEFACTURA').AsString := Datos.ClaseFactura;
    FieldByName('SELECCION').AsString := '1';
    Post;
    Total := Total + TablaFacturasMem.FieldByName('IMPORTETOTAL').AsFloat;
    CalcularComisiones;
  end;
  Datos.Free;
end;

end.
