Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Proyecto SIF/Veri*Factu/Ley Antifraude > Envío de registros y sus respuestas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #8  
Antiguo 17-06-2025
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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
    /*
    Verificacion de CIF, NIF, DNI, NIE.
    Se verifica que el numero de documento cumpla la condicion ESCnnnnnnnC o CnnnnnnC
    (n son numeros y C es el digito de control).
    */

    -- 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
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Registro de eventos en modo Veri*Factu rci Registros de Facturacion y Eventos (XML) 15 15-01-2025 16:27:39
Webinar Veri*Factu de Octubre 2024 ermendalenda General/Noticias 2 21-11-2024 09:36:20
Ventajas de utilizar un SIF VERI*FACTU en lugar de un SIF no verificable novatico Temas legales 8 12-11-2024 10:15:41
Nuevo subforo dedicado a (SIF/Veri*Factu) General/Noticias Neftali [Germán.Estévez] General/Noticias 1 30-10-2024 07:54:57
Nuevo subforo dedicado a (SIF/Veri*Factu) Temas legales Neftali [Germán.Estévez] Temas legales 1 30-10-2024 07:54:57


La franja horaria es GMT +2. Ahora son las 13:17:18.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi