unit uBizMontajesCompleto;

interface

uses
  uDADataTable, uBizMontajesDetalles, uBizPedidosMontaje, uBizCobrosMontaje,
  schMontajesClient_Intf, uBizDocumentosAsociados;

const
  BIZ_CLIENT_GASTOS_MONTAJE = 'Client.GastosMontaje';
  BIZ_CLIENT_MONTAJE_COMPLETO = 'Client.Montaje.Completo';

type
  IBizGastosMontaje = interface(IMontajes_Gastos)
  ['{B740859C-7326-437E-ACB4-2035DF9743BA}']
    function EsNuevo: Boolean;
  end;

  IBizMontajeCompleto = interface(IBizMontajeDetalles)
  ['{6D72F72F-010D-4727-8002-239EDE0774F7}']
    function GetGastos: IBizGastosMontaje;
    procedure SetGastos(Value: IBizGastosMontaje);
    property Gastos: IBizGastosMontaje read GetGastos write SetGastos;

    procedure SetPedidos(AValue : IBizPedidoMontaje);
    function GetPedidos : IBizPedidoMontaje;
    property Pedidos : IBizPedidoMontaje read GetPedidos write SetPedidos;

    procedure SetCobros(AValue : IBizCobroMontaje);
    function GetCobros : IBizCobroMontaje;
    property Cobros : IBizCobroMontaje read GetCobros write SetCobros;

    //DOCUMENTOS ASOCIADOS
    function GetGestorDocumentos: TGestorDocumentos;
    procedure SetGestorDocumentos(Value: TGestorDocumentos);
    property GestorDocumentos: TGestorDocumentos read GetGestorDocumentos write SetGestorDocumentos;
  end;

  //Clase de negocio de los gastos del montaje
  TBizGastosMontaje = class(TMontajes_GastosDataTableRules, IBizGastosMontaje)
  private
    FContadorID: Integer;
  protected
    procedure OnNewRecord(Sender: TDADataTable); override;
  public
    function EsNuevo: Boolean;
    constructor Create(aDataTable: TDADataTable); override;
  end;

  //Clase de negocio de montajes a los que le aņadimos pedidos y cobros
  TBizMontajeCompleto = class(TBizMontajeDetalles, IBizMontajeCompleto,
                              IBizDocumentosAsociados)
  protected
    FGastos : IBizGastosMontaje;
    FGastosLink : TDADataSource;
    FPedidos : IBizPedidoMontaje;
    FCobros : IBizCobroMontaje;

    //DOCUMENTOS ASOCIADOS
    FGestorDocumentos: TGestorDocumentos;
    function GetGestorDocumentos: TGestorDocumentos;
    procedure SetGestorDocumentos(Value: TGestorDocumentos);

    function GetGastos: IBizGastosMontaje;
    procedure SetGastos(Value: IBizGastosMontaje);
    procedure SetPedidos(AValue : IBizPedidoMontaje);
    function GetPedidos : IBizPedidoMontaje;
    procedure SetCobros(AValue : IBizCobroMontaje);
    function GetCobros : IBizCobroMontaje;

    procedure BeforeDelete(Sender: TDADataTable); override;
    procedure BeforeCancel(Sender: TDADataTable); override;
    procedure SetIDValue(const aValue: Integer); override;

  public
    property Gastos: IBizGastosMontaje read GetGastos write SetGastos;
    property Pedidos : IBizPedidoMontaje read GetPedidos write SetPedidos;
    property Cobros : IBizCobroMontaje read GetCobros write SetCobros;

    //DOCUMENTOS ASOCIADOS
    property GestorDocumentos: TGestorDocumentos read GetGestorDocumentos write SetGestorDocumentos;

    constructor Create(aDataTable: TDADataTable); override;
    destructor Destroy; override;
  end;

implementation

uses SysUtils, Variants, uDataModuleConfiguracion, uDataTableUtils;

{ TBizMontajeCompleto }

procedure TBizMontajeCompleto.BeforeCancel(Sender: TDADataTable);
begin
  if Assigned(GestorDocumentos) then
     GestorDocumentos.procesarCancelTable;
