1

I have a trigger that needs to share a commission split if they are the Commission_Correction_User on the Rep_1_Production_Site_Rep_v3__c. This is needed because they are Partner users, and will have to login through a portal. The problem that I am having right now is that instead of sharing with just the 1 user on the Rep_1_Production_Site_Rep_v3__c(Account), it is sharing with all of the Groups that is in my groupMemberMap.

Rep_1_Production_Site_Rep_v3__c is an Account and on that account is Commission_Correction_User, which is a User and that user is associated with a Group. So if Rep_1_Production_Site_Rep_v3__c is a partner user, go in and grab that User and share it with them.

if(groupMemberMap.containsKey(grpA)){ 

This line is the issue, groupMemberMap will always have grpA (My AccountKey.keySet().. I can't wrap my head around how else to do it

-- I have multiple maps in play here

accountMap - Multidimensional map keyed to Commission_Correction_User.

Rep1SetMap - Holds the Rep_1_Production_Site_Rep_v3__c from the split. I did this in order to see if the Rep_1_Production_Site_Rep_v3__c is actually a partner user.

groupMemberMap - Holds all of the UserOrGroupIds

Here is my entire code http://pastebin.com/TjTNTShn, It's large and I don't think it is needed. In the end does anyone see why my code is sharing with all of the groups, and not just the one on the Rep_1 Account?

Map <Id, Account > Rep1SetMap = new Map <Id, Account>([Select Id, Commission_Correction_User__c, 
    Name from Account where isPartner = true and Commission_Correction_User__c != null and ID in:Rep1Set]);               

for(Split__c s: Trigger.new){
    if(Rep1SetMap.containsKey(s.Rep_1_Production_Site_Rep_v3__c)){                  
        for(Id grpA : accountMap.keySet()){
            if(groupMemberMap.containsKey(grpA)){                  
                try{                    
                    GroupMember gMember = groupMemberMap.get(grpA);             
                    splitSharesToInsert.add(new Split__Share(ParentId = s.id , 
                        UserOrGroupId = gMember.GroupId, AccessLevel = 'Read'));

                    if(!splitSharesToInsert.isEmpty()){             
                        Database.Saveresult[] rsr = Database.insert(splitSharesToInsert, false);                 
                    }           
                }catch (NullPointerException e){ 
                    System.debug('NullPointerException' + e);                
                }
            }
        }
    }
}  
4
  • As I understand your question, you're attempting to create a custom sharing group (or modify one) using Apex Sharing for a specific opportunity using the intersection of existing sharing groups. Is that correct? The problem you're having is that when you add a Partner Portal User, the Partner User gets added to all of your existing Sharing Group instead of creating a Custom Sharing Group for the Opportunity? Is that a good summary?
    – crmprogdev
    Commented Jun 12, 2014 at 17:59
  • No, every group in my org gets added to the split Sharing. groupMemberMap holds all my groups. The only person that should be added is the person on the Rep_1_Production ... I'll edit my question a little bit
    – EricSSH
    Commented Jun 12, 2014 at 18:08
  • It looks like you are looping through every group in the database on line 32, which is likely where your problem resides.
    – greenstork
    Commented Jun 12, 2014 at 18:17
  • @greenstork That part is sharing with the user group that creates the split. That part is working, now I'm trying to share with the User on the Rep 1 Account because they will also be Partner users and won't have visibility of the split
    – EricSSH
    Commented Jun 12, 2014 at 18:20

1 Answer 1

0

I agree that part of your problem lies here:

   for(Id grpA : accountMap.keySet()){

So, you need to be looking at Opportunities that matching this query:

 Rep1SetMap = new Map < id, Account > ([Select id, Commission_Correction_User__c, Name from Account where isPartner = true and Commission_Correction_User__c != null and ID in:Rep1Set]);               

And then adding Commission_Correction_User__c to the Sharing Group that matches your criteria.

I suggest you create a keyset from the query above to help with this. I'm assuming that's not GrpA since I don't see it in the code you've posted. That's where you need to find your intersection of ID's to work with.

4
  • I'm doing this on Commissions Splits, it is a custom object that was created. That shouldn't be an issue correct?
    – EricSSH
    Commented Jun 12, 2014 at 19:10
  • No, it shouldn't. My reference to Opps was because I knew that was the basis. Whatever you're using to manage it is immaterial. The point is that you need to find an intersection and I didn't see a keyset for the new map to pull the users you need from that map to add when doing your splits.
    – crmprogdev
    Commented Jun 12, 2014 at 20:34
  • I've been staring at this code for awhile now, and I relized I don't even need accountMap. I'm getting everything I need from Rep1SetMap. I need to figure out how to manipulate GroupMemberMap and Rep1SetMap
    – EricSSH
    Commented Jun 12, 2014 at 20:43
  • Happens to all of us. Glad I could help point you towards solving your issue. :)
    – crmprogdev
    Commented Jun 12, 2014 at 20:47

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .