unit uViewFacturaCliente;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uViewBase, DB, uDADataTable, uCustomView,
  uViewDatosYSeleccionCliente, uBizFacturasCliente,
  cxControls, cxContainer, cxEdit, cxTextEdit, cxDBEdit, dxLayoutControl,
  cxMemo, cxMaskEdit, cxDropDownEdit, cxCalendar, cxSpinEdit, StdCtrls, Mask,
  DBCtrls, cxGraphics, dxLayoutLookAndFeels, cxLookupEdit, cxDBLookupEdit,
  cxDBLookupComboBox, uFormasPagoController, uDAInterfaces, uBizFormasPago,
  uViewTienda, uFacturasClienteController, uViewClienteFactura, Menus, StdActns,
  ActnList, uViewObservaciones, cxCheckBox;

type
  IViewFacturaCliente = interface(IViewBase)
  ['{3A95930C-20B3-41E9-93CB-21138ADB5B70}']
    function GetController : IFacturasClienteController;
    procedure SetController (const Value : IFacturasClienteController);
    property Controller : IFacturasClienteController read GetController  write SetController;

    function GetFactura: IBizFacturaCliente;
    procedure SetFactura(const Value: IBizFacturaCliente);
    property Factura: IBizFacturaCliente read GetFactura write SetFactura;
  end;

  TfrViewFacturaCliente = class(TfrViewBase, IViewFacturaCliente)
    DADataSource: TDADataSource;
    dxLayoutControl1Group_Root: TdxLayoutGroup;
    dxLayoutControl1: TdxLayoutControl;
    dxLayoutControl1Item1: TdxLayoutItem;
    eReferencia: TcxDBTextEdit;
    dxLayoutControl1Item2: TdxLayoutItem;
    edtFecha: TcxDBDateEdit;
    dxLayoutControl1Group1: TdxLayoutGroup;
    dxLayoutControl1Group2: TdxLayoutGroup;
    dxLayoutControl1Group5: TdxLayoutGroup;
    dxLayoutLookAndFeelList1: TdxLayoutLookAndFeelList;
    dxLayoutOfficeLookAndFeel1: TdxLayoutOfficeLookAndFeel;
    dsFormaPago: TDADataSource;
    dxLayoutControl1Item4: TdxLayoutItem;
    cbFormaPago: TcxDBLookupComboBox;
    dxLayoutControl1Item10: TdxLayoutItem;
    bFormasPago: TButton;
    dxLayoutControl1Group6: TdxLayoutGroup;
    frViewTienda1: TfrViewTienda;
    dxLayoutControl1Group4: TdxLayoutGroup;
    dxLayoutControl1Item3: TdxLayoutItem;
    dxLayoutControl1Item6: TdxLayoutItem;
    frViewClienteFactura1: TfrViewClienteFactura;
    dxLayoutControl1Group8: TdxLayoutGroup;
    ledtFechaVencimiento: TdxLayoutItem;
    edtFechaVencimiento: TcxDBDateEdit;
    dxLayoutControl1Group3: TdxLayoutGroup;
    frViewObservaciones1: TfrViewObservaciones;
    dxLayoutControl1Item5: TdxLayoutItem;
    dxLayoutControl1Item7: TdxLayoutItem;
    cbRecargoEquivalencia: TcxDBCheckBox;
    dxLayoutControl1Group9: TdxLayoutGroup;
    dxLayoutControl1Item8: TdxLayoutItem;
    cbTipoFactura: TcxDBComboBox;
    dxLayoutControl1Group10: TdxLayoutGroup;
    dxLayoutControl1Item9: TdxLayoutItem;
    edtSituacion: TcxDBComboBox;
    dxLayoutControl1Group11: TdxLayoutGroup;
    procedure bFormasPagoClick(Sender: TObject);
    procedure CustomViewDestroy(Sender: TObject);
    procedure CustomViewCreate(Sender: TObject);
    procedure edtFechaVencimientoPropertiesEditValueChanged(Sender: TObject);
    procedure cbFormaPagoPropertiesEditValueChanged(Sender: TObject);
  protected
    FFactura : IBizFacturaCliente;
    FController : IFacturasClienteController;
    FFormasPago : IBizFormaPago;
    FFormasPagoController : IFormasPagoController;

    function GetFactura: IBizFacturaCliente;
    procedure SetFactura(const Value: IBizFacturaCliente);

    function GetController : IFacturasClienteController;
    procedure SetController (const Value : IFacturasClienteController);
  public
    property Factura: IBizFacturaCliente read GetFactura write SetFactura;
    property Controller : IFacturasClienteController read GetController  write SetController;
  end;


implementation

uses
  uDataModuleContactos, schFacturasClienteClient_Intf;

{$R *.dfm}

{ TfrViewFacturaCliente }

procedure TfrViewFacturaCliente.bFormasPagoClick(Sender: TObject);
begin
  inherited;
  if Assigned(FFormasPago) then
     FFormasPagoController.VerTodos(FFormasPago);
end;

procedure TfrViewFacturaCliente.cbFormaPagoPropertiesEditValueChanged(Sender: TObject);
begin
  if Assigned(Factura) and (Factura.DataTable.State in dsEditModes) then
  begin
    if Assigned(FFormasPago) then
       if (FFormasPago.Plazos.RecordCount = 0) then
       begin
