• Phuc Nguyen 18
  • SMARTIE
  • 570 Points
  • Member since 2019

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 89
    Questions
  • 122
    Replies
I am wondering how do I cover code that is related to cusotm metadata.
class:
public with sharing class ApplicationServices {

    public static final String APPLICATION_STATUS_DRAFT = 'Draft';
    public string coloTemplateName;

    public static List<ApplicationProjectTemplateConfig__mdt> templateConfigs = [SELECT Id,ApplicationCriteria__c,ProjectTemplateName__c from ApplicationProjectTemplateConfig__mdt];
     
    public static Map<String, SObject> templatesByNameMap {
        get{
            if(templatesByNameMap == null){
                list<Project_Template__c> templates = [Select Id, Name FROM Project_Template__c WHERE 
Active__c =: true];
                templatesByNameMap = PGE_EDSUtils.createMapByStringFieldSingleObject(templates, 'Name');
            }

            return templatesByNameMap;
        }
        private set;
    }

    public static void handleSubmit(Map<Id, Application__c> applications) {
        // Only before update
        if( !Trigger.isBefore || !Trigger.isUpdate ) {
            return;
        }
      
        // Determine the projects to create, if any
        Map<Application__c, Project__c> projectsToCreate = new Map<Application__c, Project__c>();
        for(Application__c application : applications.values()) {
            boolean docreate = shouldCreateColoProject(application);
            if( docreate ) {
                Project__c project = createColoProject(application);
                   if(project != null){
                        projectsToCreate.put(application, project);
                    }
            }
        }


///no code coverage
        if(projectsToCreate.size() > 0) {
            insert projectsToCreate.values();
            for(Application__c application : projectsToCreate.keySet()) {
                Project__c project = projectsToCreate.get(application);
                application.Project__c = project.Id;
                application.Date_Submitted__c = application.Date_Submitted__c == null
                                                ? System.today()
                                                : application.Date_Submitted__c ;
            }
        }
    }

///no code coverage
     public static String coloTemplateName {
        get {
            if(coloTemplateName == null) {
                coloTemplateName = AppConfig.getAppConfigValue('COL_PROJECT_TEMPLATE');
            }
            return coloTemplateName;
        }
        private set;
    }

///no code coverage
    public static Id coloTemplateId {
        get {
            if(coloTemplateId == null) {
                if(String.isNotEmpty(coloTemplateName)) {
                    Project_Template__c template = [SELECT Id 
                                                                 FROM Project_Template__c
                                                                 WHERE Name =: coloTemplateName LIMIT 1];
                    coloTemplateId = template.Id;
                }
            }
            return coloTemplateId;
        }
        private set;
    }


    public static Boolean shouldCreateColoProject(Application__c application) {
        return !isDraft(application) && !hasProject(application);
    }

    private static Boolean isDraft(Application__c application) {
        return application.Application_Status__c == APPLICATION_STATUS_DRAFT;
    }

    private static Boolean hasProject(Application__c application) {
        return application.Project__c != null;
    }

  
    public static Project__c createColoProject(Application__c application) {
        Project__c project = null;
        string projectTemplate;
   
        for( ApplicationProjectTemplateConfig__mdt  config :templateConfigs){
            boolean templatematch = BooleanLogicEvaluation.evaluate(application , config.ApplicationCriteria__c);
     
            if(templatematch){
                projectTemplate = config.ProjectTemplateName__c;
                break;
            }
         } 
      
         if (projectTemplate!=null && templatesByNameMap.containsKey(projectTemplate)){
           // no code coverage
            project = new Project__c(
                AccountSite__c =  application.AccountSite__c 
                OwnerId = application.ownerId,
                application__c = application.Id,
                ProjectTemplate__c = templatesByNameMap.get(projectTemplate).id,
                Project_Start_Date_A__c = System.today()
            );
         }

        return project;
    }

}
Test Class
static testMethod void testApplicationBasicCRUD() {
    	AccountSite__c  as = [SELECT Id FROM AccountSite__c LIMIT 1];
        Test.startTest();

        Application__c application = new Application__c(
            Application_Type__c = 'NewAgreement',
            Scope_of_Work__c = 'Test Setup',
            AccountSite__c = as.Id
        );
        insert application;
        System.assert(application.Id != null, 'Successfully created application');

        // Update
        application.Tenant_AccountSite_Name__c = ' Mountain';
        application.Tenant_AccountSite_Number__c = '123';
        update application;
        System.assert(application.Id != null, 'Successfully updates application');

        // Delete
        delete application;
        System.assert(true, 'Successfully deleted application');

        Test.stopTest();
    }

    static testMethod void testAutomaticProjectCreation() {
    	AccountSite__c  as= [SELECT Id FROM AccountSite__c  LIMIT 1];

        Test.startTest();
        Application__c application = new Application__c(
            Application_Type__c = 'NewAgreement',
            Scope_of_Work__c = 'Test Setup',
            Date_Submitted__c = System.today(),
            AccountSite__c = as.Id
        );
        insert application;

        application.Application_Status__c = 'Feasibility';
        application.Approval_Status__c = 'Pending';
        update application;
        
        application = [SELECT id, Project__c,  Date_Submitted__c FROM Application__c where id=: application.Id];
        System.assertEquals(System.today(), application.Date_Submitted__c, 'Date Submitted Set');
     
        Test.stopTest();
    }


    @testSetup
    private static void createTestData() {

       
        AccountSite__c as = new AccountSite__c (
            Name = 'Casterly Rock'
        );
        insert as;

      
        Project_Template__c template = new Project_Template__c (
            Name = 'Collocation',
            Active__c = true,
            Object__c  = 'Project__c',
            Project_Extension_Objects__c = 'Coll_Project__c'
        );
        insert template;

        Collocation__c collocation = new Collocation__c (
            Name = '100ft',
            AccountSite__c = as.Id
        );
        insert collocation;

        Application__c application = new Application__c (
            Application_Type__c = 'NewAgreement',
            Scope_of_Work__c = 'Test Setup',
            AccountSite__c = as.Id
        );
        insert application;

    }


}


 
I am copying contentdocumentlink to another object
cdl.ShareType = 'I';
cdl.Visibility = 'InternalUsers';

But the visibilty when I look at the fileis 'All Users', why is that?  I need it to be private.
P

 
So in this example for inserting Content docuemnt link.  How can I limit access to a specifc user group or profile?  And how could I use a CMT so that an admin can update or add groups so that the sahring is not hard coded in the apex?
Thanks
//Get attachment
Attachment attach = [SELECT Id, Name, Body, ContentType, ParentId From Attachment LIMIT 1];
 
//Insert ContentVersion
ContentVersion cVersion = new ContentVersion();
cVersion.ContentLocation = 'S';
cVersion.PathOnClient = attach.Name;
cVersion.Origin = 'H';
cVersion.OwnerId = attach.OwnerId;
cVersion.Title = attach.Name;
cVersion.VersionData = attach.Body;
Insert cVersion;
 
//After saved the Content Verison, get the ContentDocumentId
Id conDocument = [SELECT ContentDocumentId FROM ContentVersion WHERE Id =:cVersion.Id].ContentDocumentId;
 
