unit uBizFacturasProveedorServer;

interface

uses
  schFacturasProveedorServer_Intf, uDAInterfaces,
  uDADataTable, uDABusinessProcessor;

const
  BIZ_SERVER_FACTURAS_PROVEEDOR = 'Server.FacturasProveedor';
  REF_FACTURAS_PROVEEDOR = 'REF_FACTURAS_PROVEEDOR';
  REF_ABONOS_PROVEEDOR = 'REF_ABONOS_PROVEEDOR';
  CTE_TIPO_ABONO = 'A';
  CTE_TIPO_FACTURA = 'F';


type
  TBizFacturasProveedorServer = class(TFacturasProveedorBusinessProcessorRules)
  protected
    procedure BeforeProcessChange(Sender: TDABusinessProcessor;
      aChangeType: TDAChangeType; aChange: TDADeltaChange;
      var ProcessChange: Boolean); override;
  end;

implementation

uses
  Dialogs, SysUtils, Variants, uDataModuleServer, uDAClasses, DARemoteService_Impl,
  schFacturasProveedorClient_Intf, uBusinessUtils, uReferenciasUtils, uROClasses;

{ TBizFacturasProveedorServer }

procedure TBizFacturasProveedorServer.BeforeProcessChange(
  Sender: TDABusinessProcessor; aChangeType: TDAChangeType;
  aChange: TDADeltaChange; var ProcessChange: Boolean);
var
  ASchema : TDASchema;
  ACurrentConn : IDAConnection;
  dsData: IDADataset;
  Empresa : Variant;
  Tipo : Variant;

begin
  inherited;
  case aChangeType of
    ctInsert, ctUpdate: begin
      //Si la referencia no ha sido asignada le asignamos una nosotros
      if (VarIsNull(aChange.NewValueByName[fld_FacturasProveedorREFERENCIA]))
      or (VarToStr(aChange.NewValueByName[fld_FacturasProveedorREFERENCIA]) = '') then
      begin
        ASchema := BusinessProcessor.Schema;
        ACurrentConn := GetBusinessProcessorConnection(BusinessProcessor);

        try
          //Siempre va a estar rellena
          Empresa := aChange.NewValueByName[fld_FacturasProveedorID_EMPRESA];
          Tipo := aChange.NewValueByName[fld_FacturasProveedorTIPO];

          if Tipo = CTE_TIPO_FACTURA then
             dsData := ASchema.NewDataset(ACurrentConn, 'DarReferencia', ['CODIGO', 'EMPRESA'], [REF_FACTURAS_PROVEEDOR, Empresa])
          else
             dsData := ASchema.NewDataset(ACurrentConn, 'DarReferencia', ['CODIGO', 'EMPRESA'], [REF_ABONOS_PROVEEDOR, Empresa]);

        except
          RaiseError('No existe la tabla REFERENCIAS');
        end;

        dsData.Active := True;

        if dsData.IsEmpty then
          RaiseError('NO HAY REFERENCIA ' + REF_FACTURAS_PROVEEDOR + ' / ' + REF_ABONOS_PROVEEDOR + ' DECLARADA EN TABLA REFERENCIAS');

        REFERENCIA := dsData.FieldByName('VALOR').AsString;

        try
          if Tipo = CTE_TIPO_FACTURA then
             ASchema.NewCommand(ACurrentConn, 'ModificarReferencia', ['CODIGO', 'VALOR', 'ID_EMPRESA'], [REF_FACTURAS_PROVEEDOR, DarReferenciaSiguiente(REFERENCIA), Empresa])
          else
             ASchema.NewCommand(ACurrentConn, 'ModificarReferencia', ['CODIGO', 'VALOR', 'ID_EMPRESA'], [REF_ABONOS_PROVEEDOR, DarReferenciaSiguiente(REFERENCIA), Empresa]);

        except
          RaiseError('Error al asignar la nueva ' + REFERENCIA + ' referencia en tabla');
        end;
      end;
    end;
  end;
end;

initialization
  RegisterBusinessProcessorRules(BIZ_SERVER_FACTURAS_PROVEEDOR, TBizFacturasProveedorServer);

end.
