Page 5 of 5
Re: Facturación electronica - España
Posted: Tue Mar 26, 2013 9:04 am
by Antonio Mart.
Carlos,
¿ Sabes tu si el componente aeatfact.dll sigue siendo valido para firmar oficial y digitalmente facturae ?
Lo digo porque por lo que he leído por ahí, ese componente no tiene continuidad y además no firma de forma correcta según
Ya conocía (y tambien había probado) la el activeX AEATFACT.DLL.
El problema es que esta librería valida documentos en "BASE 64 y firma PKKCS#7". Si embargo, el formato oficial de facturae utiliza una firma "XADES".
En la propia página de la AEAT, donde explican como funciona "Facturación Telemática en formato BASE64 y firma PKCS#7" y el uso de AEATFACT.DLL (aquí),aconsejan utilizar el nuevo formato de Factura electrónica: Facturae, basado en XML con firma XADES, que es el que yo necesito interpretar.
Aeatfact.dll no está implementado para reconocer el formato facturae.
Con lo cual parece que aeatfact.dll NO esta preparado (no sirve) para firmar facturae
Saludos
Re: Facturación electronica - España
Posted: Tue Mar 26, 2013 9:54 am
by colthop
Hola Antonio:
No puedo decirte si esta activo todavía o no, desde septiembre no veo ese tema, pero si puedes hacer una factura firmada puedes comprobar su validez en la pagina siguiente:
http://sedeaplicaciones2.minetur.gob.es/FacturaE/Un saludo
Carlos
Re: Facturación electronica - España
Posted: Tue Mar 26, 2013 2:06 pm
by Antonio Mart.
Carlos,
Esa página, de verificación, parece que fallara.
Por otra parte, quería preguntar a todos: ¿ alguien ha conseguido firmar facturas facturae con el estandar XAdES en modo "batch" ?
A ver si pudieramos generar las fras. y automaticamente quedaran firmadas sin intervencion del usuario.
Gracias.
Re: Facturación electronica - España
Posted: Tue Mar 26, 2013 4:08 pm
by Antonio Mart.
Hola,
Gracias a la clase de Manuel Calero Solís he conseguido generar el .xml.
Adjunto una clase envoltorio.
Me faltaría firmar con el estandar XAdEs.
Code: Select all | Expand
///////////////
// CLASS TEnvoltorioFacturaElectronica
//
//
// Clase envoltorio para la clase TFacturaElectronica de
// Manuel Calero Sol¡s. (Gracias Manuel)
///////////////////////////////////////////////////////////////////////////
#Include "FiveWin.Ch"
*
//-------------------------------------------------------------------------//
// Ejemplo de la clase
// Hay que asignar los datos en el metodo ::AsignaDatos()
FUNCTION TestFacturaElectronica()
Local oEnv
oEnv:= TEnvoltorioFacturaElectronica():New()
oEnv:cNif := "43787173S"
oEnv:cNumFac:= "A-00001/13"
oEnv:cCli := "43000001"
oEnv:lFirmar:= .f.
oEnv:lEnviar:= .t.
oEnv:Activate()
IF oEnv:lError
oEnv:ShowErr()
oenv:showmsg()
ENDIF
RETURN NIL
*
*
*
*
//-------------------------------------------------------------------------//
CLASS TEnvoltorioFacturaElectronica
METHOD New()
METHOD Activate()
DATA cNif // Obligatorio. Al menos para firmar
DATA cNumFac // Obligatorio. Nº de factura.
DATA cCli // Obligatorio. Codigo de cliente de la fra.
DATA lFirmar // Opcional. Si se quiere o no firmar
DATA lEnviar // Opcional. Si se quiere enviar por email
DATA cPathGuardar HIDDEN // Opcional. Por si se quiere tener almacen de fras. enviadas
DATA cFileXml HIDDEN // Fichero xml resultante
DATA cFileXmlFir HIDDEN // Fichero xml resultante firmado, si se llega a firmar
DATA oFactuE HIDDEN
DATA oTree HIDDEN
METHOD InstanciaClase() HIDDEN
METHOD AsignaDatos() HIDDEN
METHOD GeneraXml() HIDDEN
DATA lError READONLY
METHOD ShowMsg() INLINE ::oTree:ShowMsg() // Muestra todos los mensajes de error y no error
METHOD ShowErr() INLINE ::oTree:ShowErr() // Muestra solo los mensajes que son de error
ENDCLASS
*
//-------------------------------------------------------------------------//
METHOD New() CLASS TEnvoltorioFacturaElectronica
::lFirmar:= .t.
::lEnviar:= .t.
::lError := .f.
RETURN Self
*
//-------------------------------------------------------------------------//
METHOD Activate() CLASS TEnvoltorioFacturaElectronica
::InstanciaClase()
::AsignaDatos()
::GeneraXml()
::lError:= ::oTree:lError()
RETURN NIL
*
//-------------------------------------------------------------------------//
METHOD InstanciaClase() CLASS TEnvoltorioFacturaElectronica
Local cIniFile:= FileCarValidos(::cCli+ Space(1)+ ::cNumFac) // Quitar (o sustituir) caracteres no validos para nombre de archivo
*
::cFileXml:= cIniFile+ ".Xml"
IF ::lFirmar
::cFileXmlFir:= cIniFile+ "Fir"+ ".Xml"
ENDIF
*
::oTree:= TSimulateTreeForFacturaElectronica():New()
*
::oFactuE:= TFacturaElectronica():New(::oTree)
*
IF ::lFirmar
::cFileXml := cIniFile+ " - Origen.Xml"
::cFileXmlFir:= cIniFile+ ".Xml"
*
ELSE
::cFileXml := cIniFile+ ".Xml"
::cFileXmlFir:= NIL
ENDIF
::oFactuE:cFicheroOrigen := ::cFileXml
::oFactuE:cFicheroDestino:= ::cFileXmlFir
*
//-------------------------------------------------------------------------//
METHOD AsignaDatos() CLASS TEnvoltorioFacturaElectronica
// AQUI asignar estos datos
::oFactuE:nTotalGrossAmount := 0
::oFactuE:nTotalGeneralDiscounts := 0
::oFactuE:nTotalGeneralSurcharges := 0
::oFactuE:nTotalGrossAmountBeforeTaxes := 0
::oFactuE:nTotalTaxOutputs := 0
::oFactuE:nTotalTaxesWithheld := 0
::oFactuE:nInvoiceTotal := 0
::oFactuE:nTotalOutstandingAmount := 0
::oFactuE:nTotalExecutableAmount := 0
::oFactuE:nTotalReimbursableExpenses := 0
::oFactuE:nInvoiceTotalAmount := 0
// AQUI asignar oSellerParty y oBuyerParty
::oFactuE:oSellerParty := ::oFactuE:oSellerParty
::oFactuE:oBuyerParty := ::oFactuE:oBuyerParty
// AQUI rellenar estos arrays
::oFactuE:aTax := {}
::oFactuE:aDiscount := {}
::oFactuE:aItemLine := {}
::oFactuE:aInstallment := {}
RETURN NIL
*
*
//-------------------------------------------------------------------------//
METHOD GeneraXml() CLASS TEnvoltorioFacturaElectronica
::oFactuE:GeneraXml()
IF ::lFirmar
::oFactuE:Firma()
::oFactuE:VerificaFirma()
ENDIF
IF ::lEnviar
::oFactuE:Enviar()
ENDIF
RETURN NIL
*
//-------------------------------------------------------------------------//
// Esta clase simula un objeto oTree que utiliza Manuel en su clase parece
// ser para obtener informacion de la generacion xml de la factura.
// Nosotros simulamos esa clase para, primero aprovechar su uso y segundo,
// dejar intacto el codigo de Manuel.
CLASS TSimulateTreeForFacturaElectronica
METHOD New()
METHOD Add()
METHOD Expand() INLINE NIL
DATA nNivel INIT 1 HIDDEN
DATA aMsg INIT {} HIDDEN
DATA aMsgErr INIT {} HIDDEN
METHOD ShowMsg()
METHOD ShowErr()
METHOD lError() INLINE !Empty(::aMsgErr)
ENDCLASS
*
//-------------------------------------------------------------------------//
METHOD New() CLASS TSimulateTreeForFacturaElectronica
RETURN Self
*
//-------------------------------------------------------------------------//
// nTipoMsg: 1 Ok, vacio error.
METHOD Add(cTexto, nTipoMsg) CLASS TSimulateTreeForFacturaElectronica
Local oTree
oTree:= TSimulateTreeForFacturaElectronica():New()
oTree:nNivel:= Self:nNivel+ 1
*
Aadd(::aMsg, {cTexto, nTipoMsg})
IF Empty(nTipoMsg)
Aadd(::aMsgErr, {cTexto, nTipoMsg})
ENDIF
RETURN oTree
*
//-------------------------------------------------------------------------//
METHOD ShowMsg() CLASS TSimulateTreeForFacturaElectronica
Local cMsg
#Define MSG_ a[1]+ Space(1)+ "["+ hb_ValToStr(a[2])+ "]"
cMsg:= Arr2String(::aMsg, {|a| MSG_ }, CRLF )
*
MsgInfo(cMsg, "Mensajes")
RETURN NIL
*
//-------------------------------------------------------------------------//
METHOD ShowErr() CLASS TSimulateTreeForFacturaElectronica
Local cMsg
*
cMsg:= Arr2String(::aMsgErr, {|a| MSG_ }, CRLF )
*
MsgInfo(cMsg, "Errores")
RETURN NIL
*
*
//---------------------------------------------------------------------------//
// Funciones que faltan para compilar la clase de Manuel Calero
FUNCTION nRouDiv() ; RETURN 2
FUNCTION FullCurDir(); RETURN CurDriveDir()
FUNCTION DToIso(d)
Local c
c:= Str(Year(d), 4)+ "-"+;
Str(Month(d), 2)+ "-"+;
Str(Day(d), 2)
RETURN c
*
//-------------------------------------------------------------------------//
STATIC FUNCTION FileCarValidos(c); RETURN c
*
//-------------------------------------------------------------------------//
STATIC FUNCTION Arr2String( aList, bMTransform, cSep)
local i, cList := ''
DEFAULT cSep:= ","
IF bMTransform == NIL
bMTransform:= {|x, nPos| x }
ENDIF
for i = 1 to Len( aList )
cList += Eval(bMTransform, aList[ i ], i) + cSep
next
return Left( cList, Len( cList ) - Len( cSep ) )
Saludos
Re: Facturación electronica - España
Posted: Thu Feb 26, 2015 4:28 pm
by elvira
Hola Antonio,
Por favor, ¿podrías compartir un ejemplo actualizado y con la firma?.
Muy agradecida!!
Re: Facturación electronica - España
Posted: Tue Mar 03, 2015 3:02 pm
by José Vicente Beltrán
Antonio y Elvira,
Para firmar la factura electrónica os recomiendo la utilidad que ha puesto en este mismo foro Carlos (Colthop)
http://www.colthop.es/FirEleFa.zip funciona muy bien, mediante una llamada a través de linea de comandos se puede integrar en nuestra aplicación y además tiene incorporada la ultima versión de los componentes de firma XADES validándose sin problemas en la página oficial al efecto en los tres puntos fundamentales:
- validación de formato
- validacion contable
- validación de firma
http://sedeaplicaciones2.minetur.gob.es ... /index.jspSaludos

Re: Facturación electronica - España
Posted: Tue Mar 03, 2015 3:21 pm
by elvira
Hola,
Si, muy agradecida, el tema es que cuando hay que hacer un envío masivo es un engorro porque el usuario tiene que seleccionar cada vez el certificado para cada operación de firma.
¿No existe algún .exe?. Creo que el aeatfact.dll ya no sirve

Re: Facturación electronica - España
Posted: Tue Mar 03, 2015 6:02 pm
by José Vicente Beltrán
Efectivamente aeatfact.dll no sirve porque no firma en formato XAdES
Quizas te sea util la aplicacion EcoFirma, es un exe oficial
http://oficinavirtual.mityc.es/javawebs ... index.htmlAunque yo la he descartado en favor de la utilidad de Carlos
Saludos

Re: Facturación electronica - España
Posted: Tue Mar 03, 2015 6:32 pm
by elvira
Muy agradecida pero me sale una gui para seleccionar el fichero a firnar y no una linea de comando.
Lo que pretendo es firmar todas las facturas del mes y enviarlas por email, pero no puedo seleccionar 390 veces el mismo certificado para firmar todas!!!.
Re: Facturación electronica - España
Posted: Thu Mar 05, 2015 9:18 am
by MOISES