unit uViewPedidoCliente;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uViewBase, uBizPedidosCliente, DB, uDADataTable, uCustomView,
  AppEvnts, StdCtrls, Mask, DBCtrls,

  uViewObservaciones,  uViewDatosYSeleccionClientePedido,
  cxGraphics, cxDropDownEdit, cxImageComboBox, cxDBEdit, cxContainer, cxEdit,
  cxTextEdit, cxMaskEdit, cxCalendar, dxLayoutControl, cxControls, cxMemo,
  uViewDireccionEntregaPedidoCliente, Buttons, ActnList, cxLookupEdit,
  cxDBLookupEdit, cxDBLookupComboBox, uFormasPagoController, cxLookAndFeels,
  cxLookAndFeelPainters, dxLayoutcxEditAdapters, uDAInterfaces, uBizFormasPago,
  uPedidosClienteController, cxSpinEdit;

type
  IViewPedidoCliente = interface(IViewBase)
  ['{C5385699-C1A4-4AEB-B3D0-EE3BDB322FE2}']
    function GetPedido: IBizPedidoCliente;
    procedure SetPedido(const Value: IBizPedidoCliente);
    property Pedido: IBizPedidoCliente read GetPedido write SetPedido;
    function GetController : IPedidosClienteController;
    procedure SetController (const Value : IPedidosClienteController);
    property Controller : IPedidosClienteController read GetController write SetController;

    function GetViewClientePedido: TfrViewDatosYSeleccionClientePedido;
    procedure SetViewClientePedido(const Value: TfrViewDatosYSeleccionClientePedido);
    property ViewClientePedido: TfrViewDatosYSeleccionClientePedido read GetViewClientePedido write SetViewClientePedido;

    procedure RellenarCuentasBancarias;
    procedure AsignarCuentaBancaria;
  end;

  TfrViewPedidoCliente = class(TfrViewBase, IViewPedidoCliente)
    DADataSource: TDADataSource;
    dxLayoutControl1Group_Root: TdxLayoutGroup;
    dxLayoutControl1: TdxLayoutControl;
    dxLayoutControl1Item2: TdxLayoutItem;
    edtFechaPedido: TcxDBDateEdit;
    dxLayoutControl1Group1: TdxLayoutGroup;
    dxLayoutControl1Group2: TdxLayoutGroup;
    dxLayoutControl1Item6: TdxLayoutItem;
    memObservaciones: TcxDBMemo;
    dxLayoutControl1Item3: TdxLayoutItem;
    eReferencia: TcxDBTextEdit;
    dxLayoutControl1Group6: TdxLayoutGroup;
    dxLayoutControl1Group7: TdxLayoutGroup;
    dxLayoutControl1Group8: TdxLayoutGroup;
    dxLayoutControl1Item1: TdxLayoutItem;
    frViewClientePedido: TfrViewDatosYSeleccionClientePedido;
    dxLayoutControl1Item8: TdxLayoutItem;
    eCalle: TcxDBTextEdit;
    dxLayoutControl1Item9: TdxLayoutItem;
    ePoblacion: TcxDBTextEdit;
    dxLayoutControl1Item10: TdxLayoutItem;
    eCodigoPostal: TcxDBTextEdit;
    dxLayoutControl1Item11: TdxLayoutItem;
    eProvincia: TcxDBTextEdit;
    dxLayoutControl1Item12: TdxLayoutItem;
    ePersonaContacto: TcxDBTextEdit;
    dxLayoutControl1Item13: TdxLayoutItem;
    eTlfTrabajo: TcxDBTextEdit;
    dxLayoutControl1Group4: TdxLayoutGroup;
    dxLayoutControl1Group9: TdxLayoutGroup;
    dxLayoutControl1Item14: TdxLayoutItem;
    bElegirDireccion: TBitBtn;
    ActionList1: TActionList;
    actElegirDireccion: TAction;
    dxLayoutControl1Item5: TdxLayoutItem;
    bFormasPago: TButton;
    dsFormaPago: TDADataSource;
    dxLayoutControl1Group10: TdxLayoutGroup;
    dxLayoutControl1Item7: TdxLayoutItem;
    edtFechaPrevistaEnvio: TcxDBDateEdit;
    dxLayoutControl1Item15: TdxLayoutItem;
    eRefCliente: TcxDBTextEdit;
    dxLayoutControl1Group5: TdxLayoutGroup;
    cbFormaPago: TcxDBLookupComboBox;
    dxLayoutControl1Item4: TdxLayoutItem;
    dxLayoutControl1Group3: TdxLayoutGroup;
    cbCuentaBancaria: TcxDBComboBox;
    dxLayoutControl1Item16: TdxLayoutItem;
    procedure CustomViewCreate(Sender: TObject);
    procedure CustomViewDestroy(Sender: TObject);
    procedure actElegirDireccionExecute(Sender: TObject);
    procedure actElegirDireccionUpdate(Sender: TObject);
    procedure bFormasPagoClick(Sender: TObject);
    procedure frViewClientePedidoButton1Click(Sender: TObject);
    procedure frViewClientePedidoButton2Click(Sender: TObject);
  protected
    FPedido : IBizPedidoCliente;
    FController : IPedidosClienteController;    
    FViewClientePedido : TfrViewDatosYSeleccionClientePedido;
    FFormasPago : IBizFormaPago;
    FFormasPagoController : IFormasPagoController;

    function GetController : IPedidosClienteController;
    procedure SetController (const Value : IPedidosClienteController);
    function GetPedido: IBizPedidoCliente;
    procedure SetPedido(const Value: IBizPedidoCliente); virtual;
    function GetViewClientePedido: TfrViewDatosYSeleccionClientePedido;
    procedure SetViewClientePedido(const Value: TfrViewDatosYSeleccionClientePedido);
  public
    property Pedido: IBizPedidoCliente read GetPedido write SetPedido;
    property ViewClientePedido: TfrViewDatosYSeleccionClientePedido read GetViewClientePedido;
    property Controller : IPedidosClienteController read GetController write SetController;

    procedure RellenarCuentasBancarias;
    procedure AsignarCuentaBancaria;
  end;

