Club Delphi  
    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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 10-12-2024
CarlosMz CarlosMz is offline
Miembro
 
Registrado: jul 2020
Posts: 96
Poder: 5
CarlosMz Va por buen camino
Interesante el proyecto, muchas gracias por este aporte seccion_31

La parte que falta sería el tema de qué hacer con cada respuesta de la AEAT como códigos de error...
Responder Con Cita
  #22  
Antiguo 11-12-2024
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 291
Poder: 9
seccion_31 Va por buen camino
procesar los codigos de error,

bueno, eso esta mas o menos en el codigo, en la funcion que procesa el envio.

anuncio que tengo previsto hacer otra demo (quizas la ultima), espero poder llegar al final, porque creo que ese codigo lo voy a usar. (sino tendre que tirar un monton de codigo)

se podra enviar facturas desde delphi 7, mediante un componente no visual, le das los datos de la factura, y recibes la respuesta.

soportara facturas, tickets, alta, rectificacion por diferencia, anulacion, exportacion...

En principio podras hacer una factura con D7 y enviarla a la AET sin mas.

Saludos
Responder Con Cita
  #23  
Antiguo 11-12-2024
CarlosMz CarlosMz is offline
Miembro
 
Registrado: jul 2020
Posts: 96
Poder: 5
CarlosMz Va por buen camino
Buenas noticias, no sería más sencillo encapsularlo en una clase ?

Una pregunta ¿por qué usas capicom ? no es más sencillo cargar desde un fichero el certificado:

Código Delphi [-]
procedure TMain.HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp;
  Client: THTTPClient);
var
   CertStream: TMemoryStream;
begin
     CertStream := TMemoryStream.Create;
     CertStream.LoadFromFile('file.pfx');
     HTTPReqResp.ClientCertificate.Stream := CertStream;
     HTTPReqResp.ClientCertificate.Password := 'password';

end;
Responder Con Cita
  #24  
Antiguo 11-12-2024
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 291
Poder: 9
seccion_31 Va por buen camino
¿Sinceramente?

porque no tengo mucha idea, y se hacerlo asi. XD

ahora mismo esta echo asi.

¿que ventajas tiene un metodo sobre otro?
Responder Con Cita
  #25  
Antiguo 11-12-2024
CarlosMz CarlosMz is offline
Miembro
 
Registrado: jul 2020
Posts: 96
Poder: 5
CarlosMz Va por buen camino
xD, pues como ventajas, a simple vista, que no hay necesidad de instalar el certificado,
se puede cargar directamente desde un fichero o stream, y simplifica el código reduciendo dependencias
Responder Con Cita
  #26  
Antiguo 11-12-2024
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 291
Poder: 9
seccion_31 Va por buen camino
uummmm...

voy a ver que hago finalmente, de momento publico este componente asi y luego se puede incoporar.

gracias por el extracto de codigo.

El que se pueda enviar una factura desde D7 para mi no es sencillo. la unidad de la AEAT no compila, y el httprio tampoco funciona.

Interaccionar con una DLL en berlin tampoco he podido porque el httprio da un error de proteccion al enviar.

He descartado el DDE

Al final he usado mensajes definidos por el usuario para comunicar con una aplicacion (D10) que se queda residente y va recibiendo las facturas, ordenes de envio y comunica el resultado.
Los datos se transmiten en dos direcciones atraves de funciones "filemapping".

Funcionar, funciona, y enviar una factura es muy simple. En caso de fallo solo haria falta cambiar la aplicacion residente o servidor, que incopora un sistema de log que te va diciendo lo que hace.
Responder Con Cita
  #27  
Antiguo 11-12-2024
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 291
Poder: 9
seccion_31 Va por buen camino
mas o menos quedara asi:

Código:
procedure TForm1.Button2Click(Sender: TObject);
var
  factura, anterior:TRegistroFactura;
  resultado:TResultadoEnvio;
  j:integer;
