unit uBizObras;

interface

uses
  uDAInterfaces, uDADataTable, schObrasClient_Intf, uBizContactos,
  uDBSelectionListUtils;

const
  BIZ_CLIENT_OBRA = 'Client.Obra';
  BIZ_CLIENT_OBRA_EJECUCION = 'Client.Obra.Ejecucion';
//  BIZ_CLIENT_OBRA_EJECUCIONES_CERRADAS = 'Client.Obra.EjecucionesCerradas';
//  BIZ_CLIENT_OBRA_EJECUCION_ENCURSO = 'Client.Obra.EjecucionEnCurso';
  BIZ_CLIENT_OBRA_EJECUCION_PRESUPUESTO = 'Client.Obra.Ejecucion.Presupuesto';
  BIZ_CLIENT_OBRA_EJECUCION_PEDIDO_PROVEEDOR = 'Client.Obra.Ejecucion.PedidoProveedor';  

type
  IBizEjecucionPresupuestos = interface(IObrasEjecucionesPresupuestos)
    ['{F335B047-7559-4C40-8DA7-E06719D1F683}']
    function EsNuevo : Boolean;
  end;

  IBizEjecucionPedidosProveedor = interface(IObrasEjecucionesPedidosProveedor)
    ['{404DB8A7-7D36-459B-8C6A-33139B40F2C5}']
    function EsNuevo : Boolean;
  end;

  IBizEjecucionesObra = interface(IObrasEjecuciones)
    ['{6BAFA32B-39A5-4BC3-9F16-97A36745C3D9}']
    function EsNuevo : Boolean;
    function EnCurso : Boolean;
    procedure RecalcularBeneficio;

    function GetPresupuestos: IBizEjecucionPresupuestos;
    procedure SetPresupuestos(Value: IBizEjecucionPresupuestos);
    property Presupuestos: IBizEjecucionPresupuestos read GetPresupuestos write SetPresupuestos;

    function GetPedidos: IBizEjecucionPedidosProveedor;
    procedure SetPedidos(Value: IBizEjecucionPedidosProveedor);
    property Pedidos: IBizEjecucionPedidosProveedor read GetPedidos write SetPedidos;
  end;

