![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#201
|
||||
|
||||
Cita:
|
#202
|
||||
|
||||
Cita:
los datos de huella son ciertos, ocurra el fallo que ocurra: Código:
CadenaTemporalHuella:= 'IDEmisorFactura='+ alta.IDFactura.IDEmisorFactura+'&'+ 'NumSerieFactura='+ alta.IDFactura.NumSerieFactura+'&'+ 'FechaExpedicionFactura='+ alta.IDFactura.FechaExpedicionFactura+'&'+ 'TipoFactura='+ TipoFacturaVerifactuToString( alta.TipoFactura )+'&'+ 'CuotaTotal='+ alta.CuotaTotal+'&'+ 'ImporteTotal='+ alta.ImporteTotal+'&'+ 'Huella='+ huellaAnterior+'&'+ 'FechaHoraHusoGenRegistro='+alta.FechaHoraHusoGenRegistro.NativeToXS; La carga del certificado PFX o P12 no tengo ni idea, hay algun usuario que le funcionó (podeis revisar el hilo). Lamentablemente mas alla de eso no tengo tiempo para comprobar, pero mirare un poco por google. El codigo es copy-paste de uno que supuestamente funcionaba. ( ¿has aplicado la correccion de Quim Herrera ? ) Saludos ! |
#203
|
||||
|
||||
El usuario garada tiene un codigo ligeramente distinto en:
https://www.clubdelphi.com/foros/showthread.php?t=95356 dale una mirada al hilo. Este es el codigo, señalo en rojo, lo que puede ser distinto. la carga del pfx la deja libre, sin determinar. Código:
procedure HTTPRIOHTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer); procedure CheckError(Puntero: Pointer); begin if not Assigned(Puntero) then RaiseLastOSError; end; const INTERNET_OPTION_CLIENT_CERT_CONTEXT = 84; Pass = 'LaContraseña'; var pStore: HCERTSTORE; pCert: PCERT_CONTEXT; DataBlob: CRYPT_DATA_BLOB; PFX: AnsiString; begin pStore := nil; pCert := nil; PFX := FuncionQueLeaElFicheroPFX; try DataBlob.cbData := Length(PFX); DataBlob.pbData := @PFX[1]; // Almacen temporal con el contenido del PFX pStore := PFXImportCertStore(DataBlob, PWideChar(Pass), {PKCS12_NO_PERSIST_KEY + }PKCS12_INCLUDE_EXTENDED_PROPERTIES); CheckError(pStore); // Buscar un certificado con clave privada // Solo debería haber uno pCert := CertFindCertificateInStore(pStore, X509_ASN_ENCODING, 0, CERT_FIND_HAS_PRIVATE_KEY, //CERT_FIND_ANY, nil, nil); CheckError(pCert); // Pasarlo al servicio InternetSetOption(Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT, pCert, SizeOf(CERT_CONTEXT)); finally if Assigned(pCert) then CertFreeCertificateContext(pCert); if Assigned(pStore) then CertCloseStore(pStore, 0); end; end; |
#204
|
|||
|
|||
Cita:
Saludos |
#205
|
|||
|
|||
Cita:
debido a que cambia si lo dejo en va bien pero en la linea internetsetoption recibo el mismo error que al principio, "codigo error 6" |
#206
|
||||
|
||||
Cada registro de facturación tiene que tener su huella y su encadenamiento, independientemente de que la AEAT lo haya rechazado por, por ejemplo, un NIF incorrecto.
__________________
El recuerdo es la prisión en la que el alma sueña pasado, cuando no vive el presente, ni quiere un futuro. |
#207
|
||||
|
||||
Cita:
el codigo que carga el certificado esta correcto pero no se transmite el password a la DLL y en la DLL el array de sesiones se comprueba al llegar a la zona de carga del certificado de forma erronea. creo que corrigiendo esto: en el componente: Código:
function TVerifactu.validNIF(nif, nombre:string; var resultado, nombreRes:string):boolean; var valida_nif: TValidadorNIF; j:integer; begin checkAutoRun; result:=false; valida_nif.nombreCertificado:=Certificado; valida_nif.passwordCerficado:=passwordCertificado; valida_nif.nifvalidar :=nif; valida_nif.nombre :=nombre; valida_nif.resultado :=''; valida_Nif.error :=true; validarNIF( valida_nif ); if valida_Nif.error then begin resultado:=''; nombreRes:=''; result:=false; exit; end; resultado:=valida_Nif.resultado; nombreRes:=valida_Nif.resultadoN; result:=true; end; y esto en la DLL: Código:
procedure TEventosWebNode.WebNodeBeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer); var pStore: HCERTSTORE; pCert: PCERT_CONTEXT; DataBlob: CRYPT_BIT_BLOB; PFX: TBytes; pass,cert:string; begin if sesion=-1 then // viene de un validador de nif begin pass:=nifValidatorPass; cert:=nifValidator; end else // viene de un objeto verifactu begin pass:=sesiones[sesion].inicio.passwordCertificado; cert:=sesiones[sesion].inicio.nombreCertificado; end; if (pos('.PFX',uppercase(cert))=0) and (pos('.P12',uppercase(cert))=0) then exit; cargaCertificado(data, cert, pass); end; ya deberia funcionar, a mi me funciona. A principios de la semana que viene publicare una nueva version corregida. Pero ya esta solucionado. slds |
#208
|
||||
|
||||
Buenas tardes.
Si se le factura a un cliente con recargo de equivalencia no se si está asignando la clave de régimen 01 (Operación de Régimen General). Creo que en este caso debería de asignar la clave de regimen 18 (Recargo de equivalencia). Por favor corregirme si me equivoco.
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos. |
#209
|
||||
|
||||
Cita:
En uveriFactuFuncs. La variable Condatos en la consulta se quedaba siempre a false, al menos en la version que yo tengo. Si os ocurre esto, cambiar esta funcion asi: Código:
function consultar(sesion:integer; var resultado:TConsultaResultado):boolean; var consulta : ConsultaFactuSistemaFacturacion; // Objeto a enviar res : RespuestaConsultaFactuSistemaFacturacionType; // Respuesta tras el envio HTTPRIO1 : THTTPRIO; j : integer; direccion_envio, estado : string; eventos : TEventosHttpPrio; eventosWebNode: TEventosWebNode; begin consulta:=ConsultaFactuSistemaFacturacion.Create; consulta.Cabecera:=CabeceraConsultaSf.Create; consulta.Cabecera.ObligadoEmision :=ObligadoEmisionConsultaType.Create; consulta.Cabecera.ObligadoEmision.NombreRazon :=sesiones[sesion].inicio.emisor.NombreRazonEmisor; consulta.Cabecera.ObligadoEmision.NIF :=sesiones[sesion].inicio.emisor.nifEmisor; consulta.FiltroConsulta:=LRFiltroRegFacturacionType.Create; consulta.FiltroConsulta.PeriodoImputacion :=PeriodoImputacionType.Create; consulta.FiltroConsulta.PeriodoImputacion.Ejercicio :=resultado.Cabecera.ejercicio; consulta.FiltroConsulta.PeriodoImputacion.Periodo :=veriFactuPeriodo( resultado.Cabecera.periodo ); if resultado.Cabecera.NumSerieFactura='' then begin consulta.FiltroConsulta.FechaExpedicionFactura:=FechaExpedicionConsultaType.Create; if resultado.Cabecera.dfecha=resultado.Cabecera.hfecha then begin consulta.FiltroConsulta.FechaExpedicionFactura.FechaExpedicionFactura:=verifactuFecha(datetostr(resultado.Cabecera.dfecha)); end else begin consulta.FiltroConsulta.FechaExpedicionFactura.RangoFechaExpedicion:=RangoFechaExpedicionType.Create; consulta.FiltroConsulta.FechaExpedicionFactura.RangoFechaExpedicion.Desde:=verifactuFecha(datetoStr(resultado.Cabecera.dfecha)); consulta.FiltroConsulta.FechaExpedicionFactura.RangoFechaExpedicion.Hasta:=verifactuFecha(datetoStr(resultado.Cabecera.hfecha)); end; end else begin consulta.FiltroConsulta.NumSerieFactura:=resultado.Cabecera.NumSerieFactura; end; If resultado.Cabecera.filtroSIF then Begin //Vamos a establecer un filtro por sistema informático (opcional) consulta.FiltroConsulta.SistemaInformatico:=SistemaInformaticoType.Create; consulta.FiltroConsulta.SistemaInformatico.NombreRazon := sesiones[sesion].inicio.sistemaInformatico.razonSocial; consulta.FiltroConsulta.SistemaInformatico.NIF := sesiones[sesion].inicio.sistemaInformatico.nif; consulta.FiltroConsulta.SistemaInformatico.NombreSistemaInformatico := sesiones[sesion].inicio.sistemaInformatico.nombre; consulta.FiltroConsulta.SistemaInformatico.IdSistemaInformatico := sesiones[sesion].inicio.sistemaInformatico.ID; consulta.FiltroConsulta.SistemaInformatico.Version := sesiones[sesion].inicio.sistemaInformatico.Version; consulta.FiltroConsulta.SistemaInformatico.NumeroInstalacion := sesiones[sesion].inicio.sistemaInformatico.NumeroInstalacion; consulta.FiltroConsulta.SistemaInformatico.TipoUsoPosibleSoloVerifactu := SiNoType.S; if sesiones[sesion].inicio.sistemaInformatico.multiplesOT then consulta.FiltroConsulta.SistemaInformatico.TipoUsoPosibleMultiOT := SiNoType.S else consulta.FiltroConsulta.SistemaInformatico.TipoUsoPosibleMultiOT := SiNoType.N; End; eventos:=TEventosHttpPrio.Create; eventos.fileNameBefore :=sesiones[sesion].inicio.saveXMLenvio; eventos.fileNameAfter :=sesiones[sesion].inicio.saveXMLResultado; eventosWebNode:=TEventosWebNode.Create; eventosWebNode.sesion:=sesion; HTTPRIO1:=THTTPRIO.create(nil); HTTPRIO1.onBeforeExecute:=eventos.BeforeExecute; HTTPRIO1.onAfterExecute :=eventos.AfterExecute; // Cargar certificado del disco if ( pos('.PFX',uppercase(sesiones[sesion].inicio.nombreCertificado))<>0) or ( pos('.P12',uppercase(sesiones[sesion].inicio.nombreCertificado))<>0) then HTTPRIO1.HTTPWebNode.onBeforePost:=eventosWebNode.WebNodeBeforePost; // --> envío pre-produccion: 'https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP'; try // Cargar certificado del almacen if ( pos('.PFX',uppercase(sesiones[sesion].inicio.nombreCertificado))=0) and ( pos('.P12',uppercase(sesiones[sesion].inicio.nombreCertificado))=0) then HTTPRIO1.HTTPWebNode.ClientCertificate.SerialNum := Buscar_Certificado_SERIAL( sesiones[sesion].inicio.nombreCertificado ); // coloca el certificado direccion_envio :=sesiones[sesion].inicio.direccion_envio; res:= RespuestaConsultaFactuSistemaFacturacionType.Create; res:= GetsfPortTypeVerifactu( false, direccion_envio , HTTPRIO1 ).ConsultaFactuSistemaFacturacion( consulta ); // Enviarlo ! // limpiar resultado antes de procesarlo clear_consulta(resultado); // resultado del envio: resultado.ConDatos:=(res.ResultadoConsulta=ResultadoConsultaType.ConDatos); resultado.error :=false; resultado.errorDes:=''; procesarConsulta(res,resultado ); except on E:Exception do begin resultado.ConDatos:=false; resultado.error:=true; resultado.errorDes:=Format('(%s)-%s',[E.ClassName, E.Message]); result:=false; exit; end; // Finalmente: // HTTPRIO1.free; //<- no puede ser destruido con NIL como constructor //eventos.Free; end; result:=true; end; |
#210
|
||||
|
||||
Cita:
Lo mismo que ocurriría si es una operación REBU 03 (Régimen de bienes usados), no la puedo calificar con el Régimen General (01).
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos. |
#211
|
||||
|
||||
Cita:
https://arnaldes.com/expedientes-de-...sos-indebidos/ A ver que conclusiones sacamos Saludos ! |
#212
|
||||
|
||||
en la proxima version que publicaremos este fin de semana incluira previsiblemente entre otras tres flags de factura
subsanacion rechazoprevioExiste rechazoPrevioNoExiste Con la intencion de marcar a true la modalidad de rechazoprevio, cuando se envie un registro por un fallo, por ejemplo el de un DNI. (subsanacion, rechazoPrevioNoExiste) Tenemos el siguiente caso: Factura 1 aceptada huella: A Factura 2 error por dni huella B Factura 3 aceptada huella C Factura 2 aceptada huella D Cuando se vuelva a enviar la factura 2, tendra una nueva huella D y habria que marchar esos dos flags. Ahora viene una pregunta: El resto de huellas de la 2 en adelante y hasta el fin de la facturacion estara mal por dos causas: https://www.agenciatributaria.es/sta..._registros.pdf Cita:
¿esto es asi? Saludos ! Última edición por seccion_31 fecha: 11-03-2025 a las 08:42:37. |
#213
|
||||
|
||||
Cita:
Cita:
Abreviando, calculas el hash con datos erroneos , te da bbbb, lo usas en el siguiente aunque sea erroneo, el calculo da ccc, para el siguiente el calculo cccc, es correcto porque en su formula, usaste bbbb que es lo que enviaste. Tenemos un hilo entero aqui, al respecto. Ten en cuenta que corrijes la huella del 2 registro en la aeat, creando un nuevo registro, no sustituyes ese registro en tu SIF, se queda inalterado.
__________________
Uno se alegra de ser útil. (Isaac Asimov) Última edición por bmfranky fecha: 11-03-2025 a las 09:34:58. Razón: Diferenciar AEAT con SIF |
#214
|
||||
|
||||
gracias por la respuesta bmfranky !
entonces tenemos ENVIO 1 --------- F0001-ACEPTADA ENLACE CON NADA, PRIMER REGISTRO F0002-ACEPTADA ENLACE CON F0001 F0003-DNI ERROR ENLACE CON F0002 F0004-ACEPTADA ENLACE CON F0003 ENVIO 2 --------- F0003 ACEPTADA-DNI YA CORRECTO - ENLACE CON F0004 F0005 ACEPTADA ENLACE CON F0004 ¿o con F0003? F0006 ACEPTADA ENLACE CON F0005 ¿seria asi? |
#215
|
||||
|
||||
La F0005 iría con la F0003 en ese caso. Ya que la F0003 aceptada, es cronológicamente su predecesora.
__________________
El recuerdo es la prisión en la que el alma sueña pasado, cuando no vive el presente, ni quiere un futuro. Última edición por DarkDudae fecha: 11-03-2025 a las 11:21:15. |
#216
|
||||
|
||||
Encadenamiento Registros , No Facturas
Cita:
Cita:
Hola, el encadenamiento es sobre el registro anterior, has de coger de el sus datos para el siguiente encadenamiento Cita:
Se enlaza con el contenido del registro anterior, sea de alta, baja, modificacion, no con la factura.
__________________
Uno se alegra de ser útil. (Isaac Asimov) Última edición por bmfranky fecha: 11-03-2025 a las 11:26:32. |
#217
|
||||
|
||||
Exacto, me refería justo a a eso. Pensaba que se sobreentendía.
__________________
El recuerdo es la prisión en la que el alma sueña pasado, cuando no vive el presente, ni quiere un futuro. |
#218
|
||||
|
||||
Si, pero como en el ejemplo, se hacia referencia al numero de factura F0003, he creido que se entenderia mejor de esta manera, un saludo.
__________________
Uno se alegra de ser útil. (Isaac Asimov) |
#219
|
||||
|
||||
Sí, se entiende mucho mejor.
__________________
El recuerdo es la prisión en la que el alma sueña pasado, cuando no vive el presente, ni quiere un futuro. |
#220
|
||||
|
||||
gracias por las respuestas !
¿y si el emisor tiene varias series? (una para tickets, y otra para facturas ) por ejemplo F0003 ACEPTADA ENLAZADO CON F0002 V0002 ACEPTADA ¿ENLAZADO CON F0003? saludos ! |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Verifactu o por requerimiento (no-verifactu) ¿decisión del usuario? | Maska10 | Temas legales | 2 | 07-12-2024 12:34:47 |
Demo de una applicación para una estación de enfermera con RAD Studio | AgustinOrtu | La Taberna | 1 | 21-07-2015 17:41:35 |
Demo Delphi, EMail | Caral | Internet | 1 | 19-12-2006 00:37:56 |
Demo de delphi 2005 | mazinger | Varios | 2 | 18-12-2004 09:23:09 |
El Rave que viene con Delphi es una Demo? | apicito | Impresión | 0 | 04-06-2003 11:33:36 |
![]() |
|