unit uViewDatosYSeleccionClienteBase;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uViewBase, StdCtrls, cxControls, cxContainer, cxEdit, cxLabel,
  cxDBLabel, ExtCtrls, DB, uDADataTable, uBizContactos, uClientesController,
  uDAInterfaces, uBizDireccionesContacto,
  uDireccionesContactoController, uBizContactosPersonal, ImgList, PngImageList,
  ActnList, dxLayoutControl, Buttons;

type
  IViewDatosYSeleccionClienteBase = interface(IViewBase)
    ['{EC1BAC23-95A7-469F-8E86-939C149C4528}']
    function GetCliente: IBizCliente;
    procedure SetCliente(Value: IBizCliente);
    property Cliente: IBizCliente read GetCliente write SetCliente;

    function GetID_Cliente: integer;
    procedure SetID_Cliente(const Value: integer);
    property ID_Cliente: integer read GetID_Cliente write SetID_Cliente;

    function GetOnClienteChanged : TNotifyEvent;
    procedure SetOnClienteChanged (const Value : TNotifyEvent);
    property OnClienteChanged : TNotifyEvent read GetOnClienteChanged
      write SetOnClienteChanged;

    procedure ElegirPersonaContacto;
    procedure ElegirDireccionCliente;
    procedure ElegirCliente;
    procedure VerFichaCliente;
    procedure AnadirNuevoCliente;
  end;

  TfrViewDatosYSeleccionClienteBase = class(TfrViewBase, IViewDatosYSeleccionClienteBase)
    dsCliente: TDADataSource;
    ActionList1: TActionList;
    actElegirContacto: TAction;
    actAnadirContacto: TAction;
    actVerContacto: TAction;
    PngImageList: TPngImageList;
    dxLayoutControl1Group_Root: TdxLayoutGroup;
    dxLayoutControl1: TdxLayoutControl;
    actElegirDireccion: TAction;
    actElegirPersonaContacto: TAction;
    Panel1: TPanel;
    bElegirCliente: TBitBtn;
    bNuevoCliente: TBitBtn;
    bVerFicha: TBitBtn;
    bvSeparador: TBevel;
    procedure actElegirContactoExecute(Sender: TObject);
    procedure actAnadirContactoExecute(Sender: TObject);
    procedure edtPersonaContactoPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure edtDireccionPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure actVerContactoExecute(Sender: TObject);
    procedure actElegirDireccionUpdate(Sender: TObject);
    procedure actElegirDireccionExecute(Sender: TObject);
    procedure actElegirPersonaContactoExecute(Sender: TObject);
    procedure actElegirPersonaContactoUpdate(Sender: TObject);

  private
    FOnClienteChanged : TNotifyEvent;
    FMsgElegirCliente: String;
    FMsgElegirDireccion: String;
    FMsgElegirPersonaContacto: String;
  protected
    FClientesController : IClientesController;
    FDireccionesController : IDireccionesContactoController;

    FCliente : IBizCliente;
    FDireccion : IBizDireccionesContacto;
    FPersonaContacto : IBizContactoPersonal;
    
    function GetCliente: IBizCliente; virtual;
    procedure SetCliente(Value: IBizCliente); virtual;
    function GetOnClienteChanged : TNotifyEvent;
    procedure SetOnClienteChanged (const Value : TNotifyEvent);
    procedure SetReadOnly(Value: Boolean); override;
    function GetID_Cliente: integer; virtual;
    procedure SetID_Cliente(const Value: integer); virtual;

    procedure InicializarMensajes; virtual;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    procedure ElegirPersonaContacto; virtual;
    procedure ElegirDireccionCliente; virtual;
    procedure ElegirCliente; virtual;
    procedure VerFichaCliente; virtual;
    procedure AnadirNuevoCliente; virtual;

    property Cliente: IBizCliente read GetCliente write SetCliente;
    property OnClienteChanged : TNotifyEvent read GetOnClienteChanged write SetOnClienteChanged;
    property ID_Cliente: integer read GetID_Cliente write SetID_Cliente;
  end;

implementation

{$R *.dfm}

uses
  uDataModuleClientes, Math, uCustomView, uDialogUtils;


procedure TfrViewDatosYSeleccionClienteBase.actElegirContactoExecute(Sender: TObject);
begin
  ElegirCliente;
end;

procedure TfrViewDatosYSeleccionClienteBase.actElegirDireccionExecute(
  Sender: TObject);
begin
  inherited;
  ElegirDireccionCliente;
end;