//  IBizEjecucionesCerradasObra = interface(IObrasEjecucionesTerminadas)
//    ['{08CB6A7C-058C-4A07-AFED-64D861296BFE}']
//    {procedure SetSubcontrata(AValue : IBizProveedor);
//    function GetSubcontrata : IBizProveedor;
//    property Subcontrata : IBizProveedor read GetSubcontrata write SetSubcontrata;}
//
//    // Esta propidad es para que el controlador pueda acceder directamente
//    // a la propiedad Cliente
//    {procedure _SetSubcontrata(AValue : IBizProveedor);
//    function _GetSubcontrata : IBizProveedor;
//    property _Subcontrata : IBizProveedor read _GetSubcontrata write _SetSubcontrata;}
//  end;
//
//
//  IBizEjecucionEnCursoObra = interface(IObrasEjecucionesEnCurso)
//    ['{DDEE3280-32B0-4C5C-AC14-9AADD641407D}']
//		function EsNuevo : Boolean;
//    {procedure SetSubcontrata(AValue : IBizProveedor);
//    function GetSubcontrata : IBizProveedor;
//    property Subcontrata : IBizProveedor read GetSubcontrata write SetSubcontrata;}
//
//    // Esta propidad es para que el controlador pueda acceder directamente
//    // a la propiedad Cliente
//    {procedure _SetSubcontrata(AValue : IBizProveedor);
//    function _GetSubcontrata : IBizProveedor;
//    property _Subcontrata : IBizProveedor read _GetSubcontrata write _SetSubcontrata;}
//  end;


  IBizObra = interface(IObras)
    ['{96A7EC59-23CB-44FF-B3CF-8679C6F001C8}']

    procedure SetCliente(AValue : IBizCliente);
    function GetCliente : IBizCliente;
    property Cliente : IBizCliente read GetCliente write SetCliente;

    // Esta propidad es para que el controlador pueda acceder directamente
    // a la propiedad Cliente
    procedure _SetCliente(AValue : IBizCliente);
    function _GetCliente : IBizCliente;
    property _Cliente : IBizCliente read _GetCliente write _SetCliente;

    function GetEjecuciones: IBizEjecucionesObra;
    procedure SetEjecuciones(Value: IBizEjecucionesObra);
    property Ejecuciones: IBizEjecucionesObra read GetEjecuciones write SetEjecuciones;

		function EsNuevo : Boolean;
  end;


  TBizEjecucionPresupuestos = class(TObrasEjecucionesPresupuestosDataTableRules, IBizEjecucionPresupuestos)
  protected
    procedure BeforeInsert(Sender: TDADataTable); override;
  public
    function EsNuevo : Boolean;
  end;


  TBizEjecucionPedidosProveedor = class(TObrasEjecucionesPedidosProveedorDataTableRules, IBizEjecucionPedidosProveedor)
  protected
    procedure BeforeInsert(Sender: TDADataTable); override;
  public
    function EsNuevo : Boolean;
  end;


  TBizEjecucionesObra = class(TObrasEjecucionesDataTableRules, IBizEjecucionesObra)
  protected
    FPresupuestos : IBizEjecucionPresupuestos;
    FPresupuestosLink : TDADataSource;

    FPedidos : IBizEjecucionPedidosProveedor;
    FPedidosLink : TDADataSource;

    procedure BeforeInsert(Sender: TDADataTable); override;
    procedure OnNewRecord(Sender: TDADataTable); override;

    function GetPresupuestos: IBizEjecucionPresupuestos;
    procedure SetPresupuestos(Value: IBizEjecucionPresupuestos);

    function GetPedidos: IBizEjecucionPedidosProveedor;
    procedure SetPedidos(Value: IBizEjecucionPedidosProveedor);
  public
    function EsNuevo : Boolean;
    function EnCurso : Boolean;
    procedure RecalcularBeneficio;
    
    constructor Create(aDataTable: TDADataTable); override;
    destructor Destroy; override;

    property Presupuestos: IBizEjecucionPresupuestos read GetPresupuestos write SetPresupuestos;
    property Pedidos: IBizEjecucionPedidosProveedor read GetPedidos write SetPedidos;
  end;


//  TBizEjecucionesCerradasObra = class(TObrasEjecucionesTerminadasDataTableRules, IBizEjecucionesCerradasObra)
//  protected
////    FSubcontrata : IBizProveedor;
//
//    procedure BeforeInsert(Sender: TDADataTable); override;
//    procedure OnNewRecord(Sender: TDADataTable); override;
//
//
//{    procedure _SetSubcontrata(AValue : IBizProveedor);
//    function _GetSubcontrata : IBizProveedor;
//
//    procedure SetSubcontrata(AValue : IBizProveedor);
//    function GetSubcontrata : IBizProveedor;}
//  public
//    constructor Create(aDataTable: TDADataTable); override;
//    destructor Destroy; override;
//
//{    property Subcontrata : IBizProveedor read GetSubcontrata write SetSubcontrata;
//    property _Subcontrata : IBizProveedor read _GetSubcontrata write _SetSubcontrata;}
//  end;
//
//  TBizEjecucionEnCursoObra = class(TObrasEjecucionesEnCursoDataTableRules, IBizEjecucionEnCursoObra)
//  protected
////    FSubcontrata : IBizProveedor;
//
//    procedure BeforeInsert(Sender: TDADataTable); override;
//    procedure OnNewRecord(Sender: TDADataTable); override;
//
//{    procedure _SetSubcontrata(AValue : IBizProveedor);
//    function _GetSubcontrata : IBizProveedor;
//
//    procedure SetSubcontrata(AValue : IBizProveedor);
//    function GetSubcontrata : IBizProveedor;}
//  public
//		function EsNuevo : Boolean;
//    constructor Create(aDataTable: TDADataTable); override;
//    destructor Destroy; override;
//
//{    property Subcontrata : IBizProveedor read GetSubcontrata write SetSubcontrata;
//    property _Subcontrata : IBizProveedor read _GetSubcontrata write _SetSubcontrata;}
//  end;


  TBizObra = class(TObrasDataTableRules, IBizObra, ISeleccionable)
  protected
    FSeleccionableInterface : ISeleccionable;
    FCliente : IBizCliente;