//Insert ContentDocumentLink
ContentDocumentLink cDocLink = new ContentDocumentLink();
cDocLink.ContentDocumentId = conDocument;//Add ContentDocumentId
cDocLink.LinkedEntityId = attach.ParentId;//Add attachment parentId
cDocLink.ShareType = 'I';
cDocLink.Visibility = 'InternalUsers';
Insert cDocLink;
Can anyone assist me with getting coverage for this test class
global class AttachmentTriggerHandler r{
    
    Map<Id, List<ContentDocumentLink>> linkMap = new Map<Id, List<ContentDocumentLink>>();
    Map<String, Directory__c> directoryMap = new Map<String, Directory__c>();
    List<ContentDocumentLink> cdl_List = new List<ContentDocumentLink>();
    public ContentDocumentLink cdl = New ContentDocumentLink();
    List<Attachment__c> categoryvals = new List<Attachment__c>();
    public String parentId;
    public String catvalue;
    public String folderparentId;
    public string parentObjectType;
    public Map<Id,Programme__c> ProgrammeMap = new Map<Id,Programme__c>();
    public Map<Id,Permit__c>  PermitMap  = new Map<Id,Permit__c>();

    global override void bulkBeforeExtended() {
        if( Trigger.isUpdate ){
            List<Id> docIds = new List<Id>();
            List<String> parentIds = new List<String>();
            List<Id> progRecordIds = new List<Id>();
            List<Id> perRecordIds = new List<Id>();
                   
            for( Attachment__c attrecord : ( List<Attachment__c> ) Trigger.new ){
                Id recId = Id.valueOf(attrecord.Parent_ID__c ); 
                parentObjectType = String.valueOf( recId.getSObjectType());

                if(parentObjectType == 'Programme__c' ){
                    progRecordIds.add(attrecord.Parent_ID__c);
                }
                if(parentObjectType == 'Permit__c' ){
                    perRecordIds.add(attrecord.Parent_ID__c);
                }
            }
            if (!progRecordIds.isEmpty()) {
                programmeMap.putall([Select Project__c from Programme__c WHERE Id =: ProgRecordIds]);  
            }
            if (!perRecordIds.isEmpty()) {
                permitMap.putall([Select Project__c from Permit__c WHERE Id =: perRecordIds]); 
            }
            if (!jobRecordIds.isEmpty()) {
                jobMap.putall([Select Project__c from Job__c WHERE Id =: JobRecordIds]);
            }
          
            for( Attachment__c record : ( List<Attachment__c> ) Trigger.new ){
                Id docId = record.ContentDocumentId__c;
                    parentId = record.Parent_ID__c ;
                    Id recId = Id.valueOf(record.Parent_ID__c ); 
                    parentObjectType = String.valueOf( recId.getSObjectType() );
       
                    if( ProgrammeMap.containsKey(record.Parent_ID__c)){ 
                        for(Programme__c prog :ProgrammeMap.values()){
                            parentId = prog.Project__c;
                        }
                    }
                    if( PermitMap.containsKey(record.Parent_ID__c)){ 
                        parentId = record.Proj__c;
                        record.sobject__c ='Project';
                    }
                    }
                 
                    if( docId != null ){    
                        docIds.add( docId );
                    }
                  
                    if( parentId != null ){    
                        parentIds.add( parentId );
                    } 
                  
                    if( record.sobject__c != null ){    
                        categoryvals.add( record );
                    }       
            }

            list<Directory__c> dirs = [
                SELECT id,Directory_Template__c,Name,ParentId__c,Sobject__c,
                    (Select Id,Name, Directory__c, Folder_Template__c,Parent_File_Folder__c FROM File_Folders__r ORDER BY Name)
                FROM Directory__c 
                WHERE ParentId__c IN: parentIds
            ];
           
            if( !dirs.isEmpty() ){
                for( Directory__c dir : dirs ){
                    this.directoryMap.put( dir.ParentId__c, dir );
                }
            }

            List<ContentDocumentLink> linkList = [ SELECT Id, ContentDocumentId, LinkedEntityId FROM ContentDocumentLink WHERE ContentDocumentId IN: docIds ];
            if( !linkList.isEmpty() ){
                for( ContentDocumentLink link : linkList ){
                    List<ContentDocumentLink> links = this.linkMap.containsKey( link.ContentDocumentId )
                        ? this.linkMap.get( link.ContentDocumentId ) : new List<ContentDocumentLink>();
                    links.add( link );
                    this.linkMap.put( link.ContentDocumentId, links );
                }
            }
        }
    }
    global override void bulkAfterExtended() {
    }

    global override void beforeInsertExtended(SObject so) {
        Attachment__c newAttachment = ( Attachment__c ) so;
        this.getObjectType(newAttachment);
    }
    global override void beforeUpdateExtended(SObject oldso, SObject newso) {
      	Attachment__c newAttachment = ( Attachment__c ) newSo;
        folderparentId = newAttachment.Parent_Id__c;
        Id recId = Id.valueOf(newAttachment.Parent_ID__c );
        parentObjectType = String.valueOf( recId.getSObjectType() );
        this.getParentObjectType(parentObjectType,newAttachment);      

        if( directoryMap.containsKey( folderparentId)){           
            Directory__c dir = this.directoryMap.get( folderparentId );
            List<File_Folder__c> folders = dir.File_Folders__r;
            system.debug('dir.File_Folders__r '+ dir.File_Folders__r);
            List<ContentDocumentLink> links = this.linkMap.get( newAttachment.ContentDocumentId__c );

            for (ContentDocumentLink cont : links ){
                for (File_Folder__c folder: folders ){
                    if(newattachment.Document_Type__c == folder.name ){
                        ContentDocumentLink cdl = new ContentDocumentLink();
                        cdl.LinkedEntityId = folder.Id;
                        cdl.ContentDocumentId = cont.ContentDocumentId;
                        cdl.ShareType = 'V';
                        cdl.Visibility = 'AllUsers';
                        newAttachment.File_Folder__c = folder.Id;
                        cdl_List.add(cdl);
                        break;
                    }
                }
            }
        }
    }
    global override void afterUpdateExtended(SObject oldso, SObject newso) {}
    global override void afterInsertExtended(SObject newso) {} 
    global override void andFinallyExtended() {
    
      if (!Trigger.isDelete) {
            if (Trigger.isUpdate) {
                try {
                    if (cdl_List.size() > 0) {
                        insert cdl_List;
                    }
                } catch (Exception e) {
                    System.debug('Error: ' + e.getMessage());
                }
            }
        }

        if (!Trigger.isDelete) {
            if (Trigger.isInsert) {
                try {
                    if (categoryvals.size() > 0) {
                        update categoryvals;
                    }
                } catch (Exception e) {
                    System.debug('Error: ' + e.getMessage());
                }
            }
        }

    }

    private void getParentObjectType(String tempParentObjectType,Attachment__c newAttachment){
   
        if( tempParentObjectType == 'Programme__c'  ){
            folderparentId = parentId;
            newAttachment.sobject__c='Programme';
        }
        else{
            folderparentId = parentId;
            newAttachment.sobject__c='Project';
        }
    }

    private void getObjectType(Attachment__c newAttachment){
        if( this.linkMap.containsKey( newAttachment.ContentDocumentId__c ) ){
            List<ContentDocumentLink> links = this.linkMap.get( newAttachment.ContentDocumentId__c );
            if( !links.isEmpty() ){
                for( ContentDocumentLink link : links ){
                    String objectType = String.valueOf( link.LinkedEntityId.getSObjectType() );
                    Directory__c dir = this.directoryMap.containsKey( link.LinkedEntityId )
                        ? this.directoryMap.get( link.LinkedEntityId ) : null;
                    if( dir != null ){
                        switch on ( objectType ){
                            when 'Programme__c' {
                                newAttachment.Programme__c = link.LinkedEntityId;
                            }
         
                            when 'Permit__c' {
                               newAttachment.Permit__c = link.LinkedEntityId;
                            }
                            
                        }
                    }
                }
            }
        }
    }
}

Test Class
@IsTest
private class AttachmentTriggerHandlerTest {
    @TestSetup
    static void setupTestData() {
        Directory_Template__c dirTemplate = new Directory_Template__c(
            Name = 'Directory Template Test',
            Sobject__c = 'Project',
            Active__c = true
        );
        insert dirTemplate;
    }

