unit uViewPedidoCliente;

interface

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

  uViewObservaciones,  uViewDatosYSeleccionCliente,
  cxGraphics, cxDropDownEdit, cxImageComboBox, cxDBEdit, cxContainer, cxEdit,
  cxTextEdit, cxMaskEdit, cxCalendar, dxLayoutControl, cxControls, cxMemo,
  uViewDireccionEntregaPedidoCliente, Buttons, ActnList, cxLookupEdit,
  cxDBLookupEdit, cxDBLookupComboBox, uFormasPagoController;

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 GetViewClientePedido: TfrViewDatosYSeleccionCliente;
    procedure SetViewClientePedido(const Value: TfrViewDatosYSeleccionCliente);
    property ViewClientePedido: TfrViewDatosYSeleccionCliente read GetViewClientePedido write SetViewClientePedido;
  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: TfrViewDatosYSeleccionCliente;
    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;
    dxLayoutControl1Item4: TdxLayoutItem;
    cbFormaPago: TcxDBLookupComboBox;
    dxLayoutControl1Item5: TdxLayoutItem;
    bFormasPago: TButton;
    dxLayoutControl1Group5: TdxLayoutGroup;
    dsFormaPago: TDADataSource;
    dxLayoutControl1Group10: TdxLayoutGroup;
    dxLayoutControl1Item7: TdxLayoutItem;
    edtFechaPrevistaEnvio: TcxDBDateEdit;
    dxLayoutControl1Item15: TdxLayoutItem;
    eRefCliente: TcxDBTextEdit;
    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;
    FViewClientePedido : TfrViewDatosYSeleccionCliente;
    FFormasPagoController : IFormasPagoController;

    function GetPedido: IBizPedidoCliente;
    procedure SetPedido(const Value: IBizPedidoCliente); virtual;
    function GetViewClientePedido: TfrViewDatosYSeleccionCliente;
    procedure SetViewClientePedido(const Value: TfrViewDatosYSeleccionCliente);
  public
    property Pedido: IBizPedidoCliente read GetPedido write SetPedido;
    property ViewClientePedido: TfrViewDatosYSeleccionCliente read GetViewClientePedido;
  end;

implementation

{$R *.dfm}

{ TfrViewPedidoCliente }

uses
  uClientesController, uBizDireccionesContacto, uPedidosClienteController,
  uBizFormasPago;


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.bFormasPagoClick(Sender: TObject);
begin
  inherited;
  FFormasPagoController.VerTodos((dsFormaPago.DataTable) as IBizFormaPago);
end;

procedure TfrViewPedidoCliente.CustomViewCreate(Sender: TObject);
begin
  inherited;
  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;
  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.GetPedido: IBizPedidoCliente;
begin
  Result := FPedido;
end;

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

procedure TfrViewPedidoCliente.SetPedido(const Value: IBizPedidoCliente);
begin
  FPedido := Value;
  if Assigned(FPedido) then
  begin
    DADataSource.DataTable := FPedido.DataTable;
    dsFormaPago.DataTable := FFormasPagoController.BuscarTodos.DataTable;
    dsFormaPago.DataTable.Active := True;
    frViewClientePedido.Cliente := FPedido.Cliente;
  end
  else begin
    DADataSource.DataTable := NIL;
    dsFormaPago.DataTable := NIL;
    frViewClientePedido.Cliente := nil;
  end;
end;

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

end.