//    FEjecucionEnCurso : IBizEjecucionEnCursoObra;
//    FEjecucionEnCursoLink : TDADataSource;

    FEjecuciones : IBizEjecucionesObra;
    FEjecucionesLink : TDADataSource;

    procedure SetCliente(AValue : IBizCliente);
    function GetCliente : IBizCliente;

    procedure _SetCliente(AValue : IBizCliente);
    function _GetCliente : IBizCliente;

    function GetEjecuciones: IBizEjecucionesObra;
    procedure SetEjecuciones(Value: IBizEjecucionesObra);

//    function GetEjecucionEnCurso: IBizEjecucionEnCursoObra;
//    procedure SetEjecucionEnCurso(Value: IBizEjecucionEnCursoObra);

    procedure OnNewRecord(Sender: TDADataTable); override;
  public
    constructor Create(aDataTable: TDADataTable); override;
    destructor Destroy; override;

    function EsNuevo : Boolean;
    property Cliente : IBizCliente read GetCliente write SetCliente;
    property _Cliente : IBizCliente read _GetCliente write _SetCliente;
    property Ejecuciones: IBizEjecucionesObra read GetEjecuciones write SetEjecuciones;
//    property EjecucionEnCurso: IBizEjecucionEnCursoObra read GetEjecucionEnCurso write SetEjecucionEnCurso;

    property SeleccionableInterface : ISeleccionable read FSeleccionableInterface
        write FSeleccionableInterface implements ISeleccionable;
  end;

implementation

uses
	uFactuGES_App, DB, DateUtils, SysUtils, uDataTableUtils;

{ TBizEjecucionesCerradasObra }

procedure TBizEjecucionesObra.BeforeInsert(Sender: TDADataTable);
var
  AMasterTable : TDADataTable;
begin
  inherited;
  AMasterTable := DataTable.GetMasterDataTable;
  if Assigned(AMasterTable) and (AMasterTable.State = dsInsert) then
    AMasterTable.Post;
end;

constructor TBizEjecucionesObra.Create(aDataTable: TDADataTable);
begin
  inherited;
  FPresupuestos := NIL;
  FPresupuestosLink := TDADataSource.Create(NIL);
  FPresupuestosLink.DataTable := aDataTable;

  FPedidos := NIL;
  FPedidosLink := TDADataSource.Create(NIL);
  FPedidosLink.DataTable := aDataTable;
end;

destructor TBizEjecucionesObra.Destroy;
begin
  FPresupuestos := NIL;
  FreeANDNIL(FPresupuestosLink);

  FPedidos := NIL;
  FreeANDNIL(FPedidosLink);

  inherited;
end;

function TBizEjecucionesObra.EnCurso: Boolean;
begin
  Result := FECHA_FINIsNull;
end;

function TBizEjecucionesObra.EsNuevo: Boolean;
begin
  Result := (ID < 0);
end;

function TBizEjecucionesObra.GetPedidos: IBizEjecucionPedidosProveedor;
begin
  Result := FPedidos;
end;

function TBizEjecucionesObra.GetPresupuestos: IBizEjecucionPresupuestos;
begin
  Result := FPresupuestos;
end;

procedure TBizEjecucionesObra.OnNewRecord(Sender: TDADataTable);
begin
  inherited;
  FECHA_INICIO := DateOf(Now);
end;

procedure TBizEjecucionesObra.RecalcularBeneficio;
begin
  Edit;
  IMPORTE_TOTAL := IMPORTE_INGRESOS - IMPORTE_GASTOS;
end;

procedure TBizEjecucionesObra.SetPedidos(
  Value: IBizEjecucionPedidosProveedor);
begin
  FPedidos := Value;
  EnlazarMaestroDetalle(FPedidosLink, FPedidos);
end;

procedure TBizEjecucionesObra.SetPresupuestos(Value: IBizEjecucionPresupuestos);
begin
  FPresupuestos := Value;
  EnlazarMaestroDetalle(FPresupuestosLink, FPresupuestos);
end;