begin
    // datos generales
    verifactu1.Emisor.NombreRazonEmisor:='Industrias Pepe';
    verifactu1.Emisor.nifEmisor:='Emisor nif';
    verifactu1.SistemaInformatico.razonSocial:='Software prueba sl';
    verifactu1.SistemaInformatico.nif:='informatico nif';
    verifactu1.SistemaInformatico.nombre:='software aeat';
    verifactu1.SistemaInformatico.ID:='1000';
    verifactu1.SistemaInformatico.Version:='11';
    verifactu1.SistemaInformatico.NumeroInstalacion:='01';
    verifactu1.certificado:='mi certificado';

    // cargar factura
    if verifactu1.inicio then
    begin
          factura.numSerieFactura:='F0001';
          factura.fechaFactura:='01/10/2024';
          factura.estado:='A';
          factura.DescripcionOperacion:='VENTA MERCADERIAS';
          factura.cliente:='CLIENTE';
          factura.clienteNIF:='NIF-CLIENTE';
          factura.nivas:=1;
          factura.iva[0].iva:=21;
          factura.iva[0].baseImp:=100;
          factura.iva[0].impIVA:=120;
          factura.cuotatotal:=120;
          factura.total:=1120;

          // sin anterior
          anterior.numSerieFactura:='';


    end;
    if verifactu1.envio(resultado) then
    begin
        for j:=0 to resultado.nfacturas do
        begin
              if not resultado.facturas[j].error then
                  showmessage(resultado.facturas[j].numserieFactura+' '+resultado.facturas[j].csv)
              else
                  showmessage(resultado.facturas[j].numserieFactura+' '+inttostr(resultado.facturas[j].errorCodigo) );
        end;
    end
    else
        showmessage('Error En El Envio');
end;
Responder Con Cita
  #28  
Antiguo 11-12-2024
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 291
Poder: 9
seccion_31 Va por buen camino
voy a intentar hacer que admita un nombre de certificado o nombre de fichero.pfx en el certificado para tener las dos opciones.
Responder Con Cita
  #29  
Antiguo 11-12-2024
CarlosMz CarlosMz is offline
Miembro
 
Registrado: jul 2020
Posts: 96
Poder: 5
CarlosMz Va por buen camino
Tiene buena pinta, creo que ¿habría que agregarle un control de flujo según los errores recibidos por parte de la AEAT?
Responder Con Cita
  #30  
Antiguo 14-12-2024
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 291
Poder: 9
seccion_31 Va por buen camino
buenos dias !

el servidor de mensajes en B10 funciona
el componente en D7 funciona
la demo que envía una excel D7 funciona


Hay un componente en D7 que crea una sesion en el servidor B10
El componente D7 recoge los datos de la facturas y las envia al servidor B10
El componente D7 da orden de envio al servidor B10
El servidor B10 devuelve el resultado del envio al componente D7

Este es un trozo de código del ejemplo de la anterior demo programada en B10, AHORA reprogramada con el nuevo componente para D7

Código en D7 que hace uso del componente:

Código:
// carga los datos de la rejilla en TVerifactu enviandolos a nuestro servidor
function TForm1.stringGrid_to_VerFactuD7( fila:integer ):TRegistroFactura;
var
  actual, anterior:TRegistroFactura;
  n:integer;
