Untitled

 avatar
unknown
plain_text
3 years ago
37 kB
2
Indexable
/**
 * @description       : 
 * @author            : Mady COLY
 * @group             : 
 * @last modified on  : 10-07-2021
 * @last modified by  : ChangeMeIn@UserSettingsUnder.SFDoc
**/
public without sharing class CEP_UTL_StatePerformanceCheck {

	private static Set<String> pointFieldSet = new Set<String>{ 
		'Id', 'Name', 'Key__c', 'CurrentAsset__c', 'CurrentAsset__r.Account.VATNumber__c', 'CurrentAsset__r.Status', 'RecordTypeId', 'RecordType.Name', 'CurrentSupply__r.CompanyDivision__r.Name', 
		'CurrentSupply__c', 'CurrentSupply__r.Name', 'CurrentSupply__r.Key__c', 'CurrentSupply__r.Status__c', 
		'CurrentSupply__r.CompanyDivision__c', 'CurrentSupply__r.Product__c', 'CurrentSupply__r.Product__r.Name', 
		'CurrentSupply__r.Account__c', 'CurrentSupply__r.Account__r.Name', 'CurrentSupply__r.Account__r.Key__c', 'CurrentSupply__r.ContractAccount__r.Account__r.Name', 
		'CurrentSupply__r.ContractAccount__c', 'CurrentSupply__r.ContractAccount__r.Name', 'CurrentSupply__r.ContractAccount__r.Key__c', 
		'CurrentSupply__r.ServiceSite__c', 'CurrentSupply__r.ServiceSite__r.Name', 'CurrentSupply__r.ServiceSite__r.SiteAddressKey__c', 
		'CurrentSupply__r.ServiceSite__r.Account__c', 'CurrentSupply__r.ServiceSite__r.Account__r.Name', 'CurrentSupply__r.ServiceSite__r.SiteAddress__c',
		'CurrentSupply__r.Contract__c', 'CurrentSupply__r.Contract__r.ContractNumber', 'CurrentSupply__r.Contract__r.AccountId', 'CurrentSupply__r.Contract__r.Account.Name','Distributor__c',
		'CurrentAsset__r.AccountId','CurrentAsset__r.SupplyEnergyService__c', 'CurrentAsset__r.Account.Segment__c', 'CurrentAsset__r.Account.Name', 'CurrentAsset__r.Account.JointVenture__r.Name'
	};
	private String opportunityId;
	private String accountId;
	private String vatNumberUscente; 
	public static final CEP_QR_ContestablePod podContendibiliSrv = CEP_QR_ContestablePod.getInstance();

    public static CEP_UTL_StatePerformanceCheck getInstance() {
        return (CEP_UTL_StatePerformanceCheck) ServiceLocator.getInstance(CEP_UTL_StatePerformanceCheck.class);
    }


    public List<String> statoPrestazionePreValorizzazione(String podPdr, String commodity,String accountId, String opportunityId) {
		System.debug('CEP_UTL_StatePerformanceCheck.statoPrestazionePreValorizzazione');
		if(String.isBlank(podPdr)) {
			throw new WrtsException(System.Label.AtLeastOneQueryFilterMustBeSet);
		}

		String text = podPdr;
		Set<String> fieldSet = pointFieldSet;
		this.opportunityId = opportunityId; 
		this.accountId = accountId; 
		String query = 'SELECT ' + String.join(new List<String>(fieldSet), ', ') 
			+ ', CurrentAsset__r.Account.FiscalCode__c, CurrentAsset__r.Account.Type, CurrentAsset__r.Account.RecordType.Name, CurrentAsset__r.Account.CompanyChannel__c, CurrentAsset__r.Account.Key__c   '
			+' FROM ServicePoint__c '
			+' WHERE Key__c = \'' + text + '\'';

		List<ServicePoint__c> servicePoints;
		List<ContestablePod__c> podContendibili = new List<ContestablePod__c>();
		List<PODDistributorAlignment__c> pda = new List<PODDistributorAlignment__c>();
        
        if(Schema.SObjectType.ServicePoint__c.isAccessible()) {
            servicePoints= Database.query(query);
            System.debug('POD SERVICE POINT--list : ' + servicePoints);
        }
        
        
        String status = '';
		List<CEP_StatePerformance__mdt> statePerformances = new List<CEP_StatePerformance__mdt>();
		List<String> prestazioni = new List<String>();
		System.debug('*** accountId: '+accountId);
		Account acc = AccountQueries.getInstance().findAccount(accountId);
		String accountCfEntrante = acc.FiscalCode__c;
		String accountVatNumber = acc.VATNumber__c;
		/*
		if('Reseller'.equalsIgnoreCase(acc.Segment__c)){
			accountCfEntrante = acc.Key__c;
		}
		*/
	
		String clientType = acc.Type!=null && String.isNotBlank(acc.Type) ? acc.Type : acc.RecordType.Name;
		String recordTypeName = acc.RecordTypeDeveloperName__c;
		System.debug('71');
		switch on commodity{
			
			when 'Electric' {
				System.debug('Electric commodity');				
				prestazioni = this.manageEleCommodity(servicePoints,podPdr,accountCfEntrante,clientType, accountVatNumber, this.opportunityId);
			}

			when 'Gas'{
				System.debug('Gas commodity');
				prestazioni = this.manageGasCommodity(servicePoints,accountCfEntrante,clientType, accountVatNumber, this.opportunityId);
			}

			when else {
				return null;
			}
		}

		//RIMUOVE I VALORI DI VOLTURA PER CLIENTI RESELLER
		if(recordTypeName == 'CEP_RT_Reseller' || recordTypeName == 'CEP_RT_ResellerEndCustomer'){
			if(prestazioni.contains('Voltura'))
				prestazioni.remove(prestazioni.indexOf('Voltura'));
			if(prestazioni.contains('Voltura Successione Mortis Causa'))
				prestazioni.remove(prestazioni.indexOf('Voltura Successione Mortis Causa'));
			if(prestazioni.contains('Voltura Fusione, Incorporazione'))
				prestazioni.remove(prestazioni.indexOf('Voltura Fusione, Incorporazione'));
			if(prestazioni.contains('Voltura Per Incorporazione Societaria'))
				prestazioni.remove(prestazioni.indexOf('Voltura Per Incorporazione Societaria'));
			if(prestazioni.contains('Voltura Beneficiario Servizi Energetici'))
				prestazioni.remove(prestazioni.indexOf('Voltura Beneficiario Servizi Energetici'));
			if(prestazioni.contains('Voltura Gestore Servizi Energetici'))
				prestazioni.remove(prestazioni.indexOf('Voltura Gestore Servizi Energetici'));
		}

		// ELIMINA I VALORI PERFORMANCE NON PREVISTI PER LA WAVE 1
		/*if(Constants.getAllConstants().ACTIVE_PERFORMANCE_VALUE_WAVE_1){
			prestazioni = this.filterPerformanceValuesForWave1(prestazioni,commodity);
		} */
		
	return prestazioni;
	}

	public List<String> manageGasCommodity(List<ServicePoint__c> servicePoints, String accountCfEntrante, String clientType,String vatNumber, String opportunityId){
		System.debug('In manageGasCommodity 114');
		List<ContestablePod__c> podContendibili = new List<ContestablePod__c>();
		List<PODDistributorAlignment__c> pda = new List<PODDistributorAlignment__c>();
		List<PermissionSetAssignment> prs=[SELECT PermissionSetId FROM PermissionSetAssignment WHERE PermissionSet.Name IN ('CEP_LargeSme_AEMA','CEP_LargeSme_UE','CEP_LeadSmeLarge') AND AssigneeId =: UserInfo.getUserId() limit 1];
        String status = '';
		String accountIdAsset = '';
		String accountCfUscente;
		String supplyEnergyService;
		String companyDivisionAsset;
		String accountNameAsset;
		String segment = '';
		String accountTypeUscente;
		String accountTypeEntrante = clientType;
		//NTT W3
		String brand;
		//
		List<CEP_StatePerformance__mdt> statePerformances = new List<CEP_StatePerformance__mdt>();
		List<String> prestazioni = new List<String>();
		String CorrespondenceCFIncomingOutgoing = 'NO';
		//non sempre, quando viene richiamato questo metodo, si ha l'opportunityId popolato
		//nei casi in cui è null è necessario controllarlo prima di effettuare la query
		//INC0000000057134 --> errore sulla verifica offertabilità
		Opportunity oppty;
		String accountNameOppty;
		String companyDivisionOppty;
		String recordTypeName;
		String opptySegment = '';
		if(!String.isBlank(opportunityId)) {
			oppty = [SELECT Account.Name, Account.JointVenture__r.Name, Account.RecordTypeDeveloperName__c, Segment__c FROM Opportunity WHERE Id =: opportunityId];
			accountNameOppty = oppty.Account.Name;
			companyDivisionOppty = oppty.Account.JointVenture__r.Name;
			recordTypeName = oppty.Account.RecordTypeDeveloperName__c;
			if(string.isNotBlank(oppty.Segment__c))opptySegment = oppty.Segment__c;
		}

		if(servicePoints.size()>0){
			accountCfUscente = servicePoints[0].CurrentAsset__r.Account.FiscalCode__c;
			status = servicePoints[0].CurrentAsset__r.Status;
			accountIdAsset = servicePoints[0].CurrentAsset__r.AccountId;
			segment = servicePoints[0].CurrentAsset__r.Account.Segment__c;
			companyDivisionAsset = servicePoints[0].CurrentAsset__r.Account.JointVenture__r.Name;
			accountNameAsset = servicePoints[0].CurrentAsset__r.Account.Name;
			//NTT W3
			brand = ServicePoints[0].CurrentAsset__r.Account.CompanyChannel__c;
			//
			CorrespondenceCFIncomingOutgoing = accountCfUscente != null && accountCfEntrante != null  &&  accountCfEntrante == accountCfUscente  ? 'SI' : 'NO';
			supplyEnergyService =  servicePoints[0].CurrentAsset__r.SupplyEnergyService__c;
			String accTypeTmp = servicePoints[0].CurrentAsset__r.Account.Type;
			String recTypeTmp = servicePoints[0].CurrentAsset__r.Account.RecordType.Name;
			accountTypeUscente = accTypeTmp!=null && String.isNotBlank(accTypeTmp) ? accTypeTmp : recTypeTmp;
			if(status == 'Attivo'){
				statePerformances = CEP_QR_StatePerformance.getInstance().getByOriginAndStatus('DB Acea',status,'Gas', CorrespondenceCFIncomingOutgoing, clientType);
			}else {
				statePerformances = CEP_QR_StatePerformance.getInstance().getByOriginAndStatus('DB Acea',status,'Gas',clientType);
			}
			if(statePerformances.size()>0){
				String prestazione = '';
						for(CEP_StatePerformance__mdt stpf : statePerformances){
							prestazione = prestazione + stpf.Performance__c + ',';
						}	
				prestazioni = prestazione.split(',');
			}
			else{
				prestazioni.add('SWITCHING WIN');
				prestazioni.add('Voltura Con Switching');
				prestazioni.add('A40 - ATTIVAZIONE SOGGETTA ALLA DELIBERA 40/14');
				prestazioni.add('A01 - ATTIVAZIONE NON SOGGETTA ALLA DELIBERA 40/14');
				System.debug('Ser179');
				// prestazioni.add('VOLTURA TITOLO 4');
				// prestazioni.add('CAMBIO PRODOTTO'); 
			}
			
		}else{
				prestazioni.add('SWITCHING WIN');
				prestazioni.add('Voltura Con Switching');
				prestazioni.add('A40 - ATTIVAZIONE SOGGETTA ALLA DELIBERA 40/14');
				prestazioni.add('A01 - ATTIVAZIONE NON SOGGETTA ALLA DELIBERA 40/14');
				prestazioni.add('Attivazione Tecnica');
				System.debug('Service Point nuovo190');
				// prestazioni.add('VOLTURA TITOLO 4');  
				// prestazioni.add('CAMBIO PRODOTTO');  			
		}
		System.debug('this.opportunityId >>> '+this.opportunityId);
		   //if(prs!=null && prs.size()==1){
			   	//valori gestiti da matrice CEP_StatePerformance__mdt
				//prestazioni.add('Voltura');
				//prestazioni.add('Voltura Successione Mortis Causa');
				//prestazioni.add('Voltura per Incorporazione Societaria');
				//prestazioni.add('Voltura Titolo 4');
				//prestazioni.add('Voltura Retroattiva o di recupero');
		if((status=='Attivo')&&(this.accountId == accountIdAsset)){
			prestazioni.add('Modifica Tipologia PDR');
		}
		if(prs!=null && prs.size()==1){
			if((status=='Attivo' || status=='Sospeso') && supplyEnergyService == 'SI' &&  servicePoints[0].CurrentAsset__r != null){
				if(this.accountId == accountIdAsset){
					prestazioni.add('Voltura Beneficiario Servizi Energetici');
				}else{
					prestazioni.add('Voltura Gestore Servizi Energetici');
				}
			}
		}

		//NTT W3
		//CONTROLLO SUL CANALE DELLO USER
		/*
		Id userId = userinfo.getUserId();
		List<User> userInfo = [SELECT DefaultChannel__c, DefaultSubChannel__c FROM User WHERE Id = :userId LIMIT 1];
		if(userInfo.size()>0){
			String canale = userInfo[0].DefaultChannel__c;
			String sottoCanale = userInfo[0].DefaultSubChannel__c;
			if (canale == 'Punti fisici' && sottoCanale == 'Store WINDTRE') {
				if(prestazioni.contains('Cambio Prodotto') && brand == 'AE'){ 
					prestazioni.remove(prestazioni.indexOf('Cambio Prodotto'));
					prestazioni.add('Cambio Prodotto Cross Brand'); 
				}
				if(prestazioni.contains('Cambio Prodotto') && brand == 'W3'){ 
					prestazioni.remove(prestazioni.indexOf('Cambio Prodotto'));
					prestazioni.add('Errore'); 
				}
			}
		}  */
		//



		if(segment == 'Mass Market' && clientType == 'Organizzazione'){
			if(prestazioni.contains('Voltura Successione Mortis Causa')){
				prestazioni.remove(prestazioni.indexOf('Voltura Successione Mortis Causa'));
			}
		}
		if(opptySegment != 'Mass Market'){
			//		if(segment != 'Mass Market'){			
			if(recordTypeName != 'CEP_RT_Reseller'){
				if(prestazioni.contains('Voltura Successione Mortis Causa'))
					prestazioni.remove(prestazioni.indexOf('Voltura Successione Mortis Causa'));
				if(prestazioni.contains(' Voltura Successione Mortis Causa'))
					prestazioni.remove(prestazioni.indexOf(' Voltura Successione Mortis Causa'));
				if((status =='Attivo' || status =='Sospeso') && companyDivisionAsset != companyDivisionOppty){
					prestazioni.add('Voltura Con Switching');
					if(prestazioni.contains('Voltura'))
						prestazioni.remove(prestazioni.indexOf('Voltura'));
					if(prestazioni.contains(' Voltura'))
						prestazioni.remove(prestazioni.indexOf(' Voltura'));
					if(prestazioni.contains('Voltura Fusione\\'))
						prestazioni.remove(prestazioni.indexOf('Voltura Fusione\\'));
					if(prestazioni.contains(' Voltura Fusione\\'))
						prestazioni.remove(prestazioni.indexOf(' Voltura Fusione\\'));
					if(prestazioni.contains('Incorporazione'))
						prestazioni.remove(prestazioni.indexOf('Incorporazione'));
					if(prestazioni.contains(' Incorporazione'))
						prestazioni.remove(prestazioni.indexOf(' Incorporazione'));
					if(prestazioni.contains('Voltura Retroattiva'))
						prestazioni.remove(prestazioni.indexOf('Voltura Retroattiva'));
					if(prestazioni.contains(' Voltura Retroattiva'))
						prestazioni.remove(prestazioni.indexOf(' Voltura Retroattiva'));
					if(prestazioni.contains('Voltura Tecnica'))
						prestazioni.remove(prestazioni.indexOf('Voltura Tecnica'));
					if(prestazioni.contains(' Voltura Tecnica'))
						prestazioni.remove(prestazioni.indexOf(' Voltura Tecnica'));
				}
			}
			else{
				if((status =='Attivo' || status =='Sospeso') && accountNameAsset != accountNameOppty){
					prestazioni.add('Voltura Con Switching');
					if(prestazioni.contains('Voltura'))
						prestazioni.remove(prestazioni.indexOf('Voltura'));
					if(prestazioni.contains('Voltura Fusione\\'))
						prestazioni.remove(prestazioni.indexOf('Voltura Fusione\\'));
					if(prestazioni.contains('Incorporazione'))
						prestazioni.remove(prestazioni.indexOf('Incorporazione'));
					if(prestazioni.contains('Voltura Retroattiva'))
						prestazioni.remove(prestazioni.indexOf('Voltura Retroattiva'));
					if(prestazioni.contains(' Voltura'))
						prestazioni.remove(prestazioni.indexOf(' Voltura'));
					if(prestazioni.contains(' Voltura Fusione\\'))
						prestazioni.remove(prestazioni.indexOf(' Voltura Fusione\\'));
					if(prestazioni.contains(' Incorporazione'))
						prestazioni.remove(prestazioni.indexOf(' Incorporazione'));
					if(prestazioni.contains(' Voltura Retroattiva'))
						prestazioni.remove(prestazioni.indexOf(' Voltura Retroattiva'));
					if(prestazioni.contains('Voltura Tecnica'))
						prestazioni.remove(prestazioni.indexOf('Voltura Tecnica'));
					if(prestazioni.contains(' Voltura Tecnica'))
						prestazioni.remove(prestazioni.indexOf(' Voltura Tecnica'));
				}
			}
		}
		if(segment == 'Mass Market'){
			if(accountTypeUscente!=null && 
				((accountTypeEntrante.containsIgnoreCase('organizzazione') && !accountTypeUscente.containsIgnoreCase('organizzazione')) ||
					(accountTypeUscente.containsIgnoreCase('organizzazione') && !accountTypeEntrante.containsIgnoreCase('organizzazione')))){
						if(prestazioni.contains('Voltura Fusione\\'))
							prestazioni.remove(prestazioni.indexOf('Voltura Fusione\\'));
						if(prestazioni.contains('Incorporazione'))
							prestazioni.remove(prestazioni.indexOf(' Incorporazione'));
			}
			if(accountTypeUscente!=null && 
				((accountTypeEntrante.containsIgnoreCase('persona fisica') && !accountTypeUscente.containsIgnoreCase('persona fisica')) ||
					(accountTypeUscente.containsIgnoreCase('persona fisica') && !accountTypeEntrante.containsIgnoreCase('persona fisica')))){
						if(prestazioni.contains('Voltura Successione Mortis Causa'))
							prestazioni.remove(prestazioni.indexOf('Voltura Successione Mortis Causa'));
			}
		}
		System.debug('segment = '+segment);
		System.debug('status2 = '+status);
		if( status=='Cessato'){
			prestazioni.add('Attivazione Tecnica');
		}
		return prestazioni;
	}

	public List<String> manageEleCommodity(List<ServicePoint__c> servicePoints, String pod, String accountCfEntrante, String clientType, String vatNumber, String opportunityId){
		List<ContestablePod__c> podContendibili = new List<ContestablePod__c>();
		List<PODDistributorAlignment__c> pda = new List<PODDistributorAlignment__c>();
		//list<PermissionSetAssignment> prs=[SELECT PermissionSetId FROM PermissionSetAssignment WHERE PermissionSet.Name IN ('CEP_LargeSme_AEMA','CEP_LargeSme_UE','CEP_LeadSmeLarge') AND AssigneeId =: UserInfo.getUserId() limit 1];
        String status = '';
        String accountIdAsset = '';
		String accountCfUscente; 
		String accountTypeUscente;
		String accountTypeEntrante = clientType;
		String segment = '';
		String companyDivisionAsset;
		String accountNameAsset;
		String CorrespondenceCFIncomingOutgoing = 'NO';
		//NTT W3
		String brand;
		//
		List<CEP_StatePerformance__mdt> statePerformances = new List<CEP_StatePerformance__mdt>();
		List<String> prestazioni = new List<String>();
		System.debug('Search in service points...');
		//non sempre, quando viene richiamato questo metodo, si ha l'opportunityId popolato
		//nei casi in cui è null è necessario controllarlo prima di effettuare la query
		//INC0000000057134 --> errore sulla verifica offertabilità
		Opportunity oppty;
		String accountNameOppty;
		String companyDivisionOppty;
		String recordTypeName;
		String opptySegment = '';
		if(!String.isBlank(opportunityId)) {
			oppty = [SELECT Account.Name, Account.JointVenture__r.Name, Account.RecordTypeDeveloperName__c, Segment__c,(select id FROM OpportunityServiceItems__r) FROM Opportunity WHERE Id =: opportunityId];
			accountNameOppty = oppty.Account.Name;
			companyDivisionOppty = oppty.Account.JointVenture__r.Name;
			recordTypeName = oppty.Account.RecordTypeDeveloperName__c;
			if(string.isNotBlank(oppty.Segment__c))opptySegment = oppty.Segment__c;
		}
		// Il sistema cerca il punto sul DB Acea
		if(servicePoints.size()>0){
			accountCfUscente = servicePoints[0].CurrentAsset__r.Account.FiscalCode__c;
			//GIO
			String jointAccountUscente;
			if(!String.isEmpty(servicePoints[0].CurrentAsset__c)){
				String idCompany = servicePoints[0].CurrentAsset__r.Account.JointVenture__c;
				System.debug('*** idCompany: '+idCompany);
				List<CompanyDivision__c> ListJointAccountUscente = [Select id, JointVentureCode__c from CompanyDivision__c where id =: idCompany limit 1];
				if(ListJointAccountUscente.size() > 0){
					jointAccountUscente = ListJointAccountUscente[0].JointVentureCode__c;
				}

			}
			/*
			//gio se reseller ricerca per key__c dell'account sull'asset
			if('Reseller'.equalsIgnoreCase(servicePoints[0].CurrentAsset__r.Account.Segment__c)){
				accountCfUscente = servicePoints[0].CurrentAsset__r.Account.Key__c;
			}
			*/

			String accTypeTmp = servicePoints[0].CurrentAsset__r.Account.Type;
			String recTypeTmp = servicePoints[0].CurrentAsset__r.Account.RecordType.Name;
			accountTypeUscente = accTypeTmp!=null && String.isNotBlank(accTypeTmp) ? accTypeTmp : recTypeTmp;
			//System.debug('service point field BusinessPartnerType__c ' + servicePoints[0].CurrentAsset__r.Account.BusinessPartnerType__c );
			System.debug('Found service point ' + servicePoints[0].Id);
			status = servicePoints[0].CurrentAsset__r.Status;
			accountIdAsset = servicePoints[0].CurrentAsset__r.AccountId;
			segment = servicePoints[0].CurrentAsset__r.Account.Segment__c;
			vatNumberUscente = servicePoints[0].CurrentAsset__r.Account.VATNumber__c; 
			companyDivisionAsset = servicePoints[0].CurrentAsset__r.Account.JointVenture__r.Name;
			accountNameAsset = servicePoints[0].CurrentAsset__r.Account.Name;
			//NTT W3
			brand = ServicePoints[0].CurrentAsset__r.Account.CompanyChannel__c;
			//
			System.debug('Current service point status '+ status);

			// gio
			List<Account> accountEntrante = [SELECT Id, VATNumber__c, FiscalCode__c, JointVenture__r.JointVentureCode__c FROM Account WHERE FiscalCode__c =: accountCfEntrante LIMIT 1];
			String jointAccountEntrante = accountEntrante[0].JointVenture__r.JointVentureCode__c;
			//
			System.debug('*** jointAccountEntrante: '+jointAccountEntrante+' *** jointAccountUscente: '+jointAccountUscente);
			if(!String.isEmpty(jointAccountUscente)){
				CorrespondenceCFIncomingOutgoing = accountCfUscente != null && accountCfEntrante != null  && jointAccountEntrante != null && jointAccountUscente != null
					&&  accountCfEntrante == accountCfUscente && jointAccountEntrante == jointAccountUscente ? 'SI' : 'NO';
			}else{
				CorrespondenceCFIncomingOutgoing = accountCfUscente != null && accountCfEntrante != null &&  accountCfEntrante == accountCfUscente  ? 'SI' : 'NO';
			}
			
			// Se lo trova e lo Stato DB è “Attivo” interroga la tabella per determinare la prestazione
			if(status == 'Attivo'){
				statePerformances = CEP_QR_StatePerformance.getInstance().getByOriginAndStatus('DB Acea',status,'Ele',CorrespondenceCFIncomingOutgoing,clientType);	
					if(statePerformances.size()>0){
						String prestazione = '';
						for(CEP_StatePerformance__mdt stpf : statePerformances){
							prestazione = prestazione + stpf.Performance__c + ',';
						}	
						prestazioni = prestazione.split(',');
					}
					
				String firstToSearch;
				String secondToSearch;
				//accountCfUscente = servicePoints[0].CurrentAsset__r.Account.FiscalCode__c; //ripristino il controllo sul cf uscente invece che sulla key uscente
				if(String.isNotBlank(accountCfEntrante)){
					firstToSearch = accountCfEntrante;
				}else{
					firstToSearch = vatNumber;
				}
				if(String.isNotBlank(accountCfUscente)){
					secondToSearch = accountCfUscente;
				}else{
					secondToSearch = vatNumberUscente;
				} 
				if(firstToSearch == secondToSearch){ // probabile controparte commerciale. Vado a querare gli account
					List<Account> accountList = new List<Account>();
					//List<Account> accountListCF = new List<Account>();
					//gio NON mettere if per fare query sulle key__c perchè serve ad aggiungere solo la prestazione di Switching Win
					//if('Reseller'.equalsIgnoreCase(servicePoints[0].CurrentAsset__r.Account.Segment__c)){
					//	accountListCF = [SELECT Id, VATNumber__c, FiscalCode__c, JointVenture__r.JointVentureCode__c FROM Account WHERE Key__c IN(:accountCfEntrante, :accountCfUscente) LIMIT 2];
					//}else{
						List<Account> accountListCF = [SELECT Id, VATNumber__c, FiscalCode__c, JointVenture__r.JointVentureCode__c FROM Account WHERE FiscalCode__c IN(:firstToSearch, :secondToSearch) OR vatNumber__c IN(:firstToSearch, :secondToSearch) LIMIT 2]; 
					//}

					
					for(Account account : accountListCF){ 
						if(String.isNotBlank(account.FiscalCode__c)){
							accountList.add(account); 
						}else if(String.isNotBlank(account.VATNumber__c)) { 
							accountList.add(account);  
						} 
					}          
					System.debug('accountList = '+accountList);
                    if(!accountList.isEmpty() && accountList.size()>=2 ){
						if((accountList[0]?.JointVenture__r?.JointVentureCode__c != accountList[1]?.JointVenture__r?.JointVentureCode__c) && !prestazioni.contains('Switching Win')){ 
							prestazioni.add('Switching Win'); 
						}
                    }
				}
                System.debug('prestazioni = '+prestazioni);
			} 
			// Altrimenti cerca il punto sulla tabella dei POD Contendibili
			else{
				System.debug('Search in POD CONTENDIBILI');
				podContendibili = CEP_QR_ContestablePod.getInstance().getByPod(pod);
				// Se il punto è trovato
				if(podContendibili.size()>0){
					System.debug('Found POD CONTENDIBILI ' + servicePoints[0].Id);
					status = podContendibili[0].CounterStatus__c;
					System.debug('Current service point status '+ status);
					statePerformances = CEP_QR_StatePerformance.getInstance().getByOriginAndStatus('Pod Contendibili',status,'Ele',clientType);
					//e lo Stato Contendibile è censito in tabella
					if(statePerformances.size()>0){
						// allora il sistema usa questo stato per determinare la prestazione
						String prestazione = '';
						for(CEP_StatePerformance__mdt stpf : statePerformances){
							prestazione = prestazione + stpf.Performance__c + ',';
						}	
						prestazioni = prestazione.split(',');
					}
					// Altrimenti se lo Stato Contendibile non è censito in tabella 
					// possiamo avere 2 situazioni
					else{
						statePerformances = CEP_QR_StatePerformance.getInstance().getByOriginAndStatus('DB Acea',status,'Ele',clientType);
						//  1 - lo Stato DB è censito in tabella
						if(statePerformances.size()>0){
							// allora il sistema usa lo Stato DB per determinare la prestazione	
							String prestazione = '';
							for(CEP_StatePerformance__mdt stpf : statePerformances){
							prestazione = prestazione + stpf.Performance__c + ',';
							}	
							prestazioni = prestazione.split(',');
						}
						// 2 - lo Stato DB non è censito in tabella
						else{
							// allora il sistema fa vedere tutte le prestazioni previste per la commodity ELE
							if(segment != 'Mass Market'){
								prestazioni.add('Switching Win');
								prestazioni.add('Voltura Con Switching');
								prestazioni.add('Attivazione');
								prestazioni.add('Subentro');
							}
							// NOTA : sul documento per ora sono questi
							// inserire nella variabile eventuali altri stati
						}
					}
				}
				// Altrimenti se il punto non è stato trovato nei POD Contendibili
				// possiamo avere 2 situazioni
				else{
					statePerformances = CEP_QR_StatePerformance.getInstance().getByOriginAndStatus('DB Acea',status,'Ele',clientType);	
					// 1 - lo Stato DB è censito in tabella	
					if(statePerformances.size()>0){
						// allora il sistema usa lo Stato DB per determinare la prestazione
						String prestazione = '';
						for(CEP_StatePerformance__mdt stpf : statePerformances){
							prestazione = prestazione + stpf.Performance__c + ',';
						}	
						prestazioni = prestazione.split(',');
					}
					// 2 - lo Stato DB non è censito in tabella
					else{
						System.debug('senza ASSET 512');
						// allora il sistema fa vedere tutte le prestazioni previste per la commodity ELE
						if(segment != 'Mass Market'){
							prestazioni.add('Switching Win');
							prestazioni.add('Voltura Con Switching');
							prestazioni.add('Attivazione');
							prestazioni.add('Subentro');
							prestazioni.add('Attivazione Tecnica');
						}
					}
				}
			}
		}
		// Altrimenti se il punto non è stato trovato sul DB Acea
		// cerca il punto sulla tabella dei POD Contendibili
		else{
				System.debug('POD CONTENDIBILI 526');
				podContendibili = podContendibiliSrv.getByPod(pod);
				// Se il punto è trovato
				if(podContendibili.size()>0){
					status = podContendibili[0].CounterStatus__c;
					statePerformances = CEP_QR_StatePerformance.getInstance().getByOriginAndStatus('Pod Contendibili',status,'Ele',clientType);
					//e lo Stato Contendibile è censito in tabella
					if(statePerformances.size()>0){
						// allora il sistema usa questo stato per determinare la prestazione
						String prestazione = '';
						for(CEP_StatePerformance__mdt stpf : statePerformances){
							prestazione = prestazione + stpf.Performance__c + ',';
						}					
						prestazioni = prestazione.split(',');
					}
					// Altrimenti se lo Stato Contendibile non è censito in tabella 
					else{
						prestazioni.add('Switching Win');
						prestazioni.add('Voltura Con Switching');
						prestazioni.add('Attivazione');
						prestazioni.add('Subentro');
						//prestazioni.add('Voltura');
						// prestazioni.add('Cambio Prodotto'); 
					}
				}
				// Altrimenti se il punto non è stato trovato nemmeno sui POD Contendibili
				else{
					System.debug('553');
					prestazioni.add('Switching Win');
					prestazioni.add('Voltura Con Switching');
					prestazioni.add('Attivazione');
					prestazioni.add('Subentro');
					prestazioni.add('Attivazione Tecnica');
					// prestazioni.add('Voltura Titolo 4');
					// prestazioni.add('Cambio Prodotto'); 
				}
		}
		//if(prs!=null && prs.size()==1){
			//valori gestiti da matrice CEP_StatePerformance__mdt
			//prestazioni.add('Voltura');
			//prestazioni.add('Voltura Successione Mortis Causa');
			//prestazioni.add('Voltura per Incorporazione Societaria');
			//prestazioni.add('Voltura Titolo 4');
			//prestazioni.add('Voltura Retroattiva o di recupero');



		//NTT W3
		//CONTROLLO SUL CANALE DELLO USER
		Id userId = userinfo.getUserId();
		List<User> userInfo = [SELECT DefaultChannel__c, DefaultSubChannel__c FROM User WHERE Id = :userId LIMIT 1];
		if(userInfo.size()>0){
			String canale = userInfo[0].DefaultChannel__c;
			String sottoCanale = userInfo[0].DefaultSubChannel__c;
			System.debug(canale);
			System.debug(sottoCanale);
			System.debug('Controllo 1');
			if (canale == 'Punti fisici' && sottoCanale == 'Store WINDTRE') {
				System.debug('Controllo 2');
				if(prestazioni.contains('Cambio Prodotto') && brand == 'AE'){ 
					System.debug('Controllo 3');
					prestazioni.remove(prestazioni.indexOf('Cambio Prodotto'));
					prestazioni.add('Cambio Prodotto Cross Brand'); 
				}
				if(prestazioni.contains('Cambio Prodotto') && brand == 'W3'){ 
					System.debug('Controllo 4');
					prestazioni.remove(prestazioni.indexOf('Cambio Prodotto'));
					prestazioni.add('Errore'); 
				}
			}
		}

		if((status=='Attivo' || status=='Sospeso') && this.accountId == accountIdAsset){
			if(this.accountId!=null && [Select Segment__c FROM Account WHERE Id =: this.accountId].Segment__c != 'Mass Market'){
				prestazioni.add('Cambio Uso');
			}
		}
		if(segment == 'Mass Market' && clientType == 'Organizzazione'){
			if(prestazioni.contains('Voltura Successione Mortis Causa')){
				prestazioni.remove(prestazioni.indexOf('Voltura Successione Mortis Causa'));
			}
		}
		if(opptySegment != 'Mass Market'){
		//if(segment != 'Mass Market'){
			if(prestazioni.contains('Voltura Successione Mortis Causa'))
				prestazioni.remove(prestazioni.indexOf('Voltura Successione Mortis Causa'));
			if(recordTypeName != 'CEP_RT_Reseller'){
				if((status =='Attivo' || status =='Sospeso') && companyDivisionAsset != companyDivisionOppty){
					prestazioni.add('Voltura Con Switching');
					System.debug('RIMUOVO LA VOLTURA TECNICA');
					if(prestazioni.contains('Voltura'))
						prestazioni.remove(prestazioni.indexOf('Voltura'));
					if(prestazioni.contains('Voltura Fusione\\'))
						prestazioni.remove(prestazioni.indexOf('Voltura Fusione\\'));
					if(prestazioni.contains('Incorporazione'))
						prestazioni.remove(prestazioni.indexOf('Incorporazione'));
					if(prestazioni.contains('Voltura Retroattiva'))
						prestazioni.remove(prestazioni.indexOf('Voltura Retroattiva'));
					if(prestazioni.contains(' Voltura'))
						prestazioni.remove(prestazioni.indexOf(' Voltura'));
					if(prestazioni.contains(' Voltura Fusione\\'))
						prestazioni.remove(prestazioni.indexOf(' Voltura Fusione\\'));
					if(prestazioni.contains(' Incorporazione'))
						prestazioni.remove(prestazioni.indexOf(' Incorporazione'));
					if(prestazioni.contains(' Voltura Retroattiva'))
						prestazioni.remove(prestazioni.indexOf(' Voltura Retroattiva'));
					if(prestazioni.contains('Voltura Tecnica'))
						prestazioni.remove(prestazioni.indexOf('Voltura Tecnica'));
					if(prestazioni.contains(' Voltura Tecnica'))
						prestazioni.remove(prestazioni.indexOf(' Voltura Tecnica'));
				}
			}
			else{
				if((status =='Attivo' || status =='Sospeso') && accountNameAsset != accountNameOppty){
					prestazioni.add('Voltura Con Switching');
					if(prestazioni.contains('Voltura'))
						prestazioni.remove(prestazioni.indexOf('Voltura'));
					if(prestazioni.contains('Voltura Fusione\\'))
						prestazioni.remove(prestazioni.indexOf('Voltura Fusione\\'));
					if(prestazioni.contains('Incorporazione'))
						prestazioni.remove(prestazioni.indexOf('Incorporazione'));
					if(prestazioni.contains('Voltura Retroattiva'))
						prestazioni.remove(prestazioni.indexOf('Voltura Retroattiva'));
					if(prestazioni.contains(' Voltura'))
						prestazioni.remove(prestazioni.indexOf(' Voltura'));
					if(prestazioni.contains(' Voltura Fusione\\'))
						prestazioni.remove(prestazioni.indexOf(' Voltura Fusione\\'));
					if(prestazioni.contains(' Incorporazione'))
						prestazioni.remove(prestazioni.indexOf(' Incorporazione'));
					if(prestazioni.contains(' Voltura Retroattiva'))
						prestazioni.remove(prestazioni.indexOf(' Voltura Retroattiva'));
					if(prestazioni.contains('Voltura Tecnica'))
						prestazioni.remove(prestazioni.indexOf('Voltura Tecnica'));
					if(prestazioni.contains(' Voltura Tecnica'))
						prestazioni.remove(prestazioni.indexOf(' Voltura Tecnica'));
				}
			}
		}
		if(segment == 'Mass Market'){
			if(accountTypeUscente!=null && 
				((accountTypeEntrante.containsIgnoreCase('organizzazione') && !accountTypeUscente.containsIgnoreCase('organizzazione')) ||
					(accountTypeUscente.containsIgnoreCase('organizzazione') && !accountTypeEntrante.containsIgnoreCase('organizzazione')))){
						if(prestazioni.contains('Voltura Fusione\\'))
							prestazioni.remove(prestazioni.indexOf('Voltura Fusione\\'));
						if(prestazioni.contains('Incorporazione'))
							prestazioni.remove(prestazioni.indexOf(' Incorporazione'));
			}
			if(accountTypeUscente!=null && 
				((accountTypeEntrante.containsIgnoreCase('persona fisica') && !accountTypeUscente.containsIgnoreCase('persona fisica')) ||
					(accountTypeUscente.containsIgnoreCase('persona fisica') && !accountTypeEntrante.containsIgnoreCase('persona fisica')))){
						if(prestazioni.contains('Voltura Successione Mortis Causa'))
							prestazioni.remove(prestazioni.indexOf('Voltura Successione Mortis Causa'));
			}
		}

		System.debug('segment = '+segment);
		System.debug('status = '+status);
		if(status=='Cessato'){
			prestazioni.add('Attivazione Tecnica');
		}
		// rimuovo la Voltura Tecnica se ci sono altre osi di qualsiasi altro tipo
		if(oppty!= null && !oppty.OpportunityServiceItems__r.isEmpty() && segment == 'Mass Market'){
					if(prestazioni.contains('Voltura Tecnica'))
						prestazioni.remove(prestazioni.indexOf('Voltura Tecnica'));
					if(prestazioni.contains(' Voltura Tecnica'))
						prestazioni.remove(prestazioni.indexOf(' Voltura Tecnica'));
		}

	

		

			List<PermissionSetAssignment> prs=[SELECT PermissionSetId FROM PermissionSetAssignment WHERE PermissionSet.Name = 'CEP_CanViewVolturaTecnica'  AND AssigneeId = :userId  limit 1];
			if(prs.size() == 0){
				if(prestazioni.contains('Voltura Tecnica'))
					prestazioni.remove(prestazioni.indexOf('Voltura Tecnica'));
			}

		

		

		if(segment == 'Reseller' && prestazioni.contains('Voltura Tecnica')){
			prestazioni.remove(prestazioni.indexOf('Voltura Tecnica'));
		}
		

		return prestazioni;
	}

	@TestVisible
	private List<String> filterPerformanceValuesForWave1(List<String> input, String commodity){
		List<String> output = new List<String>();
		if(commodity=='Electric'){
			for(String s : input){
				if(Constants.getAllConstants().PERFORMANCE_ELE_WAVE_1.contains(s)){
					output.add(s);
				}
			}
		}
		if(commodity=='Gas'){
			for(String s : input){
				if(Constants.getAllConstants().PERFORMANCE_GAS_WAVE_1.contains(s)){
					output.add(s);
				}
			}
		}
		return output;
	}

/*
	@TestVisible
	private List<String> addPrestazioniPermissionSet(List<String> prestazioni){
		List<PermissionSetAssignment> prs=[SELECT PermissionSetId FROM PermissionSetAssignment WHERE PermissionSet.Name = 'CEP_LargeUsers'  AND AssigneeId = :UserInfo.getUserId() limit 1];
		if(prs!=null && prs.size()==1){
			prestazioni.add('Voltura Ordinaria');
			prestazioni.add('Voltura Mortis causa');
			prestazioni.add('Voltura per Incorporazione Societaria');
			prestazioni.add('Voltura Titolo IV');
			prestazioni.add('Voltura Retroattiva o di recupero');
		}
		return prestazioni;
	}*/
}