Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-10-2021
Sistel Sistel is offline
Miembro
 
Registrado: nov 2019
Ubicación: Bilbao
Posts: 484
Poder: 7
Sistel Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje
Tiene algunos detalles más.
https://www.agenciatributaria.es/AEA...spanola_.shtml
Madre mía cada año meten más historias. Hace ya varios años que no repasaba esto.
Hola ermendalenda,

Sí, hay muchos casos posibles.
En https://es.wikipedia.org/wiki/N%C3%B...%C3%B3n_fiscal tienes la información de cada uno de ellos y el algoritimo de verificación (cálculo de la letra en el DNI y del último dígito en el CIF)

Saludos
Responder Con Cita
  #2  
Antiguo 02-10-2021
Sistel Sistel is offline
Miembro
 
Registrado: nov 2019
Ubicación: Bilbao
Posts: 484
Poder: 7
Sistel Va por buen camino
Cita:
Empezado por Sistel Ver Mensaje
Hola ermendalenda,
Sí, hay muchos casos posibles.
En https://es.wikipedia.org/wiki/N%C3%B...%C3%B3n_fiscal tienes la información de cada uno de ellos y el algoritimo de verificación (cálculo de la letra en el DNI y del último dígito en el CIF)
Saludos
Yo, desde hace muchos años, uso las mismas funciones para comprobar si un documento (NIF, NIE o CIF) expedido en España es válido.
En PHP, llamando a la función COMPROBAR_DOCUMENTO($nif) :
Código PHP:
<?php
function COMPROBAR_DOCUMENTO($nif){
    
// Limpia
    
$nif LIMPIAR_NIF($nif);
    
// Comprueba NIF, CIF o NIE
    
if(stristr("XYZ"$nif[0])) $salida COMPROBAR_NIE($nif);
    if(
stristr("ABCDEFGHJKLMNPQRSUVW"$nif[0])) $salida COMPROBAR_CIF($nif);
    if(
stristr("0123456789"$nif[0])) $salida COMPROBAR_NIF($nif);
    
// Si la comprobación ha dado errónea se devuelve texto
    
if($salida <> '1') return "Error en documento (CIF/NIF/NIE)";
    return 
"";
}
/***************************************************************************************************************/
function COMPROBAR_NIE($nie){
    if(
$nie[0] == "X"$nie "0".substr($nie1);
    if(
$nie[0] == "Y"$nie "1".substr($nie1);
    if(
$nie[0] == "Z"$nie "2".substr($nie1);
    
$dni substr($nie0, -1);
    if(
LETRA_NIF($dni) <> substr($nie, -11)) return "Error: NIE erróneo";
    return 
1;
}
/***********************************************************************************/
function COMPROBAR_NIF($nif){
    
$nif str_replace(" """$nif);
    
$nif str_replace("."""$nif);
    
$nif str_replace("-"""$nif);
    
$nif str_replace("_"""$nif);
    
$nif str_replace(","""$nif);
    
$dni substr($nif0, -1);
    if(
LETRA_NIF($dni) <> strtoupper(substr($nif, -11))) return "Error: NIF erróneo";
    return 
1;
}
/***************************************************************************************************************/
function COMPROBAR_CIF($cif){
    
$cif str_replace(" """$cif);
    
$cif str_replace("."""$cif);
    
$cif str_replace("-"""$cif);
    if(
strlen($cif) <> 9) return "Error: Número de caracteres del CIF no es 9";
    
$validos "ABCDEFGHJKLMNPQRSUVW";
    if(!
strstr($validossubstr($cif01))) return "Error: Primera letra del CIF errónea";
    if(!
ctype_digit(substr($cif17))) return "Error: Dígitos no numéricos en el CIF";

    
// Cálculo del dígito final
    
$a $cif[2] + $cif[4] + $cif[6];
    for(
$i=1$i<=7$i=$i+2){
        
$x $cif[$i] * 2;
        
$x sprintf('%02d'$x);
        
$b += $x[0] + $x[1];
    }
    
$c $a $b;
    
$c sprintf('%02d'$c);
    
$d 10 $c[1];
    if(
$d == 10$d 0;
    
$letras = array("J","A","B","C","D","E","F","G","H","I");
    if(
$cif[8] <> $d && $cif[8] <> $letras[$d]) return "Error: CIF erróneo";
    return 
1;
}
/***************************************************************************************************************/
function LIMPIAR_NIF($nif){
    
$nif str_replace(' '''$nif);
    
$nif str_replace('-'''$nif);
    
$nif str_replace('/'''$nif);
    
$nif str_replace('_'''$nif);
    
$nif str_replace('.'''$nif);
    
$nif str_replace(','''$nif);        
    
$nif strtoupper($nif);            
    return 
$nif;
}
/***************************************************************************************************************/
function LETRA_NIF($dni){
    
$dni str_replace(" """$dni);
    
$dni str_replace("."""$dni);
    
$resto = (int) ($dni 23);
    
$letras "TRWAGMYFPDXBNJZSQVHLCKE";
    
$letra substr ($letras$resto1);
    return 
$letra;
}
?>
Saludos
Responder Con Cita
  #3  
Antiguo 02-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.764
Poder: 7
ermendalenda Va por buen camino
Cita:
Empezado por Sistel Ver Mensaje
Yo, desde hace muchos años, uso las mismas funciones para comprobar si un documento (NIF, NIE o CIF) expedido en España es válido.
En PHP, llamando a la función COMPROBAR_DOCUMENTO($nif) :
Código PHP:
<?php
function COMPROBAR_DOCUMENTO($nif){
    
// Limpia
    
$nif LIMPIAR_NIF($nif);
    
// Comprueba NIF, CIF o NIE
    
if(stristr("XYZ"$nif[0])) $salida COMPROBAR_NIE($nif);
    if(
stristr("ABCDEFGHJKLMNPQRSUVW"$nif[0])) $salida COMPROBAR_CIF($nif);
    if(
stristr("0123456789"$nif[0])) $salida COMPROBAR_NIF($nif);
    
// Si la comprobación ha dado errónea se devuelve texto
    
if($salida <> '1') return "Error en documento (CIF/NIF/NIE)";
    return 
"";
}
/***************************************************************************************************************/
function COMPROBAR_NIE($nie){
    if(
$nie[0] == "X"$nie "0".substr($nie1);
    if(
$nie[0] == "Y"$nie "1".substr($nie1);
    if(
$nie[0] == "Z"$nie "2".substr($nie1);
    
$dni substr($nie0, -1);
    if(
LETRA_NIF($dni) <> substr($nie, -11)) return "Error: NIE erróneo";
    return 
1;
}
/***********************************************************************************/
function COMPROBAR_NIF($nif){
    
$nif str_replace(" """$nif);
    
$nif str_replace("."""$nif);
    
$nif str_replace("-"""$nif);
    
$nif str_replace("_"""$nif);
    
$nif str_replace(","""$nif);
    
$dni substr($nif0, -1);
    if(
LETRA_NIF($dni) <> strtoupper(substr($nif, -11))) return "Error: NIF erróneo";
    return 
1;
}
/***************************************************************************************************************/
function COMPROBAR_CIF($cif){
    
$cif str_replace(" """$cif);
    
$cif str_replace("."""$cif);
    
$cif str_replace("-"""$cif);
    if(
strlen($cif) <> 9) return "Error: Número de caracteres del CIF no es 9";
    
$validos "ABCDEFGHJKLMNPQRSUVW";
    if(!
strstr($validossubstr($cif01))) return "Error: Primera letra del CIF errónea";
    if(!
ctype_digit(substr($cif17))) return "Error: Dígitos no numéricos en el CIF";

    
// Cálculo del dígito final
    
$a $cif[2] + $cif[4] + $cif[6];
    for(
$i=1$i<=7$i=$i+2){
        
$x $cif[$i] * 2;
        
$x sprintf('%02d'$x);
        
$b += $x[0] + $x[1];
    }
    
$c $a $b;
    
$c sprintf('%02d'$c);
    
$d 10 $c[1];
    if(
$d == 10$d 0;
    
$letras = array("J","A","B","C","D","E","F","G","H","I");
    if(
$cif[8] <> $d && $cif[8] <> $letras[$d]) return "Error: CIF erróneo";
    return 
1;
}
/***************************************************************************************************************/
function LIMPIAR_NIF($nif){
    
$nif str_replace(' '''$nif);
    
$nif str_replace('-'''$nif);
    
$nif str_replace('/'''$nif);
    
$nif str_replace('_'''$nif);
    
$nif str_replace('.'''$nif);
    
$nif str_replace(','''$nif);        
    
$nif strtoupper($nif);            
    return 
$nif;
}
/***************************************************************************************************************/
function LETRA_NIF($dni){
    
$dni str_replace(" """$dni);
    
$dni str_replace("."""$dni);
    
$resto = (int) ($dni 23);
    
$letras "TRWAGMYFPDXBNJZSQVHLCKE";
    
$letra substr ($letras$resto1);
    return 
$letra;
}
?>
Saludos
Gracias me faltaba la parte dell algoritmo para comprobar los NIE (Offline), con esto listo.

Una cosa menos.
Responder Con Cita
  #4  
Antiguo 03-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.764
Poder: 7
ermendalenda Va por buen camino
continuo con los CIFS, perdonad los que ya tengais este tema solucionado, pero creo que es una parte importante para que en el futuro no echen para atrás facturas enviadas por errores en los cif/nif/nie/Nombres y por lo tanto se queden facturas huerfanas (no se si se queda aceptado "00" o no aceptado, pero está claro que se va a quedar con errores)

Por lo que tengo visto lo normal es que los que están dado de alta en el ROI los 2 primeros caracteres identifique el país, pero sopresa, primera excepción que me encuentro:
Los que empiezan por "ESN", las primeras letras no identifican al pais si no a "Entidades no residentes" por lo tanto tratamiento¿?: comprobar por el curl extranjero o español, por que el curl extranjero no admite "ESN", así que supongo que será español.

Tenedlo en cuenta sobre todo los que trabajais programas que hacen facturas para laboratorios externos, holandeses, alemanes, etc, que se os va a dar más de un caso.

Esto es más lioso de lo que esperaba, los que podais aportar ideas, documentos... se agradece

Última edición por ermendalenda fecha: 03-10-2021 a las 10:20:10.
Responder Con Cita
  #5  
Antiguo 03-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.764
Poder: 7
ermendalenda Va por buen camino
Si equivocas la primera letra del cif te lo admite. Esta bien que el algoritmo lo admita., por que entiendo que hay empresas que cambian su sociedad por ejemplo de SL. a SA etc. Y le respetan el mismo número pasando de B-XXXXXXXX a A-XXXXXXXX, pero no entiendo que la consulta curl te de por correcta ambas.
Responder Con Cita
  #6  
Antiguo 03-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.764
Poder: 7
ermendalenda Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje
Si equivocas la primera letra del cif te lo admite. Esta bien que el algoritmo lo admita., por que entiendo que hay empresas que cambian su sociedad por ejemplo de SL. a SA etc. Y le respetan el mismo número pasando de B-XXXXXXXX a A-XXXXXXXX, pero no entiendo que la consulta curl te de por correcta ambas.
Devuelve la letra correcta en la respuesta..
Pues es importante dejar la opción de elegir uno u otro por los cambios de sociedades

Última edición por ermendalenda fecha: 03-10-2021 a las 11:47:57.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
SII -Nuevo sistema de la Agencia Tributaria española de envío de datos vía Webservice newtron Internet 3716 19-01-2026 20:01:34
Como utilizar la ayuda del nuevo Sistema Operativo gluglu Humor 3 24-09-2007 09:39:05
Aplicacion Agencia De Viajes ArdiIIa Varios 9 20-01-2007 16:49:53
El Vasco Aguirre Al González La Taberna 5 26-05-2006 09:22:28
Microsoft ha lanzado su nuevo sistema operativo DarkByte Humor 0 25-01-2004 09:21:14


La franja horaria es GMT +2. Ahora son las 02:20:52.


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