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

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 116
    Questions
  • 142
    Replies
Hello All,
Is there a way to configure sf to sf to be enabled when you build a scracth org? Like I knolw you can enable communities by adding the config in a json sile so I was wondering if we could do the same for the sf to sf feeature.

Thank you,
P
Hello All,
I am trying to pass a value from @wire to the connectedCallback
 
import PRICE_FIELD from '@salesforce/schema/Order__c.Price__c';
 
@wire(getRecord, { recordId: '$recordId', fields: [PRICE_FIELD] })
  record;
I tried this within the connectedcallback but no value
this.priceId = this.record.data ? getFieldValue(this.record.data, PRICE_FIELD) : '';

So process flow is 
  1. @wire
  2. callback
  3. @wire

So at step 3 the @wire gets a value but not a step 1
What am I doing wrong?

Thank you,
P
 
Hello All,
I am working on a LWC.  Currently I can retrieve the record Id and pass it to a handler
@api recordId;

console.log('Job RecordId is ' + this.recordId);

getContactName{recordId : this.recordId})

Now I want to pass another field off the record but unsure how to retrieve it.  I tried this but it does not work
import JOB_NAME_FIELD from '@salesforce/schema/Contact__c.Job_Name__c';

getFieldValue(this.recordId, JOB_NAME_FIELD);

Any suggestions would be greatly appreciated.
Thanks
P
 
Hello All,
I have a formula to  calculate the number of business days excluding weekend and holidays,
The issue is is not very user friendly.  Specifically the holiday part.  Here is the  holiday formula.
((IF(AND(Request_F__c <= DATEVALUE("2021-11-24"),TODAY() >= DATEVALUE("2021-11-24")),1,0) + IF(AND(Request_F__c <= DATEVALUE("2021-12-22"),TODAY() >= DATEVALUE("2021-12-22")),1,0) + IF(AND(Request_F__c <= DATEVALUE("2021-01-01"),TODAY() >= DATEVALUE("2021-01-01")),1,0)))

Issue is what if the holiday is on a weekend?  The holiday date will be included so the date diff will be incorrect. And the formula has to be updated every year.
I thought about apex but it will be the same issue plus the code only runs when the record is updated so the difference will not be calculated when the user opens the record page.
Any suggestions?  Would love to have a solution using the SF holiday(recurring) and business days functionality.
Thank you,
Hello All,
Trying to figure out how to compare a grand child record field to another grand child record field

Parent = Merch
Child = Invoice
grand child = invoice Line
Child = Purchase
grand child = Purchase line

I am trying to compare the  merch category field on the invoice Line to the merch category field on the Purchase line.

Purchase is a lookup field on Merch.
Invoice records are related records on Merch.
Need to determine if there is a Purchase lIne record with a merch category value that is the same as the merch category on the Invoice lIne that is being created. 

Just not sure how to query/map the record.

Thank you,
P
Hello All,
Have an interesting issue.  I need to get the max date from a list of child records but the result needs to be based on an order.

Example
I have Test record 1
It has child records

E 07/02/2021
C 05/22/2022
B 03/05/2021
D 06/02/2020
B 03/05/2019
F 01/01/2021

Now the max date of teh child records is C 05/22/2022.
But I need to get the max date based on an order.
The Order is A,B,C,D,E,F
And since there is a B record I need to get B 03/05/2021 since this is the max date for the B records.

If there was an 'A' record I would have neede to get the 'A' record even if the date value was not the max within all of of the child records.

Any suggestion is appreciated.
Cheers,
P
Hello,
I would like to covert my list of mdt records to use a map.
Her eis the current state
List<PriceSelection__mdt> priceBooks = [SELECT Id, PriceId__c, Service__c, DeveloperName, Customer__c, ProjectManager__c 
                                                        from PriceSelection__mdt];
            
