unit uViewDatosYSeleccionClienteAlbaran;

interface

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

type
  IViewDatosYSeleccionClienteAlbaran = interface(IViewBase)
    ['{02F0A00C-FAE7-43A4-B959-D2B929FF287A}']
    function GetAlbaran: IBizAlbaranCliente;
    procedure SetAlbaran(const Value: IBizAlbaranCliente);
    property Albaran: IBizAlbaranCliente read GetAlbaran write SetAlbaran;

    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;

  TfrViewDatosYSeleccionClienteAlbaran = class(TfrViewBase, IViewDatosYSeleccionClienteAlbaran)
    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;
    dsAlbaran: 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;
    FAlbaran : IBizAlbaranCliente;
    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 GetAlbaran: IBizAlbaranCliente;
    procedure SetAlbaran(const Value: IBizAlbaranCliente);
    procedure EscribirTextoDireccion;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ElegirPersonaContacto;
    procedure ElegirDireccionCliente;
    procedure ElegirCliente;
    procedure VerFichaCliente;
    procedure AnadirNuevoCliente;
    procedure RefrescarDireccion;
    property Albaran: IBizAlbaranCliente read GetAlbaran write SetAlbaran;
    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 TfrViewDatosYSeleccionClienteAlbaran.actElegirContactoExecute(Sender: TObject);
begin
  ElegirCliente;
end;

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

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

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

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

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

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

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

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

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

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

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

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

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

procedure TfrViewDatosYSeleccionClienteAlbaran.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 TfrViewDatosYSeleccionClienteAlbaran.ElegirDireccionCliente;
var
  ADireccion : IBizDireccionesContacto;
begin
  inherited;
  ADireccion := FClientesController.ElegirDireccionEntrega(FCliente, ' ');

  if Assigned(ADireccion) then
  begin
    FDireccion := ADireccion;
    FAlbaran.Edit;

    if FDireccion.IDIsNull then
    begin
      FAlbaran.ClearField('ID_DIRECCION');
      FAlbaran.ClearField('IMPORTE_PORTE');
    end
    else begin
      FAlbaran.ID_DIRECCION := FDireccion.ID;
      FAlbaran.IMPORTE_PORTE := FDireccion.PORTE;
    end;
    //Siempre asignaremos la persona de contacto ya sea de las direcciones del contacto o la ID_Direccion=0 que es la principal de la ficha
    FAlbaran.PERSONA_CONTACTO := FDireccion.PERSONA_CONTACTO;
    EscribirTextoDireccion;
  end;
end;

procedure TfrViewDatosYSeleccionClienteAlbaran.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
    FAlbaran.Edit;
    FAlbaran.PERSONA_CONTACTO := APersona.NOMBRE;
  end;
end;

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

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

  edtDireccion.Text := ACadena;
end;

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

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

procedure TfrViewDatosYSeleccionClienteAlbaran.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
      FAlbaran.Edit;
      FAlbaran.PERSONA_CONTACTO := FCliente.PERSONA_CONTACTO;
      RefrescarDireccion;
    end;
  end
  else begin
    dsCliente.DataTable := NIL;
    FCliente := NIL;
    FDireccion := NIL;
    edtPersonaContacto.Enabled := False;
  end;

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

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

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

function TfrViewDatosYSeleccionClienteAlbaran.GetAlbaran: IBizAlbaranCliente;
begin
  Result := FAlbaran;
end;

procedure TfrViewDatosYSeleccionClienteAlbaran.RefrescarDireccion;
begin
  FDireccion := FDireccionesController.Nuevo;

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

  EscribirTextoDireccion;
end;

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

procedure TfrViewDatosYSeleccionClienteAlbaran.SetAlbaran(
  const Value: IBizAlbaranCliente);
begin
  FAlbaran := Value;
  if Assigned(FAlbaran) then
  begin
    dsAlbaran.DataTable := FAlbaran.DataTable;

    FCliente := FAlbaran.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
    dsAlbaran.DataTable := NIL;
    FCliente := NIL;
    FDireccion := NIL;
  end;
end;

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

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

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

end.
