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 01-10-2021
Ramon88 Ramon88 is offline
Miembro
 
Registrado: ago 2021
Posts: 157
Poder: 6
Ramon88 Va por buen camino
Me sabe fatal preguntar algo que ya está explicado en el foro, pero no logro entenderlo y no me sale.
Calcular el último CRC8...
He visto que si hay '+' '/' da problemas y que para ello hay que pasarlo a URI.


Os explico lo que hago aver si veis donde fallo, por que llevo todo el día dándole vueltas y seguramente lo tenga delante y ya no lo vea...


1- Calculo el primer CRC8 como siempre y me funcionaba.
2- Voy calculando todo y cuando tengo que calcular el ultimo CRC lo codifico a URI, y queda algo asi
Código:
https%3A%2F%2Ftbai.prep.....
Responder Con Cita
  #2  
Antiguo 01-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Cita:
Empezado por Ramon88 Ver Mensaje
Me sabe fatal preguntar algo que ya está explicado en el foro, pero no logro entenderlo y no me sale.
Calcular el último CRC8...
He visto que si hay '+' '/' da problemas y que para ello hay que pasarlo a URI.


Os explico lo que hago aver si veis donde fallo, por que llevo todo el día dándole vueltas y seguramente lo tenga delante y ya no lo vea...


1- Calculo el primer CRC8 como siempre y me funcionaba.
2- Voy calculando todo y cuando tengo que calcular el ultimo CRC lo codifico a URI, y queda algo asi
Código:
https%3A%2F%2Ftbai.prep.....
No veo nada raro. La teoría bien, si quieres má dar un ejemplo mañana lo reviso.

Última edición por ermendalenda fecha: 01-10-2021 a las 22:11:58.
Responder Con Cita
  #3  
Antiguo 02-10-2021
andalusoft andalusoft is offline
Miembro
 
Registrado: sep 2021
Posts: 10
Poder: 0
andalusoft Va por buen camino
Calculo CRC-8

Hola a tod@s.

Os dejo código fuente para calcular el CRC-8:

MICROFOCUS COBOL:

$set sourceformat(variable)
program-id. CRC8 as "CRC8".

environment division.
configuration section.

data division.
working-storage section.

01 CRC8-Table.
05 filler occurs 256.
10 tbByte PIC X(1).
10 tbByteNum redefines tbByte PIC S9(2) COMP-5.

01 cadena PIC X(256) VALUE
"TBAI-00000006Y-251019-btFpwP8dcLGAF-".
01 len PIC 9(2) COMP-5.
01 crc PIC X(1).
01 crcNum redefines crc PIC 9(2) comp-5.
01 crcNumInt PIC S9(9) COMP-5.

01 idx-1 PIC 9(2) COMP-5.

01 tmpChar PIC X(1).
01 tmpIdx redefines tmpChar PIC S9(2) COMP-5.
01 tmpIdxInt PIC S9(9) COMP-5.

procedure division.

perform chargeTable
perform getLen

move 1 to idx-1
move 0 to crcNumInt

perform until idx-1 > len
move cadena(idx-1:1) to tmpChar
move tmpIdx to tmpIdxInt

call "CBL_XOR" using crcNumInt tmpIdxInt by value 4
display tmpIdxInt " " no advancing

call "CBL_AND" using X"FF000000" tmpIdxInt by value 4
display tmpIdxInt " "
tbByteNum(tmpIdxInt + 1) " " no advancing

move tbByte(tmpIdxInt + 1) to crc
move crcNum to crcNumInt

display crcNumInt " "

add 1 to idx-1
end-perform

call "CBL_AND" using X"FF000000" crcNumInt by value 4

display crcNumInt

move crcNumInt to crcNum

display crcNum " " crc

goback
.


chargeTable.
string
X"00", X"07", X"0E", X"09",
X"1C", X"1B", X"12", X"15", X"38", X"3F", X"36", X"31",
X"24", X"23", X"2A", X"2D", X"70", X"77", X"7E", X"79",
X"6C", X"6B", X"62", X"65", X"48", X"4F", X"46", X"41",

