unit uPedidosMontajeController;

interface

uses
  uEditorDBItem,
  uPedidosProveedorController, uMontajesDetallesController, uBizPedidosProveedor,
  uBizPedidosMontaje;

type
  IPedidosMontajeController = interface(IPedidosProveedorController)
  ['{2E5321A9-03DC-4E81-A97B-C4D2D1C2ADB9}']
    function GetMontajeController: IMontajesDetallesController;
    procedure SetMontajeController(const Value: IMontajesDetallesController);
    property MontajeController: IMontajesDetallesController read GetMontajeController write SetMontajeController;
    function BuscarPedidosMontaje(const ID: Integer): IBizPedidoMontaje;
  end;

  TPedidosMontajeController = class(TPedidosProveedorController, IPedidosMontajeController)
  protected
    FMontajeController : IMontajesDetallesController;
    function GetMontajeController: IMontajesDetallesController;
    procedure SetMontajeController(const Value: IMontajesDetallesController);
    procedure RecuperarMontaje(APedido : IBizPedidoMontaje);

    //Estos son los tres métodos a sobre escribir si se desea heredar toda la logica de
    //este controller
    procedure AsignarDataModule; override;
    procedure RecuperarObjetos(APedido: IBizPedidoProveedor); override;
    procedure AsignarEditor(out AEditor: IEditorDBItem); override;

  public
    property MontajeController: IMontajesDetallesController read GetMontajeController write SetMontajeController;
    function BuscarPedidosMontaje(const ID: Integer): IBizPedidoMontaje;
    constructor Create;
    destructor Destroy; override;
  end;

implementation

uses
  uIEditorPedidoMontaje, uDataModulePedidosMontaje, uBizMontajesDetalles,
  uIDataModulePedidosMontaje;

{ TPedidosMontajeController }

procedure TPedidosMontajeController.AsignarDataModule;
begin
  FDataModule := TDataModulePedidosMontaje.Create(Nil);
end;

procedure TPedidosMontajeController.AsignarEditor(out AEditor: IEditorDBItem);
begin
//  inherited; No descomentar así crea solo el editor hijo
  CreateEditor('EditorPedidoMontaje', IEditorPedidoMontaje, AEditor);
end;

function TPedidosMontajeController.BuscarPedidosMontaje(const ID: Integer): IBizPedidoMontaje;
begin
  Result := (FDataModule as IDataModulePedidosMontaje).GetItemsMontaje(ID);
  FiltrarEmpresa(Result);
end;

constructor TPedidosMontajeController.Create;
begin
  inherited;
  FMontajeController := TMontajesDetallesController.Create;
end;

destructor TPedidosMontajeController.Destroy;
begin
  FMontajeController := Nil;
  inherited;
end;

procedure TPedidosMontajeController.RecuperarMontaje(APedido: IBizPedidoMontaje);
begin
  APedido.Montaje := (FMontajeController.Buscar(APedido.ID_MONTAJE) as IBizMontajeDetalles);
end;

procedure TPedidosMontajeController.RecuperarObjetos(APedido: IBizPedidoProveedor);
begin
  inherited;
  if not Assigned((APedido as IBizPedidoMontaje).Montaje)
  or ((APedido as IBizPedidoMontaje).ID_MONTAJE <> (APedido as IBizPedidoMontaje).Montaje.ID) then
     RecuperarMontaje((APedido as IBizPedidoMontaje))
end;

procedure TPedidosMontajeController.SetMontajeController(const Value: IMontajesDetallesController);
begin
  FMontajeController := Value;
end;

function TPedidosMontajeController.GetMontajeController: IMontajesDetallesController;
begin
  Result := FMontajeController;
end;

end.
