function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Rafael.Martins.SantosRafael.Martins.Santos 

Get parents Id's using Nested SOQL in child object.

Hi
I have a child object classed OpportunityItem__c that the parent is Opportunity, and in the OpportunityItem__ I have a relationship field that get the Id from an Object called Goal__c.

In the OpportunityItem__c I have a trigger, in these trigger I have to get the Opportunity Id and get the Goal Id too.

My code is like this:

for(OpportunityItem__c item : trigger.new)
{
opportunityId = item.OpportunityId; //(relationship field Name in OpportunityItem__c)
year = item.CloseDate__c;
}
  list<Goal__c> goalsList = [SELECT Id, Year__c FROM Goal__c WHERE Year__c =: year];
  list<Opportunity> opportunities = [SELECT Id, Name FROM Opportunity WHERE Id=: opportunityId ];

Until here ok.
But When I test, both list get a exception of SOQL Limit 101.
I want some manner to get the data of Goal and Opportunity that have relationship with the current item that fire a trigger.

Someone knows how I do that?

Best Regards
Rafael
Paul S.Paul S.
Can you post the full trigger?
Damon ShawDamon Shaw
Hi Rafael,

I think you should provide more of your trigger's code to better see what is going wrong, from what you've provided the trigger will loop over all of the OpportunityItem__c records in the trigger updating your opportunityId and year variables, then it will make 2 queries, and then end.

You also said in your first sentance, you have a relationship field on OpportunityItem__c to the Goal__c object however you are trying to use the Year to find the Goal__c record rather than the Id that would be available from the lookup field, you are also trying to use item.OpportunityId, this is an unexpected field name on a custom object it should be something like OpportunityId__c or Opportunity_Id__c?
Rafael.Martins.SantosRafael.Martins.Santos
I'm tryng sent the code for you but occurs an error 503 in the page of the community.
There is another way to ai attach an file?
Rafael.Martins.SantosRafael.Martins.Santos
This is a part of the code
 