X"54", X"53", X"5A", X"5D", X"E0", X"E7", X"EE", X"E9",
X"FC", X"FB", X"F2", X"F5", X"D8", X"DF", X"D6", X"D1",
X"C4", X"C3", X"CA", X"CD", X"90", X"97", X"9E", X"99",
X"8C", X"8B", X"82", X"85", X"A8", X"AF", X"A6", X"A1",
X"B4", X"B3", X"BA", X"BD", X"C7", X"C0", X"C9", X"CE",
X"DB", X"DC", X"D5", X"D2", X"FF", X"F8", X"F1", X"F6",
X"E3", X"E4", X"ED", X"EA", X"B7", X"B0", X"B9", X"BE",
X"AB", X"AC", X"A5", X"A2", X"8F", X"88", X"81", X"86",
X"93", X"94", X"9D", X"9A", X"27", X"20", X"29", X"2E",
X"3B", X"3C", X"35", X"32", X"1F", X"18", X"11", X"16",
X"03", X"04", X"0D", X"0A", X"57", X"50", X"59", X"5E",
X"4B", X"4C", X"45", X"42", X"6F", X"68", X"61", X"66",
X"73", X"74", X"7D", X"7A", X"89", X"8E", X"87", X"80",
X"95", X"92", X"9B", X"9C", X"B1", X"B6", X"BF", X"B8",
X"AD", X"AA", X"A3", X"A4", X"F9", X"FE", X"F7", X"F0",
X"E5", X"E2", X"EB", X"EC", X"C1", X"C6", X"CF", X"C8",
X"DD", X"DA", X"D3", X"D4", X"69", X"6E", X"67", X"60",
X"75", X"72", X"7B", X"7C", X"51", X"56", X"5F", X"58",
X"4D", X"4A", X"43", X"44", X"19", X"1E", X"17", X"10",
X"05", X"02", X"0B", X"0C", X"21", X"26", X"2F", X"28",
X"3D", X"3A", X"33", X"34", X"4E", X"49", X"40", X"47",
X"52", X"55", X"5C", X"5B", X"76", X"71", X"78", X"7F",
X"6A", X"6D", X"64", X"63", X"3E", X"39", X"30", X"37",
X"22", X"25", X"2C", X"2B", X"06", X"01", X"08", X"0F",
X"1A", X"1D", X"14", X"13", X"AE", X"A9", X"A0", X"A7",
X"B2", X"B5", X"BC", X"BB", X"96", X"91", X"98", X"9F",
X"8A", X"8D", X"84", X"83", X"DE", X"D9", X"D0", X"D7",
X"C2", X"C5", X"CC", X"CB", X"E6", X"E1", X"E8", X"EF",
X"FA", X"FD", X"F4", X"F3"
delimited by size into CRC8-Table
.

getLen.

move 36 to len

*> Fujitsu: function stored-cahr-length
*> Otros: un bucle, unstring con x"00" o NOT = SPACES etc.
.

end program CRC8.


WINDEV:


PROCEDURE calcular_CRC8(Cadena is UNICODE string)

CRC8_Table is array of byte = [0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3]

Idx_1 is int = 1
Len is int = Length(Cadena)

TmpIdx is bytes = 0

CrcNum is byte = 0
CRC is UNICODE string = ""

Cadena = StringToUTF8(Cadena,charsetUTF8)

FOR Idx_1 = 1 TO Len
TmpIdx = Asc(Middle(Cadena,Idx_1,1))
TmpIdx = BinaryXOR(CrcNum,TmpIdx)
TmpIdx = BinaryAND(0xFF,TmpIdx)
CrcNum = CRC8_Table[TmpIdx + 1]
END

CrcNum = BinaryAND(0xFF,CrcNum)

CRC = NumToString(CrcNum,"%03d")

RESULT = CRC

Saludos y gracias por todo.
Responder Con Cita
  #4  
Antiguo 02-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Calculo Cifs

Lo prometiddo es deuda
Aquí os dejo los calculos de los cifs, españa, extranjero.
Aún me queda una duda, que no me he peleado mucho, pero ya veo codigo fuente flotando en el aire y es hora del descanso.

Resulta que para la comprobación del cif extranjeero se envia el cif dividido en 2 campos;
Por un lado el identificador del pais
Por otro Lado el resto del identificador.
He probado con el identificador del Pais de 2 caracteres, por que resulta que hay de 2 caracteres, de 3 y otro identificadorn úmerico (os mando la tabla de paises en una excell), los probaré todos el Lunes, si probais vosotros antes decidme.

XML Petición ejemplo comproobacion nif ESPAÑA
Código:
<?xml version="1.0" encoding="utf-8"?>
<Spain:Envelope xmlns:Spain="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ELNIF="http://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/burt/jdit/ws/VNifV2Ent.xsd">
     <Spain:Header/>
     <Spain:Body>
         <ELNIF:VNifV2Ent>
             <ELNIF:Contribuyente>
                 <ELNIF:Nif>B63272603</ELNIF:Nif>
                 <ELNIF:Nombre>GOOGLE </ELNIF:Nombre>
             </ELNIF:Contribuyente>
         </ELNIF:VNifV2Ent>
     </Spain:Body>
</Spain:Envelope>
CURL CIF ESPAÑOL:
curl.exe --connect-timeout 60 -m 60 -S -L -d "@C:\[path donde esta ubicado]\EnvioNif.xml" -o C:\[path respuesta]\RespuestaNif.xml --cert-type P12 --cert c:\[path certificado]\Ciudadano.pfx:82388133 https://www1.agenciatributaria.gob.e.../ws/VNifV2SOAP



Ejemplo xml Petición Nif Extranjero
Código:
<?xml version="1.0" encoding="utf-8"?>
<Extranjero:Envelope xmlns:Extranjero='http://schemas.xmlsoap.org/soap/envelope/'>
     <Extranjero:Body>
         <Datos:checkVat xmlns:Datos='urn:ec.europa.eu:taxud:vies:services:checkVat:types'>
             <Datos:countryCode>FR</Datos:countryCode>
             <Datos:vatNumber>08353523418</Datos:vatNumber>
         </Datos:checkVat>
     </Extranjero:Body>
</Extranjero:Envelope>
Curl Extranjero:
curl.exe --connect-timeout 60 -m 60 -S -L -d "@C:\[path donde esta ubicado]\EnvioNif_extranjero.xml" -o C:\[path respuesta]\RespuestaNif_extranjero.xml http://ec.europa.eu/taxation_customs...heckVatService
Ojo: un cif extranjero no es el que empieza por X o Y, esos son cifs extranjeros adaptados a España y hay que comprobarlos según el Curl de España.
Archivos Adjuntos
Tipo de Archivo: rar calculo_cifs.rar (27,2 KB, 29 visitas)