procedure TfrViewDatosYSeleccionClienteBase.actElegirDireccionUpdate(
  Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := Assigned(FCliente.Direcciones) and
      (FCliente.Direcciones.Active) and (FCliente.Direcciones.RecordCount > 0);
end;

procedure TfrViewDatosYSeleccionClienteBase.actElegirPersonaContactoExecute(
  Sender: TObject);
begin
  inherited;
  ElegirPersonaContacto;
end;

procedure TfrViewDatosYSeleccionClienteBase.actElegirPersonaContactoUpdate(
  Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := Assigned(FCliente.Personal) and
      (FCliente.Personal.Active) and (FCliente.Personal.RecordCount > 0);
end;

procedure TfrViewDatosYSeleccionClienteBase.actAnadirContactoExecute(
  Sender: TObject);
begin
  AnadirNuevoCliente;
end;

procedure TfrViewDatosYSeleccionClienteBase.actVerContactoExecute(
  Sender: TObject);
begin
  inherited;
  VerFichaCliente;
end;

procedure TfrViewDatosYSeleccionClienteBase.AnadirNuevoCliente;
var
  ACliente : IBizCliente;
begin
  inherited;
  ACliente := (FClientesController.Nuevo as IBizCliente);
  FClientesController.Ver(ACliente);
  Self.Cliente := ACliente;
end;

constructor TfrViewDatosYSeleccionClienteBase.Create(AOwner: TComponent);
begin
  inherited;

  FClientesController := TClientesController.Create;
  FDireccionesController := TDireccionesContactoController.Create;

  FPersonaContacto := NIL;
  FDireccion := NIL;
  FCliente := NIL;
end;

destructor TfrViewDatosYSeleccionClienteBase.Destroy;
begin
  FPersonaContacto := NIL;
  FDireccion := NIL;
  FCliente := NIL;

  FClientesController := NIL;
  FDireccionesController := NIL;
  inherited;
end;

procedure TfrViewDatosYSeleccionClienteBase.edtDireccionPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  inherited;
  ElegirDireccionCliente;
end;

procedure TfrViewDatosYSeleccionClienteBase.edtPersonaContactoPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  inherited;
  ElegirPersonaContacto;
end;

procedure TfrViewDatosYSeleccionClienteBase.ElegirCliente;
var
  ACliente : IBizCliente;
begin
  inherited;
  ACliente := (FClientesController.ElegirContacto(FClientesController.BuscarTodos, FMsgElegirCliente, False) as IBizCliente);

  if Assigned(ACliente) then
    Self.Cliente := ACliente;
  ACliente := Nil;
end;

procedure TfrViewDatosYSeleccionClienteBase.ElegirDireccionCliente;
var
  ADireccion : IBizDireccionesContacto;
begin
  inherited;
  ADireccion := FClientesController.ElegirDireccionEntrega(FCliente, FMsgElegirDireccion);

  if Assigned(ADireccion) then
    FDireccion := ADireccion;
end;

procedure TfrViewDatosYSeleccionClienteBase.ElegirPersonaContacto;
var
  APersona : IBizContactoPersonal;
begin
  inherited;
  APersona := FClientesController.ElegirPersonaContacto(FCliente.Personal, FMsgElegirPersonaContacto);
  if Assigned(APersona) then
    FPersonaContacto := APersona;
end;

function TfrViewDatosYSeleccionClienteBase.GetCliente: IBizCliente;
begin
  Result := FCliente;
end;

function TfrViewDatosYSeleccionClienteBase.GetID_Cliente: integer;
begin
  Result := -1;
  if Assigned(FCliente) then
    Result := FCliente.ID;
end;

procedure TfrViewDatosYSeleccionClienteBase.SetCliente(Value: IBizCliente);
begin
  FCliente := Value;
  if Assigned(FCliente) then
  begin
    dsCliente.DataTable := FCliente.DataTable;

    if not FCliente.DataTable.Active then
      FCliente.DataTable.Active := True;
  end
  else begin
    dsCliente.DataTable := NIL;
    FCliente := NIL;
    FDireccion := NIL;
    FPersonaContacto := NIL;
  end;

  if Assigned(FOnClienteChanged) then
    FOnClienteChanged(Self);
end;

procedure TfrViewDatosYSeleccionClienteBase.SetID_Cliente(const Value: integer);
begin
  Self.Cliente := IBizCliente(FClientesController.Buscar(Value));
end;

function TfrViewDatosYSeleccionClienteBase.GetOnClienteChanged: TNotifyEvent;
begin
  Result := FOnClienteChanged;
end;

procedure TfrViewDatosYSeleccionClienteBase.InicializarMensajes;
begin
  FMsgElegirCliente := 'Elija el cliente que desea utilizar.';
  FMsgElegirPersonaContacto := 'El cliente dispone de personas de contacto dadas de alta en su ficha. Seleccione la que quiere utilizar.';
  FMsgElegirDireccion := 'El cliente dispone de direcciones de contacto dadas de alta en su ficha. Seleccione la que quiere utilizar.';
end;

procedure TfrViewDatosYSeleccionClienteBase.SetOnClienteChanged(
  const Value: TNotifyEvent);
begin
  FOnClienteChanged := Value;
end;

procedure TfrViewDatosYSeleccionClienteBase.SetReadOnly(Value: Boolean);
begin
  inherited;

  if (csLoading in Self.ComponentState) then
    Exit;

  actAnadirContacto.Enabled := not ReadOnly;
  actElegirContacto.Enabled := not ReadOnly;
  actElegirDireccion.Enabled := not ReadOnly;
  actElegirPersonaContacto.Enabled := not ReadOnly;
end;

procedure TfrViewDatosYSeleccionClienteBase.VerFichaCliente;
begin
  if not Assigned(Cliente) then
    ShowErrorMessage('No se ha indicado un cliente', '')
  else begin
    FClientesController.Ver(Cliente);
  end;
end;

end.