begin
      // asignar datos de 1 factura a un record
      actual.alta_baja           :=copy(StringGridFacturas.Cells[ 0, fila ],1,1);  // A o B
      actual.numSerieFactura     :=StringGridFacturas.Cells[ 1, fila ];
      actual.fechafactura        :=StringGridFacturas.Cells[ 2, fila ];
      actual.descripcionOperacion:=StringGridFacturas.Cells[ 3, fila ];
      actual.cliente             :=StringGridFacturas.Cells[ 4, fila ];
      actual.clienteNIF          :=StringGridFacturas.Cells[ 5, fila ];
      actual.clientetipoNIF      :=StringGridFacturas.Cells[ 6, fila ];
      actual.clienteCodPais      :=StringGridFacturas.Cells[ 7, fila ];

      // cargar 2 ivas
      actual.nivas:=0;
      if StringGridFacturas.Cells[10, fila]<>'' then  // añadir iva 1
      begin
            actual.iva[0].iva     :=value( StringGridFacturas.Cells[10, fila] );
            actual.iva[0].req     :=value( StringGridFacturas.Cells[11, fila] );
            actual.iva[0].baseImp :=value( StringGridFacturas.Cells[12, fila] );
            actual.iva[0].impIVA  :=actual.iva[0].baseImp*actual.iva[0].iva / 100;
            actual.iva[0].impREQ  :=actual.iva[0].baseImp*actual.iva[0].req / 100;
            inc(actual.nivas);
      end;
      if StringGridFacturas.Cells[13, fila]<>'' then  // añadir iva 1
      begin
            actual.iva[1].iva     :=value( StringGridFacturas.Cells[13, fila] );
            actual.iva[1].req     :=value( StringGridFacturas.Cells[14, fila] );
            actual.iva[1].baseImp :=value( StringGridFacturas.Cells[15, fila] );
            actual.iva[1].impIVA  :=actual.iva[0].baseImp*actual.iva[0].iva / 100;
            actual.iva[1].impREQ  :=actual.iva[0].baseImp*actual.iva[0].req / 100;
            inc(actual.nivas);
      end;

      // totales
      actual.cuotatotal    :=value( StringGridFacturas.Cells[ 8, fila ] );
      actual.total         :=value( StringGridFacturas.Cells[ 9, fila ] );

      //
      // localizar la factura anterior:  (en nuestra base de datos XML)
      //
      anterior.numSerieFactura  :='';
      anterior.fechaFactura     :='';
      anterior.huella           :='';

      if FacturasEnviadas.locate('emisor;numSerieFactura',VarArrayOf([ VeriFactuD7.Emisor.nifEmisor, actual.numSerieFactura ]),[] ) then
      begin
          FacturasEnviadas.prior;
          if not FacturasEnviadas.bof then
          begin
                anterior.numSerieFactura  :=FacturasEnviadas.FieldByName('numSerieFactura').text;
                anterior.fechaFactura     :=FacturasEnviadas.FieldByName('fechaExpedicioFactura').text;
                anterior.huella           :=FacturasEnviadas.FieldByName('huella').text;
          end;
      end;
      //
      // enviarlo al servidor
      //
      n:=VeriFactuD7.addFactura( actual, anterior );
      //
      //
      if n<=0 then
      begin
            showmessage('Error Añadiendo Factura '+factura+' Al Servidor');
            abort;
      end;
      result:=actual;
end;

//
// enviar los datos cargados en la rejilla
//
procedure TForm1.enviarClick(Sender: TObject);
var
  resultado         : TResultadoEnvio;    // Respuesta tras el envio
  factura           : TFacturas;          // records con los datos de 1 factura la actual y anterior
  actual            : TRegistroFactura;   // para almacenar en la BD
  fila              : integer;            // fila de la rejilla

  alta_baja         : string;             // estado de la fila, 'A' ó 'B'