Última edición por ermendalenda fecha: 02-10-2021 a las 11:13:47.
Responder Con Cita
  #5  
Antiguo 02-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
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.
Responder Con Cita
  #6  
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
  #7  
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($nie, 1);
    if(
$nie[0] == "Y") $nie = "1".substr($nie, 1);
    if(
$nie[0] == "Z") $nie = "2".substr($nie, 1);
    
$dni = substr($nie, 0, -1);
    if(
LETRA_NIF($dni) <> substr($nie, -1, 1)) 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($nif, 0, -1);
    if(
LETRA_NIF($dni) <> strtoupper(substr($nif, -1, 1))) 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($validos, substr($cif, 0, 1))) return "Error: Primera letra del CIF errónea";
    if(!
ctype_digit(substr($cif, 1, 7))) 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, $resto, 1);
    return 
$letra;
}
?>
Saludos
Responder Con Cita
  #8  
Antiguo 04-10-2021
Noe277 Noe277 is offline
Miembro
 
Registrado: jul 2017
Posts: 185
Poder: 10
Noe277 Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje
Lo prometiddo es deuda
Aquí os dejo los calculos de los cifs, españa, extranjero.
Aún me queda una duda, que no me he peleado mucho, pero ya veo codigo fuente flotando en el aire y es hora del descanso.

Resulta que para la comprobación del cif extranjeero se envia el cif dividido en 2 campos;
Por un lado el identificador del pais
Por otro Lado el resto del identificador.
He probado con el identificador del Pais de 2 caracteres, por que resulta que hay de 2 caracteres, de 3 y otro identificadorn úmerico (os mando la tabla de paises en una excell), los probaré todos el Lunes, si probais vosotros antes decidme.
Los Alpha 3 se usan para factura-e, para listados oficiales, modelos y SII Alpha 2


Y una pregunta el Zuzendu de Gipuzkoa sabemos algo de el ?

Última edición por Noe277 fecha: 04-10-2021 a las 10:17:34.
Responder Con Cita
  #9  
Antiguo 04-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Cita:
Empezado por Noe277 Ver Mensaje
Los Alpha 3 se usan para factura-e, para listados oficiales, modelos y SII Alpha 2


Y una pregunta el Zuzendu de Gipuzkoa sabemos algo de el ?
Gracias
Ni idea de Zuzendu
Responder Con Cita
  #10  
Antiguo 04-10-2021
JoseLeeTo JoseLeeTo is offline
Miembro
 
Registrado: jun 2021
Posts: 78
Poder: 6
JoseLeeTo Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje
Lo prometiddo es deuda
Aquí os dejo los calculos de los cifs, españa, extranjero.
Aún me queda una duda, que no me he peleado mucho, pero ya veo codigo fuente flotando en el aire y es hora del descanso.

Resulta que para la comprobación del cif extranjeero se envia el cif dividido en 2 campos;
Por un lado el identificador del pais
Por otro Lado el resto del identificador.
He probado con el identificador del Pais de 2 caracteres, por que resulta que hay de 2 caracteres, de 3 y otro identificadorn úmerico (os mando la tabla de paises en una excell), los probaré todos el Lunes, si probais vosotros antes decidme.

XML Petición ejemplo comproobacion nif ESPAÑA
Código:
<?xml version="1.0" encoding="utf-8"?>
<Spain:Envelope xmlns:Spain="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ELNIF="http://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/burt/jdit/ws/VNifV2Ent.xsd">
     <Spain:Header/>
     <Spain:Body>
         <ELNIF:VNifV2Ent>
             <ELNIF:Contribuyente>
                 <ELNIF:Nif>B63272603</ELNIF:Nif>
                 <ELNIF:Nombre>GOOGLE </ELNIF:Nombre>
             </ELNIF:Contribuyente>
         </ELNIF:VNifV2Ent>
     </Spain:Body>
</Spain:Envelope>
CURL CIF ESPAÑOL:
curl.exe --connect-timeout 60 -m 60 -S -L -d "@C:\[path donde esta ubicado]\EnvioNif.xml" -o C:\[path respuesta]\RespuestaNif.xml --cert-type P12 --cert c:\[path certificado]\Ciudadano.pfx:82388133 https://www1.agenciatributaria.gob.e.../ws/VNifV2SOAP



Ejemplo xml Petición Nif Extranjero
Código:
<?xml version="1.0" encoding="utf-8"?>
<Extranjero:Envelope xmlns:Extranjero='http://schemas.xmlsoap.org/soap/envelope/'>
     <Extranjero:Body>
         <Datos:checkVat xmlns:Datos='urn:ec.europa.eu:taxud:vies:services:checkVat:types'>
             <Datos:countryCode>FR</Datos:countryCode>
             <Datos:vatNumber>08353523418</Datos:vatNumber>
         </Datos:checkVat>
     </Extranjero:Body>