{procedure TBizEjecucionesCerradasObra.SetSubcontrata(AValue: IBizProveedor);
var
  bEnEdicion : Boolean;
begin
  FSubcontrata := AValue;

  if Assigned(FSubcontrata) then
  begin
    if not FSubcontrata.DataTable.Active then
      FSubcontrata.DataTable.Active := True;

    if ID_SUBCONTRATA <> FSubcontrata.ID then
    begin
      bEnEdicion := (DataTable.State in dsEditModes);
      if not bEnEdicion then
         DataTable.Edit;

      ID_SUBCONTRATA := FSubcontrata.ID;

      DataTable.Post;  //Muy importante ya que es necesario hacer un post de la cabecera antes de aņadir detalles
                       //si se quita el id de la cabecera y los detalles se desincroniza
      if bEnEdicion then
         DataTable.Edit;
    end;
  end;
end;}

{function TBizEjecucionesCerradasObra._GetSubcontrata: IBizProveedor;
begin
  Result := FSubcontrata;
end;

procedure TBizEjecucionesCerradasObra._SetSubcontrata(AValue: IBizProveedor);
begin
  FSubcontrata := AValue;
end;}

{ TBizEjecucionEnCursoObra }

//procedure TBizEjecucionEnCursoObra.BeforeInsert(Sender: TDADataTable);
//var
//  AMasterTable : TDADataTable;
//begin
//  inherited;
//  AMasterTable := DataTable.GetMasterDataTable;
//  if Assigned(AMasterTable) and (AMasterTable.State = dsInsert) then
//    AMasterTable.Post;
//end;
//
//constructor TBizEjecucionEnCursoObra.Create(aDataTable: TDADataTable);
//begin
//  inherited;
////  FSubcontrata := NIL;
//end;
//
//destructor TBizEjecucionEnCursoObra.Destroy;
//begin
////  FSubcontrata := NIL;
//  inherited;
//end;
//
//function TBizEjecucionEnCursoObra.EsNuevo: Boolean;
//begin
//  Result := (ID < 0);
//end;
//{
//function TBizEjecucionEnCursoObra.GetSubcontrata: IBizProveedor;
//begin
//  Result := FSubcontrata;
//end;}
//
//procedure TBizEjecucionEnCursoObra.OnNewRecord(Sender: TDADataTable);
//begin
//  inherited;
//  FECHA_INICIO := DateOf(Now);
//end;

{procedure TBizEjecucionEnCursoObra.SetSubcontrata(AValue: IBizProveedor);
var
  bEnEdicion : Boolean;
begin
  FSubcontrata := AValue;

  if Assigned(FSubcontrata) then
  begin
    if not FSubcontrata.DataTable.Active then
      FSubcontrata.DataTable.Active := True;

    if ID_SUBCONTRATA <> FSubcontrata.ID then
    begin
      bEnEdicion := (DataTable.State in dsEditModes);
      if not bEnEdicion then
         DataTable.Edit;

      ID_SUBCONTRATA := FSubcontrata.ID;

      DataTable.Post;  //Muy importante ya que es necesario hacer un post de la cabecera antes de aņadir detalles
                       //si se quita el id de la cabecera y los detalles se desincroniza
      if bEnEdicion then
         DataTable.Edit;
    end;
  end;
end;}

{function TBizEjecucionEnCursoObra._GetSubcontrata: IBizProveedor;
begin
  Result := FSubcontrata;
end;}

{procedure TBizEjecucionEnCursoObra._SetSubcontrata(AValue: IBizProveedor);
begin
  FSubcontrata := AValue;
end;}

{ TBizObra }

constructor TBizObra.Create(aDataTable: TDADataTable);
begin
  inherited;
  FCliente := NIL;

//  FEjecucionEnCurso := NIL;
//  FEjecucionEnCursoLink := TDADataSource.Create(NIL);
//  FEjecucionEnCursoLink.DataTable := aDataTable;

  FEjecuciones := NIL;
  FEjecucionesLink := TDADataSource.Create(NIL);
  FEjecucionesLink.DataTable := aDataTable;

  FSeleccionableInterface := TSeleccionable.Create(aDataTable);
end;

destructor TBizObra.Destroy;
begin
  FCliente := NIL;

//  FEjecucionEnCurso := NIL;
//  FreeANDNIL(FEjecucionEnCursoLink);

  FEjecuciones := NIL;
  FreeANDNIL(FEjecucionesLink);

  FSeleccionableInterface := NIL;
  inherited;
