unit uViewDatosYSeleccionClienteAlbaran;

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, uBizAlbaranesCliente, uBizDireccionesContacto,
  uDireccionesContactoController, Menus, cxLookAndFeelPainters, cxButtons,
  cxMemo;

type
  IViewDatosYSeleccionClienteAlbaran = interface(IViewBase)
  ['{7C180225-6C92-4F43-948A-4F67CD9A168D}']
    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 ElegirDireccionParaAlbaran;
    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;
    bElegirCliente: TBitBtn;
    dxLayoutControl1Item7: TdxLayoutItem;
    bNuevoCliente: TBitBtn;
    dxLayoutControl1Item8: TdxLayoutItem;
    bVerFichaCliente: TBitBtn;
    dxLayoutControl1Item9: TdxLayoutItem;
    dxLayoutControl1Group1: TdxLayoutGroup;
    dxLayoutControl1Group2: TdxLayoutGroup;
    dsAlbaran: TDADataSource;
    actElegirDireccion: TAction;
    dxLayoutControl1Item4: TdxLayoutItem;
    edtDireccion: TcxMemo;
    bElegirDireccion: TButton;
    dxLayoutControl1Item5: TdxLayoutItem;
    dxLayoutControl1Item10: TdxLayoutItem;
    edtTelefonos: TcxTextEdit;
    dxLayoutControl1Item11: TdxLayoutItem;
    edtReferencia: TcxDBTextEdit;
    dxLayoutControl1Group6: 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;
    FAlbaran : IBizAlbaranCliente;
    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 GetAlbaran: IBizAlbaranCliente;
    procedure SetAlbaran(const Value: IBizAlbaranCliente);
    procedure EscribirTextoDireccion;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ElegirDireccionParaAlbaran;
    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, uDialogUtils;


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

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

procedure TfrViewDatosYSeleccionClienteAlbaran.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 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 albarán.';
  FClientesController := TClientesController.Create;
  FDireccionesController := TDireccionesContactoController.Create;

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

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

procedure TfrViewDatosYSeleccionClienteAlbaran.edtDireccionPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  inherited;
  ElegirDireccionParaAlbaran;
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.ElegirDireccionParaAlbaran;
var
  ADireccion : IBizDireccionesContacto;
begin
  if FCliente.Direcciones.RecordCount > 0 then
    ADireccion := FClientesController.ElegirDireccionEntrega(FCliente, 'El cliente dispone de varias direcciones. Seleccione la que quiere utilizar.')
  else begin
    ADireccion := FDireccionesController.Nuevo;
    FDireccionesController.CopiarDireccionFiscal(FCliente, ADireccion);
  end;

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

      with FAlbaran do
      begin
        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
      FAlbaran.Post;
    end;
  end;
end;


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

  if Assigned(FAlbaran) then
    ACadena := Format('%s %s %s %s',
      [FAlbaran.CALLE, FAlbaran.POBLACION,
      FAlbaran.CODIGO_POSTAL, FAlbaran.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);
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;

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

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

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

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

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

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

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

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

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

    ACliente := (FClientesController.Buscar(Cliente.ID) as IBizCliente);
    if Assigned(ACliente) then
       Self.Cliente := ACliente;
    ACliente := Nil;
  end;
end;

end.