</Extranjero:Envelope>
Curl Extranjero:
curl.exe --connect-timeout 60 -m 60 -S -L -d "@C:\[path donde esta ubicado]\EnvioNif_extranjero.xml" -o C:\[path respuesta]\RespuestaNif_extranjero.xml http://ec.europa.eu/taxation_customs...heckVatService
Ojo: un cif extranjero no es el que empieza por X o Y, esos son cifs extranjeros adaptados a España y hay que comprobarlos según el Curl de España.

Muchísimas gracias por la aportación.
Responder Con Cita
  #11  
Antiguo 04-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Cita:
Empezado por JoseLeeTo Ver Mensaje
Muchísimas gracias por la aportación.
Nada. Es buenísimo. Para los cifs españoles no hace falta que mandes nada en el nombre, te lo devuelve. Y te devuelve el cif, si te equivocas de letra te devuelve la letra correcta.
Para los nifs y nie tienes que mandarle una parte del nombre aproximada y te lo devuelve completo, lo que tienen registrado.
Para los ESN se le quita El Es y se manda la consulta a la de España, son los no residentes (Extranjeros con un nif de alta en españa pero no están en el registro ROI), por ejemplo los chinos de Aliexpress, amazon, muchos laboratorios Europeos...



Para los extranjeros: En el primer campo, siempre los 2 caracteres del país, y en el segundo el código. Y te devuelve nombre y dirección, que además creo que la he conseguido formatear para sacar dirección, ciudad, población y cod. Postal(aunque es un algoritmo aprox creo que vale para la mayoría de los casos, ya que al devolver la dirección en un solo campo hay que hacer inventos. Ten en cta que como devuelve la dirección con saltos de líneas (asc(10)) se puede más o menos formatear.

Un consejo, cuando compreis productos chinos, normalmente el proveedor tiene un ESN o un VIES(Registro en el ROI), muchas veces falso, en ese caso no comprar nada, y podeis comprobarlo con estos CURLS.

Última edición por ermendalenda fecha: 04-10-2021 a las 11:03:32.
Responder Con Cita
  #12  
Antiguo 04-10-2021
unomasmas unomasmas is offline
Miembro
 
Registrado: dic 2019
Posts: 194
Poder: 7
unomasmas Va por buen camino
Cita:
Empezado por Ramon88 Ver Mensaje
Me sabe fatal preguntar algo que ya está explicado en el foro, pero no logro entenderlo y no me sale.
Calcular el último CRC8...
He visto que si hay '+' '/' da problemas y que para ello hay que pasarlo a URI.


Os explico lo que hago aver si veis donde fallo, por que llevo todo el día dándole vueltas y seguramente lo tenga delante y ya no lo vea...

1- Calculo el primer CRC8 como siempre y me funcionaba.
2- Voy calculando todo y cuando tengo que calcular el ultimo CRC lo codifico a URI, y queda algo asi
Código:
https%3A%2F%2Ftbai.prep.....
Yo creo que sólo hay que codificar la parte del identificador TBAI, no la URL completa. Básicamente, con codificar la parte subrayada sería suficiente, aunque podrías hacerlo con toda la cadena negrita si te resulta más cómodo, pero no habría que incluir la parte inicial de la URL.
Código:
https://tbai.egoitza.gipuzkoa.eus/qr/?id=TBAI-12345678Z-290921-ViPV5QljO4BSh-103&s=R-2021&nf=0003&i=60.50&cr=255
No te fies de los valores. Los crc de este ejemplo son ficticios. Me he inventado una cadena que parece cierta para explicar cómo lo entiendo yo.
Responder Con Cita
  #13  
Antiguo 04-10-2021
iMia iMia is offline
Miembro
 
Registrado: jul 2010
Posts: 147
Poder: 17
iMia Va por buen camino
Arrow

Cita:
Empezado por unomasmas Ver Mensaje
Yo creo que sólo hay que codificar la parte del identificador TBAI, no la URL completa. Básicamente, con codificar la parte subrayada sería suficiente, aunque podrías hacerlo con toda la cadena negrita si te resulta más cómodo, pero no habría que incluir la parte inicial de la URL.
Código:
https://tbai.egoitza.gipuzkoa.eus/qr/?id=TBAI-12345678Z-290921-ViPV5QljO4BSh-103&s=R-2021&nf=0003&i=60.50&cr=255
No te fies de los valores. Los crc de este ejemplo son ficticios. Me he inventado una cadena que parece cierta para explicar cómo lo entiendo yo.
Exacto, Sólo hay que pasar a URI el código TBAI y sin recalcular el CRC...

p.Ej.

h t t p s://tbai.egoitza.gipuzkoa.eus/qr/?id=TBAI-12345678Z-290921-ViP+5Qlj/4BSh-103&s=R-2021&nf=0003&i=60.50&cr=255

debería ser

h t t p s://tbai.egoitza.gipuzkoa.eus/qr/?id=TBAI-12345678Z-290921-ViP%2B5Qlj%2F4BSh-103&s=R-2021&nf=0003&i=60.50&cr=128

- Sólo se cambian los caracteres + y / del codigo TBAI
- El CRC del código TBAI -> 103, no varía
- El CRC de todo el valor de la dirección se calcula una vez se han cambiado los valores + y / del codigo TBAI

Código Delphi [-]
    strCodigoTBAI := 'TBAI-12345678Z-290921-ViP+5Qlj/4BSh-103';
    strUrlQR := 'https://tbai.egoitza.gipuzkoa.eus/qr/';
    strURI := strUrlQR + '?id=' + TbaiToURI(strCodigoTBAI) + '&s=' + strSerie + '&nf=' strNumeroFactura + '&i=' + strImporteFactura;
    strURI := strURI + '&cr=' + CRC8(strURI);
-
Responder Con Cita
  #14  
Antiguo 04-10-2021
Ramon88 Ramon88 is offline
Miembro
 
Registrado: ago 2021
Posts: 157
Poder: 6
Ramon88 Va por buen camino
Cita:
Empezado por unomasmas Ver Mensaje
Yo creo que sólo hay que codificar la parte del identificador TBAI, no la URL completa. Básicamente, con codificar la parte subrayada sería suficiente, aunque podrías hacerlo con toda la cadena negrita si te resulta más cómodo, pero no habría que incluir la parte inicial de la URL.
Código:
https://tbai.egoitza.gipuzkoa.eus/qr/?id=TBAI-12345678Z-290921-ViPV5QljO4BSh-103&s=R-2021&nf=0003&i=60.50&cr=255
No te fies de los valores. Los crc de este ejemplo son ficticios. Me he inventado una cadena que parece cierta para explicar cómo lo entiendo yo.

He estado probándolo y si cambio los caracteres o lo convierto a uri no me funciona, sin embargo si lo dejo tal cual, si. No entiendo nada...


FUNCIONA:

https://tbai.prep.gipuzkoa.eus/qr/?i...&i=0.00&cr=046


NO FUNCIONA:
https://tbai.prep.gipuzkoa.eus/qr/?i...&i=0.00&cr=046
Responder Con Cita
  #15  
Antiguo 04-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Cita:
Empezado por Ramon88 Ver Mensaje
He estado probándolo y si cambio los caracteres o lo convierto a uri no me funciona, sin embargo si lo dejo tal cual, si. No entiendo nada...


FUNCIONA:

https://tbai.prep.gipuzkoa.eus/qr/?i...&i=0.00&cr=046


NO FUNCIONA:
https://tbai.prep.gipuzkoa.eus/qr/?i...&i=0.00&cr=046
El último crc del último caso está mal.
No puedes poner el mismo. Tienes que calcularlo según lo que has cambiado. Es lioso pero es así
Responder Con Cita
  #16  
Antiguo 04-10-2021
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 682
Poder: 18
espinete Va camino a la fama
el mensaje ha sido modificado en tránsito o la firma no está bien realizada

Buenas...

Estoy haciendo pruebas con Gipuzkoa y, aunque la factura se envía, me devuelve el error "...el mensaje ha sido modificado en tránsito o la firma no está bien realizada...".

He leído en el foro y en las Preguntas Frecuentes de Gipuzkoa, que puede deberse a problemas en la codificación del archivo antes y después de firmar/enviar, pero he revisado todo y no encuentro dónde puede estar el problema.
Me he asegurado de que todo se guarda como UTF-8 (sin BOM) y el envío se realiza también en UTF-8 (sin BOM).
El nombre de la empresa no contiene ningún carácter especial, ni tildes, etc.

Estos son los pasos que sigo:

1. Creo el XML de la factura a partir del xml data binding:

Código Delphi [-]
        f:=ticketBaiV12.NewTicketBai;
        f.Cabecera.IDVersionTBAI := '1.2';
        .......

2. Cargo el contenido de "f" en un XMLDocument:

Código Delphi [-]
        XMLDocument1.XML.Text:=f.XML;
        xmldocument1.Active:=True;
        xmldocument1.SaveToFile('factura.xml');

3. Realizo las modificaciones de hay que hacer en el XML generado por Delphi, siguiendo los pasos encontrados en el foro:

Código Delphi [-]
        FicheroCorregir := TStringList.Create;
        FicheroCorregir.LoadFromFile('factura.xml');
        FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text, '','');
        FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text,'', '');

        FicheroCorregir.WriteBOM := false;
        FicheroCorregir.SaveToFile('factura.xml', TEncoding.UTF8);