begin
      screen.Cursor:=crHourglass;

      if sender=enviar  then VerifactuD7.Simular:=false;
      if sender=soloXML then VerifactuD7.Simular:=true;

      // url EndPoint
      VerifactuD7.urlEndPoint:=editURL.text;

      // Datos de sistema Informatico:
      VerifactuD7.SistemaInformatico.razonSocial      :=editRazonSocial.Text;
      VerifactuD7.SistemaInformatico.nif              :=editNIF.Text;
      VerifactuD7.SistemaInformatico.nombre           :=editNombre.Text;
      VerifactuD7.SistemaInformatico.ID               :=editID.text;
      VerifactuD7.SistemaInformatico.Version          :=editVersion.text;
      VerifactuD7.SistemaInformatico.NumeroInstalacion:=editInstalacion.text;

      // Certificado:
      VerifactuD7.Certificado                         :=comboCertificados.text;

      // Emisor
      VerifactuD7.Emisor.NombreRazonEmisor            :=editEmisor.Text;
      VerifactuD7.Emisor.nifEmisor                    :=editNIFEmisor.Text;

      // Otros datos
      VeriFactuD7.pathXML_Envio                       :=xmlEnvio;      // siempre guardaremos una copia de la ultima transmision
      VeriFactuD7.pathXML_Respuesta                   :=xmlRespuesta;  // siempre guardaremos una copia del ultimo resultado

      // Iniciamos Sesion !!
      if not VeriFactuD7.inicio then
      begin
            showmessage('Error Iniciando Sesion');
            exit;
      end;

      // recorrer las facturas de la rejilla
      for fila:=1 to StringGridFacturas.RowCount do
      begin
          alta_baja:=StringGridFacturas.Cells[ 0, fila ];           // estado de la factura (ALTA, BAJA)

          if alta_baja<>'' then
          begin                                                     // SI ALTA ó BAJA:
                actual:=stringGrid_to_VerFactuD7( fila );           // <---- envia al servidor la factura de la fila correspondiente
                archivoFactura(actual);
          end;
      end;

      // resultados:
      PageControlVerifactu.TabIndex:=1;                              // nos preparamos para ver el resultado del envio en su tabulador
      memoXML.lines.clear;

      if VeriFactuD7.envio(resultado) then                           // enviarlo !!
        procesarEnvio(resultado)                                     // procesar el resultado (mostrar en pantalla, y guardarlo en xmlFacturas)
      else
        memoRes.lines.add('El Envio No Ha Podido Ser Realizado');

      // Finalmente:
      FacturasEnviadas.SaveToFile(xmlFacturas);                     // Guardamos el archivo propio de facturas  ( para encadenamiento )

      // cerrar sesion:
      VeriFactuD7.final;                                            // Liberamos la sesion

      screen.Cursor:=crDefault;
end;

[/quote]



Hay varios temas preliminares

Faltan mejorar y afinar algunos temas

¿hay alguien interesado en usarlo?

Para publicarlo, necesito alguien que entienda BIEN la composicion de los mensajes de la AEAT segun cada tipo de factura para componerlo con la informacion basica de una factura y se encargue de ello.
El resto de la logica de envio y recepcion como digo ya funciona.

Seria tomar la funcion que hace la carga del objeto de la AEAT e indicarle los datos segun la factura suministrada.

Ahi dejo este mensaje, a ver si alguien se anima.

Última edición por seccion_31 fecha: 14-12-2024 a las 09:14:48.
Responder Con Cita
  #31  
Antiguo 16-12-2024
Avatar de ramherfer
ramherfer ramherfer is offline
Miembro
 
Registrado: may 2013
Ubicación: Valencia
Posts: 128
Poder: 12
ramherfer Va por buen camino
Yo estoy interesado, aunque tampoco tengo mucha idea en este tipo de procesos.
Toda mi aplicación está programada en D7. Y tengo un problemón de narices. Ya que tiempo material para recodificar todo es imposible.
Ya comenté que en lo que pueda ayudar y echar un cable, intento hacer lo que medigas.
Tambien me gustaría tener más claro la metodología de uso del componente para no tener fallos a la hora de su uso y que todo vaya como la seda.
Sigo sin entender porque no se trabajó en los foros orientado en este sentido. Muchos tendríamos la solución con un poquito de aporte de todos.
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos.
Responder Con Cita
  #32  
Antiguo 16-12-2024
CarlosMz CarlosMz is offline
Miembro
 
Registrado: jul 2020
Posts: 96
Poder: 5
CarlosMz Va por buen camino
Yo podría echar una mano para convertir el código a delphi 12, intentando minimizar dependencias y encapsulando todo el código en una clase para evitar el uso de componentes no "nativos"

Cita:
Empezado por seccion_31 Ver Mensaje
buenos dias !

el servidor de mensajes en B10 funciona
el componente en D7 funciona
la demo que envía una excel D7 funciona


Hay un componente en D7 que crea una sesion en el servidor B10
El componente D7 recoge los datos de la facturas y las envia al servidor B10
El componente D7 da orden de envio al servidor B10
El servidor B10 devuelve el resultado del envio al componente D7

