Ho cercato questo script per un bel po senza riscontro se non a caro prezzo
# ============================================
# SCRIPT COMPLETO GENERA FATTURA PA XML FPR12 -
# ============================================
# --- Controlli preliminari ---
If [
IsEmpty ( Fatture::Numero ) or
IsEmpty ( Fatture::Data ) or
IsEmpty ( Fatture::Totale ) or
IsEmpty ( Azienda::PIVA ) or
IsEmpty ( Azienda::RagioneSociale ) or
IsEmpty ( Clienti::RagioneSociale )
]
Show Custom Dialog [ "Errore" ; "Dati obbligatori mancanti" ]
Exit Script []
End If
# --- Indentazioni ---
Set Variable [ $tab1 ; " " ]
Set Variable [ $tab2 ; $tab1 & $tab1 ]
Set Variable [ $tab3 ; $tab1 & $tab1 & $tab1 ]
Set Variable [ $tab4 ; $tab1 & $tab1 & $tab1 & $tab1 ]
# --- Funzione per escape XML ---
# Sostituisce &, <, >, " nei testi
Set Variable [ $XMLEscape ;
"Substitute(
Substitute(
Substitute(
Substitute(
?;
'&'; '&'
);
'<'; '<'
);
'>'; '>'
);
'""'; '"'
)"
]
# ============================================
# DATI TRASMISSIONE
# ============================================
Set Variable [ $nodoDestinatario ;
If ( not IsEmpty ( Clienti::CodiceDestinatario ) ;
"<CodiceDestinatario>" & Clienti::CodiceDestinatario & "</CodiceDestinatario>" ;
"<CodiceDestinatario>0000000</CodiceDestinatario>" &
"<PECDestinatario>" & Clienti::PEC & "</PECDestinatario>"
)
]
Set Variable [ $datiTrasmissione ;
$tab1 & "<DatiTrasmissione>" & ¶ &
$tab2 & "<IdTrasmittente>" & ¶ &
$tab3 & "<IdPaese>IT</IdPaese>" & ¶ &
$tab3 & "<IdCodice>" & Azienda::PIVA & "</IdCodice>" & ¶ &
$tab2 & "</IdTrasmittente>" & ¶ &
$tab2 & "<ProgressivoInvio>" & Right("0000000000" & Fatture::Numero ; 10) & "</ProgressivoInvio>" & ¶ &
$tab2 & "<FormatoTrasmissione>FPR12</FormatoTrasmissione>" & ¶ &
$tab2 & $nodoDestinatario & ¶ &
$tab2 & "<ContattiTrasmittente>" & ¶ &
$tab3 & "<Telefono>" & Azienda::Telefono & "</Telefono>" & ¶ &
$tab3 & "<Email>" & Azienda::Email & "</Email>" & ¶ &
$tab2 & "</ContattiTrasmittente>" & ¶ &
$tab1 & "</DatiTrasmissione>"
]
# ============================================
# CEDENTE PRESTATORE
# ============================================
Set Variable [ $cedente ;
$tab1 & "<CedentePrestatore>" & ¶ &
$tab2 & "<DatiAnagrafici>" & ¶ &
$tab3 & "<IdFiscaleIVA>" & ¶ &
$tab4 & "<IdPaese>IT</IdPaese>" & ¶ &
$tab4 & "<IdCodice>" & Azienda::PIVA & "</IdCodice>" & ¶ &
$tab3 & "</IdFiscaleIVA>" & ¶ &
$tab3 & "<Anagrafica>" & ¶ &
$tab4 & "<Denominazione>" & XMLEscape(Azienda::RagioneSociale) & "</Denominazione>" & ¶ &
$tab3 & "</Anagrafica>" & ¶ &
$tab3 & "<RegimeFiscale>RF01</RegimeFiscale>" & ¶ &
$tab2 & "</DatiAnagrafici>" & ¶ &
$tab2 & "<Sede>" & ¶ &
$tab3 & "<Indirizzo>" & Azienda::Indirizzo & "</Indirizzo>" & ¶ &
$tab3 & "<NumeroCivico>" & Azienda::NumeroCivico & "</NumeroCivico>" & ¶ &
$tab3 & "<CAP>" & Azienda::CAP & "</CAP>" & ¶ &
$tab3 & "<Comune>" & Azienda::Comune & "</Comune>" & ¶ &
$tab3 & "<Provincia>" & Azienda::Provincia & "</Provincia>" & ¶ &
$tab3 & "<Nazione>IT</Nazione>" & ¶ &
$tab2 & "</Sede>" & ¶ &
$tab1 & "</CedentePrestatore>"
]
# ============================================
# CESSIONARIO COMMITTENTE
# ============================================
Set Variable [ $datiFiscaliCliente ;
If ( not IsEmpty(Clienti::PIVA) ;
"<IdFiscaleIVA><IdPaese>IT</IdPaese><IdCodice>" & Clienti::PIVA & "</IdCodice></IdFiscaleIVA>" ;
"<CodiceFiscale>" & Clienti::CodiceFiscale & "</CodiceFiscale>"
)
]
Set Variable [ $cliente ;
$tab1 & "<CessionarioCommittente>" & ¶ &
$tab2 & "<DatiAnagrafici>" & ¶ &
$tab3 & $datiFiscaliCliente & ¶ &
$tab3 & "<Anagrafica><Denominazione>" & XMLEscape(Clienti::RagioneSociale) & "</Denominazione></Anagrafica>" & ¶ &
$tab2 & "</DatiAnagrafici>" & ¶ &
$tab2 & "<Sede>" & ¶ &
$tab3 & "<Indirizzo>" & Clienti::Indirizzo & "</Indirizzo>" & ¶ &
$tab3 & "<CAP>" & Clienti::CAP & "</CAP>" & ¶ &
$tab3 & "<Comune>" & Clienti::Comune & "</Comune>" & ¶ &
$tab3 & "<Provincia>" & Clienti::Provincia & "</Provincia>" & ¶ &
$tab3 & "<Nazione>IT</Nazione>" & ¶ &
$tab2 & "</Sede>" & ¶ &
$tab1 & "</CessionarioCommittente>"
]
# ============================================
# HEADER
# ============================================
Set Variable [ $header ;
"<FatturaElettronicaHeader>" & ¶ &
$datiTrasmissione & ¶ &
$cedente & ¶ &
$cliente & ¶ &
"</FatturaElettronicaHeader>"
]
# ============================================
# DATI GENERALI DOCUMENTO
# ============================================
Set Variable [ $datiGeneraliDocumento ;
$tab1 & "<DatiGeneraliDocumento>" & ¶ &
$tab2 & "<TipoDocumento>TD01</TipoDocumento>" & ¶ &
$tab2 & "<Divisa>EUR</Divisa>" & ¶ &
$tab2 & "<Data>" & Year(Fatture::Data) & "-" & Right("0" & Month(Fatture::Data);2) & "-" & Right("0" & Day(Fatture::Data);2) & "</Data>" & ¶ &
$tab2 & "<Numero>" & Fatture::Numero & "</Numero>" & ¶ &
$tab2 & "<ImportoTotaleDocumento>" & Substitute(Round(Fatture::Totale;2);",";".") & "</ImportoTotaleDocumento>" & ¶ &
$tab1 & "</DatiGeneraliDocumento>"
]
# ============================================
# RIGHE FATTURA + RIEPILOGO IVA
# ============================================
Set Variable [ $righeXML ; "" ]
Set Variable [ $riepilogoXML ; "" ]
Set Variable [ $aliquota ; "" ]
Set Variable [ $imponibile ; 0 ]
Set Variable [ $n ; 1 ]
Go to Related Record [ From: FattureRighe ; Using layout: "FattureRighe" ]
Sort Records [ Restore ; With dialog: Off ]
Go to Record/Request/Page [ First ]
Loop
Exit Loop If [ Get ( FoundCount ) = 0 ]
# Dettaglio linee
Set Variable [ $righeXML ;
$righeXML &
$tab2 & "<DettaglioLinee>" & ¶ &
$tab3 & "<NumeroLinea>" & $n & "</NumeroLinea>" & ¶ &
$tab3 & "<Descrizione>" & XMLEscape(FattureRighe::Descrizione) & "</Descrizione>" & ¶ &
$tab3 & "<Quantita>" & Substitute(FattureRighe::Qta;",";".") & "</Quantita>" & ¶ &
$tab3 & "<PrezzoUnitario>" & Substitute(Round(FattureRighe::PrezzoUnitario;2);",";".") & "</PrezzoUnitario>" & ¶ &
$tab3 & "<PrezzoTotale>" & Substitute(Round(FattureRighe::TotaleRiga;2);",";".") & "</PrezzoTotale>" & ¶ &
$tab3 & "<AliquotaIVA>" & FattureRighe::AliquotaIVA & "</AliquotaIVA>" & ¶ &
If(FattureRighe::AliquotaIVA=0; $tab3 & "<Natura>N2.2</Natura>" & ¶; "") &
$tab2 & "</DettaglioLinee>" & ¶
]
# Riepilogo IVA
If [ $aliquota ≠ FattureRighe::AliquotaIVA and $aliquota ≠ "" ]
Set Variable [ $riepilogoXML ;
$riepilogoXML &
$tab2 & "<DatiRiepilogo>" & ¶ &
$tab3 & "<AliquotaIVA>" & $aliquota & "</AliquotaIVA>" & ¶ &
If($aliquota=0; $tab3 & "<Natura>N2.2</Natura>" & ¶; "") &
$tab3 & "<ImponibileImporto>" & Substitute(Round($imponibile;2);",";".") & "</ImponibileImporto>" & ¶ &
$tab3 & "<Imposta>" & Substitute(Round($imponibile*$aliquota/100;2);",";".") & "</Imposta>" & ¶ &
$tab3 & "<EsigibilitaIVA>I</EsigibilitaIVA>" & ¶ &
$tab2 & "</DatiRiepilogo>" & ¶
]
Set Variable [ $imponibile ; 0 ]
End If
Set Variable [ $imponibile ; $imponibile + FattureRighe::TotaleRiga ]
Set Variable [ $aliquota ; FattureRighe::AliquotaIVA ]
Set Variable [ $n ; $n + 1 ]
Go to Record/Request/Page [ Next ; Exit after last ]
End Loop
# Ultimo riepilogo IVA
If [ $aliquota ≠ "" ]
Set Variable [ $riepilogoXML ;
$riepilogoXML &
$tab2 & "<DatiRiepilogo>" & ¶ &
$tab3 & "<AliquotaIVA>" & $aliquota & "</AliquotaIVA>" & ¶ &
If($aliquota=0; $tab3 & "<Natura>N2.2</Natura>" & ¶; "") &
$tab3 & "<ImponibileImporto>" & Substitute(Round($imponibile;2);",";".") & "</ImponibileImporto>" & ¶ &
$tab3 & "<Imposta>" & Substitute(Round($imponibile*$aliquota/100;2);",";".") & "</Imposta>" & ¶ &
$tab3 & "<EsigibilitaIVA>I</EsigibilitaIVA>" & ¶ &
$tab2 & "</DatiRiepilogo>" & ¶
]
End If
# ============================================
# PAGAMENTO
# ============================================
Set Variable [ $pagamento ;
$tab1 & "<DatiPagamento>" & ¶ &
$tab2 & "<CondizioniPagamento>TP02</CondizioniPagamento>" & ¶ &
$tab2 & "<DettaglioPagamento>" & ¶ &
$tab3 & "<ModalitaPagamento>MP05</ModalitaPagamento>" & ¶ &
$tab3 & "<DataScadenzaPagamento>" & Year(Fatture::DataScadenza) & "-" & Right("0" & Month(Fatture::DataScadenza);2) & "-" & Right("0" & Day(Fatture::DataScadenza);2) & "</DataScadenzaPagamento>" & ¶ &
$tab3 & "<ImportoPagamento>" & Substitute(Round(Fatture::Totale;2);",";".") & "</ImportoPagamento>" & ¶ &
If( not IsEmpty(Azienda::IBAN) ; $tab3 & "<IBAN>" & Azienda::IBAN & "</IBAN>" & ¶ ; "" ) &
$tab2 & "</DettaglioPagamento>" & ¶ &
$tab1 & "</DatiPagamento>"
]
# ============================================
# BODY
# ============================================
Set Variable [ $body ;
"<FatturaElettronicaBody>" & ¶ &
$datiGeneraliDocumento & ¶ &
"<DatiBeniServizi>" & ¶ &
$righeXML & $riepilogoXML &
"</DatiBeniServizi>" & ¶ &
$pagamento & ¶ &
"</FatturaElettronicaBody>"
]
# ============================================
# XML FINALE - PROLOG PULITO
# ============================================
Set Variable [ $xmlFinale ;
Trim(
"<?xml version=""1.0"" encoding=""UTF-8""?>" &
"<FatturaElettronica versione=""FPR12"" xmlns=""http://ivaservizi.agenziaentrate.gov.it ... tture/v1.2"">" &
$header &
$body &
"</FatturaElettronica>"
)
]
# --- Salvataggio ---
Set Field [ Globals::XML ; $xmlFinale ]
Export Field Contents [ Globals::XML ; "Fattura_" & Azienda::PIVA & "_" & Fatture::Numero & ".xml" ]
Set Field [ Globals::XML ; "" ]