unit uMontajesCompletoController;

interface


uses
  Classes, SysUtils, uDADataTable, uControllerBase, uEditorDBItem,
//  uIDataModuleMontajes,
//  uMontajesController, uPresupuestosController, uDetallesMontajeController,
  uBizMontajes, uIDataModuleMontajes,
  uBizMontajesCompleto, uMontajesDetallesController, uPedidosMontajeController,
  uCobrosMontajeController, uGastosMontajeController;

type
  IMontajesCompletoController = interface(IMontajesDetallesController)
  ['{6429BDB3-3685-4A77-89CA-7454C8C96C24}']
    function GetGastosController: IGastosMontajeController;
    procedure SetGastosController(const Value: IGastosMontajeController);
    property GastosController: IGastosMontajeController read GetGastosController write SetGastosController;

    function GetPedidosController: IPedidosMontajeController;
    procedure SetPedidosController(const Value: IPedidosMontajeController);
    property PedidosController: IPedidosMontajeController read GetPedidosController write SetPedidosController;

    function GetCobrosController: ICobrosMontajeController;
    procedure SetCobrosController(const Value: ICobrosMontajeController);
    property CobrosController: ICobrosMontajeController read GetCobrosController write SetCobrosController;
  end;

  TMontajesCompletoController = class(TMontajesDetallesController, IMontajesCompletoController)
  protected
    FGastosController : IGastosMontajeController;
    FPedidosController: IPedidosMontajeController;
    FCobrosController: ICobrosMontajeController;

    function GetGastosController: IGastosMontajeController;
    procedure SetGastosController(const Value: IGastosMontajeController);
    function GetPedidosController: IPedidosMontajeController;
    procedure SetPedidosController(const Value: IPedidosMontajeController);
    procedure RecuperarPedidos(AMontaje : IBizMontajeCompleto);

    function GetCobrosController: ICobrosMontajeController;
    procedure SetCobrosController(const Value: ICobrosMontajeController);
    procedure RecuperarCobros(AMontaje : IBizMontajeCompleto);

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

    function ValidarMontaje(AMontaje: IBizMontaje): Boolean; override;
    procedure AsignarID(AMontaje: IBizMontaje; NuevoID:Integer); override;


  public
    property GastosController: IGastosMontajeController read GetGastosController write SetGastosController;
    property PedidosController: IPedidosMontajeController read GetPedidosController write SetPedidosController;
    property CobrosController: ICobrosMontajeController read GetCobrosController write SetCobrosController;
    constructor Create;
    destructor Destroy; override;
  end;

implementation

uses
  cxControls, DB, uEditorRegistryUtils, //schMontajesClient_Intf,
//  uBizContactos, uIEditorMontajes, uIEditorMontaje, ,
//  uIEditorElegirMontajes, uDataModuleUsuarios, uDAInterfaces, uDataTableUtils,
//  uDateUtils, uROTypes, DateUtils, Controls,
//   uIDataModuleMontajesDetalle;
 uIEditorMontajeCompleto,
 uDataModuleMontajesCompleto, uIDataModuleMontajesCompleto;

{ TMontajesDetallesController }

procedure TMontajesCompletoController.AsignarDataModule;
begin
  FDataModule := TDataModuleMontajesCompleto.Create(Nil);
end;

procedure TMontajesCompletoController.AsignarEditor(out AEditor: IEditorDBItem);
begin
  CreateEditor('EditorMontajeCompleto', IEditorMontajeCompleto, AEditor);
end;

procedure TMontajesCompletoController.AsignarID(AMontaje: IBizMontaje; NuevoID: Integer);
begin
  if not Assigned(FGastosController) then
    raise Exception.Create ('Controller gastos no asignado');

  { ¡¡¡ OJO !!!
    Primero cambiamos el ID de las tablas detalles
    porque si cambiamos antes el ID de la cabecera
    deja de funcionar la relacion M/D y no
    encontraríamos las filas detalle.

      -->  MASTER.ID = DETAIL.ID_MONTAJE <--
  }

  FGastosController.AsignarID((AMontaje as IBizMontajeCompleto).Gastos, NuevoID, AMontaje.EsNuevo);
  inherited;
end;

constructor TMontajesCompletoController.Create;
begin
  inherited;
  FGastosController := TGastosMontajeController.Create;
  FPedidosController := TPedidosMontajeController.Create;
  FCobrosController := TCobrosMontajeController.Create;
end;

destructor TMontajesCompletoController.Destroy;
begin
  FGastosController := Nil;
  FPedidosController := Nil;
  FCobrosController := Nil;  
  inherited;
end;

procedure TMontajesCompletoController.RecuperarCobros(AMontaje: IBizMontajeCompleto);
begin
  AMontaje.Cobros := FCobrosController.BuscarCobrosMontaje(AMontaje.ID);
end;

procedure TMontajesCompletoController.RecuperarObjetos(AMontaje: IBizMontaje);
begin
  inherited;
  if not Assigned((AMontaje as IBizMontajeCompleto).Pedidos) then
     RecuperarPedidos((AMontaje as IBizMontajeCompleto));
  if not Assigned((AMontaje as IBizMontajeCompleto).Cobros) then
     RecuperarCobros((AMontaje as IBizMontajeCompleto));
end;

procedure TMontajesCompletoController.RecuperarPedidos(AMontaje: IBizMontajeCompleto);
begin
  AMontaje.Pedidos := FPedidosController.BuscarPedidosMontaje(AMontaje.ID);
end;

procedure TMontajesCompletoController.SetCobrosController(const Value: ICobrosMontajeController);
begin
  FCobrosController := Value;
end;

procedure TMontajesCompletoController.SetGastosController(const Value: IGastosMontajeController);
begin
  FGastosController := Value;
end;

procedure TMontajesCompletoController.SetPedidosController(const Value: IPedidosMontajeController);
begin
  FPedidosController := Value;
end;

function TMontajesCompletoController.ValidarMontaje(AMontaje: IBizMontaje): Boolean;
begin
  Result := inherited ValidarMontaje(AMontaje);
  if not Result then exit;

  Result := False;

  if not Assigned(FGastosController) then
    raise Exception.Create ('Controller gastos no asignado');

  //Tambien hacemos post de sus tablas hija
  if ((AMontaje as IBizMontajeCompleto).Gastos.DataTable.State in dsEditModes) then
      (AMontaje as IBizMontajeCompleto).Gastos.DataTable.Post;

  Result := True;    
end;

function TMontajesCompletoController.GetCobrosController: ICobrosMontajeController;
begin
  Result := FCobrosController;
end;

function TMontajesCompletoController.GetGastosController: IGastosMontajeController;
begin
  Result := FGastosController;
end;

function TMontajesCompletoController.GetPedidosController: IPedidosMontajeController;
begin
  Result := FPedidosController;
end;

end.