4. Firmo la factura

Código Delphi [-]
    firmante.r_SigPolicyID := 'https://www.gipuzkoa.eus/ticketbai/sinadura';                        
    firmante.r_SigPolicyHash := 'e8daca026eb4a3bbbad85510c3365ec36e2b6b6bdef4f4506300b6d4033a227d';     //6NrKAm60o7u62FUQwzZew24ra2ve9PRQYwC21AM6In0= convertido a HEX 
    firmante.r_SigPolicyURI := 'https://www.gipuzkoa.eus/ticketbai/sinadura';

    FirmarXML('factura.xml',firmante);

5. Vuelvo a cargar el XML ya firmado en un XMLDocument:

Código Delphi [-]
    xmldocument1.Active:=false;
    xmldocument1.LoadFromFile('firmado.xml');
    xmldocument1.Active:=true;

6. Uso el código SaveAsUTF8 encontrado en el foro para guardar el archivo en UTF-8 SIN BOM

Código Delphi [-]
    SaveAsUTF8('firmado.xml', xmldocument1.XML);

7. Ya tenemos el archivo firmado. Ahora hago el envío:

Código Delphi [-]
    RequestBody := TFileStream.Create('firmado.xml', fmOpenRead);

    NetHTTPClient1.SecureProtocols := [THTTPSecureProtocol.TLS12];
    NetHTTPClient1.CustomHeaders['Content-Type'] := 'application/xml';
    NetHTTPClient1.CustomHeaders['Charset'] := 'UTF-8';

    AResponse := NetHTTPClient1.Post('https://tbai-prep.egoitza.gipuzkoa.eus/WAS/HACI/HTBRecepcionFacturasWEB/rest/recepcionFacturas/alta',RequestBody);