Este es un trozo de código del ejemplo de la anterior demo programada en B10, AHORA reprogramada con el nuevo componente para D7

Código en D7 que hace uso del componente:

Código:
// carga los datos de la rejilla en TVerifactu enviandolos a nuestro servidor
function TForm1.stringGrid_to_VerFactuD7( fila:integer ):TRegistroFactura;
var
  actual, anterior:TRegistroFactura;
  n:integer;
begin
      // asignar datos de 1 factura a un record
      actual.alta_baja           :=copy(StringGridFacturas.Cells[ 0, fila ],1,1);  // A o B
      actual.numSerieFactura     :=StringGridFacturas.Cells[ 1, fila ];
      actual.fechafactura        :=StringGridFacturas.Cells[ 2, fila ];
      actual.descripcionOperacion:=StringGridFacturas.Cells[ 3, fila ];
      actual.cliente             :=StringGridFacturas.Cells[ 4, fila ];
      actual.clienteNIF          :=StringGridFacturas.Cells[ 5, fila ];
      actual.clientetipoNIF      :=StringGridFacturas.Cells[ 6, fila ];
      actual.clienteCodPais      :=StringGridFacturas.Cells[ 7, fila ];

      // cargar 2 ivas
      actual.nivas:=0;
      if StringGridFacturas.Cells[10, fila]<>'' then  // añadir iva 1
      begin
            actual.iva[0].iva     :=value( StringGridFacturas.Cells[10, fila] );
            actual.iva[0].req     :=value( StringGridFacturas.Cells[11, fila] );
            actual.iva[0].baseImp :=value( StringGridFacturas.Cells[12, fila] );
            actual.iva[0].impIVA  :=actual.iva[0].baseImp*actual.iva[0].iva / 100;
            actual.iva[0].impREQ  :=actual.iva[0].baseImp*actual.iva[0].req / 100;
            inc(actual.nivas);
      end;
      if StringGridFacturas.Cells[13, fila]<>'' then  // añadir iva 1
      begin
            actual.iva[1].iva     :=value( StringGridFacturas.Cells[13, fila] );
            actual.iva[1].req     :=value( StringGridFacturas.Cells[14, fila] );
            actual.iva[1].baseImp :=value( StringGridFacturas.Cells[15, fila] );
            actual.iva[1].impIVA  :=actual.iva[0].baseImp*actual.iva[0].iva / 100;
            actual.iva[1].impREQ  :=actual.iva[0].baseImp*actual.iva[0].req / 100;
            inc(actual.nivas);
      end;

      // totales
      actual.cuotatotal    :=value( StringGridFacturas.Cells[ 8, fila ] );
      actual.total         :=value( StringGridFacturas.Cells[ 9, fila ] );

      //
      // localizar la factura anterior:  (en nuestra base de datos XML)
      //
      anterior.numSerieFactura  :='';
      anterior.fechaFactura     :='';
      anterior.huella           :='';

      if FacturasEnviadas.locate('emisor;numSerieFactura',VarArrayOf([ VeriFactuD7.Emisor.nifEmisor, actual.numSerieFactura ]),[] ) then
      begin
          FacturasEnviadas.prior;
          if not FacturasEnviadas.bof then
          begin
                anterior.numSerieFactura  :=FacturasEnviadas.FieldByName('numSerieFactura').text;
                anterior.fechaFactura     :=FacturasEnviadas.FieldByName('fechaExpedicioFactura').text;
                anterior.huella           :=FacturasEnviadas.FieldByName('huella').text;
          end;
      end;
      //
      // enviarlo al servidor
      //
      n:=VeriFactuD7.addFactura( actual, anterior );
      //
      //
      if n<=0 then
      begin
            showmessage('Error Añadiendo Factura '+factura+' Al Servidor');
            abort;
      end;
      result:=actual;
end;

