Python sdicoop

qualcuno per caso ha utilizzato python per interfacciarsi con sdicoop?

Sul forum ho visto per lo più Java, asp.net e php. Python per nulla…

Mi sembra di capire che il SOAP non viene implementato in python dal 2011. Il mio gestionale è fatto in python pertanto sto cercando di metterlo in piedi.

Al limite se esiste qualcosa di fatto in php posso affiancarlo-

In PHP leggi SDICoop: configurazione PHP SoapClient / SoapServer (Apache) per invio e ricezione di test

per la trasmissione sono quasi riuscito:

ho utilizzato zeep come client e pare si connetta ma ho ancora un problema con la spedizione del file in base64 che mi va in timeout

from zeep import Client
from zeep.transports import Transport
from zeep.wsse.signature import Signature
from requests import Session

class SDI():

def __init__(self):
	cafile = '/home/fiore/webapps/fatturefacile_test/myproject/apps/sdi/certificati/CA_Agenzia_delle_Entrate_all.pem'

	keyfile = '/home/fiore/webapps/fatturefacile_test/myproject/apps/sdi/certificati/mykey.key'

	clientcertfile = '/home/fiore/webapps/fatturefacile_test/myproject/apps/sdi/certificati/SDI-xxxxxxxx-client.pem'

	wsdl = '/home/fiore/webapps/fatturefacile_test/myproject/apps/sdi/wsdl/SdIRiceviFile_v1.0.wsdl'


	session = Session()
	session.cert = (clientcertfile, keyfile)
	session.verify = cafile
	transport = Transport(session=session)
	self.client = Client(wsdl,transport=transport)

def InviaSingola(self, file, nomefile):
	response = self.client.service.RiceviFile(File = file, NomeFile = nomefile);
	return response

poi spedisco con una cosa simile:
def trasmissione(request):

documento = get_object_or_404(Fattura, pk=8193)

import io
import base64


#response = io.BytesIO()
filename=str(request.user.profilo.stato.sigla)+str(request.user.profilo.partita_iva)+ '_' + str(documento.numero_fattura)+'.xml'
#documento.fe().write(response,xml_declaration= True)


client = SDI()
res = None
res = client.InviaSingola(documento.fe_tobase64(), filename);

return render(request, 'sdi/trasmissione.html', { 'res': res })

mi sto studiando soaplib in python per creare il servizio server
mha…

preferisco xmlrpc milioni di volte

ma per il server cosa usi?

google, ma noi siamo in debian, apache, php :grin:

io uso debian, django/python, ngynx.

mi sa che dovrò fare la parte in php

Perché non disaccoppi l’elaborazione delle fatture e notifiche dal loro invio/ricezione?

Per l’invio di fatture e notifiche puoi generare su disco in Python i file da inviare, poi con un crontab e curl li invii.

Per la ricezione puoi fare lo script PHP che salva l’XML ricevuto su disco, che poi elaborerai in un secondo momento con Python.

Oppure, se hai un po’ di esperienza sistemistica, puoi utilizzare il gateway GovWay e non avrai nemmeno bisogno di scrivere gli script di cui sopra, in quanto wrappa i servizi SOAP del SdI come semplici API REST, riducendo il problema alla chiamata di un URL in HTTP POST.

credo sia per me la soluzione migliore. oggi provo a rispolverare il vecchio php

Ho completato l’invio in ambiente di test con python 3:

se a qualcuno può servire posto classe e prova che ho fatto:

from zeep import Client
from zeep.transports import Transport
from zeep.wsse.signature import Signature
from zeep.cache import SqliteCache
from requests import Session

class SDI():

import logging.config

logging.config.dictConfig({
	'version': 1,
	'formatters': {
		'verbose': {
			'format': '%(name)s: %(message)s'
		}
	},
	'handlers': {
		'console': {
			'level': 'DEBUG',
			'class': 'logging.StreamHandler',
			'formatter': 'verbose',
		},
	},
	'loggers': {
		'zeep.transports': {
			'level': 'DEBUG',
			'propagate': True,
			'handlers': ['console'],
		},
	}
})

def __init__(self):
	cafile = '/path/CA_Agenzia_delle_Entrate_all.pem'

	keyfile = '/path/mykey.key'

	clientcertfile = '/path/SDI-xxxxxxxxxxxx-client.pem'

	wsdl = '/path/SdIRiceviFile_v1.0.wsdl'


	session = Session()
	session.cert = (clientcertfile, keyfile)
	session.verify = cafile
	transport = Transport(session=session, cache=SqliteCache(), timeout=10000)
	self.client = Client(wsdl,transport=transport)

def InviaSingola(self, file, nomefile):
	service = self.client.create_service('{http://www.fatturapa.gov.it/sdi/ws/trasmissione/v1.0}SdIRiceviFile_binding','https://testservizi.fatturapa.it/ricevi_file')
	soap_result = service.RiceviFile(File = file, NomeFile = nomefile);
	
	return soap_result

e questo un esempio di utilizzo in una view di django:

@never_cache
@login_required
def trasmissione(request):

documento = get_object_or_404(Fattura, pk=8193)

import base64

filename=str(request.user.profilo.stato.sigla)+str(request.user.profilo.partita_iva)+ '_' + str(documento.numero_fattura)+'.xml'

client = SDI()
res = None
res = client.InviaSingola(documento.fe_tobase64(), filename);

return render(request, 'sdi/trasmissione.html', { 'res': res })

ricevo:
{ ‘IdentificativoSdI’: 7402051, ‘DataOraRicezione’: datetime.datetime(2019, 1, 2, 7, 45, 45, 980000, tzinfo=<FixedOffset ‘+01:00’>), ‘Errore’: None }

adesso le notifiche…:wink: buon anno

Io ho interfacciato Odoo con SDI (ovviamente sviluppato in Python), tuttavia implementare i servizi SOAP in Python è stato un bagno di sangue per la mancanza di librerie decenti, motivo per cui la parte SOAP l’ho quasi interamente gestita in PHP.
L’invio lo faccio con SUDS, tuttavia il gran casino l’ho avuto per gestire la risposta delle notifiche, motivo per cui ho scelto PHP per tutto il resto.

Per la parte PHP, guarda qui:

si ho visto, ma implementare doctrine interfacciato al mio db è come tornare indietro di 10 anni. non riesco più a concepire un milione di righe di codice per fare 4 cose.

Sto facendo un tentativo con pysimplesoap che vedo è stata usata in qualche esempio anche in django.

Sto cercando di incapsulare la risposta in un transport tls con urllib2.

Mal che vada ripiego in php.

Ciao! Noi di Python Italia siamo realizzando una webapp in django per la fatturazione elettronica (ci serve per la vendita dei biglietti per PyCon It).

Al momento ho una minima generazione di un file xml valido (ma ci sono ancora dei dati hardcoded), il prossimo step è quello di mandare le fatture all’SdI.

Se volete dare una mano il repo è qui: https://github.com/pythonitalia/fatturae

Possiamo anche sentirci in call per discutere un po’, io non sono molto pratico di fatture, infatti ho avuto un po’ di problemi a capire come funziona tutta la procedura di fatturazione elettronica, però credo di aver capito, ora, come funziona il tutto :slight_smile:

mi fa piacere senz’altro confrontarmi. Io, appena collegato, devo sviluppare le api del mio gestionale per lavorare con altre webapp, probabilmente con xmlrpc.

Se vuoi, visto che anche io lavoro in django e cerco programmatori che mi aiutino, possiamo usare quanto ho già fatto e sviluppare assieme le api.

test.fatturefacile.it