implementation
{$R *.dfm}

{ TfrViewPedidoCliente }

uses
  uFactuGES_App, uEmpresasController, uClientesController, uBizDireccionesContacto;


procedure TfrViewPedidoCliente.actElegirDireccionExecute(Sender: TObject);
var
  AClientesController : IClientesController;
  APedidoController : IPedidosClienteController;
  ADireccion : IBizDireccionesContacto;
begin
  inherited;
{
  AClientesController := TClientesController.Create;
  APedidoController := TPedidosClienteController.Create;
  try
    ADireccion := AClientesController.ElegirDireccionEntrega(FPedido.Cliente.Direcciones,
      'Seleccione la dirección del cliente que quiere utilizar como dirección de envio de este pedido.');
    if Assigned(ADireccion) then
    begin
      APedidoController.CopiarDireccionEnvio(ADireccion, FPedido);
      FPedido.Edit;
      FPedido.IMPORTE_PORTE := ADireccion.PORTE;
    end;
  finally
    AClientesController := NIL;
    APedidoController := NIL;
  end;
}
end;

procedure TfrViewPedidoCliente.actElegirDireccionUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := (not ReadOnly) and
    Assigned(FPedido) and
    Assigned(FViewClientePedido) and
    FPedido.DataTable.Active and
    Assigned(FPedido.Cliente) and
    Assigned(FPedido.Cliente) and
    Assigned(FPedido.Cliente.Direcciones) and
    FPedido.Cliente.Direcciones.DataTable.Active and
    (FPedido.Cliente.Direcciones.DataTable.RecordCount > 0);
end;

procedure TfrViewPedidoCliente.AsignarCuentaBancaria;
begin
  FPedido.Edit;
  try
    FPedido.DATOS_BANCARIOS := cbCuentaBancaria.Properties.Items[0];
  finally
    FPedido.Post;
  end;
end;

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

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

  FViewClientePedido := frViewClientePedido;
//  FViewClientePedido.MsgElegirCliente := 'Elija el cliente al que se le realizará el pedido.';
end;

