SDIFatturaUtils.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 Link.it srl (https://link.it).
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3, as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
package org.openspcoop2.protocol.sdi.utils;

import java.io.ByteArrayInputStream;
import java.util.List;

import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.protocol.sdi.config.SDIProperties;
import org.openspcoop2.protocol.sdi.constants.SDICostanti;
import org.openspcoop2.protocol.sdi.constants.SDICostantiServizioRicezioneFatture;
import org.openspcoop2.protocol.sdi.validator.SDIValidazioneUtils;
import org.openspcoop2.protocol.sdk.Busta;
import org.openspcoop2.protocol.sdk.Eccezione;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
import org.openspcoop2.utils.xml.AbstractValidatoreXSD;

/**
 * SDIFatturaUtils
 * 
 * @author Andrea Poli (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class SDIFatturaUtils {

	public static void validazioneFattura(byte[] fattura, SDIProperties sdiProperties, List<Eccezione> eccezioniValidazione, 
			SDIValidazioneUtils validazioneUtils, IProtocolFactory<?> protocolFactory,
			Busta busta,OpenSPCoop2Message msg,boolean addMsgInContextIfEnabled,
			boolean validaDatiTrasmissione, boolean forceDisableValidazioneXSD) throws Exception{
			
		boolean forceEccezioneLivelloInfo = false;
		if(validaDatiTrasmissione) {
			if(sdiProperties.isEnableAccessoFattura() == false) {
				return;
			}
			else if(sdiProperties.isEnableAccessoFatturaWarningMode()) {
				forceEccezioneLivelloInfo = true;
			}
		}
		
		// Valori letti nel file Metadati o come parametro nel caso di fattura da inviare
		String versioneFattura = busta.getProperty(SDICostanti.SDI_BUSTA_EXT_VERSIONE_FATTURA_PA);
				
		String codiceDestinatario = busta.getProperty(SDICostanti.SDI_BUSTA_EXT_CODICE_DESTINATARIO);
		
		// validazione XSD file Fattura
		if(forceDisableValidazioneXSD==false && sdiProperties.isEnableValidazioneXsdFattura()){
			try{
				AbstractValidatoreXSD validatore = null;
				if(SDICostanti.SDI_VERSIONE_FATTURA_PA_10.equals(versioneFattura)){
					validatore = it.gov.fatturapa.sdi.fatturapa.v1_0.utils.XSDValidatorWithSignature.getOpenSPCoop2MessageXSDValidator(protocolFactory.getLogger());
				}
				else if(SDICostanti.SDI_VERSIONE_FATTURA_PA_11.equals(versioneFattura)){
					validatore = it.gov.fatturapa.sdi.fatturapa.v1_1.utils.XSDValidatorWithSignature.getOpenSPCoop2MessageXSDValidator(protocolFactory.getLogger());
				}
				else if(SDICostanti.SDI_VERSIONE_FATTURA_SEMPLIFICATA_10.equals(versioneFattura)){
					validatore = it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_0.utils.XSDValidatorWithSignature.getOpenSPCoop2MessageXSDValidator(protocolFactory.getLogger());
				}
				else{
					validatore = it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_2.utils.XSDValidatorWithSignature.getOpenSPCoop2MessageXSDValidator(protocolFactory.getLogger());
				}
				validatore.valida(new ByteArrayInputStream(fattura));
			}catch(Exception e){
				String msgErrore = "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] contiene un file Fattura("+versioneFattura+") non valido rispetto allo schema XSD: "+e.getMessage();
				eccezioniValidazione.add(
						validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,msgErrore,e,forceEccezioneLivelloInfo));
				return;	 // esco anche in caso di forceEccezioneLivelloInfo poiche' la fattura non e' ben formata e non ha senso andare avanti
			}
		}
		
		// Lettura fattura
		String attributoVersione = null;
		String trasmittenteIdPaese = null;
		String trasmittenteIdCodice = null;
		String trasmissioneProgressivoInvio = null;
		String trasmissioneFormatoTrasmissione = null;
		String trasmissioneCodiceDestinatario = null;
		String trasmissionePECDestinatario = null; // solo per versione 1.2
		String cedentePrestatoreIdPaese = null;
		String cedentePrestatoreIdCodice = null;
		String cedentePrestatoreDenominazione = null;
		String cedentePrestatoreNome = null;
		String cedentePrestatoreCognome = null;
		String cedentePrestatoreCodiceFiscale = null;
		String cessionarioCommittenteIdPaese = null;
		String cessionarioCommittenteIdCodice = null;
		String cessionarioCommittenteDenominazione = null;
		String cessionarioCommittenteNome = null;
		String cessionarioCommittenteCognome = null;
		String cessionarioCommittenteCodiceFiscale = null;
		String terzoIdPaese = null;
		String terzoIdCodice = null;
		String terzoDenominazione = null;
		String terzoNome = null;
		String terzoCognome = null;
		String terzoCodiceFiscale = null;
		String soggettoEmittente = null;
		try{
			// Fattura v1.0
			if(SDICostanti.SDI_VERSIONE_FATTURA_PA_10.equals(versioneFattura)){
				it.gov.fatturapa.sdi.fatturapa.v1_0.utils.serializer.JaxbDeserializer deserializer =
						new it.gov.fatturapa.sdi.fatturapa.v1_0.utils.serializer.JaxbDeserializer();
				
				it.gov.fatturapa.sdi.fatturapa.v1_0.FatturaElettronicaType fatturaObject = deserializer.readFatturaElettronicaType(fattura);
				if(addMsgInContextIfEnabled && sdiProperties.isSaveFatturaInContext()){
					msg.addContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_FATTURA, fatturaObject);
				}
				it.gov.fatturapa.sdi.fatturapa.v1_0.FatturaElettronicaHeaderType fatturaHeaderObject = fatturaObject.getFatturaElettronicaHeader();
				
				// Attributo Versione
				attributoVersione = fatturaObject.getVersione();
				
				// Fattura.DatiTrasmissione.IdTrasmittente
				trasmittenteIdPaese = fatturaHeaderObject.getDatiTrasmissione().getIdTrasmittente().getIdPaese();
				trasmittenteIdCodice = fatturaHeaderObject.getDatiTrasmissione().getIdTrasmittente().getIdCodice();
				
				// Fattura.DatiTrasmissione.ProgressivoInvio
				trasmissioneProgressivoInvio = fatturaHeaderObject.getDatiTrasmissione().getProgressivoInvio();
				
				// Fattura.DatiTrasmissione.FormatoTrasmissione
				trasmissioneFormatoTrasmissione = fatturaHeaderObject.getDatiTrasmissione().getFormatoTrasmissione().name();
				
				// Fattura.DatiTrasmissione.CodiceDestinatario
				trasmissioneCodiceDestinatario = fatturaHeaderObject.getDatiTrasmissione().getCodiceDestinatario();
				
				if(fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici()!=null){
					if(fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getIdFiscaleIVA()!=null){
						// Fattura.CedentePrestatore.DatiAnagrafici.IdFiscaleIVA
						cedentePrestatoreIdPaese = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getIdFiscaleIVA().getIdPaese();
						cedentePrestatoreIdCodice = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getIdFiscaleIVA().getIdCodice();
					}
					if(fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getCodiceFiscale()!=null){
						cedentePrestatoreCodiceFiscale = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getCodiceFiscale();
					}
					if(fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getAnagrafica()!=null){
						// Fattura.CedentePrestatore.DatiAnagrafici.Anagrafica.[Denominazione,Nome/Cognome] sono in choice
						cedentePrestatoreDenominazione = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getAnagrafica().getDenominazione();
						cedentePrestatoreNome = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getAnagrafica().getNome();
						cedentePrestatoreCognome = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getAnagrafica().getCognome();
					}
				}
				
				if(fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici()!=null){
					if(fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getIdFiscaleIVA()!=null){
						// Fattura.CessionarioCommittente.DatiAnagrafici.IdFiscaleIVA
						cessionarioCommittenteIdPaese = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getIdFiscaleIVA().getIdPaese();
						cessionarioCommittenteIdCodice = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getIdFiscaleIVA().getIdCodice();
					}
					if(fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getCodiceFiscale()!=null){
						cessionarioCommittenteCodiceFiscale = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getCodiceFiscale();
					}
					if(fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getAnagrafica()!=null){
						// Fattura.CessionarioCommittente.DatiAnagrafici.Anagrafica.[Denominazione,Nome/Cognome] sono in choice
						cessionarioCommittenteDenominazione = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getAnagrafica().getDenominazione();
						cessionarioCommittenteNome = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getAnagrafica().getNome();
						cessionarioCommittenteCognome = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getAnagrafica().getCognome();
					}
				}
				if(fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente()!=null && 
						fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici()!=null){
					if(fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getIdFiscaleIVA()!=null){
						// Fattura.TerzoIntermediarioOSoggettoEmittente.DatiAnagrafici.IdFiscaleIVA
						terzoIdPaese = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getIdFiscaleIVA().getIdPaese();
						terzoIdCodice = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getIdFiscaleIVA().getIdCodice();
					}
					if(fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getCodiceFiscale()!=null){
						terzoCodiceFiscale = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getCodiceFiscale();
					}
					if(fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getAnagrafica()!=null){
						// Fattura.TerzoIntermediarioOSoggettoEmittente.DatiAnagrafici.Anagrafica.[Denominazione,Nome/Cognome] sono in choice
						terzoDenominazione = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getAnagrafica().getDenominazione();
						terzoNome = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getAnagrafica().getNome();
						terzoCognome = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getAnagrafica().getCognome();
					}
				}
				if(fatturaHeaderObject.getSoggettoEmittente()!=null){
					// Fattura.SoggettoEmittente
					soggettoEmittente = fatturaHeaderObject.getSoggettoEmittente().name();
				}
				
			}
			
			// Fattura v1.1
			else if(SDICostanti.SDI_VERSIONE_FATTURA_PA_11.equals(versioneFattura)){
				it.gov.fatturapa.sdi.fatturapa.v1_1.utils.serializer.JaxbDeserializer deserializer =
						new it.gov.fatturapa.sdi.fatturapa.v1_1.utils.serializer.JaxbDeserializer();
				it.gov.fatturapa.sdi.fatturapa.v1_1.FatturaElettronicaType fatturaObject = deserializer.readFatturaElettronicaType(fattura);
				if(addMsgInContextIfEnabled && sdiProperties.isSaveFatturaInContext()){
					msg.addContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_FATTURA, fatturaObject);
				}
				it.gov.fatturapa.sdi.fatturapa.v1_1.FatturaElettronicaHeaderType fatturaHeaderObject = fatturaObject.getFatturaElettronicaHeader();
				
				// Attributo Versione
				attributoVersione = fatturaObject.getVersione();
				
				// Fattura.DatiTrasmissione.IdTrasmittente
				trasmittenteIdPaese = fatturaHeaderObject.getDatiTrasmissione().getIdTrasmittente().getIdPaese();
				trasmittenteIdCodice = fatturaHeaderObject.getDatiTrasmissione().getIdTrasmittente().getIdCodice();
				
				// Fattura.DatiTrasmissione.ProgressivoInvio
				trasmissioneProgressivoInvio = fatturaHeaderObject.getDatiTrasmissione().getProgressivoInvio();
				
				// Fattura.DatiTrasmissione.FormatoTrasmissione
				trasmissioneFormatoTrasmissione = fatturaHeaderObject.getDatiTrasmissione().getFormatoTrasmissione().name();
				
				// Fattura.DatiTrasmissione.CodiceDestinatario
				trasmissioneCodiceDestinatario = fatturaHeaderObject.getDatiTrasmissione().getCodiceDestinatario();
				
				if(fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici()!=null){
					if(fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getIdFiscaleIVA()!=null){
						// Fattura.CedentePrestatore.DatiAnagrafici.IdFiscaleIVA
						cedentePrestatoreIdPaese = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getIdFiscaleIVA().getIdPaese();
						cedentePrestatoreIdCodice = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getIdFiscaleIVA().getIdCodice();
					}
					if(fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getCodiceFiscale()!=null){
						cedentePrestatoreCodiceFiscale = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getCodiceFiscale();
					}
					if(fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getAnagrafica()!=null){
						// Fattura.CedentePrestatore.DatiAnagrafici.Anagrafica.[Denominazione,Nome/Cognome] sono in choice
						cedentePrestatoreDenominazione = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getAnagrafica().getDenominazione();
						cedentePrestatoreNome = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getAnagrafica().getNome();
						cedentePrestatoreCognome = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getAnagrafica().getCognome();
					}
				}
					
				if(fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici()!=null){
					if(fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getIdFiscaleIVA()!=null){
						// Fattura.CessionarioCommittente.DatiAnagrafici.IdFiscaleIVA
						cessionarioCommittenteIdPaese = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getIdFiscaleIVA().getIdPaese();
						cessionarioCommittenteIdCodice = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getIdFiscaleIVA().getIdCodice();
					}
					if(fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getCodiceFiscale()!=null){
						cessionarioCommittenteCodiceFiscale = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getCodiceFiscale();
					}
					if(fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getAnagrafica()!=null){
						// Fattura.CessionarioCommittente.DatiAnagrafici.Anagrafica.[Denominazione,Nome/Cognome] sono in choice
						cessionarioCommittenteDenominazione = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getAnagrafica().getDenominazione();
						cessionarioCommittenteNome = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getAnagrafica().getNome();
						cessionarioCommittenteCognome = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getAnagrafica().getCognome();
					}
				}
					
				if(fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente()!=null && 
						fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici()!=null){
					if(fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getIdFiscaleIVA()!=null){
						// Fattura.TerzoIntermediarioOSoggettoEmittente.DatiAnagrafici.IdFiscaleIVA
						terzoIdPaese = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getIdFiscaleIVA().getIdPaese();
						terzoIdCodice = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getIdFiscaleIVA().getIdCodice();
					}
					if(fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getCodiceFiscale()!=null){
						terzoCodiceFiscale = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getCodiceFiscale();
					}
					if(fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getAnagrafica()!=null){
						// Fattura.TerzoIntermediarioOSoggettoEmittente.DatiAnagrafici.Anagrafica.[Denominazione,Nome/Cognome] sono in choice
						terzoDenominazione = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getAnagrafica().getDenominazione();
						terzoNome = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getAnagrafica().getNome();
						terzoCognome = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getAnagrafica().getCognome();
					}
				}
				if(fatturaHeaderObject.getSoggettoEmittente()!=null){
					// Fattura.SoggettoEmittente
					soggettoEmittente = fatturaHeaderObject.getSoggettoEmittente().name();
				}
				
			}
			
			// FatturaSemplificata v1.0
			else if(SDICostanti.SDI_VERSIONE_FATTURA_SEMPLIFICATA_10.equals(versioneFattura)){
				it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_0.utils.serializer.JaxbDeserializer deserializer =
						new it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_0.utils.serializer.JaxbDeserializer();
				it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_0.FatturaElettronicaType fatturaObject = deserializer.readFatturaElettronicaType(fattura);
				if(addMsgInContextIfEnabled && sdiProperties.isSaveFatturaInContext()){
					msg.addContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_FATTURA, fatturaObject);
				}
				it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_0.FatturaElettronicaHeaderType fatturaHeaderObject = fatturaObject.getFatturaElettronicaHeader();
				
				// Attributo Versione
				if(fatturaObject.getVersione()!=null) {
					attributoVersione = fatturaObject.getVersione().name();
				}
				
				// Fattura.DatiTrasmissione.IdTrasmittente
				trasmittenteIdPaese = fatturaHeaderObject.getDatiTrasmissione().getIdTrasmittente().getIdPaese();
				trasmittenteIdCodice = fatturaHeaderObject.getDatiTrasmissione().getIdTrasmittente().getIdCodice();
				
				// Fattura.DatiTrasmissione.ProgressivoInvio
				trasmissioneProgressivoInvio = fatturaHeaderObject.getDatiTrasmissione().getProgressivoInvio();
				
				// Fattura.DatiTrasmissione.FormatoTrasmissione
				trasmissioneFormatoTrasmissione = fatturaHeaderObject.getDatiTrasmissione().getFormatoTrasmissione().name();
				
				// Fattura.DatiTrasmissione.CodiceDestinatario
				trasmissioneCodiceDestinatario = fatturaHeaderObject.getDatiTrasmissione().getCodiceDestinatario();
				
				if(fatturaHeaderObject.getCedentePrestatore()!=null){
					if(fatturaHeaderObject.getCedentePrestatore().getIdFiscaleIVA()!=null){
						// Fattura.CedentePrestatore.IdFiscaleIVA
						cedentePrestatoreIdPaese = fatturaHeaderObject.getCedentePrestatore().getIdFiscaleIVA().getIdPaese();
						cedentePrestatoreIdCodice = fatturaHeaderObject.getCedentePrestatore().getIdFiscaleIVA().getIdCodice();
					}
					if(fatturaHeaderObject.getCedentePrestatore().getCodiceFiscale()!=null){
						cedentePrestatoreCodiceFiscale = fatturaHeaderObject.getCedentePrestatore().getCodiceFiscale();
					}
					// Fattura.CedentePrestatore.[Denominazione,Nome/Cognome] sono in choice
					if(fatturaHeaderObject.getCedentePrestatore().getDenominazione()!=null){
						cedentePrestatoreDenominazione = fatturaHeaderObject.getCedentePrestatore().getDenominazione();
					}
					if(fatturaHeaderObject.getCedentePrestatore().getNome()!=null){
						cedentePrestatoreNome = fatturaHeaderObject.getCedentePrestatore().getNome();
					}
					if(fatturaHeaderObject.getCedentePrestatore().getCognome()!=null){
						cedentePrestatoreCognome = fatturaHeaderObject.getCedentePrestatore().getCognome();
					}
				}
					
				if(fatturaHeaderObject.getCessionarioCommittente()!=null){
					if(fatturaHeaderObject.getCessionarioCommittente().getIdentificativiFiscali()!=null) {
						if(fatturaHeaderObject.getCessionarioCommittente().getIdentificativiFiscali().getIdFiscaleIVA()!=null){
							// Fattura.CessionarioCommittente.DatiAnagrafici.IdFiscaleIVA
							cessionarioCommittenteIdPaese = fatturaHeaderObject.getCessionarioCommittente().getIdentificativiFiscali().getIdFiscaleIVA().getIdPaese();
							cessionarioCommittenteIdCodice = fatturaHeaderObject.getCessionarioCommittente().getIdentificativiFiscali().getIdFiscaleIVA().getIdCodice();
						}
						if(fatturaHeaderObject.getCessionarioCommittente().getIdentificativiFiscali().getCodiceFiscale()!=null){
							cessionarioCommittenteCodiceFiscale = fatturaHeaderObject.getCessionarioCommittente().getIdentificativiFiscali().getCodiceFiscale();
						}
					}
					if(fatturaHeaderObject.getCessionarioCommittente().getAltriDatiIdentificativi()!=null) {
						// Fattura.CessionarioCommittente.AltriDatiIdentificativi.[Denominazione,Nome/Cognome] sono in choice
						if(fatturaHeaderObject.getCessionarioCommittente().getAltriDatiIdentificativi().getDenominazione()!=null){
							cessionarioCommittenteDenominazione = fatturaHeaderObject.getCessionarioCommittente().getAltriDatiIdentificativi().getDenominazione();
						}
						if(fatturaHeaderObject.getCessionarioCommittente().getAltriDatiIdentificativi().getNome()!=null){
							cessionarioCommittenteNome = fatturaHeaderObject.getCessionarioCommittente().getAltriDatiIdentificativi().getNome();
						}
						if(fatturaHeaderObject.getCessionarioCommittente().getAltriDatiIdentificativi().getCognome()!=null){
							cessionarioCommittenteCognome = fatturaHeaderObject.getCessionarioCommittente().getAltriDatiIdentificativi().getCognome();
						}
					}
				}
				
				if(fatturaHeaderObject.getSoggettoEmittente()!=null){
					// Fattura.SoggettoEmittente
					soggettoEmittente = fatturaHeaderObject.getSoggettoEmittente().name();
				}
				
			}
			
			// Fattura v1.2
			else{
				
				it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_2.utils.serializer.JaxbDeserializer deserializer =
						new it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_2.utils.serializer.JaxbDeserializer();
				it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_2.FatturaElettronicaType fatturaObject = deserializer.readFatturaElettronicaType(fattura);
				if(addMsgInContextIfEnabled && sdiProperties.isSaveFatturaInContext()){
					msg.addContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_FATTURA, fatturaObject);
				}
				it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_2.FatturaElettronicaHeaderType fatturaHeaderObject = fatturaObject.getFatturaElettronicaHeader();
				
				// Attributo Versione
				if(fatturaObject.getVersione()!=null){
					attributoVersione = fatturaObject.getVersione().getValue();
				}
				
				// Fattura.DatiTrasmissione.IdTrasmittente
				trasmittenteIdPaese = fatturaHeaderObject.getDatiTrasmissione().getIdTrasmittente().getIdPaese();
				trasmittenteIdCodice = fatturaHeaderObject.getDatiTrasmissione().getIdTrasmittente().getIdCodice();
				
				// Fattura.DatiTrasmissione.ProgressivoInvio
				trasmissioneProgressivoInvio = fatturaHeaderObject.getDatiTrasmissione().getProgressivoInvio();
				
				// Fattura.DatiTrasmissione.FormatoTrasmissione
				trasmissioneFormatoTrasmissione = fatturaHeaderObject.getDatiTrasmissione().getFormatoTrasmissione().name();
				
				// Fattura.DatiTrasmissione.CodiceDestinatario
				trasmissioneCodiceDestinatario = fatturaHeaderObject.getDatiTrasmissione().getCodiceDestinatario();
				
				// Fattura.DatiTrasmissione.PECDestinatario
				trasmissionePECDestinatario = fatturaHeaderObject.getDatiTrasmissione().getPecDestinatario();
				
				if(fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici()!=null){
					if(fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getIdFiscaleIVA()!=null){
						// Fattura.CedentePrestatore.DatiAnagrafici.IdFiscaleIVA
						cedentePrestatoreIdPaese = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getIdFiscaleIVA().getIdPaese();
						cedentePrestatoreIdCodice = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getIdFiscaleIVA().getIdCodice();
					}
					if(fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getCodiceFiscale()!=null){
						cedentePrestatoreCodiceFiscale = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getCodiceFiscale();
					}
					if(fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getAnagrafica()!=null){
						// Fattura.CedentePrestatore.DatiAnagrafici.Anagrafica.[Denominazione,Nome/Cognome] sono in choice
						cedentePrestatoreDenominazione = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getAnagrafica().getDenominazione();
						cedentePrestatoreNome = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getAnagrafica().getNome();
						cedentePrestatoreCognome = fatturaHeaderObject.getCedentePrestatore().getDatiAnagrafici().getAnagrafica().getCognome();
					}
				}
					
				if(fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici()!=null){
					if(fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getIdFiscaleIVA()!=null){
						// Fattura.CessionarioCommittente.DatiAnagrafici.IdFiscaleIVA
						cessionarioCommittenteIdPaese = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getIdFiscaleIVA().getIdPaese();
						cessionarioCommittenteIdCodice = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getIdFiscaleIVA().getIdCodice();
					}
					if(fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getCodiceFiscale()!=null){
						cessionarioCommittenteCodiceFiscale = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getCodiceFiscale();
					}
					if(fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getAnagrafica()!=null){
						// Fattura.CessionarioCommittente.DatiAnagrafici.Anagrafica.[Denominazione,Nome/Cognome] sono in choice
						cessionarioCommittenteDenominazione = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getAnagrafica().getDenominazione();
						cessionarioCommittenteNome = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getAnagrafica().getNome();
						cessionarioCommittenteCognome = fatturaHeaderObject.getCessionarioCommittente().getDatiAnagrafici().getAnagrafica().getCognome();
					}
				}
					
				if(fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente()!=null && 
						fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici()!=null){
					if(fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getIdFiscaleIVA()!=null){
						// Fattura.TerzoIntermediarioOSoggettoEmittente.DatiAnagrafici.IdFiscaleIVA
						terzoIdPaese = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getIdFiscaleIVA().getIdPaese();
						terzoIdCodice = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getIdFiscaleIVA().getIdCodice();
					}
					if(fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getCodiceFiscale()!=null){
						terzoCodiceFiscale = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getCodiceFiscale();
					}
					if(fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getAnagrafica()!=null){
						// Fattura.TerzoIntermediarioOSoggettoEmittente.DatiAnagrafici.Anagrafica.[Denominazione,Nome/Cognome] sono in choice
						terzoDenominazione = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getAnagrafica().getDenominazione();
						terzoNome = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getAnagrafica().getNome();
						terzoCognome = fatturaHeaderObject.getTerzoIntermediarioOSoggettoEmittente().getDatiAnagrafici().getAnagrafica().getCognome();
					}
				}
				if(fatturaHeaderObject.getSoggettoEmittente()!=null){
					// Fattura.SoggettoEmittente
					soggettoEmittente = fatturaHeaderObject.getSoggettoEmittente().name();
				}
			}
			
		}catch(Exception e){
			String msgErrore = "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] contiene un file Fattura("+versioneFattura+") non valido: "+e.getMessage();
			eccezioniValidazione.add(
					validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,msgErrore,e,forceEccezioneLivelloInfo));
			return;	 // esco anche in caso di forceEccezioneLivelloInfo poiche' la fattura non e' ben formata e non ha senso andare avanti
		}
		
		// Attributo Versione
		String attributoAtteso = null;
		boolean attributoVersioneNonCorretto = false;
		if(SDICostanti.SDI_VERSIONE_FATTURA_PA_10.equals(versioneFattura)){
			if(!SDICostanti.SDI_ATTRIBUTE_VERSION_FATTURA_PA_10.equals(attributoVersione)){
				attributoAtteso = SDICostanti.SDI_ATTRIBUTE_VERSION_FATTURA_PA_10;
				attributoVersioneNonCorretto = true;
			}
		}
		else if(SDICostanti.SDI_VERSIONE_FATTURA_PA_11.equals(versioneFattura)){
			if(!SDICostanti.SDI_ATTRIBUTE_VERSION_FATTURA_PA_11.equals(attributoVersione)){
				attributoAtteso = SDICostanti.SDI_ATTRIBUTE_VERSION_FATTURA_PA_11;
				attributoVersioneNonCorretto = true;
			}
		}
		else if(SDICostanti.SDI_VERSIONE_FATTURA_SEMPLIFICATA_10.equals(versioneFattura)){
			if(!SDICostanti.SDI_ATTRIBUTE_VERSION_FATTURA_SEMPLIFICATA_10.equals(attributoVersione)){
				attributoAtteso = SDICostanti.SDI_ATTRIBUTE_VERSION_FATTURA_SEMPLIFICATA_10;
				attributoVersioneNonCorretto = true;
			}
		}
		else if(SDICostanti.SDI_VERSIONE_FATTURA_PA_12.equals(versioneFattura)){
			if(!SDICostanti.SDI_ATTRIBUTE_VERSION_FATTURA_PA_12.equals(attributoVersione)){
				attributoAtteso = SDICostanti.SDI_ATTRIBUTE_VERSION_FATTURA_PA_12;
				attributoVersioneNonCorretto = true;
			}
		}
		else if(SDICostanti.SDI_VERSIONE_FATTURA_PR_12.equals(versioneFattura)){
			if(!SDICostanti.SDI_ATTRIBUTE_VERSION_FATTURA_PR_12.equals(attributoVersione)){
				attributoAtteso = SDICostanti.SDI_ATTRIBUTE_VERSION_FATTURA_PR_12;
				attributoVersioneNonCorretto = true;
			}
		}
		if(attributoVersioneNonCorretto){
			eccezioniValidazione.add(
					validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
							"Attributo versione presente ["+attributoVersione+
							"] differente da quello atteso ["+attributoAtteso+"] per la versione della fattura ["+versioneFattura+"]",
							!sdiProperties.isEnableValidazioneCampiInterniFattura()));
			if(sdiProperties.isEnableValidazioneCampiInterniFattura()){
				return;	
			}
		}
		
		// Fattura.DatiTrasmissione.IdTrasmittente (la validazione del nome file e' stata effettuata nella validazione sintattica)
		if(validaDatiTrasmissione){
			String nomeFileSdi = busta.getProperty(SDICostanti.SDI_BUSTA_EXT_NOME_FILE);
			String [] nomeFileSdiSplit = nomeFileSdi.split("_");
			String idPaese = nomeFileSdiSplit[0].substring(0, 2);
			String idCodice = nomeFileSdiSplit[0].substring(2);
			if(idPaese.equals(trasmittenteIdPaese)==false){
				eccezioniValidazione.add(
						validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
								"NomeFile presente nel messaggio SdI ["+nomeFileSdi+
								"] possiede un idPaese["+idPaese+"] differente da quello presente nella fattura ["+trasmittenteIdPaese+"]",
								!sdiProperties.isEnableValidazioneCampiInterniFattura()));
				if(sdiProperties.isEnableValidazioneCampiInterniFattura()){
					return;	
				}
			}
			if(idCodice.equals(trasmittenteIdCodice)==false){
				eccezioniValidazione.add(
						validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
								"NomeFile presente nel messaggio SdI ["+nomeFileSdi+
								"] possiede un idCodice["+idCodice+"] differente da quello presente nella fattura ["+trasmittenteIdCodice+"]",
								!sdiProperties.isEnableValidazioneCampiInterniFattura()));
				if(sdiProperties.isEnableValidazioneCampiInterniFattura()){
					return;	
				}
			}
		}
		busta.addProperty(SDICostanti.SDI_BUSTA_EXT_TRASMITTENTE_ID_PAESE, trasmittenteIdPaese);
		busta.addProperty(SDICostanti.SDI_BUSTA_EXT_TRASMITTENTE_ID_CODICE, trasmittenteIdCodice);
		
		// Fattura.DatiTrasmissione.progressivoInvio (la validazione del nome file e' stata effettuata nella validazione sintattica)
// NOTA: Si tratta di due progressivi differenti.
//		if(sdiProperties.isEnableValidazioneCampiInterniFattura()){
//			String nomeFileSdi = busta.getProperty(SDICostanti.SDI_BUSTA_EXT_NOME_FILE);
//			String [] nomeFileSdiSplit = nomeFileSdi.split("_");
//			String progressivoInvio = nomeFileSdiSplit[1].split("\\.")[0];
//			if(progressivoInvio.equals(trasmissioneProgressivoInvio)==false){
//				eccezioniValidazione.add(
//						validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
//								"NomeFile presente nel messaggio SdI ["+nomeFileSdi+
//								"] possiede un progressivoInvio["+progressivoInvio+"] differente da quello presente nella fattura ["+trasmissioneProgressivoInvio+"]"));
//				return;	
//			}
//		}
		busta.addProperty(SDICostanti.SDI_BUSTA_EXT_TRASMISSIONE_PROGRESSIVO_INVIO, trasmissioneProgressivoInvio);
		
		// Fattura.DatiTrasmissione.FormatoTrasmissione
		if(validaDatiTrasmissione){
			if(versioneFattura.equals(trasmissioneFormatoTrasmissione)==false){
				eccezioniValidazione.add(
						validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
								"Formato di trasmissione indicato nel file Metadati ["+versioneFattura+
								"] differente da quello presente nella fattura ["+trasmissioneFormatoTrasmissione+"]",
								!sdiProperties.isEnableValidazioneCampiInterniFattura()));
				if(sdiProperties.isEnableValidazioneCampiInterniFattura()){
					return;	
				}
			}
		}
		
		// Fattura.DatiTrasmissione.CodiceDestinatario
		if(validaDatiTrasmissione){
			if(codiceDestinatario.equals(trasmissioneCodiceDestinatario)==false){
				eccezioniValidazione.add(
						validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
								"Codice Destinatario indicato nel file Metadati ["+codiceDestinatario+
								"] differente da quello presente nella fattura ["+trasmissioneCodiceDestinatario+"]",
								!sdiProperties.isEnableValidazioneCampiInterniFattura()));
				if(sdiProperties.isEnableValidazioneCampiInterniFattura()){
					return;	
				}
			}
		}
		
		// Fattura.DatiTrasmissione.PECDestinatario
		busta.addProperty(SDICostanti.SDI_BUSTA_EXT_TRASMISSIONE_PEC_DESTINATARIO, trasmissionePECDestinatario);
		
		// Fattura.CedentePrestatore.DatiAnagrafici.IdFiscaleIVA
		if(cedentePrestatoreIdPaese!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CEDENTE_PRESTATORE_ID_PAESE, cedentePrestatoreIdPaese);
		}
		if(cedentePrestatoreIdCodice!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CEDENTE_PRESTATORE_ID_CODICE, cedentePrestatoreIdCodice);
		}
		
		// Fattura.CedentePrestatore.DatiAnagrafici.CodiceFiscale
		if(cedentePrestatoreCodiceFiscale!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CEDENTE_PRESTATORE_CODICE_FISCALE, cedentePrestatoreCodiceFiscale);
		}
		
		// Fattura.CedentePrestatore.DatiAnagrafici.Anagrafica.[Denominazione,Nome/Cognome] sono in choice
		if(cedentePrestatoreDenominazione!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CEDENTE_PRESTATORE_DENOMINAZIONE, cedentePrestatoreDenominazione);
		}
		if(cedentePrestatoreNome!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CEDENTE_PRESTATORE_NOME, cedentePrestatoreNome);
		}
		if(cedentePrestatoreCognome!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CEDENTE_PRESTATORE_COGNOME, cedentePrestatoreCognome);
		}
		
		// Fattura.CessionarioCommittente.DatiAnagrafici.IdFiscaleIVA
		if(cessionarioCommittenteIdPaese!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CESSIONARIO_COMMITTENTE_ID_PAESE, cessionarioCommittenteIdPaese);
		}
		if(cessionarioCommittenteIdCodice!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CESSIONARIO_COMMITTENTE_ID_CODICE, cessionarioCommittenteIdCodice);
		}
		
		// Fattura.CessionarioCommittente.DatiAnagrafici.CodiceFiscale
		if(cessionarioCommittenteCodiceFiscale!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CESSIONARIO_COMMITTENTE_CODICE_FISCALE, cessionarioCommittenteCodiceFiscale);
		}
		
		// Fattura.CessionarioCommittente.DatiAnagrafici.Anagrafica.[Denominazione,Nome/Cognome] sono in choice
		if(cessionarioCommittenteDenominazione!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CESSIONARIO_COMMITTENTE_DENOMINAZIONE, cessionarioCommittenteDenominazione);
		}
		if(cessionarioCommittenteNome!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CESSIONARIO_COMMITTENTE_NOME, cessionarioCommittenteNome);
		}
		if(cessionarioCommittenteCognome!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CESSIONARIO_COMMITTENTE_COGNOME, cessionarioCommittenteCognome);
		}
		
		// Fattura.TerzoIntermediarioOSoggettoEmittente.DatiAnagrafici.IdFiscaleIVA
		if(terzoIdPaese!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_TERZO_INTERMEDIARIO_O_SOGGETTO_EMITTENTE_ID_PAESE, terzoIdPaese);
		}
		if(terzoIdCodice!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_TERZO_INTERMEDIARIO_O_SOGGETTO_EMITTENTE_ID_CODICE, terzoIdCodice);
		}
		
		// Fattura.TerzoIntermediarioOSoggettoEmittente.DatiAnagrafici.CodiceFiscale
		if(terzoCodiceFiscale!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_TERZO_INTERMEDIARIO_O_SOGGETTO_EMITTENTE_CODICE_FISCALE, terzoCodiceFiscale);
		}
		
		// Fattura.TerzoIntermediarioOSoggettoEmittente.DatiAnagrafici.Anagrafica.[Denominazione,Nome/Cognome] sono in choice
		if(terzoDenominazione!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_TERZO_INTERMEDIARIO_O_SOGGETTO_EMITTENTE_DENOMINAZIONE, terzoDenominazione);
		}
		if(terzoNome!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_TERZO_INTERMEDIARIO_O_SOGGETTO_EMITTENTE_NOME, terzoNome);
		}
		if(terzoCognome!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_TERZO_INTERMEDIARIO_O_SOGGETTO_EMITTENTE_COGNOME, terzoCognome);
		}
		
		// Fattura.SoggettoEmittente
		if(soggettoEmittente!=null){
			busta.addProperty(SDICostanti.SDI_BUSTA_EXT_SOGGETTO_EMITTENTE, soggettoEmittente);
		}

	}
	
}