unit uViewDatosYSeleccionProveedorPedido;

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, uProveedoresController, dxLayoutControl, Buttons, uDAInterfaces,
  cxMaskEdit, cxButtonEdit, uBizPedidosProveedor, uBizDireccionesContacto,
  uDireccionesContactoController, Menus, cxLookAndFeelPainters, cxButtons,
  cxMemo;

type
  IViewDatosYSeleccionProveedorPedido = interface(IViewBase)
    ['{F1E1FFC0-02C9-47F5-92BC-BE10FA2C5134}']
    function GetPedido: IBizPedidoProveedor;
    procedure SetPedido(const Value: IBizPedidoProveedor);
    property Pedido: IBizPedidoProveedor read GetPedido write SetPedido;

    function GetProveedor: IBizProveedor;
    procedure SetProveedor(Value: IBizProveedor);
    property Proveedor: IBizProveedor read GetProveedor write SetProveedor;

    function GetID_Proveedor: integer;
    procedure SetID_Proveedor(const Value: integer);
    property ID_Proveedor: integer read GetID_Proveedor write SetID_Proveedor;

    function GetOnProveedorChanged : TNotifyEvent;
    procedure SetOnProveedorChanged (const Value : TNotifyEvent);
    property OnProveedorChanged : TNotifyEvent read GetOnProveedorChanged
      write SetOnProveedorChanged;

    procedure ElegirPersonaContacto;
    procedure ElegirDireccionProveedor;
    procedure ElegirProveedor;
    procedure VerFichaProveedor;
    procedure AnadirNuevoProveedor;
    procedure RefrescarDireccion;
  end;

  TfrViewDatosYSeleccionProveedorPedido = class(TfrViewBase, IViewDatosYSeleccionProveedorPedido)
    dsProveedor: TDADataSource;
    ActionList1: TActionList;
    actElegirContacto: TAction;
    actAnadirContacto: TAction;
    actVerContacto: TAction;
    dxLayoutControl1Group_Root: TdxLayoutGroup;
    dxLayoutControl1: TdxLayoutControl;
    dxLayoutControl1Item1: TdxLayoutItem;
    edtlNombre: TcxDBTextEdit;
    dxLayoutControl1Item2: TdxLayoutItem;
    edtCODIGO_ASIGNADO: TcxDBTextEdit;
    dsPedido: 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;
    dxLayoutControl1Item9: TdxLayoutItem;
    Button3: TBitBtn;
    dxLayoutControl1Group2: TdxLayoutGroup;
    dxLayoutControl1Item7: TdxLayoutItem;
    Button1: TBitBtn;
    dxLayoutControl1Item10: TdxLayoutItem;
    BitBtn1: TBitBtn;
    dxLayoutControl1Group1: TdxLayoutGroup;
    PngImageList: TPngImageList;
    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
    FOnProveedorChanged : TNotifyEvent;
    FMsgElegirProveedor: String;
  protected
    FProveedoresController : IProveedoresController;
    FDireccionesController : IDireccionesContactoController;
    FPedido : IBizPedidoProveedor;
    FProveedor : IBizProveedor;
    FDireccion : IBizDireccionesContacto;
    function GetProveedor: IBizProveedor; virtual;
    procedure SetProveedor(Value: IBizProveedor); virtual;
    function GetOnProveedorChanged : TNotifyEvent;
    procedure SetOnProveedorChanged (const Value : TNotifyEvent);
    procedure SetReadOnly(Value: Boolean); override;
    function GetID_Proveedor: integer; virtual;
    procedure SetID_Proveedor(const Value: integer); virtual;
    function GetPedido: IBizPedidoProveedor;
    procedure SetPedido(const Value: IBizPedidoProveedor);
    procedure EscribirTextoDireccion;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ElegirPersonaContacto;
    procedure ElegirDireccionProveedor;
    procedure ElegirProveedor;
    procedure VerFichaProveedor;
    procedure AnadirNuevoProveedor;
    procedure RefrescarDireccion;
    property Pedido: IBizPedidoProveedor read GetPedido write SetPedido;
    property Proveedor: IBizProveedor read GetProveedor write SetProveedor;
    property OnProveedorChanged : TNotifyEvent read GetOnProveedorChanged write SetOnProveedorChanged;
    property ID_Proveedor: integer read GetID_Proveedor write SetID_Proveedor;
  end;

