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
YaduYadu 

Deployment Error

I am trying to deploy into Production and getting these error message

 

Failure Message: "System.DmlException: Update failed. First exception on row 0 with id a0mE0000000PDHGIA4; first error: FIELD_CUSTOM_VALIDATION_EXCEPTION, Sales Opportunities must be linked to an Originating Officer but the system was not able to automatically determine your default officer code: []"

 

Deployment says error in line 518

public class SalesOppurtunityHandler {

public SalesOppurtunityHandler(){}

public void OnBeforeCall(Sales_Opportunity__c[] newRecords, Map<Id, Sales_Opportunity__c> oldRecordMap, String flag){
List<Sales_Opportunity__c> workingList = new List<Sales_Opportunity__c>();

for(Sales_Opportunity__c opp : newRecords){
if(opp.Referred_To__c!=opp.Officer_Code__c || (opp.Referred_To__c== null && opp.Officer_Code__c == null)){
workingList.add(opp);
}else {
opp.addError(Label.Sales_Oppurtunity_Error_Message);
}
}

Sales_Opportunity__c[] validRecords = new Sales_Opportunity__c[]{};
set<Id> offCodeIdSet = new set<Id>();

System.debug('*************In OnBeforeCall');
assignOfficerCodes(workingList, validRecords, oldRecordMap, offCodeIdSet, flag);

map<Id, Officer_Code__c> offCodeMap = new map<Id, Officer_Code__c>([select Id, Officer_Code__c from Officer_Code__c where Id in :offCodeIdSet]);
System.debug('*******Office Code Map: ' + offCodeMap);
System.debug('*******Valid recs: ' + validRecords);
linkSalesTargets(validRecords, oldRecordMap, offCodeMap, flag);


referalOwnerChange(workingList,oldRecordMap);
}

//Adding to change the ownership to refered to.
public void referalOwnerChange(Sales_Opportunity__c[] newRecords, Map<Id, Sales_Opportunity__c> oldRecordMap){
set<Id> ocIdSet = new set<Id>();
Boolean isSendMail = false;
List<Sales_Opportunity__c> oppForMailSending = new List<Sales_Opportunity__c>();
for(Sales_Opportunity__c so : newRecords){
if(so.Referred_To__c!= null)
ocIdSet.add(so.Referred_To__c);
}

Map<Id,Officer_Code__c> ocMap = new Map<Id,Officer_Code__c>([Select Assigned_To_Id__c, Assigned_To_Id__r.isActive,Assigned_To_Id__r.Email
From Officer_Code__c Where Id IN: ocIdSet AND Assigned_To_Id__r.isActive = true]);
if(oldRecordMap == null){
for(Sales_Opportunity__c so : newRecords){
if(so.Referred_To__c!= null && ocMap.get(so.Referred_To__c) != null){
so.ownerId = ocMap.get(so.Referred_To__c).Assigned_To_Id__c;
}
}
}else{
for(Sales_Opportunity__c so : newRecords){
if(so.Referred_To__c!= null && ocMap.get(so.Referred_To__c) != null && so.Referred_To__c!= oldRecordMap.get(so.id).Referred_To__c){
if(ocMap.get(so.Referred_To__c).Assigned_To_Id__r.isActive){
isSendMail = true;
oppForMailSending.add(so);
so.ownerId = ocMap.get(so.Referred_To__c).Assigned_To_Id__c;
}
}
}
}
if(isSendMail)
sendMail(oppForMailSending,ocMap);

}

//Method Send email Logic
public void sendMail(List<Sales_Opportunity__c> newRecords,Map<Id,Officer_Code__c> ocMap){
Messaging.SingleEmailMessage[] grpmails = new Messaging.SingleEmailMessage[]{};
//String templateName = CommonSettings__c.getInstance('Referred To Email').Value__c; // not doing a null check just to make sure we always create a custom setting record for this.
//List<EmailTemplate> myEmailTemplate= [select Id,Name from EmailTemplate where Name=:templateName LIMIT 1 ];
List<string> addresses;
Boolean sendMail = false;
for(Sales_Opportunity__c so : newRecords){
Messaging.SingleEmailMessage oEmail;
if(so.Referred_To__c!= null){
sendMail = true;
addresses = new List<String>();
if(ocMap.get(so.Referred_To__c) != null)
addresses.add(ocMap.get(so.Referred_To__c).Assigned_To_Id__r.Email);
oEmail = new Messaging.SingleEmailMessage();
oEmail.setTargetObjectId(UserInfo.getUserId());
oEmail.setToAddresses(addresses);
oEmail.setSubject('Refered To Mail');
oEmail.setHtmlBody(EmailContent(so));
//oEmail.setTemplateId(myEmailTemplate[0].Id);
oEmail.setsaveAsActivity(false);
if(!addresses.isEmpty())
grpmails.add(oEmail);
}

}
if(sendMail)
Messaging.SendEmailResult [] oResult =
Messaging.sendEmail(grpmails);
}

public String EmailContent(Sales_Opportunity__c salesopp)
{
//String emilbodycontent='Dear Sir,';
String emilbodycontent='<p>A Sales Opportunity has been referred to you by '+ salesopp.Officer__c+'.</p>';
emilbodycontent+='If you have a Salesforce login, you can view this Sales Opportunity here: <br/> <href>'+CommonSettings__c.getInstance('serverUrl').Value__c +salesopp.Id+ '</href>';

return emilbodycontent;
}

public void OnAfterCall(Sales_Opportunity__c[] soRecords, String flag){
Set<Id> stIds = new Set<Id>();
if(flag == 'Insert'){
set<Id> ocIdSet = new set<Id>();
Boolean isSendMail = false;
List<Sales_Opportunity__c> oppForMailSending = new List<Sales_Opportunity__c>();
for(Sales_Opportunity__c so : soRecords){
if(so.Referred_To__c!= null)
ocIdSet.add(so.Referred_To__c);
}

Map<Id,Officer_Code__c> ocMap = new Map<Id,Officer_Code__c>([Select Assigned_To_Id__c, Assigned_To_Id__r.isActive,Assigned_To_Id__r.Email
From Officer_Code__c Where Id IN: ocIdSet AND Assigned_To_Id__r.isActive = true]);

for(Sales_Opportunity__c so : soRecords){
if(so.Referred_To__c!= null){
isSendMail = true;
oppForMailSending.add(so);
}
}
if(isSendMail)
sendMail(oppForMailSending,ocMap);
}

for(Sales_Opportunity__c opp : soRecords){
if(opp.Sales_Target__c != null)
stIds.add(opp.Sales_Target__c);
}

map<Id,Sales_Target__c> stRecords = new map<Id, Sales_Target__c>([Select Id, Actual_Number_of_Sales_Non_Lending__c, Actual_Number_of_Sales__c, Actual_Number_of_Sales_Referred_By__c from Sales_Target__c where Id IN :stIds]);

if(stRecords.size() > 0){
for(Sales_Opportunity__c opp : soRecords){
if(opp.Sales_Target__c!=null && opp.Status__c=='Closed Won' && opp.Count_Against_Targets__c==true){
if(flag=='Delete'){
//stRecords.get(opp.Sales_Target__c).Actual_Number_of_Sales__c--;
if(opp.Product_Category__c == 'Loans'){
stRecords.get(opp.Sales_Target__c).Actual_Number_of_Sales__c--;
}else{
stRecords.get(opp.Sales_Target__c).Actual_Number_of_Sales_Non_Lending__c--;
}
}
else{
//stRecords.get(opp.Sales_Target__c).Actual_Number_of_Sales__c++;
if(opp.Product_Category__c == 'Loans'){
//stRecords.get(opp.Sales_Target__c).Actual_Number_of_Sales__c++;
}else{
//stRecords.get(opp.Sales_Target__c).Actual_Number_of_Sales_Non_Lending__c++;
}
}

if(opp.Referred_To__c!=null && opp.Referred_To__c!=opp.Officer_Code__c){
if(flag=='Delete')
stRecords.get(opp.Sales_Target__c).Actual_Number_of_Sales_Referred_By__c--;
else
stRecords.get(opp.Sales_Target__c).Actual_Number_of_Sales_Referred_By__c++;
}
}
}
update stRecords.values();
}


//For sharing records using Visibility_Utility class.
if(flag == 'Insert'){
Visibility_Utility vu = new Visibility_Utility();
vu.createShare('Sales_Opportunity__c',soRecords);
}
}


//Adding this method to check if the office code values has been updated and
//re-calculate the sharing if it is so.
public void OnAfterUpdateCall(Map<Id,Sales_Opportunity__c> oldSoMap,Sales_Opportunity__c[] newSo, String flag){
if(flag == 'Update'){
List<Sales_Opportunity__c> reShareSo = new List<Sales_Opportunity__c>();

for(Sales_Opportunity__c so : newSo){
if(oldSoMap.get(so.Id).Officer_Code__c != so.Officer_Code__c ||
oldSoMap.get(so.Id).Referred_To__c != so.Referred_To__c){
reShareSo.add(so);
}
}
Visibility_Utility vu = new Visibility_Utility();
vu.createShare('Sales_Opportunity__c',reShareSo);
}
}

private void assignOfficerCodes(Sales_Opportunity__c[] newRecords, Sales_Opportunity__c[] validRecords, map<Id, Sales_Opportunity__c> oldRecordMap,
set<Id> offCodeIdSet, String flag){

User currUser = [Select Id, Default_Officer_Code__c from User where Id = :UserInfo.getUserId()];

//Get the Officer codes according to Assigned To field and Default Office code
List<Officer_Code__c> offCodeAssignedList = new List<Officer_Code__c>([select id, Officer_Code__c from Officer_Code__c where Assigned_To_Id__c = :currUser.Id]);
List<Officer_Code__c> offCodeDefaultList = new List<Officer_Code__c>([select id, Officer_Code__c from Officer_Code__c
where Officer_Code__c = :currUser.Default_Officer_Code__c]);
Sales_Opportunity__c oldOpp;
for(Sales_Opportunity__c optyRec: newRecords){
Boolean addRecord = false;
if(oldRecordMap != null)
oldOpp = oldRecordMap.get(optyRec.Id);
if(flag=='Insert' || (flag=='Update' && oldOpp!=null &&
(optyRec.Close_Date__c!=oldOpp.Close_Date__c ||
optyRec.Product_Category__c !=oldOpp.Product_Category__c ||
optyRec.Officer_Code__c!=oldOpp.Officer_Code__c ||
optyRec.Count_Against_Targets__c!=oldOpp.Count_Against_Targets__c ||
optyRec.Referred_To__c!=oldOpp.Referred_To__c || optyRec.Status__c!=oldOpp.Status__c))){

if(optyRec.Officer_Code__c == null){
if(offCodeAssignedList.size() == 1){
optyRec.Officer_Code__c = offCodeAssignedList[0].Id;
addRecord = true;
}else if(offCodeDefaultList.size() > 0){
optyRec.Officer_Code__c = offCodeDefaultList[0].Id;
addRecord = true;
}else{
optyRec.addError(Label.Populating_Originating_Officer);
}
}else
addRecord = true;
if(addRecord==true || flag=='Update')
validRecords.add(optyRec);
offCodeIdSet.add(optyRec.Officer_Code__c);
if(oldOpp != null)
offCodeIdSet.add(oldOpp.Officer_Code__c);
}
}
}

private void linkSalesTargets(Sales_Opportunity__c[] salesOptyList, Map<Id, Sales_Opportunity__c> oldRecordMap, Map<Id, Officer_Code__c> offCodeMap, String flag){
map<Id, Sales_Target__c> stRecords = new map<Id, Sales_Target__c>([Select Id,Actual_Number_of_Sales_Non_Lending__c, Target_Period_Start__c, Target_Period_End__c, Actual_Number_of_Sales__c, Officer_Code__c,
Actual_Number_of_Sales_Referred_By__c from Sales_Target__c where Officer_Code__c IN :offCodeMap.keySet()]);

map<String, List<Sales_Target__c>> offCodeToSalesTarget = new map<String, List<Sales_Target__c>>();

for(Sales_Target__c st : stRecords.values()){
Officer_Code__c offCodeRec = offCodeMap.get(st.Officer_Code__c);
if(offCodeToSalesTarget.get(offCodeRec.Officer_Code__c) != null){
offCodeToSalesTarget.get(offCodeRec.Officer_Code__c).add(st);
}else{
offCodeToSalesTarget.put(offCodeRec.Officer_Code__c, new Sales_Target__c[]{st});
}
}

System.debug('********Officer Codes to Sales Target: ' + offCodeToSalesTarget);
List<Sales_Target__c> stUpdateList = new List<Sales_Target__c>();
List<Id> decOriginatedList = new List<Id>();
List<Sales_Opportunity__c> decSaleOpp = new List<Sales_Opportunity__c>();
List<Id> decReferredList = new List<Id>();

if(flag=='Insert'){
for(Sales_Opportunity__c opp : salesOptyList){
if(opp.Count_Against_Targets__c == true){
Officer_Code__c ofCode = offCodeMap.get(opp.Officer_Code__c);
List<Sales_Target__c> newSTList = offCodeToSalesTarget.get(ofCode.Officer_Code__c);
System.debug('********Linked newSTList ' +newSTList );
if(newSTList!=null){
for(Sales_Target__c st : newSTList){
if(opp.Close_Date__c >= st.Target_Period_Start__c && opp.Close_Date__c <= st.Target_Period_End__c){
System.debug('********Linked Sales Target ' + st.Id + ' to Opty ' + opp.Id);
opp.Sales_Target__c = st.Id;
if(opp.Status__c == 'Closed Won'){
if(opp.Product_Category__c == 'Loans'){
st.Actual_Number_of_Sales__c++;
}else{
st.Actual_Number_of_Sales_Non_Lending__c++;
}
//st.Actual_Number_of_Sales__c++;
if(opp.Referred_To__c!=null && opp.Referred_To__c!=ofCode.Id)
st.Actual_Number_of_Sales_Referred_By__c++;
stUpdateList.add(st);
}break;
}
}
}
}
}
}else{
System.debug('***********In Update'+salesOptyList);
for(Sales_Opportunity__c opp : salesOptyList){
Sales_Opportunity__c oldOpp = oldRecordMap.get(opp.Id);
if(opp.Close_Date__c!=oldOpp.Close_Date__c || opp.Officer_Code__c!=oldOpp.Officer_Code__c || opp.Count_Against_Targets__c!=oldOpp.Count_Against_Targets__c){
if(opp.Count_Against_Targets__c==true && opp.Officer_Code__c!=null){
Officer_Code__c ofCode = offCodeMap.get(opp.Officer_Code__c);
List<Sales_Target__c> newSTList = offCodeToSalesTarget.get(ofCode.Officer_Code__c);
if(newSTList!=null){
for(Sales_Target__c st : newSTList){
if(opp.Close_Date__c >= st.Target_Period_Start__c && opp.Close_Date__c <= st.Target_Period_End__c){
opp.Sales_Target__c = st.Id;
if(oldOpp.Sales_Target__c!=null && oldOpp.Status__c=='Closed Won' && oldOpp.Count_Against_Targets__c==true){
decOriginatedList.add(oldOpp.Sales_Target__c);
decSaleOpp.add(oldOpp);
if(oldOpp.Referred_To__c!=null && oldOpp.Referred_To__c!=oldOpp.Officer_Code__c)
decReferredList.add(oldOpp.Sales_Target__c);
}
if(opp.Status__c == CommonSettings__c.getInstance('Closed Won').Value__c){// make sure config value is always present
if(opp.Product_Category__c == 'Loans'){
st.Actual_Number_of_Sales__c++;
}else{
st.Actual_Number_of_Sales_Non_Lending__c++;
}
//st.Actual_Number_of_Sales__c++;
if(opp.Referred_To__c!=null && opp.Referred_To__c!=ofCode.Id)
st.Actual_Number_of_Sales_Referred_By__c++;
stUpdateList.add(st);
}
}
}
}else{

opp.Sales_Target__c = null;
Officer_Code__c ofCode1;
List<Sales_Target__c> newSTList1;
System.debug('===In decrement block===='+oldOpp.Officer_Code__c);
if(oldOpp.Officer_Code__c != null)
ofCode1 = offCodeMap.get(oldOpp.Officer_Code__c);
System.debug('===In decrement block2===='+ofCode1 );
if(ofCode1 != null)
newSTList1 = offCodeToSalesTarget.get(ofCode1.Officer_Code__c);
System.debug('===In decrement block3===='+newSTList1 );
if(newSTList1 != null){
for(Sales_Target__c st : newSTList1){
if(oldopp.Status__c == CommonSettings__c.getInstance('Closed Won').Value__c){// make sure config value is always present
if(oldopp.Product_Category__c == 'Loans'){
st.Actual_Number_of_Sales__c--;
}else{
st.Actual_Number_of_Sales_Non_Lending__c--;
}

stUpdateList.add(st);
}
}
}
}
}else{
opp.Sales_Target__c = null;
if(oldOpp.Sales_Target__c!=null && oldOpp.Status__c=='Closed Won' && oldOpp.Count_Against_Targets__c==true){
decOriginatedList.add(oldOpp.Sales_Target__c);
decSaleOpp.add(oldOpp);
if(oldOpp.Referred_To__c!=null && oldOpp.Referred_To__c!=oldOpp.Officer_Code__c)
decReferredList.add(oldOpp.Sales_Target__c);
}
}
}else if(opp.Status__c!=oldOpp.Status__c){
if(opp.Sales_Target__c!=null && opp.Count_Against_Targets__c==true){
if(opp.Status__c == 'Closed Won'){
Sales_Target__c stRec = stRecords.get(opp.Sales_Target__c);
//stRec.Actual_Number_of_Sales__c++;
if(opp.Product_Category__c == 'Loans'){
stRec.Actual_Number_of_Sales__c++;
}else{
stRec.Actual_Number_of_Sales_Non_Lending__c++;
}
if(opp.Referred_To__c!=null && opp.Referred_To__c!=opp.Officer_Code__c)
stRec.Actual_Number_of_Sales_Referred_By__c++;

stUpdateList.add(stRec);
}else if(oldOpp.Status__c == 'Closed Won'){
Sales_Target__c stRec = stRecords.get(opp.Sales_Target__c);
if(opp.Product_Category__c == 'Loans'){
stRec.Actual_Number_of_Sales__c--;
}else{
stRec.Actual_Number_of_Sales_Non_Lending__c--;
}
stUpdateList.add(stRec);
}else{
decOriginatedList.add(opp.Sales_Target__c);
decSaleOpp.add(oldOpp);
if(opp.Referred_To__c!=null && opp.Referred_To__c!=opp.Officer_Code__c)
decReferredList.add(opp.Sales_Target__c);
}
}
}else if(opp.Referred_To__c!=oldOpp.Referred_To__c){
if(opp.Status__c == 'Closed Won' && opp.Sales_Target__c!=null && opp.Count_Against_Targets__c==true){
Sales_Target__c stRec = stRecords.get(opp.Sales_Target__c);
if(opp.Referred_To__c!=null && opp.Referred_To__c!=opp.Officer_Code__c && oldOpp.Referred_To__c==null){
stRec.Actual_Number_of_Sales_Referred_By__c++;
stUpdateList.add(stRec);
}else if(opp.Referred_To__c==null && oldOpp.Referred_To__c!=null && oldOpp.Referred_To__c!=oldOpp.Officer_Code__c){
if(stRec != null){
stRec.Actual_Number_of_Sales_Referred_By__c--;
stUpdateList.add(stRec);
}
}
}
}else{
System.debug('else--------');
if(opp.Status__c == 'Closed Won'){
Sales_Target__c stRec = stRecords.get(opp.Sales_Target__c);
if(stRec != null){
if(opp.Product_Category__c == 'Loans'){
if(oldOpp.Product_Category__c != 'Loans'){
stRec.Actual_Number_of_Sales_Non_Lending__c--;
stRec.Actual_Number_of_Sales__c++;
stUpdateList.add(stRec);
}
}else{
if(oldOpp.Product_Category__c == 'Loans'){
stRec.Actual_Number_of_Sales_Non_Lending__c++;
stRec.Actual_Number_of_Sales__c--;
stUpdateList.add(stRec);
}
}
}
}
}
}
}

if(stUpdateList.size() > 0)
update stUpdateList;

map<Id, Sales_Target__c> targetRecords = new map<Id, Sales_Target__c>([Select Id, Target_Period_Start__c, Target_Period_End__c, Actual_Number_of_Sales__c, Actual_Number_of_Sales_Non_Lending__c, Officer_Code__c,
Actual_Number_of_Sales_Referred_By__c from Sales_Target__c where Id IN :decOriginatedList OR Id IN :decReferredList]);

for(Sales_Opportunity__c so: decSaleOpp){
if(so.Product_Category__c == 'Loans'){
targetRecords.get(so.Sales_Target__c).Actual_Number_of_Sales__c--;
}else{
targetRecords.get(so.Sales_Target__c).Actual_Number_of_Sales_Non_Lending__c--;
}
}

for(Id stId: decReferredList)
targetRecords.get(stId).Actual_Number_of_Sales_Referred_By__c--;

update targetRecords.values();
}

 

}