for(SObject so : Trigger.New){
   Project__c newProj = (Project__c) so;
              
       if(priceBooks.size() > 0){
           for (PriceSelection__mdt pbs: priceBooks ){           
       if(newProj.Service__c == pbs.Service__c && newProj.Customer__c == pbs.Customer__c && newProj.Project_Manager__c== pbs.ProjectManager__c){
    newProj.PriceBook__c = pbs.PriceId__c;
 }

how can I change List<PriceSelection__mdt> into a map

Thank you,
P
Hello All,
I would like to update my exsiting code that uses Lists to instead use maps.
Here is what I have:
List<object1__c> records1 = new List<object1__c>();
List<object2__c> records2 = new List<object2__c>();

records1 = [SELECT id, name from object1__c ];
records2 = [SELECT id, name from object2__c];
        
        
 Object3__c result1 = (Object3__c ) so;

        if(!records1.isEmpty() && !records2.isEmpty()){
            for (object1__c rec: records1) {
                for(object2__c rec2: record2)
                if (rec.Apple__c == rec2.Pear__c){
                    rec.Job_Item__c = result1.Id;
         
                }
            }
        }

I am trying to convert the above to use maps but I am not sure on how to compare the fields between teh 2 maps:
Map<Id,object1__c> records1 = new Map<Id,object1__c>();
Map<Id,object2__c> records2 = new Map<Id,object2__c>();

Object3__c result1 = (Object3__c ) so;

if(!records1.isEmpty() && !records2.isEmpty()){
            for(object1__c  rec1 : records1.values()){
                if (rec1.Apple__c = records2.get(Pear_c)){
                    rec1.Test__c = result1.Id;
                }
            }
        }

 
Hello All,
Trying to detect when a formula field is being updated in my Apex Class  but I am only seeing the original value.  I can see the new value on the page layout and can see the update in the history.  I am working in the after update of the Apex Class.  Any thoughts why I am not seeing the new value in the class?
Thanks,
P
Hello All,
Was wondering if someone will help me with the best approach for adding  multiple child records:
Parent is Project  and finance is child.  The Child records will mostly be the same exexpt for a text field that I will populate:
List<Finance__c> finline = new List<Finance__c>();   

if(trigger.isInsert){        
            for (SObject so : Trigger.New) {
                Project__c newP = (Project__c) so;
                
                if (newP.ProjectChild__c != null ) { 
                   Finance__c newF = new Finance__c();
                        newF.Subject = newP.ProjectSubject__c;
                        newF.description__c = 'Custom text for finance record';
                        finline .add(newF);

                        newF.Subject = newP.ProjectSubject__c;
                        newF.description__c = 'Another Custom text for finance record';
                        finline .add(newF);

                }
            }
        }
Was wondering if there is a better way to perform this action.  There will be 5-6 child records.  Also, I will a different child record that will be created off the same parent record and there may be 3-4 records for this custom object.  
Any suggestions would be greatly appreciated.
Cheers,
P
 
Hello Everone,
I ahve the below batch class and was wondering if ther eis a way to throw up a message to let the user know that the update is happening.  Its a batch and some of the recvords have 100+ child records so it will take a awhile for the batch classes to complete. 
public class UpdateNoticeFromAccountQueueableBatch implements Database.Batchable <sObject>, Database.Stateful{
    public List<Notice__c> noticeList = new List<Notice__c>();
    public String vatQueVatValue;
    public UpdateNoticeFromAccountQueueableBatch ( List<Notice__c> records ,String vatValueFromQue ) {
        noticeList = records;
        vatQueVatValue = vatValueFromQue;
        system.debug('noticeList value in batch' + noticeList );
        system.debug('vatQueVatValue value in batch' + vatQueVatValue );
    }
    public List<SObject> start(Database.BatchableContext bc){
        return noticeList;
    }
    public void execute(Database.BatchableContext bc, List<Notice__c> scope){
         List< notice>  NoticeToUpdateFromAccount = new List<Notice__c>();   
         system.debug('scope value ' + scope);
         system.debug('vatQueVatValue value batch' + vatQueVatValue);
         if(!scope.isEmpty()){
             For ( Notice__c noticess : scope){  
               noticess.Any_other_Lessor_Info_VAT_Number__c  = vatQueVatValue;
             }
         Database.update(scope, false);
         ---- add label message here to notify user that batch is running?
         }   
       
    }

Just don't want the user guessing what is going on.

Thanks you.
P
Hello,
Having an issue saving my class.  getting 
Compile Error: Invalid loop variable type expected SObject was Notice__c

I am passing the parameters from another Class and I am trying to update a field on the Notice__c object with teh vatQueVatValue value
If you see any other issues with the batch class please also advise.
public class UpdateNoticeFromAccountQueueableBatch implements Database.Batchable <sObject>, Database.Stateful{
    public List<Notice__c> noticeList = new List<Notice__c>();
    public String vatQueVatValue;
    public UpdateNoticeFromAccountQueueableBatch ( List<Notice__c> records ,String vatValueFromQue ) {
        noticeList = records;
        vatQueVatValue = vatValueFromQue;
        system.debug('noticeList value in batch' + noticeList );
        system.debug('vatQueVatValue value in batch' + vatQueVatValue );
    }
    public List<SObject> start(Database.BatchableContext bc){
        return noticeList;
    }
    public void execute(Database.BatchableContext bc, List<SObject> scope){
         List< notice>  NoticeToUpdateFromAccount = new List<Notice__c>();   
         system.debug('scope value ' + scope);
         system.debug('vatQueVatValue value batch' + vatQueVatValue);
         if(!scope.isEmpty()){
             For ( Notice__c noticess : scope){  ---- Compile Error: Invalid loop variable type expected SObject was notice Notice__c 
               noticess.Any_other_Lessor_Info_VAT_Number__c  = vatQueVatValue;
              system.debug('notices.Any_other_Lessor_Info_VAT_Number__c ' + notices.Any_other_Lessor_Info_VAT_Number__c);
             }
         }   
         Database.update(scope, false);
    }
    public void finish(Database.BatchableContext bc){
    }
}

Cheers,
P
 
Hello All,
Going in circles over how to resolve this.
I have Object Projects.  
The Project has a lookup to an Account
The account can reside on multiple Projects

So Project 1, Project 2, Project 3 all have the same loopup record 'Account Test'
So if field 'user' is Updated on Project 1.  How can I update the 'user' field on Project 2 and Project 3. 

Cheers,
P


 
Hello All,
I have a LWC where I need to get the count of records where the record name is alike.  For example the record names are Test, Test2, Test3.  I would want to retrieve the count of 3 so that when I create the new record I can append teh count to the end of the new recods Name.
Any help is greatly appreciated.
Cheers,
P
Trying to call a Class method from a test class:
Class UtilHelper
global class FeeWrapper { global List<Project__c> transToUpdate; } 

public static FeeWrapper PassingRentFee(Fee_Calculation__c Config, Project__c trans, List<Project__c> transToUpdate, Map<String, Fee_Mapping__c> m_Fee)



Test class
Map<String,Fee_Mapping__c > afMap = new Map<String,Fee_Mapping__c >( [ SELECT Id, Fee_Amount__c , _Fee_Basis__c , WO__c,Group__c,Type__c,Macro_Type__c FROM Fee_Mapping__c]); 

List<Fee_Calculation__c > feeRec = [ SELECT Id, Name FROM Fee_Calculation__c]; 

List<Project__c> projectRec = [ SELECT Id, Name FROM Project__c]

UtilHelper.PassingRentFee(feeRec[0],projectRec[0],projectRec[0],afMap);

Error is Method does not exist or incorrect signature
Any suggesitons are appreciated
P
Hello All,
I have an issue and not sure how to approach it.
I have a Parent record 'Product'
And multiple child records 'Items'
If a user inserts an item name 'Test 1' then assign field desc__c to '1000'
And if another Item record name 'Test 1' is inserted then assign field desc__c to '2000'.  This format would continue
These Item records may be dataloaded so basically the original item will have a desc__c field value of '1000' and all other records with the same name value would have a desc__c field value that is incremented by 1000.
I am not sure how to even approach this.  Aggragate all records that are being inserted and look for a count greater than 1? 
User will also be able to manually insert indivisual item record.
Any suggestions would be greatly appreciated.
Cheers,
P
I am trying to get a vlaue from a map to use in an If statement
I need to get the status value from the m_cl map.  How do I do that?
Thank you,
P
 
Map<Id,Checklist__c> m_cl = new Map<Id, Checklist__c>();
Set<Id> checkListIds = new Set<Id>();
        Set<Id> prjIds = new Set<Id>();
        Set<Id> prjNcIds = new Set<Id>();
        Set<Id> checkListNcIds = new Set<Id>();

        if(Trigger.isUpdate) {            
            for (SObject so : Trigger.New) {
              Checklist__c newCL = (Checklist__c) so;
              Checklist__c oldCL = Trigger.oldMap != null && Trigger.oldMap.containsKey(newCL.Id)
                ? (Checklist__c) Trigger.oldMap.get(newCL.Id)
                : null;

                    if(newCL.Status__c != oldCL.Status__c && (newCL.Status__c == 'Complete' || oldCL.Status__c == 'In Progress')){
                        m_cl.put(newCL.Activity__c, newCL);
                        checkListIds.add(newCL.Id);
                        prjIds.add(newCL.Project__c);
                    }

            }

            if(checkListIds.size()> 0){
                act = [Select id,Name,Project__c, Project__r.RC_Completed__c, Project__r.M5_Completed__c,Checklist__r.Status__c,Checklist__r.Name,Checklist__c,Form_Complete__c
                      FROM Activity__c 
                      WHERE Form_Complete__c = false 
                      AND Checklist__c IN : checkListIds
                      ];

                prj = [Select id, Name, RC_Completed__c ,M5_Completed__c 
                       FROM Project__c 
                       WHERE Id IN : prjIds];
              
                if( act.size() > 0){
                    for(Activity__c acts : act){
                        formName = acts.Checklist__r.Name.split(':');    
                        if(formName[1] == 'Pre-M5 Check List Form' && m_cl.get('Status__c') == 'Complete'){
                            acts.M5_Completed__c = true;
                            actToUpdate.add(acts);
                        }
                        else {
                            acts.RC_Completed__c = true;
                            actToUpdate.add(acts);
                        }
                    }
                }

 
Hello All,
I have a Queueable class that I want to execute in a Batch class but I am not sure how to pass the list of Leases to the Batch and execute. 
Any suggestions will be greatly appreciated.
public  class UpdateLeaseQueueable implements Queueable {
    
    List<Lease__c> updateLeases = new List<Lease__c>();

    public UpdateLeaseQueueable( Map<Id, Lease__c> leases) {
        updateLeases.addAll(leases.Values());
    }

    public void execute(QueueableContext qc) {  

        if (!updateLeases.isEmpty()) { 
           //pass leases to Batch class
        }
    }
}


Batch
global class UpdateLeaseQueueableBatch implements Database.Batchable <sObject>, Database.Stateful{
   
    global Database.QueryLocator start(Database.BatchableContext bc){
        
    }
    
    global void execute(Database.BatchableContext bc, List<> listLease){
       
    }
    
    global void finish(Database.BatchableContext bc){
    }
}


Cheers,
P
Hello,
I could use some help on how to create a validation rule that forces users to fomat their text input
For example.  I need the user input to be like 
A.123456.D.54 OR A.789456.E.89
First letter needs to be an A followed by a . followed by 6 digits(numbers only) followed by a . followed by a D or E  then followed by a . and then followed by 2 digits(numbers only)
Can I do this in a validation rule? 
Thank you,
P
 
Hello All,
Currently I am attaching a PDF that is dynamically generated and atatching it to an email.  All done via controller.
The email itself has become more complicated and the users want to be able to update the email as needed so I need to utilize a SF email template instead of my email controller.  Is this possible?  Use SF email tempalte and dynamically attach a file?  This file is not attched to the record.  I am currently rendering it as a pdf and attaching it before I send.  
Thank you,
P
Hello All,
I am trying to pass a value from @wire to the connectedCallback
 
import PRICE_FIELD from '@salesforce/schema/Order__c.Price__c';
 
@wire(getRecord, { recordId: '$recordId', fields: [PRICE_FIELD] })
  record;
I tried this within the connectedcallback but no value
this.priceId = this.record.data ? getFieldValue(this.record.data, PRICE_FIELD) : '';

So process flow is 
  1. @wire
  2. callback
  3. @wire

So at step 3 the @wire gets a value but not a step 1
What am I doing wrong?

Thank you,
P
 
Hello All,
I am working on a LWC.  Currently I can retrieve the record Id and pass it to a handler
@api recordId;

console.log('Job RecordId is ' + this.recordId);

getContactName{recordId : this.recordId})

Now I want to pass another field off the record but unsure how to retrieve it.  I tried this but it does not work
import JOB_NAME_FIELD from '@salesforce/schema/Contact__c.Job_Name__c';

getFieldValue(this.recordId, JOB_NAME_FIELD);

Any suggestions would be greatly appreciated.
Thanks
P
 
Hello All,
Was wondering if someone will help me with the best approach for adding  multiple child records:
Parent is Project  and finance is child.  The Child records will mostly be the same exexpt for a text field that I will populate:
List<Finance__c> finline = new List<Finance__c>();   

if(trigger.isInsert){        
            for (SObject so : Trigger.New) {
                Project__c newP = (Project__c) so;
                
                if (newP.ProjectChild__c != null ) { 
                   Finance__c newF = new Finance__c();
                        newF.Subject = newP.ProjectSubject__c;
                        newF.description__c = 'Custom text for finance record';
                        finline .add(newF);

                        newF.Subject = newP.ProjectSubject__c;
                        newF.description__c = 'Another Custom text for finance record';
                        finline .add(newF);

                }
            }
        }
Was wondering if there is a better way to perform this action.  There will be 5-6 child records.  Also, I will a different child record that will be created off the same parent record and there may be 3-4 records for this custom object.  
Any suggestions would be greatly appreciated.
Cheers,
P
 
Hello Everone,
I ahve the below batch class and was wondering if ther eis a way to throw up a message to let the user know that the update is happening.  Its a batch and some of the recvords have 100+ child records so it will take a awhile for the batch classes to complete. 
public class UpdateNoticeFromAccountQueueableBatch implements Database.Batchable <sObject>, Database.Stateful{
    public List<Notice__c> noticeList = new List<Notice__c>();
    public String vatQueVatValue;
    public UpdateNoticeFromAccountQueueableBatch ( List<Notice__c> records ,String vatValueFromQue ) {
        noticeList = records;
        vatQueVatValue = vatValueFromQue;
        system.debug('noticeList value in batch' + noticeList );
        system.debug('vatQueVatValue value in batch' + vatQueVatValue );
    }
    public List<SObject> start(Database.BatchableContext bc){
        return noticeList;
    }
    public void execute(Database.BatchableContext bc, List<Notice__c> scope){
         List< notice>  NoticeToUpdateFromAccount = new List<Notice__c>();   
         system.debug('scope value ' + scope);
         system.debug('vatQueVatValue value batch' + vatQueVatValue);
         if(!scope.isEmpty()){
             For ( Notice__c noticess : scope){  
               noticess.Any_other_Lessor_Info_VAT_Number__c  = vatQueVatValue;
             }
         Database.update(scope, false);
         ---- add label message here to notify user that batch is running?
         }   
       
    }

Just don't want the user guessing what is going on.

Thanks you.
P
Hello,
Having an issue saving my class.  getting 
Compile Error: Invalid loop variable type expected SObject was Notice__c

I am passing the parameters from another Class and I am trying to update a field on the Notice__c object with teh vatQueVatValue value
If you see any other issues with the batch class please also advise.
public class UpdateNoticeFromAccountQueueableBatch implements Database.Batchable <sObject>, Database.Stateful{
    public List<Notice__c> noticeList = new List<Notice__c>();
    public String vatQueVatValue;
    public UpdateNoticeFromAccountQueueableBatch ( List<Notice__c> records ,String vatValueFromQue ) {
        noticeList = records;
        vatQueVatValue = vatValueFromQue;
        system.debug('noticeList value in batch' + noticeList );
        system.debug('vatQueVatValue value in batch' + vatQueVatValue );
    }
    public List<SObject> start(Database.BatchableContext bc){
        return noticeList;
    }
    public void execute(Database.BatchableContext bc, List<SObject> scope){
         List< notice>  NoticeToUpdateFromAccount = new List<Notice__c>();   
         system.debug('scope value ' + scope);
         system.debug('vatQueVatValue value batch' + vatQueVatValue);
         if(!scope.isEmpty()){
             For ( Notice__c noticess : scope){  ---- Compile Error: Invalid loop variable type expected SObject was notice Notice__c 
               noticess.Any_other_Lessor_Info_VAT_Number__c  = vatQueVatValue;
              system.debug('notices.Any_other_Lessor_Info_VAT_Number__c ' + notices.Any_other_Lessor_Info_VAT_Number__c);
             }
         }   
         Database.update(scope, false);
    }
    public void finish(Database.BatchableContext bc){
    }
}

Cheers,
P
 
Trying to call a Class method from a test class:
Class UtilHelper
global class FeeWrapper { global List<Project__c> transToUpdate; } 

public static FeeWrapper PassingRentFee(Fee_Calculation__c Config, Project__c trans, List<Project__c> transToUpdate, Map<String, Fee_Mapping__c> m_Fee)



Test class
Map<String,Fee_Mapping__c > afMap = new Map<String,Fee_Mapping__c >( [ SELECT Id, Fee_Amount__c , _Fee_Basis__c , WO__c,Group__c,Type__c,Macro_Type__c FROM Fee_Mapping__c]); 

List<Fee_Calculation__c > feeRec = [ SELECT Id, Name FROM Fee_Calculation__c]; 

List<Project__c> projectRec = [ SELECT Id, Name FROM Project__c]

UtilHelper.PassingRentFee(feeRec[0],projectRec[0],projectRec[0],afMap);

Error is Method does not exist or incorrect signature
Any suggesitons are appreciated
P
I am trying to get a vlaue from a map to use in an If statement
I need to get the status value from the m_cl map.  How do I do that?
Thank you,
P
 
Map<Id,Checklist__c> m_cl = new Map<Id, Checklist__c>();
Set<Id> checkListIds = new Set<Id>();
        Set<Id> prjIds = new Set<Id>();
        Set<Id> prjNcIds = new Set<Id>();
        Set<Id> checkListNcIds = new Set<Id>();

        if(Trigger.isUpdate) {            
            for (SObject so : Trigger.New) {
              Checklist__c newCL = (Checklist__c) so;
              Checklist__c oldCL = Trigger.oldMap != null && Trigger.oldMap.containsKey(newCL.Id)
                ? (Checklist__c) Trigger.oldMap.get(newCL.Id)
                : null;

                    if(newCL.Status__c != oldCL.Status__c && (newCL.Status__c == 'Complete' || oldCL.Status__c == 'In Progress')){
                        m_cl.put(newCL.Activity__c, newCL);
                        checkListIds.add(newCL.Id);
                        prjIds.add(newCL.Project__c);
                    }

            }

            if(checkListIds.size()> 0){
                act = [Select id,Name,Project__c, Project__r.RC_Completed__c, Project__r.M5_Completed__c,Checklist__r.Status__c,Checklist__r.Name,Checklist__c,Form_Complete__c
                      FROM Activity__c 
                      WHERE Form_Complete__c = false 
                      AND Checklist__c IN : checkListIds
                      ];

                prj = [Select id, Name, RC_Completed__c ,M5_Completed__c 
                       FROM Project__c 
                       WHERE Id IN : prjIds];
              
                if( act.size() > 0){
                    for(Activity__c acts : act){
                        formName = acts.Checklist__r.Name.split(':');    
                        if(formName[1] == 'Pre-M5 Check List Form' && m_cl.get('Status__c') == 'Complete'){
                            acts.M5_Completed__c = true;
                            actToUpdate.add(acts);
                        }
                        else {
                            acts.RC_Completed__c = true;
                            actToUpdate.add(acts);
                        }
                    }
                }

 
Hello All,
I have a Queueable class that I want to execute in a Batch class but I am not sure how to pass the list of Leases to the Batch and execute. 
Any suggestions will be greatly appreciated.
public  class UpdateLeaseQueueable implements Queueable {
    
    List<Lease__c> updateLeases = new List<Lease__c>();

    public UpdateLeaseQueueable( Map<Id, Lease__c> leases) {
        updateLeases.addAll(leases.Values());
    }

    public void execute(QueueableContext qc) {  

        if (!updateLeases.isEmpty()) { 
           //pass leases to Batch class
        }
    }
}


Batch
global class UpdateLeaseQueueableBatch implements Database.Batchable <sObject>, Database.Stateful{
   
    global Database.QueryLocator start(Database.BatchableContext bc){
        
    }
    
    global void execute(Database.BatchableContext bc, List<> listLease){
       
    }
    
    global void finish(Database.BatchableContext bc){
    }
}


Cheers,
P
Hello,
I could use some help on how to create a validation rule that forces users to fomat their text input
For example.  I need the user input to be like 
A.123456.D.54 OR A.789456.E.89
First letter needs to be an A followed by a . followed by 6 digits(numbers only) followed by a . followed by a D or E  then followed by a . and then followed by 2 digits(numbers only)
Can I do this in a validation rule? 
Thank you,
P
 
Hello All,
Currently I am attaching a PDF that is dynamically generated and atatching it to an email.  All done via controller.
The email itself has become more complicated and the users want to be able to update the email as needed so I need to utilize a SF email template instead of my email controller.  Is this possible?  Use SF email tempalte and dynamically attach a file?  This file is not attched to the record.  I am currently rendering it as a pdf and attaching it before I send.  
Thank you,
P
I need some help with solving an issue where I wan tto improve the user experince.  Currently I have a quaick action that has no fields on teh page except for Name whcih is requirted.  I defaulted the vlaue to 'Leave Blank".  I do this because I have a custom controller that assigned the name and updated other fields.  How can I remove the need for the user to have to do anything.  Ideally they would click the new button and it would generate the record. ANy suggestions 
Will someone help me with writing a test class for my email class?
 
public with sharing class PDF_EmailController {
    
    @auraEnabled

    public static void SendAttachment(String recordId){
           
        for(Purchase_Order_Request__c por : [SELECT Id, Email_Address__c FROM Purchase_Order__c
        WHERE Id =: recordId]){
            Messaging.SingleEmailMessage semail = new Messaging.SingleEmailMessage();
            Messaging.EmailFileAttachment attach = new Messaging.EmailFileAttachment();

            PageReference pref = page.POPDF;
            pref.getParameters().put('Id',por.Id);
            pref.setRedirect(true);
            Blob b = pref.getContent();
            attach.setFileName('POR.pdf');
            attach.setBody(b);
            semail.setSubject('Purchase Order Request Details');
            semail.setToAddresses(new String[] { por.Email_Address__c });
            semail.setPlainTextBody('Please find the attached POR details');
            semail.setFileAttachments(new Messaging.EmailFileAttachment[]{attach});
            Messaging.sendEmail(new Messaging.SingleEmailMessage[]{semail});

        }

        for(Purchase_Order_Request__c por : [SELECT Id, Email_Address__c,Version__c FROM Purchase_Order__c
                                             WHERE Id =: recordId]){
            PageReference PDf =  Page.PORequestPDF;
            PDf.getParameters().put('Id',por.Id);
            PDf.setRedirect(true);
            Attachment attach = new Attachment();
            Blob b ;
            b = PDf.getContent();
            attach.Body = b;
            attach.Name = 'Purchase Order Confirmation ' + System.today();
            attach.IsPrivate = false;
            attach.ParentId = por.Id;
            insert attach;

        }
    }
 }



Visualforce Page

<apex:page controller="PDF_EmailController" standardStylesheets="false" showHeader="false">    
    <center>
        <P style="font-size:22px;"><u>Send Purchase Order Request</u></P>
        <input type="text" value="" id="txtEmailAddress"/><br/><br/>
        <input type="button" onclick="SendEmailAttachment();" value="Send"/>
    </center>
    <script>
    function SendEmailAttachment(){
        var PORId = '{!$CurrentPage.parameters.Id}';
        var emailAddress=document.getElementById('txtEmailAddress').value;
        if(emailAddress!=null && emailAddress!=''){
            TestHandler.SendAttachment(emailAddress,porId,function(result,event){
                if(event.status){
                    if(result=='SUCCESS'){
                        alert('Email sent successfully.');
                    }
                    else{
                        alert(result);
                    }
                }
            })
        }
        else{
            alert('Please provide email address!');
        }
    }
    </script>
 </apex:page>

Thank you,
P
Hello All,
I have a VF page that renders record information as shows it as a PDF .  I am using renderAs="PDF"
How can I now email that PDF?
I thought I needed an email controller show below
RequestPDF is the name of the VF PDF page that is rendering the data.  How do I pass the id to the controller?  I would like to try with either a button or maybe when a user updates and saves the record.  Either way the id and email address is sent to the controller.  And if the email address is null prompt for 1? 
public with sharing class RequestPDF_EmailController {
    
    @RemoteAction
    public static string SendAttachment(String sEmailAddress, String tempId){
        String sMessage='';
        try{            
            Messaging.SingleEmailMessage semail = new Messaging.SingleEmailMessage();
            Messaging.EmailFileAttachment attach = new Messaging.EmailFileAttachment();

            PageReference pref = page.RequestPDF;
            pref.getParameters().put('id',tempId);
            pref.setRedirect(true);
            Blob b = pref.getContent();
            attach.setFileName('AttachedInV.pdf');
            attach.setBody(b);
            semail.setSubject('Inv Details');
            semail.setToAddresses(new List<String>{sEmailAddress});
            semail.setPlainTextBody('Please find the attached INV details');
            semail.setFileAttachments(new Messaging.EmailFileAttachment[]{attach});
            Messaging.sendEmail(new Messaging.SingleEmailMessage[]{semail});
            sMessage='SUCCESS';
        }
        catch(Exception ex){
            sMessage=ex.getMessage()+'\n'+ex.getLineNumber()+'\n'+ex.getCause();
        }
        return sMessage;
    }
 }

Thank you,
P