{
===============================================================================
  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.0
  Fecha versión actual: 16-11-2002
===============================================================================
  Modificaciones:

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

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,
  dxCntner, dxEditor, dxEdLib, InformeComisionesVendedores, vistaPrevia,
  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;
    eFechaIni: TLabel;
    FechaInicial: TcxDateEdit;
    eFechaFin: TLabel;
    FechaFinal: TcxDateEdit;
    Panel4: TPanel;
    Label1: TLabel;
    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);
  private
    FbParche : Boolean;
    FTotal : Double;
    FInformeComisionesVendedores : TdmInformeComisionesVendedores;
    procedure SetTotal (Value : Double);
    property Total: Double read FTotal write SetTotal;
    procedure CalcularTotal;
    procedure CalcularComisiones;
  protected
    procedure SeleccionChange(Sender: TObject);
    procedure ActivarModoConsultar; override;
    procedure BuscarFacturas; override;
  public
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
  end;

var
  frComisionesVendedores: TfrComisionesVendedores;

implementation
{$R *.DFM}

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


procedure TfrComisionesVendedores.ActivarModoConsultar;
begin
  FechaInicial.Date := FechaIni;
  FechaFinal.Date := FechaFin;
  BuscarFacturas;
  Visible := True;
  FechaInicial.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.Params.ByName('FECHAINI').AsDate  := FechaIni;
        TablaFacturas.Params.ByName('FECHAFIN').AsDate := FechaFin;
    end;

    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);
  FbParche := false;
  FechaIni := DarDiaInicioMesDat;
  FechaFin := DarDiaFinalMesDat;
  Total := 0;
  FInformeComisionesVendedores := TdmInformeComisionesVendedores.Create(Self);

  Entidad := entComisiones;
  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;
  
  bCancelar.Cancel := True;
end;

destructor TfrComisionesVendedores.Destroy;
begin
  FInformeComisionesVendedores.Free;

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

  TablaFacturasMem.Close;
  TablaFacturasMem.Free;

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

  TablaVendedoresMem.Close;
  TablaVendedoresMem.Free;

  inherited;
end;

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

procedure TfrComisionesVendedores.SeleccionChange(Sender: TObject);
begin
  if not FbParche then begin
    FbParche := True;
    Exit;
  end;

  if (TablaFacturasMem.FieldByName('SELECCION').AsString = '1') 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
  if DisplayValue > FechaFinal.Date then
  begin
    ErrorText := msgFechasMal;
    Error := True;
    Exit;
  end;
  TextToDateEx(DisplayValue, ADate);
  FechaIni := ADate;
end;

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

  IndiceCol := (Sender as TcxGridDBTableView).GetColumnByFieldName('SELECCION').Index;
  if UpperCase(AViewInfo.GridRecord.DisplayTexts[IndiceCol]) = 'FALSE' then
  begin
    ACanvas.Canvas.Font.Style := [fsStrikeOut];
    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
  if DisplayValue < FechaInicial.Date then
  begin
    ErrorText := msgFechasMal;
    Error := True;
    Exit;
  end;
  TextToDateEx(DisplayValue, ADate);
  FechaFin := ADate;
end;

end.
