La comprobación de hora se hace durante el envío y si no has podido enviarla a tiempo solo debes marcar "Incidencia".
La comprobación de NIF básica la puedes hacer tu mismo.
Si por alguna razón, el NIF estuviera dado de baja en Hacienda, podrás hacer una corrección cuando rechacen o acepten con errores la factura.
Hay ejemplos de código para verificar esto.
Yo lo hago en la base de datos al insertar el dato.
Te dejo como ejemplo el código que utilizo para documentos españoles.
Código SQL
[-]
create or alter procedure verifica_documento_esp_nif (
numero_documento varchar(20))
returns (
valido smallint,
mensaje_error varchar(100))
AS
declare variable digito_verificador varchar(1);
declare variable digito_documento varchar(1);
declare variable aux varchar(20);
declare variable letra_principio varchar(1);
declare variable letra_final varchar(1);
declare variable numero varchar(20);
declare variable contador integer;
declare variable fin_contador integer;
declare variable sumatoria integer;
declare variable resto integer;
begin
-- Inicializamos variables
valido = 1;
mensaje_error = '';
if (char_length(numero_documento) > 0) then
begin
-- Limpieza de documento (solo letras y numeros)
numero_documento = upper(numero_documento);
contador = 1;
aux = '';
while (contador <= char_length(numero_documento)) do
begin
digito_documento = substring(numero_documento from contador for 1);
if ((digito_documento between 'A' and 'Z') or
((digito_documento between '0' and '9'))) then
aux = aux || digito_documento;
contador = contador + 1;
end
numero_documento = aux;
if (char_length(numero_documento) > 0) then
begin
if (substring(numero_documento from 1 for 2) = 'ES') then
numero_documento = substring(numero_documento from 3 for char_length(numero_documento));
letra_principio = substring(numero_documento from 1 for 1);
letra_final = substring(numero_documento from char_length(numero_documento) for 1);
if (letra_principio between '0' and '9') then
letra_principio = '';
if (letra_final between '0' and '9') then
letra_final = '';
if (letra_principio = '') then
contador = 1;
else
contador = 2;
if (letra_final = '') then
fin_contador = char_length(numero_documento);
else
fin_contador = char_length(numero_documento) - 1;
numero = '';
while (contador <= fin_contador) do
begin
digito_documento = substring(numero_documento from contador for 1);
if (digito_documento between '0' and '9') then
numero = numero || digito_documento;
else
begin
valido = 0;
mensaje_error = '(1) El formato del numero es incorrecto';
end
contador = contador + 1;
end
if ((valido = 1) and
(char_length(numero_documento) = 9)) then
begin
if ((letra_principio = '') or
((letra_principio in ('X', 'Y', 'Z')))) then
begin
-- Es un NIE. (Numero de identificacion de extranjero)
if (letra_principio = 'X') then
numero = '0' || numero;
if (letra_principio = 'Y') then
numero = '1' || numero;
if (letra_principio = 'Z') then
numero = '2' || numero;
resto = numero - (trunc(numero / 23) * 23);
digito_verificador = substring('TRWAGMYFPDXBNJZSQVHLCKET' from 1 + resto for 1);
if (digito_verificador <> letra_final) then
begin
valido = 0;
mensaje_error = '(3) NIE no valido' || ' - ' || digito_verificador || '<>' || letra_final;
end
end
else
if (letra_principio in ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K',
'L', 'M', 'N', 'P', 'Q', 'S', 'U', 'V', 'W', 'R')) then
begin
-- Es un NIF (Numero de identificacion fiscal
if (letra_final > '') then
begin
if (letra_final in ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J')) then
-- Convierte la letra final en un numero (es el dig. control)
letra_final = substring('0123456789' from position(letra_final, 'JABCDEFGHI') for 1);
else
begin
valido = 0;
mensaje_error = '(4) NIF no valido';
end
end
else
begin
letra_final = substring(numero_documento from char_length(numero_documento) for 1);
numero_documento = substring(numero_documento from 1 for char_length(numero_documento) - 1);
end
if (valido = 1) then
begin
-- Sumamos posiciones pares
sumatoria = substring(numero_documento from 3 for 1) + substring(numero_documento from 5 for 1) + substring(numero_documento from 7 for 1);
contador = substring(numero_documento from 2 for 1) * 2;
if (contador > 9) then
contador = substring(contador from 1 for 1) + substring(contador from 2 for 1);
sumatoria = sumatoria + contador;
contador = substring(numero_documento from 4 for 1) * 2;
if (contador > 9) then
contador = substring(contador from 1 for 1) + substring(contador from 2 for 1);
sumatoria = sumatoria + contador;
contador = substring(numero_documento from 6 for 1) * 2;
if (contador > 9) then
contador = substring(contador from 1 for 1) + substring(contador from 2 for 1);
sumatoria = sumatoria + contador;
contador = substring(numero_documento from 8 for 1) * 2;
if (contador > 9) then
contador = substring(contador from 1 for 1) + substring(contador from 2 for 1);
sumatoria = sumatoria + contador;
if (sumatoria > 9) then
sumatoria = substring(sumatoria from 2 for 1);
sumatoria = 10 - sumatoria;
if (sumatoria = 10) then
sumatoria = 0;
if (sumatoria <> letra_final) then
begin
valido = 0;
mensaje_error = '(5) NIF no valido';
end
end
end
else
begin
valido = 0;
mensaje_error = '(6) Letra inicial invalida';
end
end
else
begin
valido = 0;
mensaje_error = '(2) Longitud incorrecta';
end
end
end
suspend;
end