trigger Item_Oportunidade_Trigger on Item_da_oportunidade__c (after insert, after update, before insert, before update) {
    Date data = Date.newInstance(2016, 06, 01);
    Date data_fechamento;
    String nome_oportunidade;
    String fase;
    String opportunityId;
    String numero_proposta;
    String id_proprietario;
    String id_conta;
    String user_name;
    String userId;
    String account_name;
    String account_city;
    String regional;
    String itemMetaVendedorId;
    String itemMetaArquiteto;
    String itemMetaDiretor;
    String id_oportunidade_item;
    String lider_imediato;
    String arquitetoId;
    String opportunityIdMeta;
    Decimal bonusMVS = 0;
    Decimal probabilidade;
    Integer ano = 0;
    Boolean b = Boolean.valueOf(false);
    Boolean b1 = Boolean.valueOf(false);
    Boolean b2 = Boolean.valueOf(false);
    LIST<Metas__c> atualizarMetasVendedor = new LIST<Metas__c>();
    LIST<Metas__c> criarMetasArquiteto = new LIST<Metas__c>();
    LIST<Metas__c> atualizarMetasArquiteto = new LIST<Metas__c>();
    LIST<Metas__c> atualizarMetasDiretor = new LIST<Metas__c>();
    SET<String> idsArquitetos = new SET<String>();
    SET<String> listaMetasArquitetosItem = new SET<String>();
    SET<Metas__c> atualizarListaVendedor = new SET<Metas__c>();
    SET<Metas__c> atualizarListaArquitetos = new SET<Metas__c>();
    SET<Metas__c> atualizarListaDiretor = new SET<Metas__c>();
//--------------------------------------------------------- INIT OPPORTUNITY ITEM ---------------------
    for(item_da_Oportunidade__c itens : trigger.new){
        id_oportunidade_item = itens.Oportunidade__c;
        ano = itens.Data_de_Fechamento_Item__c.year();
    }
// ------------------------------------------------------ METAS__C AND OPPORTUNITY OCCURS THE SOQL LIMIT
    list<Metas__c> metas = [SELECT Id, Name, Ano__c, OwnerId FROM Metas__c WHERE Ano__c =: ano];
    list<Opportunity> listaOportunidade = [SELECT Id, Name, Proposal_Number__c, StageName, OwnerId, AccountId, Regional__c, Probability, CloseDate FROM Opportunity WHERE Id =: id_oportunidade_item];
//----------------------------------------------------------------------------------------------------------------------------------------

    list<Account> accounts = [SELECT Id, Name, BillingCity, Regional__c FROM Account limit 4000];
       list<User> users = [SELECT Id, Name, L_der_Imediato__c, ContactId FROM User limit 1000];

//---------------------------------------------------------- ESSA PARTE É EXECUTADA DEPOIS DE SER CRIADA OU ATUALIZADA -----------------------------------------------

    if(trigger.isAfter){//------------------------------------------------ INICIO AFTER --------------------------------------------------------------------
    
        // ESTA CONDICAO FAZ COM QUE OS DADOS ABAIXO SEJAM EXECUTADOS APENAS 1 VEZ, EVITANDO LOOPING INFINITO
        if(verificaRecursividade_Criar_ServiceNow.runOnce()){
            //TRIGGER SERÁ EXECUTADA DEPOIS QUE O REGISTRO FOR CRIADO. (AFTER INSERT)
            if(trigger.isInsert){
                //Pega os dados do item atual, no qual esta sendo executado.
                for(Item_da_oportunidade__c item : trigger.new){
                    //Pega os dados do objeto oportunidade
                    for(Opportunity op : listaOportunidade){
                        if(item.Oportunidade__c == op.Id){
                            nome_oportunidade = op.Name;
                            fase = op.StageName;
                            opportunityId = op.Id;
                            numero_proposta = op.Proposal_Number__c;
                            probabilidade = op.Probability;
                            id_proprietario = op.OwnerId;
                            data_fechamento = op.CloseDate;
                            id_conta = op.AccountId;
                            ano = op.CloseDate.year();
                        }
                    }
                    
                    //Pega os dados do objeto User
                    for(User user : users){
                        if(id_proprietario == user.Id){
                            user_name = user.Name;
                        }
                        if(arquitetoId == user.ContactId){
                            userId = user.Id;
                        }
                        if(id_proprietario == user.Id && user.L_der_Imediato__c != null){
                            lider_imediato = user.L_der_Imediato__c;
                        }
                    }
                    //Pega os dados do objeto Conta
                    for(Account acc : accounts){
                        if(id_conta == acc.Id){
                            account_name = acc.Name;
                            account_city = acc.BillingCity;
                            regional = acc.Regional__c;
                        }
                    }
                    
                    //--------------------------------------------------------------
                    if(item.Arquitetos__c != null){
                        arquitetoId = item.Arquitetos__c;
                    }
                    if(item.Meta_Arquiteto__c != null){
                        itemMetaArquiteto = item.Meta_Arquiteto__c;
                    }
                    if(item.Meta_Vendedor__c != null){
                        itemMetaVendedorId = item.Meta_Vendedor__c;
                    }
                    if(item.Meta_Diretor__c != null){
                        itemMetaDiretor = item.Meta_Diretor__c;
                    }
                    if(item.Meta_Arquiteto__c != null){
                        listaMetasArquitetosItem.add(item.Meta_Arquiteto__c);
                    }
                    //--------------------------------------------------------------
                    for(Metas__c meta : metas){
                        if(meta.Id == itemMetaVendedorId && itemMetaVendedorId != null){
                            if(id_proprietario != null || id_proprietario != ''){
                               b = Boolean.valueOf(true);
                               atualizarMetasVendedor.add(meta);
                            }
                        }
                        for(String metasArquiteto : listaMetasArquitetosItem){
                            if(metasArquiteto == meta.Id){
                                atualizarMetasArquiteto.add(meta);
                            }
                        }
                        if(meta.Id == itemMetaDiretor){
                            if(lider_imediato != null || lider_imediato!= ''){
                                b2 = Boolean.valueOf(true);
                                atualizarMetasDiretor.add(meta);
                            }
                        }
                    }
                    if(atualizarMetasArquiteto.isEmpty() == false){
                        b1 = Boolean.valueOf(true);
                    }
                    //Caso seja verdadeiro irá atualizar as metas dos vendedores
                    if(b == true){
                        update atualizarMetasVendedor;
                    }
                    //Caso seja verdadeiro irá atualizar as metas dos arquitetos
                    if(b1 == true){
                        update atualizarMetasArquiteto;
                    }
                    //Caso seja verdadeiro irá atualizar as metas dos Diretor
                    if(b2 == true){
                        update atualizarMetasDiretor;
                    }
                    
//---------------------------------------- A PARTE DEBAIXO ESTA FOCADA NAS INTEGRAÇÕES ENTRE SALESFORCE E SERVICENOW ------------------------------------------------
                    
                    //FATURAMENTO DO PROJETO
                    //INICIO CRIAR FATURAMENTO DO PROJETO NO SERVICENOW
                    if(fase == 'Fechado e ganho' && data_fechamento > data){
                        if(item.Categoria__c == 'IT SERVICES'){
                            ServiceNow_CriarFaturamentoProjeto.criarItemNovo(numero_proposta, item.Id);
                        }
                    }
                     // FIM DA CRIAÇÃO DO FATURAMENTO DO PROJETO NO SERVICENOW  
                     
                        //ITEM DA OPORTUNIDADE FORECAST
                        //INICIO CRIAR ITEM DA OPORTUNIDADE (TABELA FORECAST) NO SERVICENOW
                        if(item.Categoria__c == 'IT SERVICES' || item.Categoria__c == 'MANAGED SERVICES'){
                            if(probabilidade >= 50 && probabilidade <100){
                                if(fase != 'Inicial' || fase != 'Validado' || fase != 'Projeto Técnico' || fase != 'Fechado e ganho'){
                                    String criar_item_oportunidade = '{\n\"u_crm\":\"'+numero_proposta+'\",'+
                                                                     '\"short_description\":\"'+ nome_oportunidade +'\",' +
                                                                     '\"u_account\":\"'+account_name+'\",'+
                                                                     '\"u_status\":\"Não Planejado\",'+
                                                                     '\"stage\":\"'+fase+'\",'+
                                                                     '\"close_date\":\"'+data_fechamento+'\",'+
                                                                     '\"type\":\"'+item.Sale_Type__c+'\",'+
                                                                     '\"u_city\":\"'+account_city+'\",'+
                                                                     '\"u_opportunity_item\":\"'+item.Name+'\",'+
                                                                     '\"u_proposal_creation_date\":\"'+item.CreatedDate+'\",'+
                                                                     '\"probability\":\"'+probabilidade+'\",'+
                                                                     '\"u_item_category\":\"'+item.Categoria__c+'\",'+
                                                                     '\"u_architect\":\"'+item.Arquiteto__c+'\",'+
                                                                     '\"u_update_date\":\"'+item.LastModifiedDate+'\",'+
                                                                     '\"u_regional\":\"'+regional+'\",'+
                                                                     '\"u_account_manager\":\"'+user_name+'\"}';
        
                                    //Executa classe e método de criação de oportunidade no ServiceNow.
                                    ServiceNow_ItemOportunidadeForecast.executarOportunidade(item.Name, numero_proposta, criar_item_oportunidade);
                                }
                            }
                        }
                        //FIM DA CRIAÇÃO DO ITEM DA OPORTUNIDADE (TABELA FORECAST) NO SERVICENOW
                              
                        //FATURAMENTO DO CONTRATO      
                        //INICIO CRIAR FATURAMENTO DO CONTRATO NO SERVICENOW
                        if(fase == 'Fechado e ganho' && data_fechamento > data ){
                            if(item.Categoria__c == 'MANAGED SERVICES'){
                                if(item.Familia_de_Produto__c != 'MS - Body Shop'){
                                    //Converte mes e ano para String
                                    Date data = data_fechamento;
                                    Integer mes1 = data.month();
                                    Integer ano1 = data.year();
                                    String mes = String.valueOf(mes1);
                                    String ano = String.valueOf(ano1);
                                    ServiceNow_CriarFaturamentoContrato.criarItemNovo(numero_proposta, item.Id, mes, ano);
                                }
                            }
                        }// FIM DA CRIAÇÃO DO FATURAMENTO DO CONTRATO NO SERVICENOW
                }
            }
        }

 
Paul S.Paul S.
Line 59 opens up a for loop inside which (lines 137, 141, 145) you're performing DML updates on three sets.  You should be performing the update call outside of the for loop.  Otherwise, you're just updating the set each time through the loop.
Rafael.Martins.SantosRafael.Martins.Santos
Hi Paul,
Now I'm facing the SOQL Limit on the line 043.
There is some way to I attach my entire code here?
 
Paul S.Paul S.
You should be able to post it as you had above?  (Using the "< >" icon.)  If it's too much to past into one window, try seperate windows or posts to the board.  
Rafael.Martins.SantosRafael.Martins.Santos
When I post my code here, occurs an error of 503 of this page.
I will try post again
Rafael.Martins.SantosRafael.Martins.Santos
/**Essa trigger executa Calculos e métodos de integração
 * Calcula Margem, MVS e Comissões
 * Calcula campos valor de venda em dolares, valor de compra em dolares.
 * ServiceNow_CriarFaturamentoProjeto.criarItemNovo
 * ServiceNow_ItemOportunidadeForecast.executarOportunidade
 * ServiceNow_CriarFaturamentoContrato.criarItemNovo
*/
trigger Item_Oportunidade_Trigger on Item_da_oportunidade__c (after insert, after update, before insert, before update) {
	Date data = Date.newInstance(2016, 06, 01);
	Date data_fechamento;
	String nome_oportunidade;
	String fase;
	String opportunityId;
	String numero_proposta;
	String id_proprietario;
	String id_conta;
	String user_name;
	String userId;
	String account_name;
	String account_city;
	String regional;
	String itemMetaVendedorId;
    String itemMetaArquiteto;
    String itemMetaDiretor;
    String id_oportunidade_item;
	String lider_imediato;
	String arquitetoId;
    String opportunityIdMeta;
	Decimal bonusMVS = 0;
	Decimal probabilidade;
	Integer ano = 0;
    Boolean b = Boolean.valueOf(false);
    Boolean b1 = Boolean.valueOf(false);
    Boolean b2 = Boolean.valueOf(false);
    LIST<Metas__c> atualizarMetasVendedor = new LIST<Metas__c>();
    LIST<Metas__c> criarMetasArquiteto = new LIST<Metas__c>();
    LIST<Metas__c> atualizarMetasArquiteto = new LIST<Metas__c>();
    LIST<Metas__c> atualizarMetasDiretor = new LIST<Metas__c>();
    SET<String> idsArquitetos = new SET<String>();
	SET<String> listaMetasArquitetosItem = new SET<String>();
    SET<Metas__c> atualizarListaArquitetos = new SET<Metas__c>();
    

    
    for(item_da_Oportunidade__c itens : trigger.new){
        id_oportunidade_item = itens.Oportunidade__c;
		ano = itens.Data_de_Fechamento_Item__c.year();
    }
	list<Metas__c> metas = [SELECT Id, Name, Ano__c, OwnerId FROM Metas__c WHERE Ano__c =: ano];
	list<Opportunity> listaOportunidade = [SELECT Id, Name, Proposal_Number__c, StageName, OwnerId, AccountId, Regional__c, Probability, CloseDate FROM Opportunity WHERE Id =: id_oportunidade_item];
	list<Account> accounts = [SELECT Id, Name, BillingCity, Regional__c FROM Account limit 4000];
   	list<User> users = [SELECT Id, Name, L_der_Imediato__c, ContactId FROM User limit 1000];

//---------------------------------------------------------- ESSA PARTE É EXECUTADA DEPOIS DE SER CRIADA OU ATUALIZADA -----------------------------------------------

    if(trigger.isAfter){//------------------------------------------------ INICIO AFTER --------------------------------------------------------------------
	
		// ESTA CONDICAO FAZ COM QUE OS DADOS ABAIXO SEJAM EXECUTADOS APENAS 1 VEZ, EVITANDO LOOPING INFINITO
        if(verificaRecursividade_Criar_ServiceNow.runOnce()){
			//TRIGGER SERÁ EXECUTADA DEPOIS QUE O REGISTRO FOR CRIADO. (AFTER INSERT)
            if(trigger.isInsert){
				//Pega os dados do item atual, no qual esta sendo executado.
                for(Item_da_oportunidade__c item : trigger.new){
					//Pega os dados do objeto oportunidade
					for(Opportunity op : listaOportunidade){
                        if(item.Oportunidade__c == op.Id){
                            nome_oportunidade = op.Name;
                            fase = op.StageName;
                            opportunityId = op.Id;
                            numero_proposta = op.Proposal_Number__c;
                            probabilidade = op.Probability;
                            id_proprietario = op.OwnerId;
                            data_fechamento = op.CloseDate;
                            id_conta = op.AccountId;
							ano = op.CloseDate.year();
                        }
					}
					
					//Pega os dados do objeto User
					for(User user : users){
                        if(id_proprietario == user.Id){
                            user_name = user.Name;
                        }
						if(arquitetoId == user.ContactId){
							userId = user.Id;
						}
						if(id_proprietario == user.Id && user.L_der_Imediato__c != null){
							lider_imediato = user.L_der_Imediato__c;
						}
					}
					//Pega os dados do objeto Conta
					for(Account acc : accounts){
                        if(id_conta == acc.Id){
                            account_name = acc.Name;
                            account_city = acc.BillingCity;
                            regional = acc.Regional__c;
                        }
					}
					
					//--------------------------------------------------------------
					if(item.Arquitetos__c != null){
						arquitetoId = item.Arquitetos__c;
					}
					if(item.Meta_Arquiteto__c != null){
						itemMetaArquiteto = item.Meta_Arquiteto__c;
					}
					if(item.Meta_Vendedor__c != null){
						itemMetaVendedorId = item.Meta_Vendedor__c;
					}
					if(item.Meta_Diretor__c != null){
						itemMetaDiretor = item.Meta_Diretor__c;
					}
					if(item.Meta_Arquiteto__c != null){
						listaMetasArquitetosItem.add(item.Meta_Arquiteto__c);
					}
					//--------------------------------------------------------------
					for(Metas__c meta : metas){
						if(meta.Id == itemMetaVendedorId && itemMetaVendedorId != null){
							if(id_proprietario != null || id_proprietario != ''){
							   b = Boolean.valueOf(true);
							   atualizarMetasVendedor.add(meta);
							}
						}
						for(String metasArquiteto : listaMetasArquitetosItem){
							if(metasArquiteto == meta.Id){
								atualizarMetasArquiteto.add(meta);
							}
						}
						if(meta.Id == itemMetaDiretor){
							if(lider_imediato != null || lider_imediato!= ''){
								b2 = Boolean.valueOf(true);
								atualizarMetasDiretor.add(meta);
							}
						}
					}
					if(atualizarMetasArquiteto.isEmpty() == false){
						b1 = Boolean.valueOf(true);
					}
                    
//---------------------------------------- A PARTE DEBAIXO ESTA FOCADA NAS INTEGRAÇÕES ENTRE SALESFORCE E SERVICENOW ------------------------------------------------
					
					//FATURAMENTO DO PROJETO
                    //INICIO CRIAR FATURAMENTO DO PROJETO NO SERVICENOW
                    if(fase == 'Fechado e ganho' && data_fechamento > data){
                        if(item.Categoria__c == 'IT SERVICES'){
                            ServiceNow_CriarFaturamentoProjeto.criarItemNovo(numero_proposta, item.Id);
                        }
                    }
                     // FIM DA CRIAÇÃO DO FATURAMENTO DO PROJETO NO SERVICENOW  
					 
						//ITEM DA OPORTUNIDADE FORECAST
                        //INICIO CRIAR ITEM DA OPORTUNIDADE (TABELA FORECAST) NO SERVICENOW
                        if(item.Categoria__c == 'IT SERVICES' || item.Categoria__c == 'MANAGED SERVICES'){
                            if(probabilidade >= 50 && probabilidade <100){
                                if(fase != 'Inicial' || fase != 'Validado' || fase != 'Projeto Técnico' || fase != 'Fechado e ganho'){
                                    String criar_item_oportunidade = '{\n\"u_crm\":\"'+numero_proposta+'\",'+
																	 '\"short_description\":\"'+ nome_oportunidade +'\",' +
																	 '\"u_account\":\"'+account_name+'\",'+
																	 '\"u_status\":\"Não Planejado\",'+
																	 '\"stage\":\"'+fase+'\",'+
																	 '\"close_date\":\"'+data_fechamento+'\",'+
																	 '\"type\":\"'+item.Sale_Type__c+'\",'+
																	 '\"u_city\":\"'+account_city+'\",'+
																	 '\"u_opportunity_item\":\"'+item.Name+'\",'+
																	 '\"u_proposal_creation_date\":\"'+item.CreatedDate+'\",'+
																	 '\"probability\":\"'+probabilidade+'\",'+
																	 '\"u_item_category\":\"'+item.Categoria__c+'\",'+
																	 '\"u_architect\":\"'+item.Arquiteto__c+'\",'+
																	 '\"u_update_date\":\"'+item.LastModifiedDate+'\",'+
																	 '\"u_regional\":\"'+regional+'\",'+
																	 '\"u_account_manager\":\"'+user_name+'\"}';
        
                                    //Executa classe e método de criação de oportunidade no ServiceNow.
                                    ServiceNow_ItemOportunidadeForecast.executarOportunidade(item.Name, numero_proposta, criar_item_oportunidade);
                                }
                            }
                        }
                        //FIM DA CRIAÇÃO DO ITEM DA OPORTUNIDADE (TABELA FORECAST) NO SERVICENOW
						      
						//FATURAMENTO DO CONTRATO	  
						//INICIO CRIAR FATURAMENTO DO CONTRATO NO SERVICENOW
                        if(fase == 'Fechado e ganho' && data_fechamento > data ){
                            if(item.Categoria__c == 'MANAGED SERVICES'){
                                if(item.Familia_de_Produto__c != 'MS - Body Shop'){
									//Converte mes e ano para String
                                    Date data = data_fechamento;
                                    Integer mes1 = data.month();
                                    Integer ano1 = data.year();
                                    String mes = String.valueOf(mes1);
                                    String ano = String.valueOf(ano1);
                
                                    ServiceNow_CriarFaturamentoContrato.criarItemNovo(numero_proposta, item.Id, mes, ano);
                                }
                            }
                        }// FIM DA CRIAÇÃO DO FATURAMENTO DO CONTRATO NO SERVICENOW
                }
				//Caso seja verdadeiro irá atualizar as metas dos vendedores
				if(b == true){
					update atualizarMetasVendedor;
				}
					//Caso seja verdadeiro irá atualizar as metas dos arquitetos
				if(b1 == true){
					update atualizarMetasArquiteto;
				}
					//Caso seja verdadeiro irá atualizar as metas dos Diretor
				if(b2 == true){
					update atualizarMetasDiretor;
				}
            }
        }
       
//---------------------------------------------------------- A PARTE ABAIXO SERÁ EXECUTADA DEPOIS QUE O ITEM FOR ATUALIZADO --------------------------------------------------------
	   
        if(trigger.isUpdate){
            b = Boolean.valueOf(false);
            b1 = Boolean.valueOf(false);
            b2 = Boolean.valueOf(false);
            
			for(Item_da_oportunidade__c item : trigger.new){
				//Pega os dados do objeto oportunidade
				for(Opportunity op : listaOportunidade){
                    if(item.Oportunidade__c == op.Id){
                        nome_oportunidade = op.Name;
                        fase = op.StageName;
                        opportunityId = op.Id;
                        numero_proposta = op.Proposal_Number__c;
                        probabilidade = op.Probability;
                        id_proprietario = op.OwnerId;
                        data_fechamento = op.CloseDate;
                        id_conta = op.AccountId;
                    }
				}
					//Pega os dados do objeto User
					for(User user : users){
                        if(id_proprietario == user.Id){
                            user_name = user.Name;
                        }
						if(arquitetoId == user.ContactId){
							userId = user.Id;
						}
						if(id_proprietario == user.Id && user.L_der_Imediato__c != null){
                         lider_imediato = user.L_der_Imediato__c;
						}
					}
					//Pega os dados do objeto Conta
					for(Account acc : accounts){
                        if(id_conta == acc.Id){
                            account_name = acc.Name;
                            account_city = acc.BillingCity;
                            regional = acc.Regional__c;
                        }
					}
					
//-------------------------------------------------------------- INICIO CRIAÇÃO E RELACIONAMENTO DE METAS ----------------------------------------------------------
					if(item.Arquitetos__c != null){
						arquitetoId = item.Arquitetos__c;
					}
					if(item.Meta_Arquiteto__c != null){
						itemMetaArquiteto = item.Meta_Arquiteto__c;
					}
					if(item.Meta_Vendedor__c != null){
                        System.debug('Entrou no if item.Meta_Vendedor__c: '+item.Meta_Vendedor__c);
						itemMetaVendedorId = item.Meta_Vendedor__c;
					}
					if(item.Meta_Diretor__c != null){
						itemMetaDiretor = item.Meta_Diretor__c;
					}
                System.debug('listaMetasArquitetosItem '+listaMetasArquitetosItem);
					if(itemMetaArquiteto != null){
                        System.debug('Entrou no if de meta arquiteto: '+item.Meta_Arquiteto__c);
						listaMetasArquitetosItem.add(item.Meta_Arquiteto__c);
                        System.debug('Lista de listaMetasArquitetosItem '+listaMetasArquitetosItem);
					}
					
					for(Metas__c meta : metas){
                        System.debug('itemMetaVendedorId: '+itemMetaVendedorId +', meta.Id '+meta.Id);
                        if(itemMetaVendedorId != null){
                            System.debug('Entrou aqui '+ itemMetaVendedorId +' não é nulo e nem vazio');
                            if(meta.Id == itemMetaVendedorId){
                                System.debug('meta.Id == itemMetaVendedorId '+ meta.Id +', '+ itemMetaVendedorId);
                                if(id_proprietario != null || id_proprietario != ''){
                                   b = Boolean.valueOf(true);
                                   atualizarMetasVendedor.add(meta);
                                }
							}
                        }
						for(String metasArquiteto : listaMetasArquitetosItem){
							if(metasArquiteto == meta.Id){
								atualizarListaArquitetos.add(meta);
                                System.debug('atualizarListaArquitetos '+atualizarListaArquitetos);
							}
						}
						if(meta.Id == itemMetaDiretor){
							if(lider_imediato != null || lider_imediato!= ''){
								b2 = Boolean.valueOf(true);
								atualizarMetasDiretor.add(meta);
							}
						}
					}
					
//-------------------------------------------------------------- FIM CRIAÇÃO E RELACIONAMENTO DE METAS -------------------------------------------------------					


//---------------------------------------- A PARTE DEBAIXO ESTA FOCADA NAS INTEGRAÇÕES ENTRE SALESFORCE E SERVICENOW ----------------------------------------------					

					//FATURAMENTO DO PROJETO
                    //INICIO CRIAR FATURAMENTO DO PROJETO NO SERVICENOW
                    if(item.Categoria__c == 'IT SERVICES' && data_fechamento > data){
                        ServiceNow_AtualizaFaturamentoProjeto.buscaFaturamento(item.Name, Item.Id, numero_proposta, opportunityId);
                    }
					// FIM DA CRIAÇÃO DO FATURAMENTO DO PROJETO NO SERVICENOW
					
					//ITEM DA OPORTUNIDADE FORECAST
                    //INICIO CRIAR ITEM DA OPORTUNIDADE (TABELA FORECAST) NO SERVICENOW
                    if(item.Categoria__c == 'IT SERVICES' || item.Categoria__c == 'MANAGED SERVICES'){
                        if(probabilidade >= 50 && data_fechamento > data || probabilidade == 0 && data_fechamento > data){
                            if(fase != 'Inicial' || fase != 'Validado' || fase != 'Projeto Técnico'){
                                //---------------- CRIAR = armazena os dados em formato json -----------------------
                                String criar = '{\n\"u_crm\":\"'+numero_proposta+'\",'+
                                        		'\"short_description\":\"'+ nome_oportunidade +'\",' +
                                            	'\"u_opportunity_item\":\"'+item.Name+'\",'+
                                            	'\"u_account\":\"'+account_name+'\",'+
                                            	'\"stage\":\"'+fase+'\",'+
                                            	'\"close_date\":\"'+data_fechamento+'\",'+
                                            	'\"type\":\"'+item.Sale_Type__c+'\",'+
                                            	'\"u_city\":\"'+account_city+'\",'+
                                            	'\"u_proposal_creation_date\":\"'+item.CreatedDate+'\",'+
                                            	'\"probability\":\"'+probabilidade+'\",'+
                                            	'\"u_item_category\":\"'+item.Categoria__c+'\",'+
                                            	'\"u_architect\":\"'+item.Arquiteto__c+'\",'+
                                            	'\"u_update_date\":\"'+item.LastModifiedDate+'\",'+
                                            	'\"u_regional\":\"'+regional+'\",'+
                                            	'\"u_account_manager\":\"'+user_name+'\"}';
        
                               //-------- Executa classe e método de atualização ou criação de oportunidade no ServiceNow -----
                               ServiceNow_AtualizaOportunidadeForecast.executarAtualizaOportunidade(item.Name, numero_proposta, criar, fase);
                            }
                        }
                    }//FIM DA CRIAÇÃO DO ITEM DA OPORTUNIDADE (TABELA FORECAST) NO SERVICENOW
						
                    //FATURAMENTO DO CONTRATO	  
					//INICIO CRIAR FATURAMENTO DO CONTRATO NO SERVICENOW
                if(fase == 'Fechado e ganho' && data_fechamento > data){
                    if(item.Categoria__c == 'MANAGED SERVICES'){
                        if(item.Familia_de_Produto__c != 'MS - Body Shop'){
                           Date data = data_fechamento;
                           Integer mes1 = data.month();
                           Integer ano1 = data.year();
                           String mes = String.valueOf(mes1);
                           String ano = String.valueOf(ano1);
                           ServiceNow_AtualizaFaturamentoContrato.buscaFaturamento(item.Name, item.Id, numero_proposta, opportunityId, mes, ano);
                        }
                    }
                }// FIM DA CRIAÇÃO DO FATURAMENTO DO CONTRATO NO SERVICENOW
			}//-------------------------------------- FIM DAS INTEGRAÇÕES ENTRE SALESFORCE E SERVICENOW -------------------------------
			
			//--------------------------------------- ATUALIZAR METAS -----------------------------------------------------------------
			if(atualizarListaArquitetos.isEmpty() == false){
				b1 = Boolean.valueOf(true);
			}
			//Caso seja verdadeiro irá atualizar as metas dos vendedores
			if(b == true){
				update atualizarMetasVendedor;
			}
			//Caso seja verdadeiro irá atualizar as metas dos arquitetos
			if(b1 == true){
                atualizarMetasArquiteto.addAll(atualizarListaArquitetos);
				update atualizarMetasArquiteto;
			}
					//Caso seja verdadeiro irá atualizar as metas dos Diretor
			if(b2 == true){
				update atualizarMetasDiretor;
			}
        }
		if(trigger.isDelete){
			list<Metas__c> deletarMetas = new list<Metas__c>();
            for(Item_da_oportunidade__c item : trigger.old){
                itemMetaVendedorId = item.Meta_Vendedor__c;
                itemMetaArquiteto = item.Meta_Arquiteto__c;
                itemMetaDiretor = item.Meta_Diretor__c;
            }
            if(itemMetaVendedorId != null || itemMetaArquiteto != null ){
                for(Metas__c meta : metas){
                    //adiciona a lista as metas que devem ter os itens deletados.
                    if(meta.Id == itemMetaVendedorId){
                        deletarMetas.add(meta);
                    }
                    //adiciona a lista as metas que devem ter os itens deletados.
                    if(meta.Id == itemMetaArquiteto){
                        deletarMetas.add(meta);
                    }
                    if(meta.Id == itemMetaDiretor){
                        deletarMetas.add(meta);
                    }
            	}
            }
            // Caso a lista deletarMetas não esteja vazio, deleta os itens das metas.
            if(deletarMetas.isEmpty()!= true){
                update deletarMetas;
            }
        }
    }//---------------------------------------------------------------------------------- FIM AFTER ----------------------------------------------------------------
	
//---------------------------------------------------------- ESSA PARTE É EXECUTADA ANTES DE SER CRIADA OU ATUALIZADA -----------------------------------------------

 
Rafael.Martins.SantosRafael.Martins.Santos
if(trigger.isBefore){//---------------------------------------------------------------- INICIO BEFORE -----------------------------------------------------------
        if(trigger.isInsert || trigger.isUpdate){
            for(item_da_Oportunidade__c item : trigger.new){
                //Pega os dados do objeto oportunidade
                    for(Opportunity op : listaOportunidade){
                        if(item.Oportunidade__c == op.Id){
                            regional = op.Regional__c;
                            ano = op.CloseDate.year();
                            fase = op.StageName;
                        }
                    }
//-------------------------------- ESSA PARTE EXECUTA OS CALCULOS VALOR DE VENDA, VALOR DE COMPRA PARA ARGENTINA E CHILE -----------------------------------------
                
                    //INICIO DOS CALCULOS DE MARGEM, MVS E COMISSOES
                    if(item.Sale_Amount__c == null || item.Purchase_Amount__c == null || item.Extra_Expenses__c == null){
                       item.addError(' Verifique se algum desses campos esta em branco: Despesas extras, Valor de Venda, Valor de Compra. Caso não use, preencha com valor 0');
                    }else{
  
                    }
                    if(item.Sale_Amount_Dollar__c > 0){
                        if(item.Extra_Expenses__c == null || item.TC_Venta__c == null || item.TC_Compra__c == null || item.Sale_Amount_Dollar__c == null || item.Valor_de_Compra_en_Dolares__c == null){
                            item.addError(' Verifique se algum desses campos esta em branco: Despesas extras, Cambio de venda, Cambio de compra, Valor de Compra en Dolares, Valor de Venta en Dolares. Caso não use, preencha com valor 0');
                        }else{
                            //Efetua o calculo valor da venda em dolares * taxa e Valor da compra * taxa
                            item.Sale_Amount__c = item.Sale_Amount_Dollar__c * item.TC_Venta__c;
                            item.Purchase_Amount__c = item.Valor_de_Compra_en_Dolares__c * item.TC_Compra__c;
                        }
                    }
                
//----------------------------------------- ESTA PARTE EFETUA OS CALCULOS DE MARGEM, MVS E COMISSÕES ----------------------------------------------------------------
                    //Margem
                    if(regional == 'AR'){
                       if(item.Sale_Type__c == 'RESALE'){
                          item.Margin__c = (item.Sale_Amount__c * 0.956) - item.Purchase_Amount__c;
                       }
                    }
                    if(regional == 'CL' || regional == 'US'){
                       if(item.Sale_Type__c == 'RESALE'){
                          item.Margin__c = item.Sale_Amount__c - item.Purchase_Amount__c;
                       }
                    }
                
                    //MVS
                    if(regional == 'AR'){
                        if(item.Sale_Type__c == 'FEE'){
                            item.MVS__c = (item.Margin__c * 0.956) - item.Extra_Expenses__c;
                        }else{
                            if(item.Sale_Type__c == 'RESALE'){
                                item.Margin__c = item.Margin__c;
                                item.Margin__c = (item.Sale_Amount__c * 0.956) - item.Purchase_Amount__c;
                                item.MVS__c = item.Margin__c - item.Extra_Expenses__c;
                            }
                                item.MVS__c = item.Margin__c - item.Extra_Expenses__c;
                        }
                    }
                    if(regional == 'CL' || regional == 'US'){
                        if(item.Sale_Type__c == 'RESALE'){
                            item.Margin__c = item.Sale_Amount__c - item.Purchase_Amount__c;
                            item.MVS__c = item.Margin__c - item.Extra_Expenses__c;
                        }else{
                            item.MVS__c = item.Margin__c - item.Extra_Expenses__c;
                        }
                    }else{
                        if(item.Sale_Type__c == 'FEE'){
                            item.MVS__c = (item.Margin__c * 0.8725)-item.Extra_Expenses__c;
                        }else{
                            item.MVS__c = item.Margin__c - item.Extra_Expenses__c;
                        }
                    }
                //Comissões Vendedores, Arquitetos e Diretores
                if(ano >= 2017){
                    //Calcula 25% do valor da venda
                    bonusMVS = item.Sale_Amount__c * 0.25;
                    if(item.Categoria__c == 'IT SERVICES'){
                            if(item.MS_Customer__c == true){
                                item.Fee_Sales_Rep__c = item.MVS__c * 0.03;
                                item.Fee_Pre_Sales__c = item.MVS__c *0.015;
                                item.Fee_Sales_Manager__c = item.MVS__c * 0.0075;
                                item.Fee_BU_Manager__c = 0;
                            }else{
                                item.Fee_Sales_Rep__c = item.MVS__c * 0.06;
                                item.Fee_Pre_Sales__c = item.MVS__c *0.03;
                                item.Fee_Sales_Manager__c = item.MVS__c * 0.015;
                                item.Fee_BU_Manager__c = 0;
                            }
                    }
                    if(item.Categoria__c == 'MANAGED SERVICES'){
                            //Quando o Cliente for MS
                            if(item.MS_Customer__c == true){
                               item.Fee_Sales_Rep__c = item.MVS__c * 0.03;
                               item.Fee_Sales_Manager__c = item.MVS__c * 0.0075;
                               item.Fee_BU_Manager__c = item.MVS__c * 0.01;
                               item.Fee_Pre_Sales__c = item.MVS__c * 0.015;
                            }else{
                                // Calcula bonus quando o mvs for maior ou igual a 25% do valor da venda do item da oportunidade.
                                if(item.MVS__c >= bonusMVS){
                                    item.Fee_Sales_Rep__c = item.MVS__c * 0.08;
                                    item.Fee_Pre_Sales__c = item.MVS__c * 0.05;
                                    item.Fee_Sales_Manager__c = item.MVS__c * 0.015;
                                    item.Fee_BU_Manager__c = item.MVS__c * 0.01;
                                }else{
                                    item.Fee_Sales_Rep__c = item.MVS__c * 0.06;
                                    item.Fee_Pre_Sales__c = item.MVS__c *0.03;
                                    item.Fee_Sales_Manager__c = item.MVS__c * 0.015;
                                    item.Fee_BU_Manager__c = item.MVS__c * 0.01;
                                }
                            }
                    }
                    if(item.Categoria__c == 'PRODUCTS'){
                        if(item.MS_Customer__c == true){
                            item.Fee_Sales_Rep__c = item.MVS__c * 0.03;
                            item.Fee_Pre_Sales__c = item.MVS__c *0.015;
                            item.Fee_Sales_Manager__c = item.MVS__c * 0.0075;
                            item.Fee_BU_Manager__c = 0;
                        }else{
                            item.Fee_Sales_Rep__c = item.MVS__c * 0.04;
                            item.Fee_Pre_Sales__c = item.MVS__c *0.02;
                            item.Fee_Sales_Manager__c = item.MVS__c * 0.01;
                            item.Fee_BU_Manager__c = 0;
                        }
                    }
                }//FIM DOS CALCULOS DE MARGEM, MVS E COMISSOES
                
                if(fase == 'Fechado e ganho'){
                    if(item.Arquitetos__c != null){
                           arquitetoId = item.Arquitetos__c;
                    }
                    if(opportunityId != null || opportunityId != ''){
                        for(User user : users){
                            if(opportunityId == user.Id && user.L_der_Imediato__c != null){
                                lider_imediato = user.L_der_Imediato__c;
                               }
                            if( arquitetoId != null && arquitetoId == user.ContactId){
                                userId = user.Id;
                            }
                        }                        
                        //Caso exista uma meta criada, será relacionado os itens com as metas.
                        for(Metas__c meta : metas){
                            if(meta.OwnerId == opportunityId && meta.Ano__c == ano){
                                  item.Meta_Vendedor__c = meta.Id;
                            }
                            if(lider_imediato != null){
                                if(meta.OwnerId == lider_imediato && meta.Ano__c == ano){
                                      item.Meta_Diretor__c = meta.Id;
                                }
                            }
                            if(userId != null){
                               if(userId == meta.OwnerId && meta.Ano__c == ano){
                                       item.Meta_Arquiteto__c = meta.Id;
                                    b = Boolean.valueOf(true);
                                }else{
                                    if(userId != null && userId != meta.OwnerId){
                                        idsArquitetos.add(userId);
                                    }
                                }
                            }
                        }
                        if(idsArquitetos != null && b == false){
                            for(String idArquiteto : idsArquitetos){
                                Metas__c novaMetaArquiteto = new Metas__c();
                                novaMetaArquiteto.OwnerId = idArquiteto;
                                novaMetaArquiteto.Ano__c = ano;
                                insert novaMetaArquiteto;
                                if(novaMetaArquiteto != null){
                                   item.Meta_Arquiteto__c = novaMetaArquiteto.Id;
                               }
                              }
                        }
                    }
                }
            }
        }
    }//------------------------------------------------------------------- FIM BEFORE ------------------------------------------------------------
    
Rafael.Martins.SantosRafael.Martins.Santos
Goal Trigger
 
trigger Metas_Trigger on Metas__c (before insert, before update, after update) {
	
    String metaId;
    Decimal anoMeta;
    String ownerId;
    Integer ano = 0;
    Date dataFechamento;
    Double valorTotal= 0;
    
    list<item_da_Oportunidade__c> listaMetasVendedores = new list<item_da_Oportunidade__c>();
    list<item_da_Oportunidade__c> listaMetasArquitetos = new list<item_da_Oportunidade__c>();
    list<item_da_Oportunidade__c> listaMetasDiretores = new list<item_da_Oportunidade__c>();
    list<Item_da_oportunidade__c> itens = new list<Item_da_oportunidade__c>();
    list<Metas__c> metas_itens = [SELECT id, Name, (SELECT Id, Categoria__c, Oportunidade__c, Data_de_Fechamento_Item__c, Meta_Vendedor__c, Meta_Arquiteto__c, Meta_Diretor__c, MVS__c FROM itens_da_Oportunidade__r) FROM Metas__c WHERE Id IN : trigger.new];
	
    for(Metas__c metas : metas_itens){
        for(item_da_Oportunidade__c itensMeta : metas.itens_da_Oportunidade__r){
            if(metas.Id == itensMeta.Meta_Vendedor__c){
               listaMetasVendedores.add(itensMeta);
            }
            if(metas.Id == itensMeta.Meta_Arquiteto__c){
               listaMetasArquitetos.add(itensMeta);
            }
            if(metas.Id == itensMeta.Meta_Diretor__c){
               listaMetasDiretores.add(itensMeta);
            }
        }
    }
    
    if(trigger.isBefore){  
        if(trigger.isInsert){
            for(Metas__c meta : trigger.new){
                anoMeta = meta.Ano__c;
                ownerId = meta.OwnerId;
            }
            list<Metas__c> metas = [SELECT Id, Ano__c, OwnerId FROM Metas__c WHERE Ano__c =: anoMeta AND OwnerId =: ownerId];
            User user = [SELECT Id, Name FROM User WHERE Id=: ownerId];
            for(Metas__c meta : trigger.new){
                if(metas.isEmpty() != true){
                	meta.addError('Já existe uma meta criada para o usuário "'+user.Name+'" no ano de '+anoMeta);
            	}
            }
        }
        
        if(trigger.isUpdate){
            for(Metas__c meta : trigger.new){
                meta.Valor_MVS_Produtos_Q1__c = 0;
                meta.Valor_MVS_ITS_Q1__c = 0;
                meta.Valor_MVS_MS_Q1__c = 0;
                    
               	meta.Valor_MVS_Produtos_Q2__c = 0;
                meta.Valor_MVS_ITS_Q2__c = 0;
                meta.Valor_MVS_MS_Q2__c = 0;
                    
                meta.Valor_MVS_Produtos_Q3__c = 0;
                meta.Valor_MVS_ITS_Q3__c = 0;
                meta.Valor_MVS_MS_Q3__c = 0;
                    
                meta.Valor_MVS_Produtos_Q4__c = 0;
                meta.Valor_MVS_ITS_Q4__c = 0;
                meta.Valor_MVS_MS_Q4__c = 0;
  
                ano = meta.Ano__c.intValue();
                //Pegar todos os itens de vendedores relacionados a meta
                for(Item_da_oportunidade__c itemVendedor : listaMetasVendedores){
                    if(itemVendedor != null){
                       itens.add(itemVendedor);
                    }
                }  
                //Pegar todos os itens de arquiteto relacionado a meta
                for(Item_da_oportunidade__c itemArquiteto : listaMetasArquitetos){
                    if(itemArquiteto != null){
                       itens.add(itemArquiteto);
                    }
                }
                    
                //Pegar todos os itens dos diretores (Lider do vendedor) relacionados a meta
                for(Item_da_oportunidade__c itemDiretor : listaMetasDiretores){
                    if(itemDiretor != null){
                       itens.add(itemDiretor);
                    }
                }                
                    
                //lista de itens = possui todos os itens da meta. 
                for(Item_da_oportunidade__c item : itens){
                    //Data de fechamento do item da oportunidade
                    dataFechamento = item.Data_de_Fechamento_Item__c;

                    if(dataFechamento >= Date.newInstance(ano, 01, 01) && dataFechamento<= Date.newInstance(ano, 03, 31)){
                        if(item.Categoria__c == 'PRODUCTS'){
                           meta.Valor_MVS_Produtos_Q1__c+= item.MVS__c;
                        }
                        if(item.Categoria__c == 'IT SERVICES'){
                               meta.Valor_MVS_ITS_Q1__c+= item.MVS__c;
                        }
                        if(item.Categoria__c == 'MANAGED SERVICES'){
                           meta.Valor_MVS_MS_Q1__c+= item.MVS__c;
                        }
                    }
                    if(dataFechamento >= Date.newInstance(ano, 04, 01) && dataFechamento<= Date.newInstance(ano, 06, 30)){
                       if(item.Categoria__c == 'PRODUCTS'){
                          meta.Valor_MVS_Produtos_Q2__c+= item.MVS__c;
                       }
                       if(item.Categoria__c == 'IT SERVICES'){
                          meta.Valor_MVS_ITS_Q2__c+= item.MVS__c;
                       }
                       if(item.Categoria__c == 'MANAGED SERVICES'){
                          meta.Valor_MVS_MS_Q2__c+= item.MVS__c;
                       }
                    }
                    if(dataFechamento >= Date.newInstance(ano, 07, 01) && dataFechamento<= Date.newInstance(ano, 09, 30)){
                       if(item.Categoria__c == 'PRODUCTS'){
                          meta.Valor_MVS_Produtos_Q3__c+= item.MVS__c;
                       }
                       if(item.Categoria__c == 'IT SERVICES'){
                          meta.Valor_MVS_ITS_Q3__c+= item.MVS__c;
                       }
                       if(item.Categoria__c == 'MANAGED SERVICES'){
                          meta.Valor_MVS_MS_Q3__c+= item.MVS__c;
                       }
                    }
                    if(dataFechamento >= Date.newInstance(ano, 10, 01) && dataFechamento<= Date.newInstance(ano, 12, 31)){
                        if(item.Categoria__c == 'PRODUCTS'){
                           meta.Valor_MVS_Produtos_Q4__c+= item.MVS__c;
                        }
                        if(item.Categoria__c == 'IT SERVICES'){
                           meta.Valor_MVS_ITS_Q4__c+= item.MVS__c;
                        }
                        if(item.Categoria__c == 'MANAGED SERVICES'){
                           meta.Valor_MVS_MS_Q4__c+= item.MVS__c;
                        }
                    }
                }
            }
        }
    }
    if(trigger.isAfter){
        if(MetaRecursiva.runOnce()){
            LIST<Metas__c> metas = new LIST<Metas__c>();
            for(Metas__c meta : metas_itens){
                for(item_da_Oportunidade__c item: meta.itens_da_Oportunidade__r){
                    valorTotal+= item.MVS__c;
                }
                if(valorTotal < meta.Valor_Total_MVS__c || valorTotal > meta.Valor_Total_MVS__c){
               		metas.add(meta);
            	}
            }
        	if(metas.isEmpty() == false){
                update metas;
            }
        }
    }
}

 
Rafael.Martins.SantosRafael.Martins.Santos
/**
 * Meta
 * Executa criação da meta (caso não exista)
 * Atualiza os itens(Para que a trigger do item execute, relacionando o item da oportunidade com a meta criada ou existente)
 * A meta é criada de acordo com o usuário e o ano em que a oportunidade foi fechada
 * Caso exista uma Meta onde o usuário é igual o proprietário da oportunidade e o ano da meta é igual o ano da oportunidade
 * Relaciona os itens da oportunidade conforme o trimestre em que a oportunidade pertence.
 * Caso não exista, a meta será criada automaticamente.
 * A meta será criada apenas quando a FASE da oportunidade for "Fechado e ganho". 
*/

trigger Oportunidade_Trigger on Opportunity (before update, after update, after delete) {

    Date data = Date.newInstance(2016, 06, 01);
    String opp_OwnerId;
    String opp_AccountId;
    String id_conta;
	String user_name;
	String account_name;
	String account_city;
	String regional;   
    Boolean b = Boolean.valueOf(false);
    Boolean b1 = Boolean.valueOf(false);
    Boolean b2 = Boolean.valueOf(false);
    String arquiteto = '';
	String opId = '';
	String lider_imediato;
    Integer ano = 0;
    String fase = '';
	String usuarioArquiteto;
	LIST<Item_da_oportunidade__c> lista = new LIST<Item_da_oportunidade__c>();
    LIST<Id> listaUsuarios = new LIST<Id>();
    LIST<Metas__c> criarMetas = new LIST<Metas__c>();
    SET<Metas__c> criarNovasMetas = new SET<Metas__c>();
	SET<String> listaArquitetos = new SET<String>();
	SET<String> setList = new SET<String>();
	
    
    for(Opportunity op : trigger.new){
        opp_OwnerId = op.OwnerId;
        opp_AccountId = op.AccountId;
		ano = op.CloseDate.year();
    }
    list<User> users = [SELECT Id, Name, ContactId, L_der_Imediato__c FROM User  WHERE Id =: opp_OwnerId];
	list<User> listUsers = [SELECT Id, Name, ContactId, L_der_Imediato__c FROM User];
    list<Account> accounts = [SELECT Id, Name, BillingCity, Regional__c FROM Account  WHERE Id =: opp_AccountId];
    list<Opportunity> opportunities = [SELECT Id, Name, Proposal_Number__c, OwnerId, CloseDate, Regional__c, StageName, Probability, (SELECT Id, Name, Oportunidade__c, Categoria__c, Sale_Type__c, Familia_de_Produto__c, Status_Faturamento__c, CreatedDate, Arquiteto__c, LastModifiedDate, Meta_Vendedor__c, Meta_Arquiteto__c, Meta_Diretor__c, Arquitetos__c FROM Itens_da_oportunidade__r) FROM Opportunity WHERE Id IN : trigger.new];
	LIST<Metas__c> metas = [SELECT Id, Name, OwnerId FROM Metas__c WHERE Ano__c =:ano];
    
	//----------------------------------------------------------------- BEFORE ------------------------------------------------------------------------
	if(trigger.isBefore){
		 if(trigger.isUpdate){
            //Antes de atualizar a oportunidade, será feito uma verificação para saber se existe uma meta.
            for(Opportunity op : opportunities){
               if(op.StageName == 'Fechado e ganho'){
                    ano = op.CloseDate.year();
                    opId = op.Id;
                    fase= op.StageName;
                    opp_OwnerId = op.OwnerId;
                   for(Item_da_oportunidade__c item : op.Itens_da_Oportunidade__r){
                       if(item.Arquitetos__c != null){
                           listaArquitetos.add(item.Arquitetos__c);
                       }
                   }
               }
            }
            
            if(fase == 'Fechado e ganho'){
                for(User user : listUsers){
                    if(user.Id == opp_OwnerId && user.L_der_Imediato__c != null){
                        lider_imediato = user.L_der_Imediato__c;
                    }
                    for(String arquiteto : listaArquitetos){
                        if(arquiteto == user.ContactId){
                            // adiciona os ids dos usuários em uma lista de String
                            listaUsuarios.add(user.Id);
                        }
                    }
                }
            	//Adiciona a lista em um Vetor para então adicionar em uma lista de conjuntos(SET).
            	//A lista de SET elimina os id's duplicados
                String[]lista = listaUsuarios;
                setList.addAll(lista);
				
                //---------------- SE LISTA DE MESTAS NÃO ESTIVER VAZIA, EXECUTA CÓDIGO ABAIXO --------------------
                if(metas.isEmpty() == false){
                    for(Metas__c meta : metas){
                        //Verifica se existe uma meta criada para o vendedor
                        if(meta.OwnerId == opp_OwnerId){
                           b = Boolean.valueOf(true);
                        }
                        if(lider_imediato != null || lider_imediato != ''){
                            // Verifica se existe uma Meta criada para o diretor
                            if(meta.OwnerId == lider_imediato){
                                b1 = Boolean.valueOf(true);
                            }
                        }else{
                            // Caso usuário proprietário da oportunidade não tenha um lider, não criar ou relacionar nova meta
                            b1 = Boolean.valueOf(true);
                        }
                        // SE A listaUsuarios NÃO ESTIVER VAZIA
                        if(listaUsuarios != null){                          
                            for(String setLista : setList){
                                usuarioArquiteto = setLista;
                                if(usuarioArquiteto == meta.OwnerId){
                                   b2 = Boolean.valueOf(true);
                                }else{
                                   Metas__c novaMeta = new Metas__c();
                                   novaMeta.OwnerId = usuarioArquiteto;
                                   novaMeta.Ano__c = ano;
                                   criarNovasMetas.add(novaMeta);
                            	}
                            }
                        }else{
                            b2 = Boolean.valueOf(true);
                        }
                	}
                }
                //---------------- SE LISTA DE MESTAS ESTIVER VAZIA EXECUTA CÓDIGO ABAIXO --------------------
                if(metas.isEmpty()==true){
                    if(listaUsuarios != null){
                        if(setList.isEmpty() == false){
                            for(String arquiteto : setList){
                                if(arquiteto != null){
                                    Metas__c meta = new Metas__c();
                                    //System.debug('Id arquiteto : ' +arquiteto);
                                    meta.OwnerId = arquiteto;
                                    meta.Ano__c = ano;
                                    criarNovasMetas.add(meta);
                                }
                            }
                        }
                	}
                }
                if(criarNovasMetas.isEmpty() == false && b2 == false){
                   b2 = Boolean.valueOf(false);
                }
            	//Caso não exista meta criada, irá criar uma nova meta para o vendedor.
            	//System.debug('B: '+b +', B1: '+b1+', B2 '+b2);
            	if(b == false){
                    Metas__c novaMeta = new Metas__c(OwnerId = opp_OwnerId, Ano__c = ano);
                    insert novaMeta;
                }
                //Caso não exista meta criada, irá criar uma nova meta para o Lider imediato do vendedor.
                if(b1 == false){
                    if(lider_imediato != null){
                        Metas__c novaMeta = new Metas__c(OwnerId = lider_imediato, Ano__c = ano);
                    	insert novaMeta;
                    }
                }
                if(b2 == false){
                   if(criarNovasMetas.isEmpty() == false){
                        criarMetas.addAll(criarNovasMetas);
                        insert criarMetas;
                	} 
                }
            }
        }
	}
	//------------------------------------------------------------------ AFTER ------------------------------------------------------------------------
	if(trigger.isAfter){
		if(trigger.isUpdate){
			for(Opportunity op : opportunities){
				for(Account acc : accounts){
					regional = acc.Regional__c;
					account_name = acc.Name;
					account_city = acc.BillingCity;
				}
				for(User user : users){
					user_name = user.Name;
				}
		//--------------------------- ESSA PARTE EXECUTA A INTEGRAÇÃO ENTRE SALESFORCE E SERVICENOW -----------------------------------                
				if(op.CloseDate > data){
					// criar_projeto RECEBE OS DADOS EM FORMATO JSON
					String criar_projeto = '{\n\"u_customer\":\"40067eee6f186d00a18b2d232e3ee4b9\",'+
											'\"u_sf_proposal\":\"'+ op.Proposal_Number__c +'\",' +
											'\"project_manager\":\"c328b1046f58b100a18bfc232e3ee485\",'+
											'\"u_branch\":\"'+op.Regional__c+'\",'+
											'\"u_costcenter\":\"fb7f9e1a87b061003838276709434d70\",'+
											'\"u_account_manager\":\"c328b1046f58b100a18bfc232e3ee485\",'+
											'\"phase\":\"-10\",'+
											'\"u_sales_year\":\"'+op.CloseDate+'\",'+
											'\"short_description\":\"'+op.Name+'\"}';

					for(Item_da_oportunidade__c item : op.Itens_da_oportunidade__r){
						if(op.StageName == 'Fechado e ganho'){
							if(item.Categoria__c == 'IT SERVICES'){
								if(item.Status_Faturamento__c != 'Cancelado'){
									if(item.Sale_Type__c == 'SALE' || item.Sale_Type__c == 'RESALE'){
									   b = Boolean.valueOf(true);
									}
								}
							}
							lista.add(item);
						}
						// INICIO DA ATUALIZAÇÃO DA OPORTUNIDADE DE FORECAST NO SERVICENOW
						if(item.Categoria__c == 'IT SERVICES' || item.Categoria__c == 'MANAGED SERVICES'){
							if(op.Probability >= 50){
								if(op.StageName != 'Inicial' || op.StageName != 'Validado' || op.StageName != 'Projeto Técnico' || op.StageName != 'Fechado e ganho'){
									// cria_item_oportunidade RECEBE OS DADOS EM FORMATO JSON     
									String cria_item_oportunidade = '{\n\"u_crm\":\"'+op.Proposal_Number__c+'\",'+
																	'\"short_description\":\"'+ op.Name +'\",'+
																	'\"u_opportunity_item\":\"'+item.Name+'\",'+
																	'\"u_account\":\"'+account_name+'\",'+
																	'\"u_status\":\"Não Planejado\",'+
																	'\"stage\":\"'+op.StageName+'\",'+
																	'\"close_date\":\"'+op.CloseDate+'\",'+
																	'\"type\":\"'+item.Sale_Type__c+'\",'+
																	'\"u_city\":\"'+account_city+'\",'+
																	'\"u_proposal_creation_date\":\"'+item.CreatedDate+'\",'+
																	'\"probability\":\"'+op.Probability+'\",'+
																	'\"u_item_category\":\"'+item.Categoria__c+'\",'+
																	'\"u_architect\":\"'+item.Arquiteto__c+'\",'+
																	'\"u_update_date\":\"'+item.LastModifiedDate+'\",'+
																	'\"u_regional\":\"'+regional+'\",'+
																	'\"u_account_manager\":\"'+user.Name+'\"}';
						
									ServiceNow_AtualizaOportunidadeForecast.executarAtualizaOportunidade(item.Name, op.Proposal_Number__c, cria_item_oportunidade, op.StageName);
									b1 = Boolean.valueOf('true');
								}
							}
						}//FIM DA ATUALIZAÇÃO DA OPORTUNIDADE DE FORECAST NO SERVICENOW
							
						if(op.StageName == 'Fechado e ganho'){
							if(item.Categoria__c == 'MANAGED SERVICES'){
								if(item.Familia_de_Produto__c != 'MS - Body Shop'){
									if(item.Arquitetos__c != null){
									   arquiteto = item.Arquitetos__c;
									}
									b2 = Boolean.valueOf(true);
								}
							}
						}
					}
						
					//INICIO CRIAÇÃO DO PROJETO NO SERVICENOW
					if(b==true){
					   ServiceNow_Projeto.executarProjeto(op.Id, op.Proposal_Number__c, criar_projeto);
					}//FIM CRIAÇÃO DO PROJETO NO SERVICENOW
						
					//INICIO DA ATUALIZAÇÃO DA OPORTUNIDADE NO SERVICENOW
					if(b1 == true){
						if(op.Probability >= 50 || op.Probability == 0){
							if(op.StageName != 'Inicial' || op.StageName != 'Validado' || op.StageName != 'Projeto Técnico'){
								String atualiza_oportunidade = '{\n\"short_description\":\"'+op.Name+'\",'+
															   '\"probability\":\"'+op.Probability+'\",'+
															   '\"u_account\":\"'+account_name+'\",'+
															   '\"stage\":\"'+op.StageName+'\",'+
															   '\"close_date\":\"'+op.CloseDate+'\",'+
															   '\"u_regional\":\"'+regional+'\",'+
															   '\"u_account_manager\":\"'+user_name+'\"}';
								ServiceNow_AtualizaOpty_Fase.executarAtualizaOportunidade(op.Proposal_Number__c, atualiza_oportunidade);
							}
						}
					}//FIM DA ATUALIZAÇÃO DA OPORTUNIDADE NO SERVICENOW
						
					//INICIO DA CRIAÇÃO DO ITEM DE CONTRATO NO SERVICENOW
					if(b2==true){
						Date data1 = op.CloseDate;
						Integer mes1 = data1.month();
						Integer ano1 = data1.year();
							 
						String mes = String.valueOf(mes1);
						String ano = String.valueOf(ano1);
							
						// criarContrato RECEBE OS DADOS EM FORMATO JSON
						String criarContrato = '{\n\"short_description\":\"'+op.Name+'\",'+
											   '\"u_arquiteto\":\"'+arquiteto+'\",'+
											   '\"u_gerente_de_conta\":\"'+user_name+'\",'+
											   '\"u_status\":\"7\",'+
											   '\"u_sf_proposal\":\"'+op.Proposal_Number__c+'\"}';
							 
						ServiceNow_Item_Contrato.executarContrato(op.Id, op.Proposal_Number__c, criarContrato, mes, ano);
					}//FIM DA CRIAÇÃO DO ITEM DE CONTRATO NO SERVICENOW   
				}
			}
			//Atualiza os itens da oportunidade.
			update lista;
		}
		if(trigger.isDelete){
            //Após a oportunidade ser deletada, todas as metas de um determinado ano serão atualizados, fazendo com que os cálculos nas metas sejam corrijida.           
			for(Opportunity op : trigger.old){
               fase = op.StageName;
			}
            if(fase == 'Fechado e ganho'){
                update metas;
            }
        }
	} 
}

 
Rafael.Martins.SantosRafael.Martins.Santos
Hi Paul,
I share my all code here.
3 triggers
Paul S.Paul S.
I'm not seeing anything still inside a for loop and it seems like you've got recursive checks in place...is this only happening when you run your test class?  Maybe there's something there with how you're inserting data.  Can you post that?
Rafael.Martins.SantosRafael.Martins.Santos
This occurs only in a test class.
But I think if I did some import with multiple data, maybe this error occur.
And if I try publish this code, maybe I will cannot publish because will occur the same error.
All the update I'm doing is out of an loop, to avoid multiple updates.
Paul S.Paul S.
Are you talking about that 503 error?  I've seen that, too, but the post usually winds up being added correctly.  Give it a try.
Rafael.Martins.SantosRafael.Martins.Santos
No, the 503 error is when I tried post my code here, but I got it dividing my code in parts.
Paul S.Paul S.
Got it - would you be able to post the test class?