unit uViewDatosYSeleccionProveedorAlbaran;

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

type
  IViewDatosYSeleccionProveedorAlbaran = interface(IViewBase)
    ['{F1E1FFC0-02C9-47F5-92BC-BE10FA2C5134}']
    function GetAlbaran: IBizAlbaranProveedor;
    procedure SetAlbaran(const Value: IBizAlbaranProveedor);
    property Albaran: IBizAlbaranProveedor read GetAlbaran write SetAlbaran;

    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;

  TfrViewDatosYSeleccionProveedorAlbaran = class(TfrViewBase, IViewDatosYSeleccionProveedorAlbaran)
    dsProveedor: TDADataSource;
    ActionList1: TActionList;
    actElegirContacto: TAction;
    actAnadirContacto: TAction;
    actVerContacto: TAction;
    dxLayoutControl1Group_Root: TdxLayoutGroup;
    dxLayoutControl1: TdxLayoutControl;
    dxLayoutControl1Item1: TdxLayoutItem;
    edtlNombre: TcxDBTextEdit;
    dxLayoutControl1Item2: TdxLayoutItem;
    edtNIFCIF: TcxDBTextEdit;
    dsAlbaran: TDADataSource;
    actElegirDireccion: TAction;
    actElegirPersonaContacto: TAction;
    dxLayoutControl1Item3: TdxLayoutItem;
    edtPersonaContacto: TcxDBTextEdit;
    dxLayoutControl1Group4: TdxLayoutGroup;
    dxLayoutControl1Item4: TdxLayoutItem;
    edtDireccion: TcxTextEdit;
    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;
    FAlbaran : IBizAlbaranProveedor;
    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 GetAlbaran: IBizAlbaranProveedor;
    procedure SetAlbaran(const Value: IBizAlbaranProveedor);
    procedure EscribirTextoDireccion;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ElegirPersonaContacto;
    procedure ElegirDireccionProveedor;
    procedure ElegirProveedor;
    procedure VerFichaProveedor;
    procedure AnadirNuevoProveedor;
    procedure RefrescarDireccion;
    property Albaran: IBizAlbaranProveedor read GetAlbaran write SetAlbaran;
    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 TfrViewDatosYSeleccionProveedorAlbaran.actElegirContactoExecute(Sender: TObject);
begin
  ElegirProveedor;
end;

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

procedure TfrViewDatosYSeleccionProveedorAlbaran.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 TfrViewDatosYSeleccionProveedorAlbaran.actElegirPersonaContactoExecute(
  Sender: TObject);
begin
  inherited;
  ElegirPersonaContacto;
end;

procedure TfrViewDatosYSeleccionProveedorAlbaran.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 TfrViewDatosYSeleccionProveedorAlbaran.actAnadirContactoExecute(
  Sender: TObject);
begin
  AnadirNuevoProveedor;
end;

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

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

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

constructor TfrViewDatosYSeleccionProveedorAlbaran.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;
  edtNIFCIF.Enabled := False;
  edtDireccion.Enabled := False;
  edtPersonaContacto.Enabled := False;
end;

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

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

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

procedure TfrViewDatosYSeleccionProveedorAlbaran.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 TfrViewDatosYSeleccionProveedorAlbaran.ElegirDireccionProveedor;
var
  ADireccion : IBizDireccionesContacto;
begin
  inherited;
  ADireccion := FProveedoresController.ElegirDireccionEntrega(FProveedor, ' ');

  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;
    FAlbaran.PERSONA_CONTACTO_PROV := FDireccion.PERSONA_CONTACTO;

    EscribirTextoDireccion;
  end;
end;

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

procedure TfrViewDatosYSeleccionProveedorAlbaran.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 TfrViewDatosYSeleccionProveedorAlbaran.GetProveedor: IBizProveedor;
begin
  Result := FProveedor;
end;

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

procedure TfrViewDatosYSeleccionProveedorAlbaran.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
      FAlbaran.Edit;
      FAlbaran.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 TfrViewDatosYSeleccionProveedorAlbaran.SetID_Proveedor(const Value: integer);
begin
  Self.Proveedor := IBizProveedor(FProveedoresController.Buscar(Value));
end;

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

function TfrViewDatosYSeleccionProveedorAlbaran.GetAlbaran: IBizAlbaranProveedor;
begin
  Result := FAlbaran;
end;

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

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

  EscribirTextoDireccion;
end;

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

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

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

procedure TfrViewDatosYSeleccionProveedorAlbaran.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 TfrViewDatosYSeleccionProveedorAlbaran.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.