procedure TfrViewPedidoCliente.CustomViewDestroy(Sender: TObject);
begin
  FViewClientePedido := NIL;
  FFormasPago := Nil;
  FFormasPagoController := NIL;
  inherited;
end;

procedure TfrViewPedidoCliente.frViewClientePedidoButton1Click(Sender: TObject);
begin
  if Assigned(Pedido) and Assigned(Pedido.Cliente) and
    Assigned (Pedido.Detalles) and (Pedido.Detalles.RecordCount > 0) then
  begin
    if (Application.MessageBox('Los descuentos de los artículos del pedido serán actualizados con los del nuevo cliente seleccionado, ¿Desea continuar?', 'Atención', MB_YESNO) = IDNO) then
      Exit;
  end;
  frViewClientePedido.actElegirContacto.Execute;
end;

procedure TfrViewPedidoCliente.frViewClientePedidoButton2Click(Sender: TObject);
begin
  if Assigned(Pedido) and Assigned(Pedido.Cliente) and
    Assigned (Pedido.Detalles) and (Pedido.Detalles.RecordCount > 0) then
  begin
    if (Application.MessageBox('Los descuentos de los artículos del pedido serán actualizados con los del nuevo cliente seleccionado, ¿Desea continuar?', 'Atención', MB_YESNO) = IDNO) then
      Exit;
  end;
  frViewClientePedido.actAnadirContacto.Execute;
end;

function TfrViewPedidoCliente.GetController: IPedidosClienteController;
begin
  Result := FController;
end;

function TfrViewPedidoCliente.GetPedido: IBizPedidoCliente;
begin
  Result := FPedido;
end;

function TfrViewPedidoCliente.GetViewClientePedido: TfrViewDatosYSeleccionClientePedido;
begin
  Result := FViewClientePedido;
end;

procedure TfrViewPedidoCliente.RellenarCuentasBancarias;
var
  AController : IEmpresasController;
  ALista : TStringList;
  AListaIBAN : TStringList;
  AListaCliente: TStringList;
  i : integer;
begin

  AController := TEmpresasController.Create;
  try
    ALista := AController.DarListaCuentasBancarias(AppFactuGES.EmpresaActiva);
    AListaIBAN := AController.DarListaCuentasBancariasIBAN(AppFactuGES.EmpresaActiva);
    AListaCliente := Controller.ClienteController.DarListaCuentasBancarias(FPedido.ID_CLIENTE);

    try
      with cbCuentaBancaria.Properties.Items do
      begin
        BeginUpdate;
        try
          Clear;
{
          for i := 0 to ALista.Count - 1 do
            Add(ALista.Names[i]);

          if AListaIBAN.Count > 0 then
          begin
            Add('--------------');
            for i := 0 to AListaIBAN.Count - 1 do
              Add(AListaIBAN.Names[i]);
          end;
}
          if AListaCliente.Count > 0 then
          begin
//            Add('--------------');
            for i := 0 to AListaCliente.Count - 1 do
              Add(AListaCliente.Names[i]);
          end;

          Add('');

        finally
          EndUpdate;
        end;
      end;
    finally
      FreeANDNIL(ALista);
      FreeANDNIL(AListaIBAN);
    end;
  finally
    AController := NIL;
  end;
end;

procedure TfrViewPedidoCliente.SetController(const Value: IPedidosClienteController);
begin
  FController := Value;
end;

procedure TfrViewPedidoCliente.SetPedido(const Value: IBizPedidoCliente);
begin
  FPedido := Value;
  RellenarCuentasBancarias;

  if Assigned(FPedido) then
  begin
    DADataSource.DataTable := FPedido.DataTable;
    FViewClientePedido.Pedido := FPedido;

    FFormasPago := FFormasPagoController.BuscarTodos;
    dsFormaPago.DataTable := FFormasPago.DataTable;
    dsFormaPago.DataTable.Active := True;
  end
  else begin
    DADataSource.DataTable := NIL;
    dsFormaPago.DataTable := NIL;
    frViewClientePedido.Pedido := nil;
  end;
end;

procedure TfrViewPedidoCliente.SetViewClientePedido(const Value: TfrViewDatosYSeleccionClientePedido);
begin
  FViewClientePedido := Value;
end;

end.