¿Dónde puede estar el problema? Las facturas se envían (en el entorno de pruebas). De hecho si intento reenviarla, me dice que ya ha sido enviada.

PD: aunque conste como enviada, si voy a la URL del TicketBAI obtenido...

Por ejemplo: https://tbai.prep.gipuzkoa.eus/qr/?i...=100.00&cr=112

...me devuelve "No se ha podido determinar el estado de la factura"
Responder Con Cita
  #17  
Antiguo 04-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Cita:
Empezado por espinete Ver Mensaje
Buenas...

Estoy haciendo pruebas con Gipuzkoa y, aunque la factura se envía, me devuelve el error "...el mensaje ha sido modificado en tránsito o la firma no está bien realizada...".

He leído en el foro y en las Preguntas Frecuentes de Gipuzkoa, que puede deberse a problemas en la codificación del archivo antes y después de firmar/enviar, pero he revisado todo y no encuentro dónde puede estar el problema.
Me he asegurado de que todo se guarda como UTF-8 (sin BOM) y el envío se realiza también en UTF-8 (sin BOM).
El nombre de la empresa no contiene ningún carácter especial, ni tildes, etc.

Estos son los pasos que sigo:

1. Creo el XML de la factura a partir del xml data binding:

Código Delphi [-] f:=ticketBaiV12.NewTicketBai; f.Cabecera.IDVersionTBAI := '1.2'; .......


2. Cargo el contenido de "f" en un XMLDocument:

Código Delphi [-] XMLDocument1.XML.Text:=f.XML; xmldocument1.Active:=True; xmldocument1.SaveToFile('factura.xml');


3. Realizo las modificaciones de hay que hacer en el XML generado por Delphi, siguiendo los pasos encontrados en el foro:

Código Delphi [-] FicheroCorregir := TStringList.Create; FicheroCorregir.LoadFromFile('factura.xml'); FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text, '',''); FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text,'', ''); FicheroCorregir.WriteBOM := false; FicheroCorregir.SaveToFile('factura.xml', TEncoding.UTF8);


4. Firmo la factura

Código Delphi [-] firmante.r_SigPolicyID := 'https://www.gipuzkoa.eus/ticketbai/sinadura'; firmante.r_SigPolicyHash := 'e8daca026eb4a3bbbad85510c3365ec36e2b6b6bdef4f4506300b6d4033a227d'; //6NrKAm60o7u62FUQwzZew24ra2ve9PRQYwC21AM6In0= convertido a HEX firmante.r_SigPolicyURI := 'https://www.gipuzkoa.eus/ticketbai/sinadura'; FirmarXML('factura.xml',firmante);


5. Vuelvo a cargar el XML ya firmado en un XMLDocument:

Código Delphi [-] xmldocument1.Active:=false; xmldocument1.LoadFromFile('firmado.xml'); xmldocument1.Active:=true;


6. Uso el código SaveAsUTF8 encontrado en el foro para guardar el archivo en UTF-8 SIN BOM

Código Delphi [-] SaveAsUTF8('firmado.xml', xmldocument1.XML);


7. Ya tenemos el archivo firmado. Ahora hago el envío:

Código Delphi [-] RequestBody := TFileStream.Create('firmado.xml', fmOpenRead); NetHTTPClient1.SecureProtocols := [THTTPSecureProtocol.TLS12]; NetHTTPClient1.CustomHeaders['Content-Type'] := 'application/xml'; NetHTTPClient1.CustomHeaders['Charset'] := 'UTF-8'; AResponse := NetHTTPClient1.Post('https://tbai-prep.egoitza.gipuzkoa.eus/WAS/HACI/HTBRecepcionFacturasWEB/rest/recepcionFacturas/alta',RequestBody);


¿Dónde puede estar el problema? Las facturas se envían (en el entorno de pruebas). De hecho si intento reenviarla, me dice que ya ha sido enviada.

PD: aunque conste como enviada, si voy a la URL del TicketBAI obtenido...

Por ejemplo: https://tbai.prep.gipuzkoa.eus/qr/?i...=100.00&cr=112

...me devuelve "No se ha podido determinar el estado de la factura"
Hola, no sé si te va a funcionar pero yo hago un par de cosas diferentes:

1. Una vez firmado no lo paso a UTF-8, solo antes.
2. Prueba a cambiar esto en la Cabecera:
xsi:schemaLocation="http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd"

3: Las politicas de firma no cuadran con las mias, falta el digest:
"name" => "Politica de firma TicketBAI 1.0",
"url" => "https://www.gipuzkoa.eus/ticketbai/sinadura",
"digest" => "dTtPpv4fWTcejeVx7+91ILruFX3HysbngBlllJm4i/E="
Responder Con Cita
  #18  
Antiguo 04-10-2021
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 682
Poder: 18
espinete Va camino a la fama
Cita:
Empezado por ermendalenda Ver Mensaje
Hola, no sé si te va a funcionar pero yo hago un par de cosas diferentes:

