unit uViewDetallesPedidoProveedor;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uViewDetallesArticulos, cxStyles, cxCustomData, cxGraphics, cxFilter,
  cxData, cxDataStorage, cxEdit, DB, cxDBData, ImgList, PngImageList,
  uDADataTable, ActnList, ComCtrls, ToolWin, cxGridLevel, cxClasses, cxControls,
  cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView,
  cxGrid, cxImageComboBox, cxTextEdit, cxMaskEdit, cxCheckBox, cxCurrencyEdit,
  Grids, DBGrids, StdCtrls, ExtCtrls, cxRichEdit, ExtActns, StdActns,
  JvExStdCtrls, JvCombobox, JvColorCombo, TB2Item, TBX, TB2Dock, TB2Toolbar,
  uArticulosController, uBizPedidosProveedor, uDAInterfaces,
  cxButtonEdit, cxDropDownEdit, Menus, cxGridCustomPopupMenu, cxGridPopupMenu,
  cxEditRepositoryItems;

type
  IViewDetallesPedidoProveedor = interface(IViewDetallesArticulos)
  ['{4C82AADF-7FE2-47BC-88F1-2F2DA6DF0B57}']
    function GetPedido: IBizPedidoProveedor;
    procedure SetPedido(const Value: IBizPedidoProveedor);
    property Pedido: IBizPedidoProveedor read GetPedido write SetPedido;
  end;

  TfrViewDetallesPedidoProveedor = class(TfrViewDetallesArticulos, IViewDetallesPedidoProveedor)
    TBXItem18: TTBXItem;
    Artculosdelcatlogo1: TMenuItem;
    N2: TMenuItem;
    procedure CustomViewCreate(Sender: TObject);
    procedure CustomViewDestroy(Sender: TObject);
    procedure OnValidateReferencia(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); override;
    procedure OnValidateReferenciaProveedor(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); virtual;

  protected
    FPedido: IBizPedidoProveedor;
    function GetPedido: IBizPedidoProveedor;
    procedure SetPedido(const Value: IBizPedidoProveedor);

    procedure AnadirArticulosInterno; override;
    procedure RellenarArticulosInterno; override;
    function AnadirArticulo(pReferencia: String; TipoReferencia: TEnumReferencia): Boolean; override;

  public
    property Pedido: IBizPedidoProveedor read GetPedido write SetPedido;
  end;

implementation
{$R *.dfm}

uses uDetallesPedidoProveedorController;

{ TfrViewDetallesPedidoProveedor }

procedure TfrViewDetallesPedidoProveedor.AnadirArticulosInterno;
begin
//No sé porque está en este módulo hecho así, supongo que por seguridad.
  if Assigned(Pedido) and Assigned(Pedido.Proveedor)
  then (Controller as IDetallesPedidoProveedorController).AnadirArticulos(Detalles, Pedido.Proveedor)
  else (Controller as IDetallesPedidoProveedorController).AnadirArticulos(Detalles);
end;

procedure TfrViewDetallesPedidoProveedor.CustomViewCreate(Sender: TObject);
begin
  inherited;
  cxGridViewREFERENCIA.Properties.OnValidate := OnValidateReferencia;
  cxGridViewREFERENCIA_PROVEEDOR.Properties.OnValidate := OnValidateReferenciaProveedor;
end;

procedure TfrViewDetallesPedidoProveedor.CustomViewDestroy(Sender: TObject);
begin
  FPedido := Nil;
  cxGridViewREFERENCIA.Properties.OnValidate := Nil;
  cxGridViewREFERENCIA_PROVEEDOR.Properties.OnValidate := Nil;
  inherited;
end;

procedure TfrViewDetallesPedidoProveedor.OnValidateReferencia(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
var
  lsReferencia : String;
begin
  //En el caso de cadena vacia no validamos
  if (VarIsNull(DisplayValue)) then
     Exit;

  lsReferencia := VarToStr(DisplayValue);
  if (length(trim(lsReferencia)) = 0) then
     Exit;

  if not AnadirArticulo(lsReferencia, tReferenciaParaCompras) then
  begin
    ErrorText := 'La referencia introducida no exite en el catálogo del proveedor';
    Error := True;
  end;
end;

procedure TfrViewDetallesPedidoProveedor.OnValidateReferenciaProveedor(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
var
  lsReferencia : String;
begin
  //En el caso de cadena vacia no validamos
  if (VarIsNull(DisplayValue)) then
     Exit;

  lsReferencia := VarToStr(DisplayValue);
  if (length(trim(lsReferencia)) = 0) then
     Exit;

  if not AnadirArticulo(lsReferencia, tRefProveedorParaCompras) then
  begin
    ErrorText := 'La referencia introducida no exite en el catálogo del proveedor';
    Error := True;
  end;
end;

function TfrViewDetallesPedidoProveedor.AnadirArticulo(pReferencia: String; TipoReferencia: TEnumReferencia): Boolean;
begin
  Result := (Controller as IDetallesPedidoProveedorController).AnadirArticulo(Detalles, pReferencia, TipoReferencia, Pedido.ID_PROVEEDOR);
end;

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

procedure TfrViewDetallesPedidoProveedor.RellenarArticulosInterno;
begin
//No sé porque está en este módulo hecho así, supongo que por seguridad.
  if Assigned(Pedido) and Assigned(Pedido.Proveedor)
  then (Controller as IDetallesPedidoProveedorController).AnadirArticulos(Detalles, Pedido.Proveedor, False)
  else (Controller as IDetallesPedidoProveedorController).AnadirArticulos(Detalles, False);
end;

procedure TfrViewDetallesPedidoProveedor.SetPedido(const Value: IBizPedidoProveedor);
begin
  FPedido := Value;
end;

end.