implementation

{$R *.dfm}

uses
  uDataModuleProveedores, Math, uCustomView, uBizContactosPersonal, uDialogUtils;


procedure TfrViewDatosYSeleccionProveedorPedido.actElegirContactoExecute(Sender: TObject);
begin
  ElegirProveedor;
end;

procedure TfrViewDatosYSeleccionProveedorPedido.actElegirDireccionExecute(
  Sender: TObject);
begin
  inherited;
  ElegirDireccionProveedor;
end;

procedure TfrViewDatosYSeleccionProveedorPedido.actElegirDireccionUpdate(
  Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := not ReadOnly and Assigned(FProveedor.Direcciones) and
      (FProveedor.Direcciones.Active) and (FProveedor.Direcciones.RecordCount > 0);
end;

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

procedure TfrViewDatosYSeleccionProveedorPedido.actElegirPersonaContactoUpdate(
  Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := not ReadOnly and Assigned(FProveedor.Personal) and
      (FProveedor.Personal.Active) and (FProveedor.Personal.RecordCount > 0);
end;

procedure TfrViewDatosYSeleccionProveedorPedido.actAnadirContactoExecute(
  Sender: TObject);
begin
  AnadirNuevoProveedor;
end;

procedure TfrViewDatosYSeleccionProveedorPedido.actVerContactoExecute(
  Sender: TObject);
begin
  inherited;
  VerFichaProveedor;
end;

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

procedure TfrViewDatosYSeleccionProveedorPedido.AnadirNuevoProveedor;
var
  AProveedor : IBizProveedor;
begin
  inherited;
  AProveedor := (FProveedoresController.Nuevo as IBizProveedor);
  FProveedoresController.Ver(AProveedor);
  Self.Proveedor := AProveedor;
end;

constructor TfrViewDatosYSeleccionProveedorPedido.Create(AOwner: TComponent);
begin
  inherited;
  FMsgElegirProveedor := 'Elija el proveedor al que se le realizará el pedido.';
  FProveedoresController := TProveedoresController.Create;
  FDireccionesController := TDireccionesContactoController.Create;

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

destructor TfrViewDatosYSeleccionProveedorPedido.Destroy;
begin
  FProveedoresController := NIL;
  FDireccionesController := NIL;
  inherited;
end;

procedure TfrViewDatosYSeleccionProveedorPedido.edtDireccionPropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  inherited;
  ElegirDireccionProveedor;
end;

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

procedure TfrViewDatosYSeleccionProveedorPedido.ElegirProveedor;
var
  AProveedor : IBizProveedor;
begin
  inherited;

  AProveedor := (FProveedoresController.ElegirContacto(FProveedoresController.BuscarTodos, FMsgElegirProveedor, False) as IBizProveedor);

  if Assigned(AProveedor) then
    Self.Proveedor := AProveedor;
  AProveedor := Nil;
end;

procedure TfrViewDatosYSeleccionProveedorPedido.ElegirDireccionProveedor;
var
  ADireccion : IBizDireccionesContacto;
begin
  inherited;
  ADireccion := FProveedoresController.ElegirDireccionEntrega(FProveedor, ' ');

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

    if FDireccion.IDIsNull then
    begin
      FPedido.ClearField('ID_DIRECCION');
      FPedido.ClearField('IMPORTE_PORTE');
    end
    else begin
      FPedido.ID_DIRECCION := FDireccion.ID;
      FPedido.IMPORTE_PORTE := FDireccion.PORTE;
    end;
    FPedido.PERSONA_CONTACTO_PROV := FDireccion.PERSONA_CONTACTO;

    EscribirTextoDireccion;
  end;
end;

procedure TfrViewDatosYSeleccionProveedorPedido.ElegirPersonaContacto;
var
  APersona : IBizContactoPersonal;
begin
  inherited;
  APersona := FProveedoresController.ElegirPersonaContacto(FProveedor.Personal,
    'El proveedor dispone de personas de contacto dadas de alta en su ficha. Seleccione la que quiere utilizar.');
  if Assigned(APersona) then
  begin
    FPedido.Edit;
    FPedido.PERSONA_CONTACTO_PROV := APersona.NOMBRE;
  end;
end;

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

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

    if not FDireccion.FAXIsNull then
      ACadena := ACadena + #13#10 + 'Fax: ' + FDireccion.FAX;

  end;

  edtDireccion.Text := ACadena;
end;

function TfrViewDatosYSeleccionProveedorPedido.GetProveedor: IBizProveedor;
begin
  Result := FProveedor;
end;

function TfrViewDatosYSeleccionProveedorPedido.GetID_Proveedor: integer;
begin
  Result := -1;
  if Assigned(FProveedor) then
    Result := FProveedor.ID;
end;

procedure TfrViewDatosYSeleccionProveedorPedido.SetProveedor(Value: IBizProveedor);
begin
  FProveedor := Value;
  if Assigned(FProveedor) then
  begin
    dsProveedor.DataTable := FProveedor.DataTable;

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

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

    if FProveedor.Direcciones.RecordCount > 0 then
      ElegirDireccionProveedor
    else begin
      FPedido.Edit;
      FPedido.PERSONA_CONTACTO_PROV := FProveedor.PERSONA_CONTACTO;
      RefrescarDireccion;
    end;
  end
  else begin
    dsProveedor.DataTable := NIL;
    FProveedor := NIL;
    FDireccion := NIL;
    edtPersonaContacto.Enabled := False;
  end;

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

procedure TfrViewDatosYSeleccionProveedorPedido.SetID_Proveedor(const Value: integer);
begin
  Self.Proveedor := IBizProveedor(FProveedoresController.Buscar(Value));
end;

function TfrViewDatosYSeleccionProveedorPedido.GetOnProveedorChanged: TNotifyEvent;
begin
  Result := FOnProveedorChanged;
end;

function TfrViewDatosYSeleccionProveedorPedido.GetPedido: IBizPedidoProveedor;
begin
  Result := FPedido;
end;

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

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

  EscribirTextoDireccion;
end;

procedure TfrViewDatosYSeleccionProveedorPedido.SetOnProveedorChanged(
  const Value: TNotifyEvent);
begin
  FOnProveedorChanged := Value;
end;

procedure TfrViewDatosYSeleccionProveedorPedido.SetPedido(
  const Value: IBizPedidoProveedor);
begin
  FPedido := Value;
  if Assigned(FPedido) then
  begin
    dsPedido.DataTable := FPedido.DataTable;

    FProveedor := FPedido.Proveedor;
    dsProveedor.DataTable := FProveedor.DataTable;

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

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

    RefrescarDireccion;
  end
  else begin
    dsPedido.DataTable := NIL;
    FProveedor := NIL;
    FDireccion := NIL;
  end;
end;

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

  if (csLoading in Self.ComponentState) then
    Exit;

  actAnadirContacto.Enabled := not ReadOnly;
  actElegirContacto.Enabled := not ReadOnly;
  edtPersonaContacto.Enabled := not ReadOnly;
end;

procedure TfrViewDatosYSeleccionProveedorPedido.VerFichaProveedor;
begin
  if not Assigned(Proveedor) then
    ShowErrorMessage('No se ha indicado un proveedor', 'El pedido no tiene ningún proveedor asociado a mostrar.')
  else begin
    FProveedoresController.Ver(Proveedor);
  end;
end;

end.