//
// enviar los datos cargados en la rejilla
//
procedure TForm1.enviarClick(Sender: TObject);
var
  resultado         : TResultadoEnvio;    // Respuesta tras el envio
  factura           : TFacturas;          // records con los datos de 1 factura la actual y anterior
  actual            : TRegistroFactura;   // para almacenar en la BD
  fila              : integer;            // fila de la rejilla

  alta_baja         : string;             // estado de la fila, 'A' ó 'B'
begin
      screen.Cursor:=crHourglass;

      if sender=enviar  then VerifactuD7.Simular:=false;
      if sender=soloXML then VerifactuD7.Simular:=true;

      // url EndPoint
      VerifactuD7.urlEndPoint:=editURL.text;

      // Datos de sistema Informatico:
      VerifactuD7.SistemaInformatico.razonSocial      :=editRazonSocial.Text;
      VerifactuD7.SistemaInformatico.nif              :=editNIF.Text;
      VerifactuD7.SistemaInformatico.nombre           :=editNombre.Text;
      VerifactuD7.SistemaInformatico.ID               :=editID.text;
      VerifactuD7.SistemaInformatico.Version          :=editVersion.text;
      VerifactuD7.SistemaInformatico.NumeroInstalacion:=editInstalacion.text;

      // Certificado:
      VerifactuD7.Certificado                         :=comboCertificados.text;

      // Emisor
      VerifactuD7.Emisor.NombreRazonEmisor            :=editEmisor.Text;
      VerifactuD7.Emisor.nifEmisor                    :=editNIFEmisor.Text;

      // Otros datos
      VeriFactuD7.pathXML_Envio                       :=xmlEnvio;      // siempre guardaremos una copia de la ultima transmision
      VeriFactuD7.pathXML_Respuesta                   :=xmlRespuesta;  // siempre guardaremos una copia del ultimo resultado

      // Iniciamos Sesion !!
      if not VeriFactuD7.inicio then
      begin
            showmessage('Error Iniciando Sesion');
            exit;
      end;

      // recorrer las facturas de la rejilla
      for fila:=1 to StringGridFacturas.RowCount do
      begin
          alta_baja:=StringGridFacturas.Cells[ 0, fila ];           // estado de la factura (ALTA, BAJA)

          if alta_baja<>'' then
          begin                                                     // SI ALTA ó BAJA:
                actual:=stringGrid_to_VerFactuD7( fila );           // <---- envia al servidor la factura de la fila correspondiente
                archivoFactura(actual);
          end;
      end;

      // resultados:
      PageControlVerifactu.TabIndex:=1;                              // nos preparamos para ver el resultado del envio en su tabulador
      memoXML.lines.clear;

      if VeriFactuD7.envio(resultado) then                           // enviarlo !!
        procesarEnvio(resultado)                                     // procesar el resultado (mostrar en pantalla, y guardarlo en xmlFacturas)
      else
        memoRes.lines.add('El Envio No Ha Podido Ser Realizado');

      // Finalmente:
      FacturasEnviadas.SaveToFile(xmlFacturas);                     // Guardamos el archivo propio de facturas  ( para encadenamiento )

      // cerrar sesion:
      VeriFactuD7.final;                                            // Liberamos la sesion

      screen.Cursor:=crDefault;
end;



Hay varios temas preliminares

Faltan mejorar y afinar algunos temas

¿hay alguien interesado en usarlo?

Para publicarlo, necesito alguien que entienda BIEN la composicion de los mensajes de la AEAT segun cada tipo de factura para componerlo con la informacion basica de una factura y se encargue de ello.
El resto de la logica de envio y recepcion como digo ya funciona.

Seria tomar la funcion que hace la carga del objeto de la AEAT e indicarle los datos segun la factura suministrada.

Ahi dejo este mensaje, a ver si alguien se anima.[/quote]
Responder Con Cita
  #33  
Antiguo 16-12-2024
Avatar de ramherfer
ramherfer ramherfer is offline
Miembro
 