1. Una vez firmado no lo paso a UTF-8, solo antes.
2. Prueba a cambiar esto en la Cabecera:
xsi:schemaLocation="http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd"

3: Las politicas de firma no cuadran con las mias, falta el digest:
"name" => "Politica de firma TicketBAI 1.0",
"url" => "https://www.gipuzkoa.eus/ticketbai/sinadura",
"digest" => "dTtPpv4fWTcejeVx7+91ILruFX3HysbngBlllJm4i/E="
Si elimino el SaveAsUTF8 tras hacer la firma, no me admite el envío. Me devuelve un error que dice algo así como "no se admite contenido en el prolog".

Cambiando el xsi:schemaLocation del XML por "http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd" en vez de "urn:ticketbai:emision ticketBaiV12.xsd" no afecta al resultado. Obtengo el mismo error 008 de mi anterior post.

Por cierto, en mi anterior post al convertir el texto a código Delphi se comió parte del código.
Esto es lo que hago para cambiar la cabecera del XML, una vez generado:

....
FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text, '<TicketBai xmlns="urn:ticketbai:emision">','<T:TicketBai xmlns:T="urn:ticketbai:emision" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:ticketbai:emision ticketBaiV12.xsd">');
FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text,'</TicketBai>', '</T:TicketBai>');
....

No he entendido lo de las políticas de firma y que falta el digest... Antes solo puse parte del código, para resumir. Pongo ahora el resto, si es que te refieres a esta parte:

firmante.r_Nombre_firma := nom_emp_emisora;
firmante.r_ID := '';
firmante.r_Metodo_Canonicalization := '';
firmante.r_Hash_algorithm := 'SHA256';
firmante.r_SigPolicyHashAlgorithm := 'SHA256';
//Gipuzkoa
firmante.r_SigPolicyID := 'https://www.gipuzkoa.eus/ticketbai/sinadura';
firmante.r_SigPolicyHash := 'e8daca026eb4a3bbbad85510c3365ec36e2b6b6bdef4f4506300b6d4033a227d'; //6NrKAm60o7u62FUQwzZew24ra2ve9PRQYwC21AM6In0= convertido a HEX es e8daca026eb4a3bbbad85510c3365ec36e2b6b6bdef4f4506300b6d4033a227d
firmante.r_SigPolicyURI := 'https://www.gipuzkoa.eus/ticketbai/sinadura';

Utilizo los componentes de SecureBlackBox 2020 para la firma.

Alguna pista?
Responder Con Cita
  #19  
Antiguo 07-10-2021
unomasmas unomasmas is offline
Miembro
 
Registrado: dic 2019
Posts: 194
Poder: 7
unomasmas Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje
El último crc del último caso está mal.
No puedes poner el mismo. Tienes que calcularlo según lo que has cambiado. Es lioso pero es así
No sé si ya lo has solucionado. Si no, como creo que también lo estás programando en C#, por si te sirve (si no a ti, tal vez a otro) dejo la función que tengo por ahora y un par de ellas auxiliares para obtener el dato.
Código:
/// <summary>
/// Obtiene la cadena para el código QR
/// </summary>
/// <param name="xmlFile">Fichero XML del que obtener info: Fichero Ticket-BAI</param>
/// <param name="serverConsulta">la parte fija de conexión al servidor, según la Diputación</param>
/// <param name="encoded">Codificamos o no?</param>
/// <param name="tBaiId">Opcional. Podemos pasar el identificador TBAI. Si no, lo obtiene del XML Ticket-BAI</param>
/// <returns></returns>
public static string GetQRCodeString(string xmlFile, string serverConsulta, bool encoded, string tBaiId="")
{
    try
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(xmlFile);

        if (tBaiId == string.Empty)
        {
            tBaiId = GetTBaiId(xmlFile);
        }
        if (encoded)
        {
            tBaiId = GetURLEncodedString(tBaiId);
        }

        string result = serverConsulta;
        result += @"?id=" + tBaiId;
        result += @"&s=" + xmlDoc.DocumentElement.GetValue("//Factura/CabeceraFactura/SerieFactura");
        result += @"&nf=" + xmlDoc.DocumentElement.GetValue("//Factura/CabeceraFactura/NumFactura");
        result += @"&i=" + xmlDoc.DocumentElement.GetValue("//Factura/DatosFactura/ImporteTotalFactura");
        result += @"&cr=" + GetCrc8(result);

        return result;
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message, System.Reflection.MethodBase.GetCurrentMethod().Name, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
        return null;
    }
}