//          edtFechaVencimiento.EditValue := DateOf(Now);
         ledtFechaVencimiento.Enabled := True;
         edtSituacion.EditValue := CTE_PENDIENTE;
         edtSituacion.Enabled := True;
       end
       else
       begin
         Application.MessageBox('Ha elegido una forma de pago con plazos asignados, la situación de la factura vendrá dada por la situación de los recibos generados según los plazos', 'Atención', MB_OK);
         edtFechaVencimiento.EditValue := Null;
         ledtFechaVencimiento.Enabled := False;
         edtSituacion.EditValue := CTE_PENDIENTE;
         edtSituacion.Enabled := False;
       end;
  end;
end;

procedure TfrViewFacturaCliente.CustomViewCreate(Sender: TObject);
begin
  inherited;
  FFormasPago := Nil;
  FFormasPagoController := TFormasPagoController.Create;

  cbFormaPago.Properties.OnEditValueChanged := cbFormaPagoPropertiesEditValueChanged;
  edtFechaVencimiento.Properties.OnEditValueChanged := edtFechaVencimientoPropertiesEditValueChanged;
end;

procedure TfrViewFacturaCliente.CustomViewDestroy(Sender: TObject);
begin
  FFormasPago := Nil;
  FFormasPagoController := NIL;

  edtFechaVencimiento.Properties.OnEditValueChanged := Nil;
  cbFormaPago.Properties.OnEditValueChanged := Nil;
  inherited;  
end;

procedure TfrViewFacturaCliente.edtFechaVencimientoPropertiesEditValueChanged(Sender: TObject);
begin
  inherited;
  if Assigned(Factura) and (Factura.DataTable.State in dsEditModes) then
  begin
    if (edtFechaVencimiento.EditValue <> null) then
    begin
      if (edtFechaVencimiento.EditValue = 0) then
      begin
        Factura.DataTable.DisableEventHandlers;
        try
          Factura.DataTable.FieldByName(fld_FacturasClienteFECHA_VENCIMIENTO).Clear;
        finally
          Factura.DataTable.EnableEventHandlers;
        end;
      end
      else begin
        Application.MessageBox('Ha elegido una fecha de vencimiento, la situación de la factura vendrá dada por la situación del recibo generado con el vencimiento dado', 'Atención', MB_OK);
        edtSituacion.EditValue := CTE_PENDIENTE;
        edtSituacion.Enabled := False;
      end;
    end
    else begin
    //    edtSituacion.EditValue := CTE_PENDIENTE;
      edtSituacion.Enabled := True;
    end;
  end;
end;

function TfrViewFacturaCliente.GetController: IFacturasClienteController;
begin
  Result := FController;
end;

function TfrViewFacturaCliente.GetFactura: IBizFacturaCliente;
begin
  Result := FFactura;
end;

procedure TfrViewFacturaCliente.SetController(const Value: IFacturasClienteController);
begin
  FController := Value;

  if Assigned(FController) then
     frViewClienteFactura1.Controller := FController.ClienteController;
end;

procedure TfrViewFacturaCliente.SetFactura(const Value: IBizFacturaCliente);
var
  ACadena : String;
begin
  FFactura := Value;
  if Assigned(FFactura) then
  begin
    DADataSource.DataTable := FFactura.DataTable;
    frViewTienda1.DataItem := FFactura.DataTable;

    FFormasPago := FFormasPagoController.BuscarTodos;
    dsFormaPago.DataTable := FFormasPago.DataTable;
    dsFormaPago.DataTable.Active := True;

    //Posicionamos la tabla en la forma de pago que tiene la factura ya que no lo hace el componente por si solo
    FFormasPago.DataTable.Locate(fld_FacturasClienteID, FFactura.ID_FORMA_PAGO, []);
    if ((not FFactura.FECHA_VENCIMIENTOIsNull) or (FFormasPago.Plazos.RecordCount > 0)) then
    begin
       if (edtFechaVencimiento.EditingValue <> null) then
          edtSituacion.Enabled := False;

       if (FFormasPago.Plazos.RecordCount > 0) then
          ledtFechaVencimiento.Enabled := False
       else
          edtFechaVencimiento.Enabled := true;
    end
    else
    begin
       edtFechaVencimiento.Enabled := True;
       edtSituacion.Enabled := True;
    end;

    //Solo se deshabilita al insertar, luego la referencia será modificable
    //eReferencia.Enabled := (FFactura.DataTable.State = dsInsert);

    if FFactura.TIPO = CTE_TIPO_ABONO then
    begin
      dxLayoutControl1Group1.Caption := 'Datos del abono:';
      dxLayoutControl1Item2.Caption := 'Fecha del abono:';
      ACadena := 'Elija el cliente al que se le realizará el abono.';
    end
    else
      ACadena := 'Elija el cliente al que se le realizará la factura.';
    frViewClienteFactura1.MsgElegirCliente := ACadena;
  end
  else begin
    DADataSource.DataTable := NIL;
    dsFormaPago.DataTable := NIL;
    frViewClienteFactura1.Cliente := NIL
  end;
end;

end.
