unit uBizPedidosProveedor;

interface

uses
  Classes, uDADataTable, schPedidosProveedorClient_Intf,
  uBizContactos, uBizDetallesPedidoProveedor, uBizDocumentosAsociados;

const
  BIZ_CLIENT_PEDIDO_PROVEEDOR = 'Client.PedidoProveedor';

  SITUACION_PEDIDO_PENDIENTE = 'Pendiente';
  SITUACION_PEDIDO_PARCIAL = 'Parcialmente recibido';
  SITUACION_PEDIDO_RECIBIDO = 'Recibido';

type
  IBizPedidoProveedor = interface(IPedidosProveedor)
  ['{D6F6129E-099A-4E7B-9FD3-C3C8174412A8}']

    procedure SetProveedor(AValue : IBizProveedor);
    function GetProveedor : IBizProveedor;
    property Proveedor : IBizProveedor read GetProveedor write SetProveedor;

    function GetDetalles: IBizDetallesPedidoProveedor;
    procedure SetDetalles(Value: IBizDetallesPedidoProveedor);
    property Detalles: IBizDetallesPedidoProveedor read GetDetalles write SetDetalles;

    function EsNuevo : Boolean;
    function DarListaSituaciones: TStringList;

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

  TBizPedidoProveedor = class(TPedidosProveedorDataTableRules, IBizPedidoProveedor,
                              IBizDocumentosAsociados)
  protected
    FProveedor : IBizProveedor;
    FDetalles : IBizDetallesPedidoProveedor;
    FDetallesLink : TDADataSource;

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

    procedure SetProveedor(AValue : IBizProveedor);
    function GetProveedor : IBizProveedor;

    function GetDetalles: IBizDetallesPedidoProveedor;
    procedure SetDetalles(Value: IBizDetallesPedidoProveedor);

    procedure SetFECHA_CONFIRMACIONValue(const aValue: TDateTime); override;
    procedure SetFECHA_ENTREGAValue(const aValue: TDateTime); override;
    procedure SetFECHA_PEDIDOValue(const aValue: TDateTime); override;

    procedure OnNewRecord(Sender: TDADataTable); override;
    procedure BeforeDelete(Sender: TDADataTable); override;
    procedure BeforeCancel(Sender: TDADataTable); override;
//    procedure AfterCancel(Sender: TDADataTable); override;
    procedure SetIDValue(const aValue: Integer); override;
    procedure IniciarValoresPedidoNuevo;
  public
    function DarListaSituaciones: TStringList;
    function EsNuevo : Boolean;
    property Proveedor : IBizProveedor read GetProveedor write SetProveedor;
    property Detalles: IBizDetallesPedidoProveedor read GetDetalles write SetDetalles;

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

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

implementation

uses
  SysUtils, Variants, uDataModuleConfiguracion, uDataModuleUsuarios,
  uDataTableUtils, DateUtils, uDateUtils;

{ TBizPedidoProveedor }

{procedure TBizPedidoProveedor.AfterCancel(Sender: TDADataTable);
begin
  inherited;
  //DOCUMENTOS ASOCIADOS
//  GestorDocumentos.Directorio := ID;
end;}

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

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

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

begin
  inherited;
  FProveedor := Nil;
  FDetallesLink := TDADataSource.Create(NIL);
  FDetallesLink.DataTable := aDataTable;

  //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

  //DOCUMENTOS ASOCIADOS
//  FGestorDocumentos := TGestorDocumentos.Create(TDAStringArray.Create);//dmBase.darEstructuraDirNormativas);
//  FGestorDocumentos.RootDocumentos := '\\roberto\E\Codigo\Output\Servidor\Documentos';
//  aDataTable.BeforeCancel := BeforeCancel;
//  aDataTable.AfterCancel := AfterCancel;

end;

function TBizPedidoProveedor.DarListaSituaciones: TStringList;
begin
  Result := TStringList.Create;
  with Result do
  begin
    Add(SITUACION_PEDIDO_PENDIENTE);
    Add(SITUACION_PEDIDO_PARCIAL);
    Add(SITUACION_PEDIDO_RECIBIDO);
  end;
end;

destructor TBizPedidoProveedor.Destroy;
begin
  FProveedor := NIL;
  FDetalles := NIL;
  FDetallesLink.Free;
  FreeAndNil(FGestorDocumentos);
  inherited;
end;

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

function TBizPedidoProveedor.GetProveedor: IBizProveedor;
begin
  Result := FProveedor;
end;

procedure TBizPedidoProveedor.IniciarValoresPedidoNuevo;
begin
  ID_EMPRESA := dmUsuarios.IDEmpresaActual;
  USUARIO := dmUsuarios.LoginInfo.Usuario;
  FECHA_PEDIDO := DateOf(Date);
  SITUACION := SITUACION_PEDIDO_PENDIENTE;
  INCIDENCIAS_ACTIVAS := 0;
end;

function TBizPedidoProveedor.GetDetalles: IBizDetallesPedidoProveedor;
begin
  Result := FDetalles;
end;

function TBizPedidoProveedor.GetGestorDocumentos: TGestorDocumentos;
begin
//  ShowMessage('Estoy en GetGestorDocumentos' + #10#13 +
//    'Directorio anterior = ' + VarToStr(FGestorDocumentos.Directorio) + #10#13 +
//    'Directorio nuevo (ID) = ' + IntToStr(ID));
//  if ID <> 0 then
    if Assigned(FGestorDocumentos) then
       FGestorDocumentos.Directorio := ID;

  Result := FGestorDocumentos;
end;

procedure TBizPedidoProveedor.OnNewRecord(Sender: TDADataTable);
begin
  inherited;
  ID := GetRecNo; // -1, -2, -3...
  IniciarValoresPedidoNuevo;
end;

procedure TBizPedidoProveedor.SetProveedor(AValue: IBizProveedor);
begin
  FProveedor := AValue;

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

    if ID_PROVEEDOR <> FProveedor.ID then
    begin
      DataTable.Edit;
      ID_PROVEEDOR := FProveedor.ID;
    end;
  end;
end;

procedure TBizPedidoProveedor.SetDetalles(Value: IBizDetallesPedidoProveedor);
begin
  FDetalles := Value;
  EnlazarMaestroDetalle(FDetallesLink, FDetalles);
end;

procedure TBizPedidoProveedor.SetFECHA_CONFIRMACIONValue(
  const aValue: TDateTime);
begin
  inherited;
  if EsFechaVacia(aValue) then
    DataTable.Fields[idx_PedidosProveedorFECHA_CONFIRMACION].AsVariant := Null
  else
    inherited;
end;

procedure TBizPedidoProveedor.SetFECHA_ENTREGAValue(const aValue: TDateTime);
begin
  inherited;
  if EsFechaVacia(aValue) then
    DataTable.Fields[idx_PedidosProveedorFECHA_ENTREGA].AsVariant := Null
  else
    inherited;
end;

procedure TBizPedidoProveedor.SetFECHA_PEDIDOValue(const aValue: TDateTime);
begin
  inherited;
  if EsFechaVacia(aValue) then
    DataTable.Fields[idx_PedidosProveedorFECHA_PEDIDO].AsVariant := Null
  else
    inherited;
end;

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

procedure TBizPedidoProveedor.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;

initialization
  RegisterDataTableRules(BIZ_CLIENT_PEDIDO_PROVEEDOR, TBizPedidoProveedor);

finalization

end.