end;

function TBizObra.EsNuevo: Boolean;
begin
  Result := (ID < 0);
end;

function TBizObra.GetCliente: IBizCliente;
begin
  Result := FCliente;
end;

//function TBizObra.GetEjecucionEnCurso: IBizEjecucionEnCursoObra;
//begin
//  Result := FEjecucionEnCurso;
//end;

function TBizObra.GetEjecuciones: IBizEjecucionesObra;
begin
  Result := FEjecuciones;
end;

procedure TBizObra.OnNewRecord(Sender: TDADataTable);
begin
  inherited;
  ID_EMPRESA := AppFactuGES.EmpresaActiva.ID;
  USUARIO := AppFactuGES.UsuarioActivo.UserName;
end;

procedure TBizObra.SetCliente(AValue: IBizCliente);
var
  bEnEdicion : Boolean;
begin
  FCliente := AValue;

  if Assigned(FCliente) then
  begin
    if not FCliente.DataTable.Active then
      FCliente.DataTable.Active := True;

    if ID_Cliente <> FCliente.ID then
    begin
      bEnEdicion := (DataTable.State in dsEditModes);
      if not bEnEdicion then
         DataTable.Edit;

      ID_CLIENTE := FCliente.ID;

      DataTable.Post;  //Muy importante ya que es necesario hacer un post de la cabecera antes de aņadir detalles
                       //si se quita el id de la cabecera y los detalles se desincroniza
      if bEnEdicion then
         DataTable.Edit;
    end;
  end;
end;

//procedure TBizObra.SetEjecucionEnCurso(Value: IBizEjecucionEnCursoObra);
//begin
//  FEjecucionEnCurso := Value;
//  EnlazarMaestroDetalle(FEjecucionEnCursoLink, FEjecucionEnCurso);
//end;

procedure TBizObra.SetEjecuciones(Value: IBizEjecucionesObra);
begin
  FEjecuciones := Value;
  EnlazarMaestroDetalle(FEjecucionesLink, FEjecuciones);
end;

function TBizObra._GetCliente: IBizCliente;
begin
  Result := FCliente;
end;

procedure TBizObra._SetCliente(AValue: IBizCliente);
begin
  FCliente := AValue;
end;

{ TBizEjecucionPresupuestos }

procedure TBizEjecucionPresupuestos.BeforeInsert(Sender: TDADataTable);
var
  AMasterTable : TDADataTable;
begin
  inherited;
  AMasterTable := DataTable.GetMasterDataTable;
  if Assigned(AMasterTable) and (AMasterTable.State = dsInsert) then
    AMasterTable.Post;
end;

function TBizEjecucionPresupuestos.EsNuevo: Boolean;
begin
  Result := (ID < 0);
end;

{ TBizEjecucionPedidosProveedor }

procedure TBizEjecucionPedidosProveedor.BeforeInsert(Sender: TDADataTable);
var
  AMasterTable : TDADataTable;
begin
  inherited;
  AMasterTable := DataTable.GetMasterDataTable;
  if Assigned(AMasterTable) and (AMasterTable.State = dsInsert) then
    AMasterTable.Post;
end;

function TBizEjecucionPedidosProveedor.EsNuevo: Boolean;
begin
  Result := (ID < 0);
end;

initialization
  RegisterDataTableRules(BIZ_CLIENT_OBRA, TBizObra);
  RegisterDataTableRules(BIz_CLIENT_OBRA_EJECUCION, TBizEjecucionesObra);
//  RegisterDataTableRules(BIz_CLIENT_OBRA_EJECUCIONES_CERRADAS, TBizEjecucionesCerradasObra);
//  RegisterDataTableRules(BIz_CLIENT_OBRA_EJECUCION_ENCURSO, TBizEjecucionEnCursoObra);
  RegisterDataTableRules(BIZ_CLIENT_OBRA_EJECUCION_PRESUPUESTO, TBizEjecucionPresupuestos);
  RegisterDataTableRules(BIZ_CLIENT_OBRA_EJECUCION_PEDIDO_PROVEEDOR, TBizEjecucionPedidosProveedor);

finalization

end.
