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 ElegirDireccionParaContrato;
    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;
    bElegirCliente: TBitBtn;
    dxLayoutControl1Item7: TdxLayoutItem;
    bNuevoCliente: TBitBtn;
    dxLayoutControl1Item8: TdxLayoutItem;
    bVerFichaCliente: TBitBtn;
    dxLayoutControl1Item9: TdxLayoutItem;
    dxLayoutControl1Group1: TdxLayoutGroup;
    dxLayoutControl1Group2: TdxLayoutGroup;
    dsContrato: TDADataSource;
    actElegirDireccion: TAction;
    dxLayoutControl1Item4: TdxLayoutItem;
    edtDireccion: TcxMemo;
    bElegirDireccion: TButton;
    dxLayoutControl1Item5: TdxLayoutItem;
    dxLayoutControl1Item10: TdxLayoutItem;
    edtTelefonos: TcxTextEdit;
    dxLayoutControl1Item11: TdxLayoutItem;
    edtReferencia: TcxDBTextEdit;
    dxLayoutControl1Group6: TdxLayoutGroup;
    dxLayoutControl1Group7: TdxLayoutGroup;
    dxLayoutControl1Group3: TdxLayoutGroup;
    procedure actElegirContactoExecute(Sender: TObject);
    procedure actAnadirContactoExecute(Sender: TObject);
    procedure actVerContactoUpdate(Sender: TObject);
    procedure edtDireccionPropertiesButtonClick(Sender: TObject;
      AButtonIndex: Integer);
    procedure actVerContactoExecute(Sender: TObject);
    procedure actElegirDireccionUpdate(Sender: TObject);
    procedure actElegirDireccionExecute(Sender: TObject);

  private
    FOnClienteChanged : TNotifyEvent;
    FMsgElegirCliente: String;
    procedure EscribirTextoTelefonos;
  protected
    FClientesController : IClientesController;
    FDireccionesController : IDireccionesContactoController;
    FContrato : IBizContratoCliente;
    FCliente : IBizCliente;

    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 ElegirDireccionParaContrato;
    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, uDialogUtils;


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

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

procedure TfrViewDatosYSeleccionClienteContrato.actElegirDireccionUpdate(
  Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := Assigned(FCliente) and
      Assigned(FCliente.Direcciones) and (FCliente.Direcciones.Active)
      and (FCliente.Direcciones.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;

  edtlNombre.Enabled := False;
  edtNIFCIF.Enabled := False;
  edtDireccion.Enabled := False;
  edtReferencia.Enabled := False;
  edtTelefonos.Enabled := False;
end;

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

procedure TfrViewDatosYSeleccionClienteContrato.edtDireccionPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  inherited;
  ElegirDireccionParaContrato;
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.ElegirDireccionParaContrato;
var
  ADireccion : IBizDireccionesContacto;
begin
  if FCliente.Direcciones.RecordCount > 0 then
    ADireccion := FClientesController.ElegirDireccion(FCliente, 'Seleccione la dirección del cliente que quiere utilizar como dirección fiscal de este contrato.')
  else begin
    ADireccion := FDireccionesController.Nuevo;
    FDireccionesController.CopiarDireccionFiscal(FCliente, ADireccion);
  end;

  if Assigned(ADireccion) then
  begin
    FContrato.Edit;
    try
      if ADireccion.IDIsNull then   // Se ha elegido la dirección de razón social
      begin
        FContrato.ClearField('ID_DIRECCION');
        FContrato.ClearField('IMPORTE_PORTE');
      end
      else begin
        FContrato.ID_DIRECCION := ADireccion.ID;
        FContrato.IMPORTE_PORTE := ADireccion.PORTE;
      end;

      with FContrato do
      begin
        NIF_CIF := ADireccion.NIF_CIF;
        NOMBRE := ADireccion.NOMBRE;
        NOMBRE_CLIENTE := ADireccion.NOMBRE;
        CALLE := ADireccion.CALLE;
        POBLACION := ADireccion.POBLACION;
        CODIGO_POSTAL := ADireccion.CODIGO_POSTAL;
        PROVINCIA := ADireccion.PROVINCIA;
        PERSONA_CONTACTO := ADireccion.PERSONA_CONTACTO;
        TELEFONO := ADireccion.TELEFONO;
        MOVIL := ADireccion.MOVIL;
      end;
    finally
      FContrato.Post;
    end;
  end;
end;

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

  if Assigned(FContrato) then
    ACadena := Format('%s %s %s %s',
      [FContrato.CALLE, FContrato.POBLACION,
      FContrato.CODIGO_POSTAL, FContrato.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);
var
  ADireccion : IBizDireccionesContacto;
begin
  ADireccion := NIL;
  FCliente := Value;

  if Assigned(FCliente) then
  begin
    dsCliente.DataTable := FCliente.DataTable;

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

    ElegirDireccionParaContrato;
    EscribirTextoDireccion;
    EscribirTextoTelefonos;
  end
  else begin
    dsCliente.DataTable := NIL;
    FCliente := NIL;
  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;

procedure TfrViewDatosYSeleccionClienteContrato.RefrescarDireccion;
begin
  EscribirTextoDireccion;
  EscribirTextoTelefonos;
end;

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

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

  if not FContrato.TELEFONOIsNull then
    ACadena := FContrato.TELEFONO;

  if not FContrato.MOVILIsNull then
  begin
    if ACadena <> '' then
      ACadena := ACadena + ' / ';
    ACadena := ACadena + FContrato.MOVIL;
  end;

  edtTelefonos.Text := ACadena;
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;

    // ¿Hay cliente en el contrato?
    if FCliente.ID > 0 then
      RefrescarDireccion
    else begin
      edtDireccion.Lines.Clear;
      edtTelefonos.Text := '';
    end;
  end
  else begin
    dsContrato.DataTable := NIL;
    FCliente := 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;
var
  ACliente : IBizCliente;

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);

    if (Application.MessageBox('¿Desea recargar los datos del cliente en el documento?', 'Atención', MB_YESNO) = IDYES) then
    begin
      ACliente := (FClientesController.Buscar(Cliente.ID) as IBizCliente);
      if Assigned(ACliente) then
         Self.Cliente := ACliente;
      ACliente := Nil;
    end;    
  end;
end;

end.
