![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
buenos dias !
Ya tengo disponible una version mas que funcional del componente y servidor de mensajes para D7. Incluyo la version compilada y codigo fuente del servidor en B10. Lamentablemente no he podido estar por aqui antes, por motivos personales, pero ahora procurare estar mas atento. especialmente esta semana por si alguien quiere implementarlo. Lo he tenido que subir a mi google drive porque github no me deja. https://drive.google.com/file/d/1fKx...usp=drive_link Aquí no hay milagros, se usa D7 para componer el envío, pero finalmente se transmite atraves de una aplicacion en B10, lo que si es cierto es que mucho mas manejable desde D7. Se arranca el servidor de mensajes y después de esto, podéis ejecutar la demo (que sube una hoja excel), o empezar desarrollar vuestra aplicacion. La parte mas imporante es un record que guarda la factura(s), la factura a enviar y la anterior (si existe). El servidor de mensajes se intenta hacer cargo de componer el resto. Actualmente soporta, facturas, y tickets, y su rectificacion. Ademas se ofrece el control del almacen de certificados, validacion del nif, y el cotejo con la AEAT de los registros enviados. La cuestión es que hay que probarlo y pulirlo. En teoria es posible utilizarlo con versiones mas alla de D7, directamente sin servidor. Queda ofrecido aqui como una demostracion, bajo la TOTAL responsabilidad de quien lo utilice. Saludos cordiales y mucha suerte. |
|
#2
|
||||
|
||||
|
Cita:
Lo estudiaré en profundidad, pero tiene muy buena pinta. En un principio pensé en hacerme un ejecutable o un servicio completo que fuese mirando en la BD cada X segundos si hay alguna factura nueva a enviar, pero con el tema de generar el QR para los tickets, algo de envío directo con un componente se hace más práctico. |
|
#3
|
||||
|
||||
|
Buenos dias !
Registro que carga la factura, podeis verlo en la unidad: utiposVerifactu y necesario para añadir las facturas al envio. Código:
TRegistroFactura=record
sesion :integer; // no tocar
nfactura :integer; // no tocar
numSerieFactura :string[60];
fechaFactura :string[10];
alta_baja :string[1]; // "A"lta, o "B"aja
DescripcionOperacion:TMyString;
cliente :string[120];
clienteNIF :string[20]; // 9 (nif) ... 20 (otros docs.)
clientetipoNIF :string[2]; // si se deja en blanco se determinara segun el pais
clienteCodPais :string[2]; // si se deja en blanco se considerara ES
canarias :boolean; // = true si de canarias
nivas : integer;
iva : array[0..maxivas] of TRegistroFacturaIVAS;
cuotatotal, total:currency;
situacion :TMyString;
huella :TMyString;
facturaRectificada :string[60]; // nº serie factura rectificada
fechaFacturaRectificada :string[10]; // fecha
end;
clientetipoNIF :string[2]; // si se deja en blanco se determinara segun el pais clienteCodPais :string[2]; // si se deja en blanco se considerara ES canarias :boolean; // = true si de canarias Son opcionales, es decir si no se envia el clienteTipoNIF se determinara segun el pais, (lista de paises comunitarios o exportacion): Código:
country_ue:array[0..26] of string=('DE','AT','BE','BG','CY','HR','DK','SI','ES','EE','FI',
'FR','GR','HU','IE','IT','LV','LT','LU','MT','NL','PL',
'PT','CZ','SK','RO','SE');
y Canarias si es un cliente canario. La huella en la factura actual la calculara el componente. Situacion: No se utiliza, que recuerde. Asi que basicamente es limitarse a cumplimentar los datos basicos de una factura en la factura actual. En la factura anterior, es identificarla, NO hace falta cargar todos los datos: Numeroserie Fecha Huella Si la factura anterior se encuentra entre las emitidas del envio, la huella la colocara el componente, solo necesaria si esta fuera del paquete de envio. Por ello una vez transmitida la factura hay que guardar su huella y sobre todo el CSV devuelto. Saludos ! Última edición por seccion_31 fecha: 27-01-2025 a las 08:17:50. |
|
#4
|
||||
|
||||
|
Cita:
http://terawiki.clubdelphi.com/Otros...27_01_2025.rar
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi ![]() P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
|
#5
|
||||
|
||||
|
Buenos días.
Como planteais el maldito control de flujo. En una instalacion monopuesto lo tengo, está claro, pero en una instalación multipuesto que funciona al libre albedrio y que cada usuario puede hacer facturas teniendo la misma serie de facturación, ya que los contadores están a nivel de ejercicio me está volviendo loco. No se si la solución sería cada usuario un SIF distinto, envio independiente de un mismo (OT) y que cada uno envíe y encadene sus registros. Para esto creo que tambien cada usuario debería tener su serie de facturas y su propio servidor de envío. A ver si me podeis echar un cable, un rayito de luz a esto. Gracias. Un saludo.
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos. |
|
#6
|
||||
|
||||
|
Cita:
Por si te sirve de algo la solución que yo he montado puede no ser la más elegante pero creo que es bastante simple y efectiva. Al emitirse una factura desde cualquier terminal se crea en una carpeta compartida un fichero .csv con la información de la factura y mi programa "enviador" lo que hace es estar atento a los ficheros que van apareciendo en esa carpeta, los va encolando por orden de llegada y los va enviando y borrando. De esta manera, en caso de problema y que todo se atasque sigo teniendo en la carpeta los ficheros pendientes de enviar. Saludos.
__________________
Be water my friend. |
|
#7
|
||||
|
||||
|
Cita:
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos. |
|
#8
|
||||
|
||||
|
Buenos dias !
Crear una lista de facturas para enviar, ya sea en un csv u otro medio era tambien mi intencion, hasta la llegada del componente para D7. Pero con el componente y servidor para D7 la cosa cambia, al menos a mi modo de ver. Si tienes varios puestos enviando, cada uno arrancara su servidor B10. Cada terminal cuando haga una factura o ticket puede intentar enviar directamente el documento, sin mas desde D7: Eso si: Bloquear el momento de envío. (un Flag comun para todos los terminales) Enviar los documentos pendientes y el nuevo. Si lo envia Ok, perfecto, sino pasa a la lista de pendientes. (por el motivo que sea). Desbloquear envio Crear un formulario con los pendientes, y lanzarlo manualmente o mediante un timer, que envie. Cuando el formulario envia, de nuevo se bloquea mediante un flag, para que nadie mas pueda enviar. Desbloquear cuando se termina de enviar. Aunque parezca mas farragoso (explicado) pienso que es mas directo, porque todo queda dentro de la aplicación en D7 si se utiliza el componente del que va este hilo. Saludos En mi caso tras crear el documento, muestro la pantalla de pendientes, y realizo el envío. Y ya. (no hay mas). Luego le programare un timer, y lo mostrare al iniciar o cerrar la aplicacion. |
|
#9
|
||||
|
||||
|
Una vez enviado es muy sencillo cargar el resultado.
Este es un extracto del ejemplo incluido que carga desde la excel: Se envia, y se obtiene el resultado en el record resultado Si no se puede si quiera enviar, devuelve false, si hay envio devuelve true, y en resultado carga lo devuelto por la aeat Código:
if VeriFactuD7.envio(resultado) then // enviarlo !!
procesarEnvio(resultado) // procesar el resultado (mostrar en pantalla, y guardarlo en xmlFacturas)
else
begin
memoRes.lines.add('El Envio No Ha Podido Ser Realizado');
memoRes.lines.add(resultado.EstadoEnvio);
memoRes.lines.add(resultado.error);
end;
///////////////////////////////////////////////////////////
procedure TForm1.procesarEnvio(resultado:TResultadoEnvio);
var
desError,error,estado,factura, emisor:string;
j:integer;
_ok,_oke,_err:integer;
begin
memoXML.Lines.LoadFromFile(xmlEnvio);
memoXML.Text:=FormatXMLData(memoXML.Text);
memoRes.lines.clear;
memoRes.lines.Add('Se ha realizado el envío');
memoRes.Lines.Add('');
memoRes.Lines.Add('Estado Del Envio:'+resultado.EstadoEnvio );
memoRes.lines.Add('CSV: ' + resultado.CSV);
memoRes.lines.Add('TimeStamp: ' + resultado.Fecha+' '+resultado.Hora);
memoRes.Lines.Add('');
_ok :=0; // nº facturas OK
_oke :=0; // nº facturas OK ( pero aceptadas con errores )
_err :=0; // nº facturas con errores (no aceptadas)
for j:=0 to resultado.nFacturas-1 do
begin
factura := resultado.facturas[j].NumSerieFactura;
emisor := resultado.facturas[j].IDEmisorFactura;
estado := resultado.facturas[j].estado;
error := inttostr(resultado.facturas[j].errorcodigo);
desError := resultado.facturas[j].descripcionError;
memoRes.Lines.Add( factura + ' ' + estado + ' '+error+' '+desError ); // ver en pantalla
if resultado.facturas[j].OK then // Es correcto ó aceptado con errores
begin
// colocar el csv y huella en la factura
if facturasEnviadas.locate('emisor;NumSerieFactura',vararrayof([emisor, factura ]),[]) then
begin
FacturasEnviadas.edit;
FacturasEnviadas.fieldbyName('csv').text :=resultado.CSV;
FacturasEnviadas.FieldByName('huella').text :=resultado.facturas[j].huellaFactura;
FacturasEnviadas.fieldbyName('situacion').text:=estado;
FacturasEnviadas.post;
end;
if resultado.facturas[j].aceptadoConErrores then inc(_oke) else inc(_ok);
end
else
inc(_err); // Es erronea
end;
memoRes.Lines.Add('');
memoRes.Lines.Add('Facturas Aceptadas: '+inttostr(_ok) );
memoRes.Lines.Add('Facturas Aceptadas Con Errores: '+inttostr(_oke) );
memoRes.Lines.Add('Facturas Con Errores: '+inttostr(_err) );
// tiempo de espera:
if resultado.tiempoDeEspera<>'' then memoRes.Lines.Add('Se Ha Establecido Un Tiempo De Espera Proximo Envio De '+resultado.tiempoDeEspera);
end;
Solo hay que recorerlo y colocar los datos devueltos: Código:
for j:=0 to resultado.nFacturas-1 do
begin
factura := resultado.facturas[j].NumSerieFactura;
emisor := resultado.facturas[j].IDEmisorFactura;
estado := resultado.facturas[j].estado;
error := inttostr(resultado.facturas[j].errorcodigo);
desError := resultado.facturas[j].descripcionError;
|
|
#10
|
|||
|
|||
|
Cita:
Voy a intentar compilar tanto la versión D7 como la "moderna" a ver si puedo compilar sin problemas y a partir de ahí empezar a adaptarlo a mi programa. ¿No has podido hacer la parte del envío utilizando D7 y por eso has optado a hacerlo con versiones más modernas?. Yo en su momento, conseguí hacer pruebas de envío, pero el problema lo tenía con el TLS de windows 7. Si el mismo ejecutable lo lanzaba desde un Windows 10 si que parecía funcionar... Un saludo. |
|
#11
|
||||
|
||||
|
Cita:
Lo dicho, si alguien sabe como hacer funcionar la llamada SOAP desde una DLL y que no de error general que me avise. Y me gustaria que alguien probara a usar un archivo PFX en lugar de usar el certificado desde el almacen. Saludos y gracias ! |
|
#12
|
||||
|
||||
|
He encontrado un pequeño error en la aplicación servidora.
Si intentas cotejar una factura simple (que por ende no tiene ni cliente ni NIF) arroja una excepción en las líneas:
Se puede solucionar con un try - except, pero creo que así es mucho mejor:
Saludos |
|
#13
|
||||
|
||||
|
gracias DarkDudae
voy a incoporar la corrección y en un tiempo, quizas dos semanas publicare una nueva version. ¿tenemos alguna sugerencia para seguir mejorando el componente? Voy a retirar el campo "situacion", porque creo que no se usa, y asi libero espacio de la pila. Corregire las fechas cuando entreguen la fecha de emision con - en lugar de / Hay un indicador que se llama incidencia, que se puede activar manual, o automaticamente, cuando la fecha de alguna factura es diferente a la del dia. Habra otro indicador que se llamara primerRegistro si se detecta primer registro en el envio -->Ambos indicadores, deberian poder ser consultados antes del envio. (Es una lastima no poder encapsularlo en una DLL, mejoraría mucho) Habria que probar el certificado pfx Y hay que añadir mas casos a la generación de la facturación, en especial la de exentos de iva. ¿hay alguien por aqui que domine el tema? Saludos ! |
|
#14
|
|||
|
|||
|
Cita:
Estoy trabajando con Delphi 2007 y acabo de modificar el código de la DEMO_D7_DLL2 y la Validación del NIF para que lo haga utilizando un certificado en fichero .p12 y con contraseña (en lugar de un certificado instalado en el sistema y seleccionado mediante el combo) y me ha hecho la validación correctamente. Genial!!!. Muchas gracias!!! |
|
#15
|
||||
|
||||
|
Cita:
En principio la DLL y el componente se puede usar desde cualquier versión. De delphi. Si vas a usar la DLL puedes ver la llamada desde el.componente. También podrías usar la unidad de funciones sin su encapsulado de DLL llamando sin más a su unidad Última edición por seccion_31 fecha: 22-03-2025 a las 12:24:22. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| 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 |
|