daspa ha scritto:
Buongiorno a tutti! Il mio gestionale adattato a questa nuova fatturazione è pronto in tutto meno che le notifiche...
Volvevo chiederVi se c'è qualcuno qui generoso da darmi una dritta su come sviluppare
in VBA le notifiche ricevute dallo SDI. Spedirei tutti i file in xml tramite SMTP alla PEC di SDI
E la gestione delle notifiche ??!! Mahhh
Ringrazio tutti coloro che suggeriranno un consiglio, un po' di codice...
Buona giornata, Davide
ciao
io ho utilizzato la libreria Chilkat per scaricare le ricevute via pop3 dalla PEC, ho estratto l'allegato sempre con Chilkat, e poi estrapolato i dati con il parser XML di microsoft.
ti copio incollo la funzione che mi son fatto, codice VB6
Private Function ProcXMLReceipt(ByVal FileName As String) As Boolean
' processa il file XML ed estrae il contenuto
Dim IDXML As Long ' puntatore colonna ID tabella FatturePAExp, ricavato dal file XML ricevuta
Dim ADOrsPAExp As ADODB.Recordset ' recorset per tabella FatturePAExp
Dim XMLReceiptType As String ' tipo file ricevuta (vedi http://www.fatturapa.gov.it/export/fatturazione/sdi/Specifiche_tecniche_SdI_v1.1.pdf pag. 32)
' RC Ricevuta di consegna
' NS Notifica di scarto
' MC Notifica di mancata consegna
' NE Notifica esito cedente / prestatore
' MT File dei metadati
' EC Notifica di esito cessionario / committente
' SE Notifica di scarto esito cessionario / committente
' DT Notifica decorrenza termini
' AT Attestazione di avvenuta trasmissione della fattura con impossibilità di recapito
Dim XMLEsito As String ' esito ricezione per receipttype = NE
Dim InvoiceState As InvoiceStates ' stato ricevuta
' IS0_NoXML = 0 ' fattura presente su MagoXP ma XML non ancora generato
' IS1_NotSent = 1 ' fattura presente su MagoXP e XML generato ma non ancora inviato al SdI
' IS2_NotifScarto = 2 ' notifica di scarto da parte del SdI
' IS3_AcceptSdI = 3 ' accettazione da parte dello SdI
' IS4_RifiutataDest = 4 ' notifica di rifiuto da parte del destinatario
' IS5_AcceptDest = 5 ' accettata dal destinatario
Set ADOrsPAExp = New ADODB.Recordset ' recorset per tabella FatturePAExp
' ****** dichiarazione oggetti XML per apertura file
Dim oXML As DOMDocument60
Dim nameXML As IXMLDOMNodeList
Dim elemXML As IXMLDOMElement
Set oXML = New DOMDocument60
If FileName = "" Then Exit Function
oXML.async = False
If Not oXML.Load(XMLRecPath + FileName) Then
Err.Raise oXML.parseError.errorCode, , oXML.parseError.reason
GoTo ExitProcXMLReceipt
Else
' ok, file aperto
' ricava numeratore progressivo fattura PA
Set elemXML = oXML.documentElement
Set nameXML = elemXML.selectNodes("NomeFile")
' se da errore 91 perchè non esiste il campo NomeFile
If nameXML.length = 0 Then
GoTo ExitProcXMLReceipt
End If
' ricava l'id
IDXML = Val(Mid$(nameXML.Item(0).text, 15, 5))
' ricava il tipo di documenti
p1under = InStr(FileName, "_")
p2under = InStr(p1under + 1, FileName, "_")
XMLReceiptType = UCase$(Mid$(FileName, p2under + 1, 2))
' apre il recordset fatture esportate e cerca la fattura in oggetto
Select Case DBActive
Case 0: ' verde
ADOrsPAExp.Open "SELECT * FROM FatturePAExp WHERE ID =" + Str$(IDXML), ADOconn, adOpenStatic, adLockOptimistic
Case 1: ' rosso
ADOrsPAExp.Open "SELECT * FROM FatturePAExp WHERE ID =" + Str$(IDXML), ADORedConn, adOpenStatic, adLockOptimistic
End Select
If Not (ADOrsPAExp.BOF = True And ADOrsPAExp.EOF = True) Then
' ok la ricevuta ha una corrispondenza di fattura emessa nella tabella
' aggiorna la tabella FatturePAExp con i dati della ricevuta XML
ADOrsPAExp.Fields("ReceiptFileName") = Var2dbField(FileName, dbCTString)
ADOrsPAExp.Fields("ReceiptType") = Var2dbField(XMLReceiptType, dbCTString)
ADOrsPAExp.Fields("IdentificativoSdI") = Var2dbField(GetXMLNode(elemXML, "IdentificativoSdI"), dbCTString)
Select Case XMLReceiptType
Case "RC" ' ricevuta consegna
InvoiceState = IS3_AcceptSdI
' 2018-07-04T14:58:32.000+02:00
ADOrsPAExp.Fields("DataOraRicezione") = DateXMLAgenziaEntrate2Date(Var2dbField(GetXMLNode(elemXML, "DataOraRicezione"), dbCTString))
ADOrsPAExp.Fields("DataOraConsegna") = DateXMLAgenziaEntrate2Date(Var2dbField(GetXMLNode(elemXML, "DataOraConsegna"), dbCTString))
ADOrsPAExp.Fields("DestinatarioDescr") = Var2dbField(GetXMLNode(elemXML, "Destinatario/Descrizione"), dbCTString)
ADOrsPAExp.Fields("ReceiptNote") = Var2dbField(GetXMLNode(elemXML, "Note"), dbCTText)
Case "NS" ' notifica scarto
InvoiceState = IS2_NotifScarto
' 2018-07-04T14:58:32.000+02:00
ADOrsPAExp.Fields("DataOraRicezione") = DateXMLAgenziaEntrate2Date(Var2dbField(GetXMLNode(elemXML, "DataOraRicezione"), dbCTString))
ADOrsPAExp.Fields("ReceiptNote") = Var2dbField(GetXMLNode(elemXML, "ListaErrori/Errore/Descrizione"), dbCTText)
Case "NE" ' notifica esito
XMLEsito = GetXMLNode(elemXML, "EsitoCommittente/Esito")
Select Case XMLEsito
Case "EC01" ' accettazione
InvoiceState = IS5_AcceptDest
Case "EC02" ' rifiuto
InvoiceState = IS4_RifiutataDest
End Select
'ADOrsPAExp.Fields("NE-Esito") = Var2dbField(XMLEsito, dbCTString)
ADOrsPAExp.Fields("ReceiptNote") = Var2dbField(GetXMLNode(elemXML, "EsitoCommittente/Descrizione", True), dbCTText)
Case "DT" ' decorrenza termini
InvoiceState = IS5_AcceptDest
ADOrsPAExp.Fields("ReceiptNote") = Var2dbField(GetXMLNode(elemXML, "Descrizione") + vbCrLf + " - Note: " + GetXMLNode(elemXML, "Note"), dbCTText)
End Select
ADOrsPAExp.Fields("InvoiceState") = Var2dbField(InvoiceState, dbCTNumMoney)
ADOrsPAExp.Update
ProcXMLReceipt = True
Else
' manca la fattura corrispondente
ProcXMLReceipt = False
End If
ADOrsPAExp.Close
End If
ExitProcXMLReceipt:
Set ADOrsPAExp = Nothing
Set elemXML = Nothing
Set nameXML = Nothing
Set oXML = Nothing
End Function
ovviamente questa è customizzata per il mio gestionale, te la dovrai adattae a seconda delle tue esigenze.