end;

procedure TBizMontajeCompleto.BeforeDelete(Sender: TDADataTable);
begin
  if Assigned(GestorDocumentos) then
     GestorDocumentos.procesarDeleteTable;
end;

constructor TBizMontajeCompleto.Create(aDataTable: TDADataTable);
var
  Ruta: Variant;

begin
  inherited;
  FGastosLink := TDADataSource.Create(NIL);
  FGastosLink.DataTable := aDataTable;
  FPedidos := Nil;
  FCobros := Nil;

  //DOCUMENTOS ASOCIADOS
  //En caso de no poder acceder a la ruta de red (Caso de dos tiendas conectadas por internet)
  //deshabilitamos el gestor de documentos
//  showmessage(ExtractFilePath(Application.ExeName) + 'Documentos' + PathDelim);
  Ruta := dmConfiguracion.darValor(CTE_DOCUMENTOS);
  if (not VarIsNull(Ruta)) and (DirectoryExists(Ruta)) then
  begin
    FGestorDocumentos := TGestorDocumentos.Create(Nil);
    FGestorDocumentos.RootDocumentos := dmConfiguracion.darValor(CTE_DOCUMENTOS);
    aDataTable.BeforeCancel := BeforeCancel;
//    aDataTable.AfterCancel := AfterCancel;
  end
  else
    FGestorDocumentos := Nil
end;

destructor TBizMontajeCompleto.Destroy;
begin
  FPedidos := Nil;
  FCobros := Nil;
  FGastos := NIL;
  FGastosLink.Free;
  FreeAndNil(FGestorDocumentos);
  inherited;
end;

function TBizMontajeCompleto.GetCobros: IBizCobroMontaje;
begin
  Result := FCobros;
end;

function TBizMontajeCompleto.GetGastos: IBizGastosMontaje;
begin
  Result := FGastos;
end;

function TBizMontajeCompleto.GetGestorDocumentos: TGestorDocumentos;
begin
    if Assigned(FGestorDocumentos) then
       FGestorDocumentos.Directorio := ID;

  Result := FGestorDocumentos;
end;

function TBizMontajeCompleto.GetPedidos: IBizPedidoMontaje;
begin
  Result := FPedidos;
end;

procedure TBizMontajeCompleto.SetCobros(AValue: IBizCobroMontaje);
begin
  FCobros := AValue;

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

procedure TBizMontajeCompleto.SetGastos(Value: IBizGastosMontaje);
begin
  FGastos := Value;
  EnlazarMaestroDetalle(FGastosLink, FGastos);
end;

procedure TBizMontajeCompleto.SetGestorDocumentos(Value: TGestorDocumentos);
begin
  FGestorDocumentos := Value;
end;

procedure TBizMontajeCompleto.SetIDValue(const aValue: Integer);
begin
//    frViewDocumentosAsociados.DeshabilitarDocumentos;

      try
        if Assigned(GestorDocumentos) then
           GestorDocumentos.Directorio := aValue;
      except
      on E: Exception do
        begin
//          Error := True;
//          ErrorText := E.Message;
//          DisplayValue := frViewObra.frViewDatosObra.edtNombre.EditValue;
        end;
      end;

//    frViewDocumentosAsociados.HabilitarDocumentos;

  inherited;
end;

procedure TBizMontajeCompleto.SetPedidos(AValue: IBizPedidoMontaje);
begin
  FPedidos := AValue;

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

{ TBizGastosMontaje }

constructor TBizGastosMontaje.Create(aDataTable: TDADataTable);
begin
  inherited Create(aDataTable);
  FContadorID := -1;
end;

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

procedure TBizGastosMontaje.OnNewRecord(Sender: TDADataTable);
begin
  inherited;
  ID := FContadorID; // -1, -2, -3...
  FECHA_GASTO := Date;
  Dec(FContadorID);
end;

initialization
  RegisterDataTableRules(BIZ_CLIENT_GASTOS_MONTAJE, TBizGastosMontaje);
  RegisterDataTableRules(BIZ_CLIENT_MONTAJE_COMPLETO, TBizMontajeCompleto);

finalization

end.

