unit uViewDatosYSeleccionClienteContrato;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uViewBase, StdCtrls, cxControls, cxContainer, cxEdit, cxLabel,
  cxDBLabel, ExtCtrls, DB, uDADataTable, uBizContactos,
  ComCtrls, ToolWin, ActnList, ImgList, PngImageList, cxTextEdit, cxDBEdit,
  pngimage, JvExControls, JvComponent, JvButton, JvTransparentButton, Mask,
  DBCtrls, uClientesController, dxLayoutControl, Buttons, uDAInterfaces,
  cxMaskEdit, cxButtonEdit, uBizContratosCliente, uBizDireccionesContacto,
  uDireccionesContactoController, Menus, cxLookAndFeelPainters, cxButtons,
  cxMemo;

type
  IViewDatosYSeleccionClienteContrato = interface(IViewBase)
  ['{18A4627C-9E15-404A-ACAC-6A41D729F89B}']
    function GetContrato: IBizContratoCliente;
    procedure SetContrato(const Value: IBizContratoCliente);
    property Contrato: IBizContratoCliente read GetContrato write SetContrato;

    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;
    procedure RefrescarDireccion;
  end;

  TfrViewDatosYSeleccionClienteContrato = class(TfrViewBase, IViewDatosYSeleccionClienteContrato)
    dsCliente: TDADataSource;
    ActionList1: TActionList;
    actElegirContacto: TAction;
    actAnadirContacto: TAction;
    actVerContacto: TAction;
    PngImageList: TPngImageList;
    dxLayoutControl1Group_Root: TdxLayoutGroup;
    dxLayoutControl1: TdxLayoutControl;
    dxLayoutControl1Item1: TdxLayoutItem;
    edtlNombre: TcxDBTextEdit;
    dxLayoutControl1Item2: TdxLayoutItem;
    edtNIFCIF: TcxDBTextEdit;
    Button1: TBitBtn;
    dxLayoutControl1Item7: TdxLayoutItem;
    Button2: TBitBtn;
    dxLayoutControl1Item8: TdxLayoutItem;
    Button3: TBitBtn;
    dxLayoutControl1Item9: TdxLayoutItem;
    dxLayoutControl1Group1: TdxLayoutGroup;
    dxLayoutControl1Group2: TdxLayoutGroup;
    dsContrato: TDADataSource;
    actElegirDireccion: TAction;
    actElegirPersonaContacto: TAction;
    dxLayoutControl1Item3: TdxLayoutItem;
    edtPersonaContacto: TcxDBTextEdit;
    dxLayoutControl1Group4: TdxLayoutGroup;
    dxLayoutControl1Item4: TdxLayoutItem;
    edtDireccion: TcxMemo;
    Button4: TButton;
    dxLayoutControl1Item5: TdxLayoutItem;
    dxLayoutControl1Group3: TdxLayoutGroup;
    dxLayoutControl1Item6: TdxLayoutItem;
    Button5: TButton;
    dxLayoutControl1Group5: TdxLayoutGroup;
    procedure actElegirContactoExecute(Sender: TObject);
    procedure actAnadirContactoExecute(Sender: TObject);
    procedure actVerContactoUpdate(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;
  protected
    FClientesController : IClientesController;
    FDireccionesController : IDireccionesContactoController;
    FContrato : IBizContratoCliente;
    FCliente : IBizCliente;
    FDireccion : IBizDireccionesContacto;
    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;
    function GetContrato: IBizContratoCliente;
    procedure SetContrato(const Value: IBizContratoCliente);
    procedure EscribirTextoDireccion;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ElegirPersonaContacto;
    procedure ElegirDireccionCliente;
    procedure ElegirCliente;
    procedure VerFichaCliente;
    procedure AnadirNuevoCliente;
    procedure RefrescarDireccion;
    property Contrato: IBizContratoCliente read GetContrato write SetContrato;
    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, uBizContactosPersonal, uDialogUtils;


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

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

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

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

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

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

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

procedure TfrViewDatosYSeleccionClienteContrato.actVerContactoUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := (Length(edtlNombre.Text) > 0);
end;

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

constructor TfrViewDatosYSeleccionClienteContrato.Create(AOwner: TComponent);
begin
  inherited;
  FMsgElegirCliente := 'Elija el cliente al que se le realizará el Contrato.';
  FClientesController := TClientesController.Create;
  FDireccionesController := TDireccionesContactoController.Create;
  FDireccion := FDireccionesController.Nuevo;

  edtlNombre.Enabled := False;
  edtNIFCIF.Enabled := False;
  edtDireccion.Enabled := False;
  edtPersonaContacto.Enabled := False;

  Button5.Visible := False;
end;

destructor TfrViewDatosYSeleccionClienteContrato.Destroy;
begin
  FDireccion := NIL;
  FClientesController := NIL;
  FDireccionesController := NIL;
  inherited;
end;

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

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

procedure TfrViewDatosYSeleccionClienteContrato.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 TfrViewDatosYSeleccionClienteContrato.ElegirDireccionCliente;
var
  ADireccion : IBizDireccionesContacto;
begin
  inherited;

  ADireccion := FClientesController.ElegirDireccionEntrega(FCliente, ' ');

  if Assigned(ADireccion) then
  begin
    FDireccion := ADireccion;
    EscribirTextoDireccion;

    if FDireccion.IDIsNull then
    begin
//      FContrato.ClearField('ID_DIRECCION');
      FContrato.ClearField('IMPORTE_PORTE');
    end
    else begin
//      FContrato.ID_DIRECCION := FDireccion.ID;
      FContrato.IMPORTE_PORTE := FDireccion.PORTE;
    end;
  end;
end;

procedure TfrViewDatosYSeleccionClienteContrato.ElegirPersonaContacto;
var
  APersona : IBizContactoPersonal;
begin
  inherited;
  APersona := FClientesController.ElegirPersonaContacto(FCliente.Personal, 'El cliente dispone de personas de contacto dadas de alta en su ficha. Seleccione la que quiere utilizar.');
  if Assigned(APersona) then
  begin
    FContrato.Edit;
    FContrato.PERSONA_CONTACTO := APersona.NOMBRE;
  end;
end;

procedure TfrViewDatosYSeleccionClienteContrato.EscribirTextoDireccion;
var
  ACadena : String;
begin
  ACadena := '';

  //Siempre asignaremos la direccion y persona de contacto ya sea de las direcciones del contacto o la ID_Direccion=0 que es la principal de la ficha
  FContrato.Edit;
  FContrato.CALLE := FDireccion.CALLE;
  FContrato.POBLACION := FDireccion.POBLACION;
  FContrato.PROVINCIA := FDireccion.PROVINCIA;
  FContrato.CODIGO_POSTAL := FDireccion.CODIGO_POSTAL;
  FContrato.PERSONA_CONTACTO := FDireccion.PERSONA_CONTACTO;

  if Assigned(FDireccion) then
    ACadena := Format('%s %s %s %s',
      [FDireccion.CALLE, FDireccion.POBLACION,
      FDireccion.CODIGO_POSTAL, FDireccion.PROVINCIA]);

  edtDireccion.Text := ACadena;
end;

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

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

procedure TfrViewDatosYSeleccionClienteContrato.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;

    //Solo podremos establecer persona de contacto si se ha asignado un cliente
    if FCliente.ID > 0 then
       edtPersonaContacto.Enabled := True;

    if FCliente.Direcciones.RecordCount > 0 then
      ElegirDireccionCliente
    else begin
      FDireccionesController.CopiarDireccionFiscal(FCliente, FDireccion);
      EscribirTextoDireccion;
    end;
  end
  else begin
    dsCliente.DataTable := NIL;
    FCliente := NIL;
    FDireccion := NIL;
    edtPersonaContacto.Enabled := False;
  end;

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

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

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

function TfrViewDatosYSeleccionClienteContrato.GetContrato: IBizContratoCliente;
begin
  Result := FContrato;
end;

procedure TfrViewDatosYSeleccionClienteContrato.RefrescarDireccion;
begin
//  FDireccion := FDireccionesController.Nuevo;

//  if (not FContrato.ID_DIRECCIONIsNull) and
//    (FDireccionesController.Localizar(FCliente.Direcciones, FContrato.ID_DIRECCION)) then
//      FDireccionesController.CopiarDireccion(FCliente.Direcciones, FDireccion)
//  else
//  FDireccionesController.CopiarDireccionFiscal(FCliente, FDireccion);

//  EscribirTextoDireccion;

  FDireccion.Active := True;
  FDireccion.DataTable.Insert;
  try
    with FDireccion do
    begin
      NOMBRE := FContrato.NOMBRE;
      CALLE := FContrato.CALLE;
      POBLACION := FContrato.POBLACION;
      PROVINCIA := FContrato.PROVINCIA;
      CODIGO_POSTAL := FContrato.CODIGO_POSTAL;
      PERSONA_CONTACTO := FContrato.PERSONA_CONTACTO;
    end;
  finally
    FDireccion.DataTable.Post;
  end;
  EscribirTextoDireccion;
end;

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

procedure TfrViewDatosYSeleccionClienteContrato.SetContrato(
  const Value: IBizContratoCliente);
begin
  FContrato := Value;
  if Assigned(FContrato) then
  begin
    dsContrato.DataTable := FContrato.DataTable;

    FCliente := FContrato.Cliente;
    dsCliente.DataTable := FCliente.DataTable;

    if not FCliente.DataTable.Active then
      FCliente.DataTable.Active := True;

    //Solo podremos establecer persona de contacto si se ha asignado un cliente
    if FCliente.ID > 0 then
       edtPersonaContacto.Enabled := True;

    RefrescarDireccion;
  end
  else begin
    dsContrato.DataTable := NIL;
    FCliente := NIL;
    FDireccion := NIL;
  end;
end;

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

  if (csLoading in Self.ComponentState) then
    Exit;
  
  actAnadirContacto.Enabled := not ReadOnly;
  actElegirContacto.Enabled := not ReadOnly;
end;

procedure TfrViewDatosYSeleccionClienteContrato.VerFichaCliente;
begin
  if not Assigned(Cliente) then
    ShowErrorMessage('No se ha indicado un cliente', 'El Contrato no tiene ningún cliente asociado a mostrar.')
  else begin
    FClientesController.Ver(Cliente);
  end;
end;

end.