/// <summary>
/// Obtiene identificador TBAI
/// </summary>
/// <param name="xmlFile">Fichero Ticket-BAI de donde sacar la info para obtener el identificar</param>
/// <returns>Cadena con el identificador</returns>
public static string GetTBaiId(string xmlFile)
{
    try
    {
        string result;
        string separador = "-";
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(xmlFile);

        string nif = xmlDoc.DocumentElement.GetValue("//Sujetos/Emisor/NIF").PadLeft(9, '0');  //9 NIF Emisor

        string fechaExpedicion = xmlDoc.DocumentElement.GetValue("//Factura/CabeceraFactura/FechaExpedicionFactura");  //Fecha Formato dd-mm-yyyy
        DateTime parsedDate;
        DateTime.TryParseExact(fechaExpedicion, "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate);
        fechaExpedicion = parsedDate.ToString("ddMMyy");

        string signatureValue = GetSignatureValue(xmlDoc, 13);

        result = "TBAI" + separador;
        result += nif + separador;
        result += fechaExpedicion + separador;
        result += signatureValue + separador;
        result += GetCrc8(result);

        return result;
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message, System.Reflection.MethodBase.GetCurrentMethod().Name, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
        return null;
    }
}

/// <summary>
/// Codifica una cadena para dar formato URI
/// </summary>
/// <param name="inputString">La cadena a codificar</param>
/// <returns>La cadena codificada</returns>
private static string GetURLEncodedString(string inputString)
{
    string result = Uri.EscapeDataString(inputString);
    return result;
}
Responder Con Cita
  #20  
Antiguo 24-11-2023
MrRipley MrRipley is offline
Registrado
 
Registrado: nov 2023
Posts: 2
Poder: 0
MrRipley Va por buen camino
Consulta función GetCrc8

Hola, unomasmas
Igual te sorprende una respuesta a tu post 4 años después de publicarlo, pero estoy con un programa de TicketBai que no consigo rematar.
Tu código me puede ser útil, pero me falta el punto más importante para mí código:

¿Cuál es la implementación para tu función "GetCrc8"?

Estoy creando links de QR con Batuz, Bizkaia, y me falla siempre el código CRC. He probado varias funciones. El algoritmo de la documentación está en java. He hecho "mi versión" del mismo, pero los códigos CRC siguen siendo incorrectos.
Un saludo


Cita:
Empezado por unomasmas Ver Mensaje
No sé si ya lo has solucionado. Si no, como creo que también lo estás programando en C#, por si te sirve (si no a ti, tal vez a otro) dejo la función que tengo por ahora y un par de ellas auxiliares para obtener el dato.
Código:
/// <summary>
/// Obtiene la cadena para el código QR
/// </summary>
/// <param name="xmlFile">Fichero XML del que obtener info: Fichero Ticket-BAI</param>
/// <param name="serverConsulta">la parte fija de conexión al servidor, según la Diputación</param>
/// <param name="encoded">Codificamos o no?</param>
/// <param name="tBaiId">Opcional. Podemos pasar el identificador TBAI. Si no, lo obtiene del XML Ticket-BAI</param>
/// <returns></returns>
public static string GetQRCodeString(string xmlFile, string serverConsulta, bool encoded, string tBaiId="")
{
    try
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(xmlFile);

        if (tBaiId == string.Empty)
        {
            tBaiId = GetTBaiId(xmlFile);
        }
        if (encoded)
        {
            tBaiId = GetURLEncodedString(tBaiId);
        }

        string result = serverConsulta;
        result += @"?id=" + tBaiId;
        result += @"&s=" + xmlDoc.DocumentElement.GetValue("//Factura/CabeceraFactura/SerieFactura");
        result += @"&nf=" + xmlDoc.DocumentElement.GetValue("//Factura/CabeceraFactura/NumFactura");
        result += @"&i=" + xmlDoc.DocumentElement.GetValue("//Factura/DatosFactura/ImporteTotalFactura");
        result += @"&cr=" + GetCrc8(result);

        return result;
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message, System.Reflection.MethodBase.GetCurrentMethod().Name, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
        return null;
    }
}

/// <summary>
/// Obtiene identificador TBAI
/// </summary>
/// <param name="xmlFile">Fichero Ticket-BAI de donde sacar la info para obtener el identificar</param>
/// <returns>Cadena con el identificador</returns>
public static string GetTBaiId(string xmlFile)
{
    try
    {
        string result;
        string separador = "-";
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(xmlFile);

        string nif = xmlDoc.DocumentElement.GetValue("//Sujetos/Emisor/NIF").PadLeft(9, '0');  //9 NIF Emisor

        string fechaExpedicion = xmlDoc.DocumentElement.GetValue("//Factura/CabeceraFactura/FechaExpedicionFactura");  //Fecha Formato dd-mm-yyyy
        DateTime parsedDate;
        DateTime.TryParseExact(fechaExpedicion, "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate);
        fechaExpedicion = parsedDate.ToString("ddMMyy");

        string signatureValue = GetSignatureValue(xmlDoc, 13);

        result = "TBAI" + separador;
        result += nif + separador;
        result += fechaExpedicion + separador;
        result += signatureValue + separador;
        result += GetCrc8(result);

        return result;
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message, System.Reflection.MethodBase.GetCurrentMethod().Name, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
        return null;
    }
}

/// <summary>
/// Codifica una cadena para dar formato URI
/// </summary>
/// <param name="inputString">La cadena a codificar</param>
/// <returns>La cadena codificada</returns>
private static string GetURLEncodedString(string inputString)
{
    string result = Uri.EscapeDataString(inputString);
    return result;
}
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 21:01:34
Como utilizar la ayuda del nuevo Sistema Operativo gluglu Humor 3 24-09-2007 10:39:05
Aplicacion Agencia De Viajes ArdiIIa Varios 9 20-01-2007 17:49:53
El Vasco Aguirre Al González La Taberna 5 26-05-2006 10:22:28
Microsoft ha lanzado su nuevo sistema operativo DarkByte Humor 0 25-01-2004 10:21:14


La franja horaria es GMT +2. Ahora son las 08:20:54.


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