    @isTest
    private static void TestTriggerFunctions(){

        List<Directory_Template__c> dirTemplates = [
            SELECT Id
            FROM Directory_Template__c
        ];
        
        System.assertEquals( 1, dirTemplates.size(), '1 template found' );

        Programme__c prog = new Programme__c(
                Name = 'Test Program',
                Operator__c = 'MBNL',
                Directory_Template__c = dirTemplates[ 0 ].Id
        );
        insert prog;

        Attachment attach = new Attachment();       
        attach.Name='Test Attachment';
        Blob bodyBlob=Blob.valueOf('Test Attachment Body');
        attach.body=bodyBlob;
        attach.parentId=prog.id;
        insert attach;
        
        List<Attachment> attachments=[select id, name from Attachment where parent.id=:prog.id];
        System.assertEquals(1, attachments.size());

        Blob contentData = Blob.valueOf( 'Test File' );
        String documentName = 'testfile.txt';

        ContentVersion newDocument = new ContentVersion(
            Title = documentName,
            VersionData = contentData,
            PathOnClient = documentName
        );

        insert newDocument;

        List<ContentVersion> versionVerify = [
            SELECT Id, ContentDocumentId
            FROM ContentVersion
            WHERE Id =: newDocument.Id
        ];
        System.assertEquals( 1, versionVerify.size() );

        List<ContentDocument> documents = [
            SELECT Id
            FROM ContentDocument
            WHERE Id =: versionVerify[ 0 ].ContentDocumentId
        ];

        System.assertEquals( 1, documents.size() );

        ContentDocumentLink newLink = new ContentDocumentLink(
            LinkedEntityId = projects[ 0 ].Id,
            ContentDocumentId = documents[ 0 ].Id,
            ShareType = 'V',
            Visibility = 'AllUsers'
        );
        insert newLink;
    }
}

 
        
 
I think I am iterating ov erht same list twice.  Will someone help me streamline the code.  Can I get the second for loop inside the first and be efficient?
Attachment__c newAttachment = (Attachment__c ) so;
        String objectType;
        List<Plan__c > palnId = new List<Plan__c>();
        Map<String,String> planMap = new Map<String,String>();
        
        if( this.linkMap.containsKey( newAttachment.ContentDocumentId__c ) ){
            List<ContentDocumentLink> links = this.linkMap.get( newAttachment.ContentDocumentId__c );
            if( !links.isEmpty() ){
                for( ContentDocumentLink link : links ){
                    objectType = String.valueOf( link.LinkedEntityId.getSObjectType() );
                    switch on ( objectType ){
                        when 'Activity__c' {
                            newAttachment.Activity__c= link.LinkedEntityId;
                        }
                        when 'Project__c' {
                            newAttachment.Proj__c= link.LinkedEntityId;
                        }
                    }
                }
            }
    
            List<Plan__c> plans= new List<Plan__c>();

            for (ContentDocumentLink cont : links ){                    
                if(newAttachment.Activity__c != null || newAttachment.Proj__c != null){
                    ContentDocumentLink cdl = new ContentDocumentLink();
                    cdl.LinkedEntityId = parentId;
                    cdl.ContentDocumentId = cont.ContentDocumentId;
                    cdl.ShareType = 'V';
                    cdl.Visibility = 'AllUsers';
                    cdl_List.add(cdl);
                    break;
                }
            }
        }

 
I have an class where I have a Class level Variable
private static final Map<Id,Customer__c> CUSTOMERTEMP;