Registrado: may 2013
Ubicación: Valencia
Posts: 128
Poder: 12
ramherfer Va por buen camino
¿De donde puedo descargar el componente D7 para intentar integrarlo y poder hacer pruebas?
¿cual sería el path para ubicar el servidor B10?
Ya tengo los datos del sistema informático emisor implementados en la ficha de empresa y me faltaría desde donde emito las ordenes de envío y recojo las respuestas, que, imagino sería desde un grid de facturas emitidas gestionando las pendientes de envío.
Soy un mar de dudas para empezar las pruebas
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos.
Responder Con Cita
  #34  
Antiguo 16-12-2024
mqm mqm is offline
Miembro
 
Registrado: nov 2006
Posts: 41
Poder: 0
mqm Va por buen camino
Primero de nada, agradecer a "seccion_31" por la grandísima aportación que ha tenido para con este foro, al brindarnos la posibilidad de usar el código facilitado.
Yo personalmente lo he adaptado para, desde Delphi 10, hace una aplicación en segundo plano que se conecta a la base de datos MYSQL y va enviando la facturas
simplificadas y ordinarias que se van generando en una aplicación en delphi 7.
Estoy intentando desarrollarlo tanto para una application con MYSQL/MariaDB y otra con ficheros DBF de paradox.
De momento consigo enviar con tu código y capturar la respuesta de la AEAT. Ahora estoy esperando a ver como actuar ante las repuestas de la AEAT.
Si en algo puedo ayudar... aquí me tenéis.
Responder Con Cita
  #35  
Antiguo 16-12-2024
Avatar de ramherfer
ramherfer ramherfer is offline
Miembro
 
Registrado: may 2013
Ubicación: Valencia
Posts: 128
Poder: 12
ramherfer Va por buen camino
Si pudieras enviar algo de codigo de esa aplicación que funciona en segundo plano para poder ver como estableces las conexiones entre el servidor B10 y tu base de datos, estaría genial y me ayudaría posiblemente a entender un poco más. Mi aplicación tambien funciona en Delphi 7 y uso tablas paradox db y voy perdido, no, lo siguiente
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos.
Responder Con Cita
  #36  
Antiguo 17-12-2024
mqm mqm is offline
Miembro
 
Registrado: nov 2006
Posts: 41
Poder: 0
mqm Va por buen camino
Simplemente hago uso de los componentes de Devart unidac. Los demás es adaptar el ejemplo a mis tables, es fácil no te lleva mucho tiempo adaptarlos. Simplemente en vez de la rejilla del excell a enviar, tengo dos grid con las facturas simplificadas y las ordinarias, y para "envioFacturas" me he creado una tabla donde en lugar de un excell , voy guardando todos los registros que voy enviando.
Termino de depurar un poco y te paso el proyecto por si te ayuda.
En mi caso para mis aplicaciones, es solo añadir 4 campos a las tablas y crear la tabla de envíos.
Responder Con Cita
  #37  
Antiguo 17-12-2024
Avatar de ramherfer
ramherfer ramherfer is offline
Miembro
 
Registrado: may 2013
Ubicación: Valencia
Posts: 128
Poder: 12
ramherfer Va por buen camino
Cita:
Empezado por mqm Ver Mensaje
Simplemente hago uso de los componentes de Devart unidac. Los demás es adaptar el ejemplo a mis tables, es fácil no te lleva mucho tiempo adaptarlos. Simplemente en vez de la rejilla del excell a enviar, tengo dos grid con las facturas simplificadas y las ordinarias, y para "envioFacturas" me he creado una tabla donde en lugar de un excell , voy guardando todos los registros que voy enviando.
Termino de depurar un poco y te paso el proyecto por si te ayuda.
En mi caso para mis aplicaciones, es solo añadir 4 campos a las tablas y crear la tabla de envíos.
Claro que me serviria de ayuda, lo cual agradecdería. Cualquier codigo que vea su planteamiento me serviría y mucho para ir entendiendo.
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos.
Responder Con Cita
  #38  
Antiguo 19-12-2024
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 291
Poder: 9
seccion_31 Va por buen camino
Hola !

