trigger ReceiptCommissionTrigger on i360__Receipt__c (before delete, after insert, before update){ i360.triggerBypass.AllTriggers = true; private Id rep1; private Decimal rep1ComLeft; private Id rep2; private Decimal rep2ComLeft; private Id saleId; private Id recId; private Id processor; private Id sarah; private Boolean twoReps = false; private List commsForInsert = new List(); private Map AWOStaff = new Map(); private Map StaffComs = new Map(); Date deployDate = Date.newInstance(2016, 08, 01); for(i360__Receipt__c receipt : trigger.isDelete ? trigger.old : trigger.new){ if(trigger.isDelete){ List commsForCheck = new List(); commsForCheck.addAll([SELECT Id FROM i361__Commission__c WHERE Receipt_Adjustment__c =: receipt.Id]); for(i361__Commission__c commForCheck : commsForCheck){ delete commForCheck; } break; } if(receipt.i360__Type__c == 'Credit' || receipt.i360__Type__c == 'Conditional Credit' || receipt.i360__Type__c == 'Settlement Balance Adjustment'){ List coms = [SELECT Id FROM i361__Commission__c WHERE Receipt_Adjustment__c =: receipt.Id]; for(i361__Commission__c com : coms){ delete com; } continue; } i360__Sale__c sale = [ SELECT Id, Processor__c, i360__Balance_Due__c, Insurance_Job__c, i360__Sold_Price__c, i360__Sales_Rep_1__c, i360__Sales_Rep_2__c, i360__Appointment__c, i360__Status__c, i361__Commission_Basis__c, i360__Sold_On__c, Insurance_Status__c, i360__Market_Segment__c, Rep1_Com_Left__c, Rep2_Com_Left__c FROM i360__Sale__c WHERE Id =: receipt.i360__Sale__c ]; if(sale.i360__Market_Segment__c == 'Commercial'){ continue; } saleId = sale.Id; recId = receipt.Id; String pros = sale.Processor__c; List awos = [ SELECT i360__Calculated_Item_Total__c, Staff__c, Is_AWO__c, AWO_Type__c FROM i360__Sale_Item__c WHERE i360__Sale__c =: sale.Id AND Is_AWO__c = true ]; List comms = [ SELECT i361__Amount__c , i361__Staff_Member__c , Receipt_Adjustment__c FROM i361__Commission__c WHERE i361__Sale__c =: sale.Id ]; if(trigger.isUpdate){ i360__Receipt__c rec = [SELECT Id, i360__Amount__c FROM i360__Receipt__c WHERE Id =: receipt.Id]; Integer i = 0; if(rec.i360__Amount__c != receipt.i360__Amount__c){ for(i361__Commission__c comm : comms){ if(comm.Receipt_Adjustment__c == receipt.Id){ delete comm; } } } else{ return; } } comms = [ SELECT i361__Amount__c , i361__Staff_Member__c , Receipt_Adjustment__c FROM i361__Commission__c WHERE i361__Sale__c =: sale.Id ]; Date commExpDate = Date.newInstance(2016, 01, 01); Boolean isCommercial = [SELECT Project_Type__c FROM i360__Appointment__c WHERE Id =: sale.i360__Appointment__c].Project_Type__c == 'Commercial'; if(sale.i360__Sold_On__c < commExpDate || receipt.i360__Recieved__c < deployDate || isCommercial) break; //Don't make commissions for sales before the deploy date, payments that were received before the deploy date, or for commercial sales. rep1 = sale.i360__Sales_Rep_1__c; if(sale.i360__Sales_rep_2__c != null){ twoReps = true; rep2 = sale.i360__Sales_Rep_2__c; } Id production = [SELECT Id FROM i360__Staff__c WHERE Name = 'Production'].Id; sarah = [SELECT Id FROM i360__Staff__c WHERE Name=: 'Sarah Taafe'].Id; if(sale.Processor__c != null){ processor = [SELECT Id FROM i360__Staff__c WHERE i360__User__c =: sale.Processor__c LIMIT 1].Id; if(processor == 'a0j61000002wPahAAE'){ processor = 'a0j61000003MIr6AAG'; } } Decimal totalComAWO = 0; Decimal totalAWOAmount = 0; for(i360__Sale_Item__c awo : awos){ if(awo.AWO_Type__c == 'Wood' || awo.AWO_Type__c == 'Finance Fee'){ totalAWOAmount += awo.i360__Calculated_Item_Total__c; } else if(awo.AWO_Type__c == 'Conditional'){ totalAWOAmount += awo.i360__Calculated_Item_Total__c; if(AWOStaff.containsKey(processor)){ Decimal temp = AWOStaff.remove(processor); AWOStaff.put(processor, temp + (awo.i360__Calculated_Item_Total__c)); } else{ AWOStaff.put(processor, (awo.i360__Calculated_Item_Total__c)); } if(AWOStaff.containsKey(sarah) && sale.Insurance_Status__c == 'Approved'){ Decimal temp = AWOStaff.remove(sarah); AWOStaff.put(sarah, temp + awo.i360__Calculated_Item_Total__c); } else if(sale.Insurance_Status__c == 'Approved'){ AWOStaff.put(sarah, awo.i360__Calculated_Item_Total__c); } } else if(awo.AWO_Type__c == 'Upgrade'){ totalComAWO += awo.i360__Calculated_Item_Total__c; totalAWOAmount += awo.i360__Calculated_Item_Total__c; if(awo.Staff__c == null){ if(AWOStaff.containsKey(production)){ Decimal temp = AWOStaff.remove(production); AWOStaff.put(production, temp + awo.i360__Calculated_Item_Total__c); } else{ AWOStaff.put(production, awo.i360__Calculated_Item_Total__c); } } else{ if(AWOStaff.containsKey(awo.Staff__c)){ totalAWOAmount += awo.i360__Calculated_Item_Total__c; Decimal temp = AWOStaff.remove(awo.Staff__c); AWOStaff.put(awo.Staff__c, temp + awo.i360__Calculated_Item_Total__c); } else{ AWOStaff.put(awo.Staff__c, awo.i360__Calculated_Item_Total__c); } } } else if(awo.AWO_Type__c == 'Required'){ totalComAWO += awo.i360__Calculated_Item_Total__c; totalAWOAmount += awo.i360__Calculated_Item_Total__c; if(AWOStaff.containsKey(production)){ Decimal temp = AWOStaff.remove(production); AWOStaff.put(production, temp + awo.i360__Calculated_Item_Total__c); } else{ AWOStaff.put(production, awo.i360__Calculated_Item_Total__c); } } } Boolean credit =false; Decimal creditAmount = 0; try{ List creditReceipts = [ SELECT i360__Amount__c FROM i360__Receipt__c WHERE i360__Sale__c =: sale.Id AND ( i360__Type__c =: 'Credit' OR i360__Type__c =: 'Conditional Credit' ) ]; for(i360__Receipt__c creditRecs : creditReceipts){ if(creditRecs.i360__Amount__c > 0){ creditAmount += creditRecs.i360__Amount__c; } else{ creditAmount -= creditRecs.i360__Amount__c; } } credit = true; } catch(Exception e){ } Decimal soldAmount = sale.i360__Sold_Price__c - totalAWOAmount; System.debug('isCredit ' + credit); System.debug('Sold Amount ' + soldAmount); if(credit){ soldAmount -= creditAmount; } System.debug('credit Amount ' + creditAmount); System.debug('Sold Amount2 ' + soldAmount); if(twoReps){ totalComAWO = totalComAWO/2; } for(i361__Commission__c comm : comms){ //get the amount of commissions everyone has gotten already on this sale if(StaffComs.containsKey(comm.i361__Staff_Member__c)){ Decimal temp = StaffComs.remove(comm.i361__Staff_Member__c); StaffComs.put(comm.i361__Staff_Member__c, temp + comm.i361__Amount__c); } else{ StaffComs.put(comm.i361__Staff_Member__c, comm.i361__Amount__c); } } CalculateRepComsLeft(totalComAWO, soldAmount); Decimal leftOverCom; if(StaffComs.containsKey(rep1)){ if(twoReps){ Decimal temp = StaffComs.remove(rep1); if(temp >= (soldAmount*.04)){ StaffComs.put(rep1, temp - (soldAmount*.04)); CalculateAWOComs(receipt.i360__Amount__c*.08, totalComAWO); } else{ StaffComs.put(rep1, temp - (soldAmount*.04)); leftOverCom = CalculateSaleComs(twoReps, temp, soldAmount, receipt.i360__Amount__c); } } else{ Decimal temp = StaffComs.remove(rep1); if(temp >= (soldAmount*.08)){ StaffComs.put(rep1, temp - (soldAmount*.08)); CalculateAWOComs(receipt.i360__Amount__c*.08, totalComAWO); } else{ leftOverCom = CalculateSaleComs(twoReps, temp, soldAmount, receipt.i360__Amount__c); } } } else{ Decimal temp = StaffComs.remove(rep1); leftOverCom = CalculateSaleComs(twoReps, temp, soldAmount, receipt.i360__Amount__c); } if(leftOverCom > 0){ CalculateAWOComs(leftOverCom, totalComAWO); } insert commsForInsert; sale.Rep1_Com_Left__c = rep1ComLeft; if(twoReps){ sale.Rep2_Com_Left__c = rep2ComLeft; } update sale; ClearVariables(); } private Decimal CalculateSaleComs(Boolean twoReps, Decimal comsPaid, Decimal saleAmount, Decimal receiptAmount){ if(comsPaid == null){ comsPaid = 0; } Decimal comToPay = 0; Decimal receiptCom; Decimal comMax; Decimal leftOverCom = 0; if(twoReps){ comMax = saleAmount*.04; receiptCom = receiptAmount*.04; if(comMax < (comsPaid + receiptCom)){ comToPay = comMax - comsPaid; leftOverCom = (comsPaid + receiptCom) - comMax; } else{ comToPay = receiptCom; } createCommission(rep1, comToPay); createCommission(rep2, comToPay); rep1ComLeft -= comToPay; rep2ComLeft -= comToPay; } else{ comMax = saleAmount*.08; rep1ComLeft = comMax - comsPaid; receiptCom = receiptAmount*.08; if(comMax < (comsPaid + receiptCom)){ comToPay = comMax - comsPaid; leftOverCom = (comsPaid + receiptCom) - comMax; } else{ comToPay = receiptCom; } createCommission(rep1, comToPay); rep1ComLeft -= comToPay; } return leftOverCom; } private void CalculateAWOComs(Decimal totalComToPay, Decimal repAWOCom){ Integer numStaff = AWOStaff.size(); Decimal repSplit; if(twoReps){ numStaff += 2; repSplit = .02; } else{ numStaff++; repSplit = .04; } Decimal comToPay = totalComToPay/numStaff; Decimal staffComMax; Decimal staffComPaid; if(!AWOStaff.containsKey(rep1) && repAWOCom > 0){ staffComMax = repAWOCom*repSplit; if(StaffComs.containsKey(rep1)){ staffComPaid = StaffComs.remove(rep1); } else{ staffComPaid = 0; } if(staffComPaid == staffComMax){ if(numStaff > 1){ numStaff--; } comToPay = totalComToPay/numStaff; } else if((comToPay + staffComPaid) > staffComMax){ CreateCommission(rep1, (staffComMax - staffComPaid)); rep1ComLeft -= staffComMax - staffComPaid; } else{ CreateCommission(rep1, comToPay); rep1ComLeft -= comToPay; } } if(!AWOStaff.containsKey(rep2) && twoReps && repAWOCom > 0){ staffComMax = repAWOCom*repSplit; if(StaffComs.containsKey(rep2)){ staffComPaid = StaffComs.remove(rep2); } else{ staffComPaid = 0; } if(staffComPaid == staffComMax){ if(numStaff > 1){ numStaff--; } comToPay = totalComToPay/numStaff; } else if((comToPay + staffComPaid) > staffComMax){ CreateCommission(rep2, (staffComMax - staffComPaid)); rep2ComLeft -= staffComMax - staffComPaid; } else{ CreateCommission(rep2, comToPay); rep2ComLeft -= comToPay; } } for(Id staffId : AWOStaff.keySet()){ comToPay = totalComToPay/numStaff; if(staffId == rep1 || staffId == rep2){ staffComMax = (AWOStaff.get(staffId)*.04) + (repAWOCom*repSplit); comToPay = comToPay*2; } else if(staffId == processor){ staffComMax = AWOStaff.get(staffId)*.08; } else if(staffId == sarah){ staffComMax = AWOStaff.get(staffId)*.0005; } else{ staffComMax = AWOStaff.get(staffId)*.04; } if(StaffComs.containsKey(staffId)){ staffComPaid = StaffComs.remove(staffId); } else{ staffComPaid = 0; } if(staffComPaid == staffComMax){ if(numStaff > 1){ numStaff--; } comToPay = totalComToPay/numStaff; continue; } else if((comToPay + staffComPaid) > staffComMax){ CreateCommission(staffId, (staffComMax - staffComPaid)); if(staffId == rep1){ rep1ComLeft -= staffComMax - staffComPaid; }if(staffId == rep2){ rep2ComLeft -= staffComMax - staffComPaid; } } else{ CreateCommission(staffId, comToPay); if(staffId == rep1){ rep1ComLeft -= comToPay; } if(twoReps && staffId == rep2){ rep2ComLeft -= comToPay; } } } } public void CreateCommission(Id staffId, Decimal comToPay){ i361__Commission__c comm = new i361__Commission__c(); i360__Sale__c sale = [SELECT Id, Name, i360__Appointment__c, i360__Status__c FROM i360__Sale__c WHERE Id =: saleId]; i360__Appointment__c appt = [SELECT Id, i360__Prospect__c FROM i360__Appointment__c WHERE Id =: sale.i360__Appointment__c]; i360__Prospect__c prospect = [SELECT Id FROM i360__Prospect__c WHERE Id =: appt.i360__Prospect__c]; i360__Lead_Source__c lsrc = [SELECT Id FROM i360__Lead_Source__c WHERE i360__Prospect__c =: prospect.Id LIMIT 1]; comm.Receipt_Adjustment__c = recId; comm.i361__Prospect__c = appt.i360__Prospect__c; comm.i361__Sale__c = sale.Id; comm.i361__Staff_Member__c = staffId; comm.i361__Lead_Source__c = lsrc.Id; comm.i361__Sale_Status__c = sale.i360__Status__c; comm.i361__Appointment__c = appt.Id; comm.i361__Amount__c = comToPay; commsForInsert.add(comm); } private void CalculateRepComsLeft(Decimal totalComAWO, Decimal soldAmount){ if(twoReps){ rep1ComLeft = soldAmount*.04; rep1ComLeft += totalComAWO*.02; rep2ComLeft = rep1ComLeft; if(AWOStaff.containsKey(rep1)){ rep1ComLeft += AWOStaff.get(rep1)*.04; } if(AWOStaff.containsKey(rep2)){ rep2ComLeft += AWOStaff.get(rep2)*.04; } if(StaffComs.containsKey(rep1)){ rep1ComLeft -= StaffComs.get(rep1); } if(StaffComs.containsKey(rep2)){ rep2ComLeft -= StaffComs.get(rep2); } }else{ rep1ComLeft = soldAmount*.08; rep1ComLeft += totalComAWO*.04; if(AWOStaff.containsKey(rep1)){ rep1ComLeft += AWOStaff.get(rep1)*.04; } if(StaffComs.containsKey(rep1)){ rep1ComLeft -= StaffComs.get(rep1); } } } public void ClearVariables(){ processor = null; rep1 = null; rep2 = null; saleId = null; recId = null; twoReps = false; commsForInsert.clear(); AWOStaff.clear(); StaffComs.clear(); } }