In my method
global override void bulkAfterExtended(){  
if (!CustVal.isEmpty()) {
                CUSTOMERTEMP = new Map<Id,Customer_c>([SELECT Id, Name,Status__c FROM Customer__c);
                }

When I go to deploy I get a 
"Final Memebers can only be assigned in thier declaration, init blocks,or constructor: CUSTOMERTEMP"

I have other private static final with no issue but they are not maps.  What am doing wrong?
Thanks,
P
I am getting an errro with my code:
Illegal assignment from List<sector__c> to id
What I am trying to do:
When a Candidate is made Primary, the Sector Record's Site Lookup field should get populated with the Site record that is linked with the Candidate record.
 
Map<Id, Sector__c> m_Sectors;
Map<Id, List<Sector__c>> m_sitesToSectors = new Map<Id, List<Sector__c>>();
List<Sector__c> sectorsToUpdate = new List<Sector__c>();

 public void bulkAfter(){{
 if (Trigger.IsUpdate && Trigger.isAfter) {
            for (SObject so : Trigger.New) {
                Candidate__c newCandidate = (Candidate__c) so;
               Candidate__c oldCandidate = (Candidate__c) Trigger.oldMap.get(newCandidate.Id);

if ((newCandidate.Primary_Candidate__c != oldCandidate.Primary_Candidate__c) && 
                     newCandidate.Primary_Candidate__c == true && newCandidate.Site__c != null) {                    candidateIdsPrimary.add(newCandidate.Id);                }

 if (!candidateIds.isEmpty()) {
                m_Sectors = new Map<Id, Sector__c>([SELECT Id,Candidate__c,Site__c FROM Sector__c WHERE Site__c = null AND Candidate__c IN: candidateIdsPrimary]);
            }

if (m_Sectors != null && !m_Sectors.isEmpty()){
                for (Sector__c sect : m_Sectors.values()) {
                    if (!m_sitesToSectors.containsKey(sect.Candidate__c)) {
                        m_sitesToSectors.put(sect.Candidate__c, new List<Sector__c>{sect});
                    }
                    else {
                        m_sitesToSectors.get(sect.Candidate__c).add(sect);
                    }
                }
            }

}

public void afterUpdate( SObject oldSo, SObject newSo ){

Candidate__c newCandidate = (Candidate__c) newSo;
Candidate__c oldCandidate = (Candidate__c) oldSo;

if (m_sitesToSectors.get(newCandidate.Id) != null && !m_sitesToSectors.get(newCandidate.Id).isEmpty()) {
            for (Sector__c sector: m_sitesToSectors.get(newCandidate.Id)) {
                sector.Site__c = m_sitesToSectors.get(newCandidate.Site__c); ---error here
                sectorsToUpdate.add(sector);
            }
        }

}

 
I am trying to create a utility class but it keeps throughing an error.
Here is the original code
List<Directory_Template__c> directorytemplate =
            ([select id,Name from Directory_Template__c where Sobject__c = 'Project' AND Active__c = true limit 1]);
                for (Permit__c proj : (List<Permit__c >) trigger.New){
                    for (Directory_Template__c dir : directorytemplate)
                    {
                        if (dir.Id != null) { 
                            proj.Directory_Template__c = dir.Id; 
                        }
                    }
                }

Here is the utility class
global class ViewUtils {
    
    public static String getDirectory(String objectType){
     
        List<Directory_Template__c> directorytemplate = new List<Directory_Template__c>();
        system.debug('objectType '+ objectType);
            if(objectType  == 'Programme__c'){
                directorytemplate =
                ([select id,Name from Directory_Template__c where Sobject__c = 'Programme' AND Active__c = true limit 1]);
                    for (Programme__c prog : (List<Programme__c >) trigger.New){
                        for (Directory_Template__c dir : directorytemplate)
                        {
                            if (dir.Id != null) { 
                                return prog.Directory_Template__c = dir.Id; 
                            }
                        }
                    }
            } 
            else{
                directorytemplate =
                ([select id,Name from Directory_Template__c where Sobject__c = 'Project' AND Active__c = true limit 1]);
                    for (objectType proj : (List<objectType >) trigger.New){
                        for (Directory_Template__c dir : directorytemplate)
                        {
                            if (dir.Id != null) { 
                                return proj.Directory_Template__c = dir.Id; 
                            }
                        }
                    } 
            }   
        }
    }

So in the original class I am trying this
ViewUtils.getDirectory('Permit__c');

It states that the return statement is missing and that objecttype is invalid.  Is it becasue I am trying to use the Object and I am actaully passing in a string?

Thanks
​​​​​​​P
Happy New Year everyone.
Need some assistance with my class.  Trying to get the SOQL queries outside the for loop if possible.  But in teh query I am using the Id as a filter.  Any thoughts? 
if( Trigger.isInsert ){
            List<Id> docIds = new List<Id>();
            List<String> parentIds = new List<String>();

            for( Attachment__c record : ( List<Attachment__c> ) Trigger.new ){
                Id docId = record.ContentDocumentId__c;
                    parentId = record.Parent_ID__c ;
                    Id recId = Id.valueOf(record.Parent_ID__c ); 
                    String parentObjectType = String.valueOf( recId.getSObjectType());
                        if( parentObjectType == 'Activity__c' ){
                           list<Activity__c> actparentId = [Select id,Project__r.Cust__c  from Activity__c WHERE Id =: parentId];   
                           for(Activity__c act :actparentId){
                                parentId = act.Project__r.Cust__c;
                            }
                        }
                        
                        if( parentObjectType == 'Project__c' ){
                           list<Project__c> projparentId = [Select Cust__c from Project__c WHERE Id =: parentId];   
                           for(Project__c proj :projparentId){
                                parentId = proj.Cust__c;
                            }
                        }
                        
                        if( docId != null ){    
                            docIds.add( docId );
                        }
            }

            List<ContentDocumentLink> linkList = [ SELECT Id, ContentDocumentId, LinkedEntityId FROM ContentDocumentLink WHERE ContentDocumentId IN: docIds ];
            if( !linkList.isEmpty() ){
                for( ContentDocumentLink link : linkList ){
                    List<ContentDocumentLink> links = this.linkMap.containsKey( link.ContentDocumentId )
                        ? this.linkMap.get( link.ContentDocumentId ) : new List<ContentDocumentLink>();
                    links.add( link );
                    this.linkMap.put( link.ContentDocumentId, links );
                }
            }
        
        }

 
Having issue getting map value.  
Template is a lookup field.  If the lookfield has a value where Require_Num__c = true I want the same value on the Activity record to be true also.  There are several templates so I want to only update Activities where the template has the Require_Num__c = true.
I know I have the right map the map size is 1 since I have only set the field to True on one template.  Just not able to select it in the value.  Right now the activity record field is false when it should be true.
Thanks,
if (Trigger.isInsert){
            List<Id> activityIds = new List<Id>();
        
            for (Activity__c act :(List<Activity__c >) trigger.New)
                {
                    activityIds.add(act.Activity_Template__c);

                }

            if(activityIds.size() > 0){
                list<Activity_Template__c> activitytemplate = [Select Name,Id,Require_Num__c
                                    FROM Activity_Template__c 
                                    WHERE Name,Id,Require_Num__c = true
                                    AND Id in : activityIds]; 
                
                atMap = new Map<Boolean,Activity_Template__c>();
                
                for (Activity_Template__c acts : activitytemplate){
                    atMap.put(acts.Name,Id,Require_Num__c,acts);
                }
            }
            system.debug('map size' + atMap.size() );
            for (Activity__c activities : (List<Activity__c >) trigger.New){
                if (atMap.containsKey(activities.Activity_Template__r.Id)){
                    activities.Name,Id,Require_Num__c = true;
                }
            }
        }

 
Hello All,
I have a custom Lookup component  - LWC
I need to ge the filter information for any lookups that has an active filter
Tried using Schema.DescribeFieldResult but no luck.  Anyone know how I can return the filter information?
Thanks,
P
I have a couple questions regarding filtered lookups and LWC. I have a lightning component wrapped in a LWC. On a create page I have a couple filtered lookup fields that are filtered based on values selected on the lightning component create page. I read that filtered lookups are not supported in lightning components and you need a custom lookup component.

So My first question is can I use something like this to resolve my issue: https://sfcure.com/2019/07/06/showing-a-lookup-field-which-respects-with-lookup-filters/

Second. Do I need a separate custom lookup component for each filtered lookup field?
Thanks
P
Hello All,
Wil someone assist me on how to get test coverage for my class?  No coverage at all for 
if( Trigger.isInsert){
        List<String> zips = new List<String>();

        for (Site__c site :(List<Site__c >) trigger.New)
        {
            zips.add(site.Zip_Code__c);
        }
              List<AggregateResult> zipcodes = [SELECT count(Id) zipids,Zip_Code__c zips FROM Site__c where Zip_Code__c in : zips
              GROUP BY Zip_Code__c];
            
                for (Site__c newsite : (List<Site__c> ) trigger.New){

                string fieldtype = newsite.Site_Type__c == 'Field' ? 'F' : 'R';
                
                Map<String,Integer> mapzips = new Map<String,Integer>();

                for(AggregateResult aggResult : zipcodes)
                    {
                        mapzips.put((String)aggResult.get('zips'), (Integer)aggResult.get('zipids'));
                    }
                
                if(mapzips.size()>0){ 
                    for(AggregateResult result :zipcodes)
                        {
                            string sitename = fieldtype;
                            string postal  = newsite.Zip_Code__c;
                            integer sitenum = ((integer)result.get('zipids')) +1;
                            newsite.Name = fieldtype +'_'+ newsite.Zip_Code__c +'_'+ sitenum;  
                        }
                    }else
                        {
                            string sitename = fieldtype;
                            string postal  = newsite.Zip_Code__c;
                            integer sitenum = 1;
                            newsite.Name = fieldtype +'_'+ newsite.Zip_Code__c +'_'+ sitenum; 
                        }
                }
        }
 
static testMethod void TestBasicTriggerFunctions(){
       Site__c site = new Site__c(
                Name = 'Test Site',
               Type__c = 'COW',
               Site_Status__c = 'Archived'

        );
        insert site;

       Site__c site2 = new Site__c(
            Name = 'Test Site2',
           Site_Type__c = 'COW',
           Site_Status__c = 'Select One'

            );
        insert site2;

        List<Site__c> sites = [ SELECT Id,Site_Type__c,Name FROM Site__c ];
        System.assertEquals( 2, sites.size() );

        site.Site_Status__c = 'Backlog';
        update site;

        System.assertEquals( 'Backlog', [ SELECT Id, Site_Status__c FROM Site__c WHERE Id =: site.Id LIMIT 1 ].Site_Status__c );

        site.Site_Status__c = 'Active';
        update site;
        
        System.assertEquals( 'Active', [ SELECT Id, Site_Status__c FROM Site__c WHERE Id =: site.Id LIMIT 1 ].Site_Status__c );

        delete site;
        
        System.assertEquals( 0, [ SELECT COUNT() FROM Site__c WHERE Id =: site.Id ] );
    }
}

Thank you,
P
Hello All,'
Trying to get count of records that has the same matching field value as the record being saved.  Tried mapping but could never get teh correct value.  Will someone assist with geving an example of using the aggregate function to ge tthe count?  Example record being created has a text field Test__c and a value of dog.  Need to find all of the existing records with the value dog in the Test__c  field.
Thanks you for your time,
P
I am having an issue populating a map.  When a user saves a record it will have a postal code.  I am trying to determine if there are existing records with the same postal code.  'prod' is always.  How do I determine if other records have the same postal code?
thanks
P
if( Trigger.isInsert){
            Map<String, Product__c>  prodMap = new Map<String, Product__c>
            ([select id,Zip_Code__c,Type__c from Product__c]);
        
            for (Product__c newprod : (List<Product__c>) trigger.New)
            {
                Product__c prod= prodmap.containskey(newprod.Zip_Code__c) ? prodmap.get(newprod.Zip_Code__c) : null; 
                string fieldtype = newprod.Type__c == 'Field' ? 'F' : 'R';
            
                if(prod!= null){
                    string prodname = fieldtype;
                    string postal  = newprod.Zip_Code__c;
                    integer prodnum = prodMap.size()+1;
                    newprod.Name = fieldtype +'_'+ newprod.Zip_Code__c +'_'+ prodnum;  
                }
            }
        }

 
On creation of a record I need to update its name based on a value on existing records.
For example a new record is created and the code Id is 12345
If a record exist with this value I need to set the new record code Id to 12345_001.  This will continue so if the latestcode ID value is 12345_054 the new code Id needs to be 12345_055
So how do I search for this value and set the new one?   Will this be an issue on data loads?
Thanks,
P​​​​​​​  
Hello All,
Need some help creating a process for creating an object name.  So the name will be a text value plus an auto incremetnted value.
For example Opportunity created would be 'Test_001 '
But what if the count is up to Test_089 and they need to delete 5 opportunities and the opportunities are in different sequences?  So they need to delete Test_055 and Test_041 and Test_020.  The naming needs to stay in sequencial order.  Is this possible?
How do I handle the naming when they do a data load?   
Thanks,
P
Having an issue getting coverage for mapping
global class Clarke_AttachmentTriggerHandler {
    
    Map<Id, List<ContentDocumentLink>> linkMap = new Map<Id, List<ContentDocumentLink>>();
    Map<String, Directory__c> directoryMap = new Map<String, Directory__c>();
    List<ContentDocumentLink> cdl_List = new List<ContentDocumentLink>();
    public ContentDocumentLink cdl = New ContentDocumentLink();

    global override void bulkBeforeExtended() {
        if( Trigger.isUpdate ){
            List<Id> docIds = new List<Id>();
            List<String> parentIds = new List<String>();
            List<String> categoryvals = new List<String>();

            for( Attachment__c record : ( List<Attachment__c> ) Trigger.new ){
                Id docId = record.ContentDocumentId__c;
                    String parentId = record.Parent_ID__c ;
                    Id recId = Id.valueOf(record.Parent_ID__c ); 
                    String parentObjectType = String.valueOf( recId.getSObjectType() );
                    if( parentObjectType == 'Activity__c' ){
                        parentId = record.Proj__c;
                    }
                    if( docId != null ){    
                        docIds.add( docId );
                    }
                    if( parentId != null ){    
                        parentIds.add( parentId );
                    }    
            }

            list<Directory__c> dirs = [
                SELECT id,Directory_Template__c,Name,ParentId__c,Sobject__c,
                    (Select Id,Name, Directory__c, Folder_Template__c,Parent_File_Folder__c FROM File_Folders__r ORDER BY Name)
                FROM Directory__c 
                WHERE ParentId__c IN: parentIds
            ];

            if( !dirs.isEmpty() ){
                for( Directory__c dir : dirs ){
                    this.directoryMap.put( dir.ParentId__c, dir );
                }
            }

            List<ContentDocumentLink> linkList = [ SELECT Id, ContentDocumentId, LinkedEntityId FROM ContentDocumentLink WHERE ContentDocumentId IN: docIds ];
            if( !linkList.isEmpty() ){
                for( ContentDocumentLink link : linkList ){
                    List<ContentDocumentLink> links = this.linkMap.containsKey( link.ContentDocumentId )
                        ? this.linkMap.get( link.ContentDocumentId ) : new List<ContentDocumentLink>();
                    links.add( link );
                    this.linkMap.put( link.ContentDocumentId, links );
                }
            }
        }
    }
    global override void bulkAfterExtended() {}

    global override void beforeInsertExtended(SObject so) {
       Attachment__c newAttachment = ( Attachment__c ) so;

        if( this.linkMap.containsKey( newAttachment.ContentDocumentId__c ) ){
            List<ContentDocumentLink> links = this.linkMap.get( newAttachment.ContentDocumentId__c );
            if( !links.isEmpty() ){
                for( ContentDocumentLink link : links ){
                    String objectType = String.valueOf( link.LinkedEntityId.getSObjectType() );
                    Directory__c dir = this.directoryMap.containsKey( link.LinkedEntityId )
                        ? this.directoryMap.get( link.LinkedEntityId ) : null;
                    if( dir != null ){
                        switch on ( objectType ){
                            when 'Site__c' {
                                newAttachment.Site__c = link.LinkedEntityId;
                            }
                            when 'Programme__c' {
                                newAttachment.Programme__c = link.LinkedEntityId;
                            }
                            when 'Activity__c' {
                               newAttachment.Activity__c= link.LinkedEntityId;
                            }
                            when 'Project__c' {
                                newAttachment.Proj__c = link.LinkedEntityId;
                            }
                        }
                    }
                }
            }
        }
    }
    global override void beforeUpdateExtended(SObject oldso, SObject newso) {
        Attachment__c newAttachment = ( Attachment__c ) newSo;
        String folderparentId = newAttachment.Parent_Id__c;
        Id recId = Id.valueOf(newAttachment.Parent_ID__c );
        String parentObjectType = String.valueOf( recId.getSObjectType() );

        if( parentObjectType == 'Activity__c' ){
            folderparentId = newAttachment.Proj__c;
        }

        if( directoryMap.containsKey( folderparentId)){           
            Directory__c dir = this.directoryMap.get( folderparentId );
            List<File_Folder__c> folders = dir.File_Folders__r;
            List<ContentDocumentLink> links = this.linkMap.get( newAttachment.ContentDocumentId__c );

            for (ContentDocumentLink cont : links ){
                for (File_Folder__c folder: folders ){
                    if(newattachment.Document_Type__c == folder.name ){
                        ContentDocumentLink cdl = new ContentDocumentLink();
                        cdl.LinkedEntityId = folder.Id;
                        cdl.ContentDocumentId = cont.ContentDocumentId;
                        cdl.ShareType = 'V';
                        cdl.Visibility = 'AllUsers';

                        newAttachment.File_Folder__c = folder.Id;
                        cdl_List.add(cdl);
                        break;
                    }
                }
            }
        }
    }
    global override void afterUpdateExtended(SObject oldso, SObject newso) {}
    global override void afterInsertExtended(SObject newso) {} 
    global override void andFinallyExtended() {
    
      if (!Trigger.isDelete) {
            if (Trigger.isUpdate) {
                try {
                    if (cdl_List.size() > 0) {
                        insert cdl_List;
                    }
                } catch (Exception e) {
                    System.debug('Error: ' + e.getMessage());
                }
            }
        }
    }
}

Test Class
@isTest
private class Clarke_AttachmentTriggerHandlerTest {
     @TestSetup
    static void CreateTestData() {
        
        Site__c site = new Site__c(Name = 'Test Site');
        insert site;

        System.assert(site.Id != null);

        Project_Template__c newTemplate = new Project_Template__c(
            Name = 'test template'
        );
        insert newTemplate;

        Project__c proj = new Project__c(
           Site__c = site.id
          
        );
        insert proj;

        Activity__c activity = new Activity__c(
            Project__c = proj.Id
        );
        insert activity;

        Programme__c programme = new Programme__c(Name = 'Test Program');
        insert programme;

        List<Attachment__c> attachments = new List<Attachment__c>{
            new Attachment__c(Parent_ID__c = site.Id),
            new Attachment__c(Parent_ID__c = proj.Id),
            new Attachment__c(Parent_ID__c = programme.Id),
            new Attachment__c()
        };
        insert attachments;

        attachments = [SELECT Id,Document_Type__c,Name FROM Attachment__c WHERE Site__r.Name = 'Test Site'];
        System.assertEquals(1, attachments.size(), 'Site attachment records');
        
         Directory_Template__c dt = new Directory_Template__c(
            Name = 'Test Directory Template'
        );
        insert dt;

        //dt.Active__c = true;
        //update dt;

        File_Folder_Template__c ft = new File_Folder_Template__c(
            Name = 'Test Folder Template',
            Directory_Template__c = dt.Id
        );
        insert ft;

        File_Folder_Template__c ftc = new File_Folder_Template__c(
            Name = 'Test Folder Template Child',
            Directory_Template__c = dt.Id,
            Parent_Folder_Template__c = ft.id
        );
        insert ftc; 
    }
    
    @isTest
    private static void TestFunction(){
    
     Test.startTest();
     List<Project_Template__c> templates = [
              SELECT Id FROM Project_Template__c
                ];
    
      List<Site__c> sites = [SELECT Id FROM Site__c];
                System.assertEquals( 1, sites.size(), '1 site found' );
                
            Project__c proj = new Project__c(
           Site__c =  sites[ 0 ].Id
           
        );
        insert proj;

        ContentVersion ContentDoc = new ContentVersion();
        ContentDoc.Title = 'Test Title';
        ContentDoc.ContentUrl= 'test.com';
        Insert ContentDoc;
    
            ContentVersion contentVersion = new ContentVersion(
                    Title          = 'a picture',
                    PathOnClient   = 'Pic.jpg',
                    VersionData    = Blob.valueOf('Test Content'),
                    IsMajorVersion = true);
            insert contentVersion;

            List<ContentDocument> documents = [SELECT Id, Title, LatestPublishedVersionId FROM ContentDocument];

            ContentDocumentLink cdl = new ContentDocumentLink();
            cdl.LinkedEntityId = proj.Id;
            cdl.ContentDocumentId = documents[0].Id;
            cdl.ShareType = 'V';
            cdl.Visibility = 'AllUsers';
            insert cdl;
            
            List<ContentDocument> cdList = [SELECT Id, Title, LatestPublishedVersionId FROM ContentDocument];
            List<ContentDocumentLink> files=[SELECT Id, ContentDocumentId, ContentDocument.LatestPublishedVersionId, LinkedEntityId, ContentDocument.Title 
                                         from ContentDocumentLink where ContentDocumentId =: documents[0].Id]; 
     Test.stopTest();

    }
}

I am having an issue with the mapping/containsKey
Never goes past:
if( this.linkMap.containsKey( newAttachment.ContentDocumentId__c ) ){
or 
if( directoryMap.containsKey( folderparentId)){
Any suggestion is appreciated.
Thanks 
P
 
Hello,
Does anyone have any ideas on how to prepopulete a look up field on a create page in communities?  A contact is associated to an Account and I need to prepopulte the account field on the create record page.  
Thanks,
P
Hello All,
Looking for ieas on how to have an uploaded file in 2 locations.
So I am going to upload a file on a related record.  During upload there will be a picklist with set vlaues.  Thes evalues will have teh same name of other related records on teh same parent.  I was thinking :
  • Could  the file be uploaded and moved to the new location and then place a hyperlink on teh original record as a placeholder. 
Is that a good approach and is it even feasible?  Open to other ideas.  So need to be able to 1 file uploaded but accessible in 2 locations.

Thanks,
P
I am wondering how do I cover code that is related to cusotm metadata.
class:
public with sharing class ApplicationServices {

    public static final String APPLICATION_STATUS_DRAFT = 'Draft';
    public string coloTemplateName;

    public static List<ApplicationProjectTemplateConfig__mdt> templateConfigs = [SELECT Id,ApplicationCriteria__c,ProjectTemplateName__c from ApplicationProjectTemplateConfig__mdt];
     
    public static Map<String, SObject> templatesByNameMap {
        get{
            if(templatesByNameMap == null){
                list<Project_Template__c> templates = [Select Id, Name FROM Project_Template__c WHERE 
Active__c =: true];
                templatesByNameMap = PGE_EDSUtils.createMapByStringFieldSingleObject(templates, 'Name');
            }

            return templatesByNameMap;
        }
        private set;
    }

    public static void handleSubmit(Map<Id, Application__c> applications) {
        // Only before update
        if( !Trigger.isBefore || !Trigger.isUpdate ) {
            return;
        }
      
        // Determine the projects to create, if any
        Map<Application__c, Project__c> projectsToCreate = new Map<Application__c, Project__c>();
        for(Application__c application : applications.values()) {
            boolean docreate = shouldCreateColoProject(application);
            if( docreate ) {
                Project__c project = createColoProject(application);
                   if(project != null){
                        projectsToCreate.put(application, project);
                    }
            }
        }


///no code coverage
        if(projectsToCreate.size() > 0) {
            insert projectsToCreate.values();
            for(Application__c application : projectsToCreate.keySet()) {
                Project__c project = projectsToCreate.get(application);
                application.Project__c = project.Id;
                application.Date_Submitted__c = application.Date_Submitted__c == null
                                                ? System.today()
                                                : application.Date_Submitted__c ;
            }
        }
    }

///no code coverage
     public static String coloTemplateName {
        get {
            if(coloTemplateName == null) {
                coloTemplateName = AppConfig.getAppConfigValue('COL_PROJECT_TEMPLATE');
            }
            return coloTemplateName;
        }
        private set;
    }

///no code coverage
    public static Id coloTemplateId {
        get {
            if(coloTemplateId == null) {
                if(String.isNotEmpty(coloTemplateName)) {
                    Project_Template__c template = [SELECT Id 
                                                                 FROM Project_Template__c
                                                                 WHERE Name =: coloTemplateName LIMIT 1];
                    coloTemplateId = template.Id;
                }
            }
            return coloTemplateId;
        }
        private set;
    }


    public static Boolean shouldCreateColoProject(Application__c application) {
        return !isDraft(application) && !hasProject(application);
    }

    private static Boolean isDraft(Application__c application) {
        return application.Application_Status__c == APPLICATION_STATUS_DRAFT;
    }

    private static Boolean hasProject(Application__c application) {
        return application.Project__c != null;
    }

  
    public static Project__c createColoProject(Application__c application) {
        Project__c project = null;
        string projectTemplate;
   
        for( ApplicationProjectTemplateConfig__mdt  config :templateConfigs){
            boolean templatematch = BooleanLogicEvaluation.evaluate(application , config.ApplicationCriteria__c);
     
            if(templatematch){
                projectTemplate = config.ProjectTemplateName__c;
                break;
            }
         } 
      
         if (projectTemplate!=null && templatesByNameMap.containsKey(projectTemplate)){
           // no code coverage
            project = new Project__c(
                AccountSite__c =  application.AccountSite__c 
                OwnerId = application.ownerId,
                application__c = application.Id,
                ProjectTemplate__c = templatesByNameMap.get(projectTemplate).id,
                Project_Start_Date_A__c = System.today()
            );
         }

        return project;
    }

}
Test Class
static testMethod void testApplicationBasicCRUD() {
    	AccountSite__c  as = [SELECT Id FROM AccountSite__c LIMIT 1];
        Test.startTest();

        Application__c application = new Application__c(
            Application_Type__c = 'NewAgreement',
            Scope_of_Work__c = 'Test Setup',
            AccountSite__c = as.Id
        );
        insert application;
        System.assert(application.Id != null, 'Successfully created application');

        // Update
        application.Tenant_AccountSite_Name__c = ' Mountain';
        application.Tenant_AccountSite_Number__c = '123';
        update application;
        System.assert(application.Id != null, 'Successfully updates application');

        // Delete
        delete application;
        System.assert(true, 'Successfully deleted application');

        Test.stopTest();
    }

    static testMethod void testAutomaticProjectCreation() {
    	AccountSite__c  as= [SELECT Id FROM AccountSite__c  LIMIT 1];

        Test.startTest();
        Application__c application = new Application__c(
            Application_Type__c = 'NewAgreement',
            Scope_of_Work__c = 'Test Setup',
            Date_Submitted__c = System.today(),
            AccountSite__c = as.Id
        );
        insert application;

        application.Application_Status__c = 'Feasibility';
        application.Approval_Status__c = 'Pending';
        update application;
        
        application = [SELECT id, Project__c,  Date_Submitted__c FROM Application__c where id=: application.Id];
        System.assertEquals(System.today(), application.Date_Submitted__c, 'Date Submitted Set');
     
        Test.stopTest();
    }


    @testSetup
    private static void createTestData() {

       
        AccountSite__c as = new AccountSite__c (
            Name = 'Casterly Rock'
        );
        insert as;

      
        Project_Template__c template = new Project_Template__c (
            Name = 'Collocation',
            Active__c = true,
            Object__c  = 'Project__c',
            Project_Extension_Objects__c = 'Coll_Project__c'
        );
        insert template;

        Collocation__c collocation = new Collocation__c (
            Name = '100ft',
            AccountSite__c = as.Id
        );
        insert collocation;

        Application__c application = new Application__c (
            Application_Type__c = 'NewAgreement',
            Scope_of_Work__c = 'Test Setup',
            AccountSite__c = as.Id
        );
        insert application;

    }


}


 
So in this example for inserting Content docuemnt link.  How can I limit access to a specifc user group or profile?  And how could I use a CMT so that an admin can update or add groups so that the sahring is not hard coded in the apex?
Thanks
//Get attachment
Attachment attach = [SELECT Id, Name, Body, ContentType, ParentId From Attachment LIMIT 1];
 
//Insert ContentVersion
ContentVersion cVersion = new ContentVersion();
cVersion.ContentLocation = 'S';
cVersion.PathOnClient = attach.Name;
cVersion.Origin = 'H';
cVersion.OwnerId = attach.OwnerId;
cVersion.Title = attach.Name;
cVersion.VersionData = attach.Body;
Insert cVersion;
 
//After saved the Content Verison, get the ContentDocumentId
Id conDocument = [SELECT ContentDocumentId FROM ContentVersion WHERE Id =:cVersion.Id].ContentDocumentId;
 
//Insert ContentDocumentLink
ContentDocumentLink cDocLink = new ContentDocumentLink();
cDocLink.ContentDocumentId = conDocument;//Add ContentDocumentId
cDocLink.LinkedEntityId = attach.ParentId;//Add attachment parentId
cDocLink.ShareType = 'I';
cDocLink.Visibility = 'InternalUsers';
Insert cDocLink;
I am getting an errro with my code:
Illegal assignment from List<sector__c> to id
What I am trying to do:
When a Candidate is made Primary, the Sector Record's Site Lookup field should get populated with the Site record that is linked with the Candidate record.
 
Map<Id, Sector__c> m_Sectors;
Map<Id, List<Sector__c>> m_sitesToSectors = new Map<Id, List<Sector__c>>();
List<Sector__c> sectorsToUpdate = new List<Sector__c>();

 public void bulkAfter(){{
 if (Trigger.IsUpdate && Trigger.isAfter) {
            for (SObject so : Trigger.New) {
                Candidate__c newCandidate = (Candidate__c) so;
               Candidate__c oldCandidate = (Candidate__c) Trigger.oldMap.get(newCandidate.Id);

if ((newCandidate.Primary_Candidate__c != oldCandidate.Primary_Candidate__c) && 
                     newCandidate.Primary_Candidate__c == true && newCandidate.Site__c != null) {                    candidateIdsPrimary.add(newCandidate.Id);                }

 if (!candidateIds.isEmpty()) {
                m_Sectors = new Map<Id, Sector__c>([SELECT Id,Candidate__c,Site__c FROM Sector__c WHERE Site__c = null AND Candidate__c IN: candidateIdsPrimary]);
            }

if (m_Sectors != null && !m_Sectors.isEmpty()){
                for (Sector__c sect : m_Sectors.values()) {
                    if (!m_sitesToSectors.containsKey(sect.Candidate__c)) {
                        m_sitesToSectors.put(sect.Candidate__c, new List<Sector__c>{sect});
                    }
                    else {
                        m_sitesToSectors.get(sect.Candidate__c).add(sect);
                    }
                }
            }

}

public void afterUpdate( SObject oldSo, SObject newSo ){

Candidate__c newCandidate = (Candidate__c) newSo;
Candidate__c oldCandidate = (Candidate__c) oldSo;

if (m_sitesToSectors.get(newCandidate.Id) != null && !m_sitesToSectors.get(newCandidate.Id).isEmpty()) {
            for (Sector__c sector: m_sitesToSectors.get(newCandidate.Id)) {
                sector.Site__c = m_sitesToSectors.get(newCandidate.Site__c); ---error here
                sectorsToUpdate.add(sector);
            }
        }

}

 
Happy New Year everyone.
Need some assistance with my class.  Trying to get the SOQL queries outside the for loop if possible.  But in teh query I am using the Id as a filter.  Any thoughts? 
if( Trigger.isInsert ){
            List<Id> docIds = new List<Id>();
            List<String> parentIds = new List<String>();

            for( Attachment__c record : ( List<Attachment__c> ) Trigger.new ){
                Id docId = record.ContentDocumentId__c;
                    parentId = record.Parent_ID__c ;
                    Id recId = Id.valueOf(record.Parent_ID__c ); 
                    String parentObjectType = String.valueOf( recId.getSObjectType());
                        if( parentObjectType == 'Activity__c' ){
                           list<Activity__c> actparentId = [Select id,Project__r.Cust__c  from Activity__c WHERE Id =: parentId];   
                           for(Activity__c act :actparentId){
                                parentId = act.Project__r.Cust__c;
                            }
                        }
                        
                        if( parentObjectType == 'Project__c' ){
                           list<Project__c> projparentId = [Select Cust__c from Project__c WHERE Id =: parentId];   
                           for(Project__c proj :projparentId){
                                parentId = proj.Cust__c;
                            }
                        }
                        
                        if( docId != null ){    
                            docIds.add( docId );
                        }
            }

            List<ContentDocumentLink> linkList = [ SELECT Id, ContentDocumentId, LinkedEntityId FROM ContentDocumentLink WHERE ContentDocumentId IN: docIds ];
            if( !linkList.isEmpty() ){
                for( ContentDocumentLink link : linkList ){
                    List<ContentDocumentLink> links = this.linkMap.containsKey( link.ContentDocumentId )
                        ? this.linkMap.get( link.ContentDocumentId ) : new List<ContentDocumentLink>();
                    links.add( link );
                    this.linkMap.put( link.ContentDocumentId, links );
                }
            }
        
        }

 
Having issue getting map value.  
Template is a lookup field.  If the lookfield has a value where Require_Num__c = true I want the same value on the Activity record to be true also.  There are several templates so I want to only update Activities where the template has the Require_Num__c = true.
I know I have the right map the map size is 1 since I have only set the field to True on one template.  Just not able to select it in the value.  Right now the activity record field is false when it should be true.
Thanks,
if (Trigger.isInsert){
            List<Id> activityIds = new List<Id>();
        
            for (Activity__c act :(List<Activity__c >) trigger.New)
                {
                    activityIds.add(act.Activity_Template__c);

                }

            if(activityIds.size() > 0){
                list<Activity_Template__c> activitytemplate = [Select Name,Id,Require_Num__c
                                    FROM Activity_Template__c 
                                    WHERE Name,Id,Require_Num__c = true
                                    AND Id in : activityIds]; 
                
                atMap = new Map<Boolean,Activity_Template__c>();
                
                for (Activity_Template__c acts : activitytemplate){
                    atMap.put(acts.Name,Id,Require_Num__c,acts);
                }
            }
            system.debug('map size' + atMap.size() );
            for (Activity__c activities : (List<Activity__c >) trigger.New){
                if (atMap.containsKey(activities.Activity_Template__r.Id)){
                    activities.Name,Id,Require_Num__c = true;
                }
            }
        }

 
Hello All,
I have a custom Lookup component  - LWC
I need to ge the filter information for any lookups that has an active filter
Tried using Schema.DescribeFieldResult but no luck.  Anyone know how I can return the filter information?
Thanks,
P
I have a couple questions regarding filtered lookups and LWC. I have a lightning component wrapped in a LWC. On a create page I have a couple filtered lookup fields that are filtered based on values selected on the lightning component create page. I read that filtered lookups are not supported in lightning components and you need a custom lookup component.

So My first question is can I use something like this to resolve my issue: https://sfcure.com/2019/07/06/showing-a-lookup-field-which-respects-with-lookup-filters/

Second. Do I need a separate custom lookup component for each filtered lookup field?
Thanks
P
I am having an issue populating a map.  When a user saves a record it will have a postal code.  I am trying to determine if there are existing records with the same postal code.  'prod' is always.  How do I determine if other records have the same postal code?
thanks
P
if( Trigger.isInsert){
            Map<String, Product__c>  prodMap = new Map<String, Product__c>
            ([select id,Zip_Code__c,Type__c from Product__c]);
        
            for (Product__c newprod : (List<Product__c>) trigger.New)
            {
                Product__c prod= prodmap.containskey(newprod.Zip_Code__c) ? prodmap.get(newprod.Zip_Code__c) : null; 
                string fieldtype = newprod.Type__c == 'Field' ? 'F' : 'R';
            
                if(prod!= null){
                    string prodname = fieldtype;
                    string postal  = newprod.Zip_Code__c;
                    integer prodnum = prodMap.size()+1;
                    newprod.Name = fieldtype +'_'+ newprod.Zip_Code__c +'_'+ prodnum;  
                }
            }
        }

 
On creation of a record I need to update its name based on a value on existing records.
For example a new record is created and the code Id is 12345
If a record exist with this value I need to set the new record code Id to 12345_001.  This will continue so if the latestcode ID value is 12345_054 the new code Id needs to be 12345_055
So how do I search for this value and set the new one?   Will this be an issue on data loads?
Thanks,
P​​​​​​​  
Hello All,
Need some help creating a process for creating an object name.  So the name will be a text value plus an auto incremetnted value.
For example Opportunity created would be 'Test_001 '
But what if the count is up to Test_089 and they need to delete 5 opportunities and the opportunities are in different sequences?  So they need to delete Test_055 and Test_041 and Test_020.  The naming needs to stay in sequencial order.  Is this possible?
How do I handle the naming when they do a data load?   
Thanks,
P
Having an issue getting coverage for mapping
global class Clarke_AttachmentTriggerHandler {
    
    Map<Id, List<ContentDocumentLink>> linkMap = new Map<Id, List<ContentDocumentLink>>();
    Map<String, Directory__c> directoryMap = new Map<String, Directory__c>();
    List<ContentDocumentLink> cdl_List = new List<ContentDocumentLink>();
    public ContentDocumentLink cdl = New ContentDocumentLink();

    global override void bulkBeforeExtended() {
        if( Trigger.isUpdate ){
            List<Id> docIds = new List<Id>();
            List<String> parentIds = new List<String>();
            List<String> categoryvals = new List<String>();

            for( Attachment__c record : ( List<Attachment__c> ) Trigger.new ){
                Id docId = record.ContentDocumentId__c;
                    String parentId = record.Parent_ID__c ;
                    Id recId = Id.valueOf(record.Parent_ID__c ); 
                    String parentObjectType = String.valueOf( recId.getSObjectType() );
                    if( parentObjectType == 'Activity__c' ){
                        parentId = record.Proj__c;
                    }
                    if( docId != null ){    
                        docIds.add( docId );
                    }
                    if( parentId != null ){    
                        parentIds.add( parentId );
                    }    
            }

            list<Directory__c> dirs = [
                SELECT id,Directory_Template__c,Name,ParentId__c,Sobject__c,
                    (Select Id,Name, Directory__c, Folder_Template__c,Parent_File_Folder__c FROM File_Folders__r ORDER BY Name)
                FROM Directory__c 
                WHERE ParentId__c IN: parentIds
            ];

            if( !dirs.isEmpty() ){
                for( Directory__c dir : dirs ){
                    this.directoryMap.put( dir.ParentId__c, dir );
                }
            }

            List<ContentDocumentLink> linkList = [ SELECT Id, ContentDocumentId, LinkedEntityId FROM ContentDocumentLink WHERE ContentDocumentId IN: docIds ];
            if( !linkList.isEmpty() ){
                for( ContentDocumentLink link : linkList ){
                    List<ContentDocumentLink> links = this.linkMap.containsKey( link.ContentDocumentId )
                        ? this.linkMap.get( link.ContentDocumentId ) : new List<ContentDocumentLink>();
                    links.add( link );
                    this.linkMap.put( link.ContentDocumentId, links );
                }
            }
        }
    }
    global override void bulkAfterExtended() {}

    global override void beforeInsertExtended(SObject so) {
       Attachment__c newAttachment = ( Attachment__c ) so;

        if( this.linkMap.containsKey( newAttachment.ContentDocumentId__c ) ){
            List<ContentDocumentLink> links = this.linkMap.get( newAttachment.ContentDocumentId__c );
            if( !links.isEmpty() ){
                for( ContentDocumentLink link : links ){
                    String objectType = String.valueOf( link.LinkedEntityId.getSObjectType() );
                    Directory__c dir = this.directoryMap.containsKey( link.LinkedEntityId )
                        ? this.directoryMap.get( link.LinkedEntityId ) : null;
                    if( dir != null ){
                        switch on ( objectType ){
                            when 'Site__c' {
                                newAttachment.Site__c = link.LinkedEntityId;
                            }
                            when 'Programme__c' {
                                newAttachment.Programme__c = link.LinkedEntityId;
                            }
                            when 'Activity__c' {
                               newAttachment.Activity__c= link.LinkedEntityId;
                            }
                            when 'Project__c' {
                                newAttachment.Proj__c = link.LinkedEntityId;
                            }
                        }
                    }
                }
            }
        }
    }
    global override void beforeUpdateExtended(SObject oldso, SObject newso) {
        Attachment__c newAttachment = ( Attachment__c ) newSo;
        String folderparentId = newAttachment.Parent_Id__c;
        Id recId = Id.valueOf(newAttachment.Parent_ID__c );
        String parentObjectType = String.valueOf( recId.getSObjectType() );

        if( parentObjectType == 'Activity__c' ){
            folderparentId = newAttachment.Proj__c;
        }

        if( directoryMap.containsKey( folderparentId)){           
            Directory__c dir = this.directoryMap.get( folderparentId );
            List<File_Folder__c> folders = dir.File_Folders__r;
            List<ContentDocumentLink> links = this.linkMap.get( newAttachment.ContentDocumentId__c );

            for (ContentDocumentLink cont : links ){
                for (File_Folder__c folder: folders ){
                    if(newattachment.Document_Type__c == folder.name ){
                        ContentDocumentLink cdl = new ContentDocumentLink();
                        cdl.LinkedEntityId = folder.Id;
                        cdl.ContentDocumentId = cont.ContentDocumentId;
                        cdl.ShareType = 'V';
                        cdl.Visibility = 'AllUsers';

                        newAttachment.File_Folder__c = folder.Id;
                        cdl_List.add(cdl);
                        break;
                    }
                }
            }
        }
    }
    global override void afterUpdateExtended(SObject oldso, SObject newso) {}
    global override void afterInsertExtended(SObject newso) {} 
    global override void andFinallyExtended() {
    
      if (!Trigger.isDelete) {
            if (Trigger.isUpdate) {
                try {
                    if (cdl_List.size() > 0) {
                        insert cdl_List;
                    }
                } catch (Exception e) {
                    System.debug('Error: ' + e.getMessage());
                }
            }
        }
    }
}

Test Class
@isTest
private class Clarke_AttachmentTriggerHandlerTest {
     @TestSetup
    static void CreateTestData() {
        
        Site__c site = new Site__c(Name = 'Test Site');
        insert site;

        System.assert(site.Id != null);

        Project_Template__c newTemplate = new Project_Template__c(
            Name = 'test template'
        );
        insert newTemplate;

        Project__c proj = new Project__c(
           Site__c = site.id
          
        );
        insert proj;

        Activity__c activity = new Activity__c(
            Project__c = proj.Id
        );
        insert activity;

        Programme__c programme = new Programme__c(Name = 'Test Program');
        insert programme;

        List<Attachment__c> attachments = new List<Attachment__c>{
            new Attachment__c(Parent_ID__c = site.Id),
            new Attachment__c(Parent_ID__c = proj.Id),
            new Attachment__c(Parent_ID__c = programme.Id),
            new Attachment__c()
        };
        insert attachments;

        attachments = [SELECT Id,Document_Type__c,Name FROM Attachment__c WHERE Site__r.Name = 'Test Site'];
        System.assertEquals(1, attachments.size(), 'Site attachment records');
        
         Directory_Template__c dt = new Directory_Template__c(
            Name = 'Test Directory Template'
        );
        insert dt;

        //dt.Active__c = true;
        //update dt;

        File_Folder_Template__c ft = new File_Folder_Template__c(
            Name = 'Test Folder Template',
            Directory_Template__c = dt.Id
        );
        insert ft;

        File_Folder_Template__c ftc = new File_Folder_Template__c(
            Name = 'Test Folder Template Child',
            Directory_Template__c = dt.Id,
            Parent_Folder_Template__c = ft.id
        );
        insert ftc; 
    }
    
    @isTest
    private static void TestFunction(){
    
     Test.startTest();
     List<Project_Template__c> templates = [
              SELECT Id FROM Project_Template__c
                ];
    
      List<Site__c> sites = [SELECT Id FROM Site__c];
                System.assertEquals( 1, sites.size(), '1 site found' );
                
            Project__c proj = new Project__c(
           Site__c =  sites[ 0 ].Id
           
        );
        insert proj;

        ContentVersion ContentDoc = new ContentVersion();
        ContentDoc.Title = 'Test Title';
        ContentDoc.ContentUrl= 'test.com';
        Insert ContentDoc;
    
            ContentVersion contentVersion = new ContentVersion(
                    Title          = 'a picture',
                    PathOnClient   = 'Pic.jpg',
                    VersionData    = Blob.valueOf('Test Content'),
                    IsMajorVersion = true);
            insert contentVersion;

            List<ContentDocument> documents = [SELECT Id, Title, LatestPublishedVersionId FROM ContentDocument];

            ContentDocumentLink cdl = new ContentDocumentLink();
            cdl.LinkedEntityId = proj.Id;
            cdl.ContentDocumentId = documents[0].Id;
            cdl.ShareType = 'V';
            cdl.Visibility = 'AllUsers';
            insert cdl;
            
            List<ContentDocument> cdList = [SELECT Id, Title, LatestPublishedVersionId FROM ContentDocument];
            List<ContentDocumentLink> files=[SELECT Id, ContentDocumentId, ContentDocument.LatestPublishedVersionId, LinkedEntityId, ContentDocument.Title 
                                         from ContentDocumentLink where ContentDocumentId =: documents[0].Id]; 
     Test.stopTest();

    }
}

I am having an issue with the mapping/containsKey
Never goes past:
if( this.linkMap.containsKey( newAttachment.ContentDocumentId__c ) ){
or 
if( directoryMap.containsKey( folderparentId)){
Any suggestion is appreciated.
Thanks 
P
 
Hello All,
Looking for ieas on how to have an uploaded file in 2 locations.
So I am going to upload a file on a related record.  During upload there will be a picklist with set vlaues.  Thes evalues will have teh same name of other related records on teh same parent.  I was thinking :
  • Could  the file be uploaded and moved to the new location and then place a hyperlink on teh original record as a placeholder. 
Is that a good approach and is it even feasible?  Open to other ideas.  So need to be able to 1 file uploaded but accessible in 2 locations.

Thanks,
P