El componente desde Delphi 7 ya envia y devuelve la respuesta. Ya es operativo en la DEMO que importaba de una hoja de calculo, compilada con D7.

En este otro ejemplo de codigo de delphi 7 se procesa la respuesta tras un envio:

Código:
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 ( aceptada con errores )
      _err  :=0;    // nº facturas con errores

      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;


En teoria, sube factura, tickets, rectificativas, comunitarias, y exportación. (hasta 1.000 facturas x envio) Pero lamentablemente ahora mismo no se bien como cubrir el resto de casos.

Genera el QR

Ya esta implementado el cotejo contra la AEAT con el nuevo objeto de consulta: tan simple como llamar a una funcion desde DELPHI 7 y se devuelve un array con los resultados:



Lo voy a incoporar en una aplicacion real que espero empiece a ser probada en un entorno real de facturacion al inicio de año enviandolas a pre-produccion, e imprimiendo el codigo QR real sobre la factura, como demo. Pero todo muy real.

Pero claro, me doy cuenta de la responsabilidad que adquiero una vez publicado, esto NO es una demo.

Permite hacer todo el trabajo desde Delphi 7 con el apoyo de la aplicacion servidora, y desde la version 10 en adelante, puede usarse como una unidad, sin mas con un uses.

En unas semanas una vez probado veo que hacer.
Responder Con Cita
  #39  
Antiguo 19-12-2024
mqm mqm is offline
Miembro
 
Registrado: nov 2006
Posts: 41
Poder: 0
mqm Va por buen camino
Yo sigo implementado tu demo inicial.
Pero.. que hacer en caso de que no tengamos respuesta de la aeat?
Para mi es fácil la implementation. Son pequeña tiendas... facturo envio y en caso de equivocación mando una en negativo. Ni permito borrado ni anulación.
Pero me he encontrado con 2-3 casos en mis pruebas, que la aeat no responde nada ... y posteriormente he visto que las facturas enviadas estaban recogidas.
Con lo fácil que seria una consulta a la aeat, para saber cual es la ultima factura enviada/grabada y aceptada.

Sinceramente..... me estoy planteando dejar todo esto. Hablando claro.... esto es una puñetera mierda que no hay dios que la entienda. Si quieren controlar... les mandamos la caja del día al finalizar la jornada y listo. Tengo algunos clientes de 50 y pico de años que dicen que cierran el negocio.
Amen de las XXX empresas en la web que te ofrecen el kit, y la solución milagrosa para tu software, y muchas ponen que homologadas por hacienda. Quc homologación ni leches..... En manos de que o quienes estamos.

Última edición por mqm fecha: 19-12-2024 a las 21:42:46.
Responder Con Cita
  #40  
Antiguo 20-12-2024
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 291
Poder: 9
seccion_31 Va por buen camino
buenos dias

yo siempre he encontrado respuesta de la aeat. es mas: lo normal es archivarla.

Creo y digo creo (porque tengo que comprobarlo) que cuando en una lista de facturas hay una erronea importa hasta ahi, ignorando el resto que va detras.

ahora el tema es mas sencillo, con la consulta que se puede obtener, puedes interrogar con el objeto de consulta y ver que facturas estan subidas, tambien podras consultarlas en un portal como se hace con el SII. Eso da mucha seguridad.

Despues de mi experiencia con el SII: los primeros dias habra millones de registros subidos, cientos de miles con posibles errores y poco a poco ira la cosa a mejor. No es para tanto, creo que hay que confiar mas en nuestras capacidades y en la sensatez. Con el SII pensaba que seria terrible y no ha sido para tanto.

Ahora bien: sigo sin entender porque con el SII para una empresa que factura 20 millones al año, por ejemplo puedas enviar tus facturas de miles de euros en 4 dias habiles y en verifactu una factura de 10 euros deba ser enviada al instante, obligando a mantener una infraestructura, programa, etc... 24/7 en perfecto funcionamiento. Para mi es incomprensible.

Saludos !
Responder Con Cita
Respuesta



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
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


La franja horaria es GMT +2. Ahora son las 05:19:05.


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