I have created a component that is using a custom class. I added this component to an email template. When I try and load the template this is the error message I receive. List has no rows for assignment to SObject. From what I can tell the attribute I have created is not passing the value to my class.
Also, when I first pull up the task page to send an email, the OpportunityID is part of the querystring with a key of p3_lkid. However, when I select the template the querystring is reset.
I have enclosed the relevant code below.
Component
<apex:component access="global" controller="ProbeQuoteEmail">
<apex:attribute name="opportunityID"
description="This is the ID of the opportunity."
type="ID" assignTo="{!opportunityID}" />
<apex:repeat value="{!ProbeProducts}" var="p">
<p>{!p.ProductFamily__c}</p>
<table border='1'>
<apex:repeat value="{!p.OpportunityLineItems}" var="line">
<tr>
<td ><apex:outputText value="{!line.Quantity}"/></td>
<td ><apex:outputText value="{!line.PricebookEntry.Name}"/></td>
<td align="right"><apex:outputField value="{!line.UnitPrice}"/></td>
<td align="right"><apex:outputField value="{!line.TotalPrice}"/></td>
</tr>
</apex:repeat>
</table>
</apex:repeat>
</apex:component>
Email Template
<messaging:emailTemplate subject="Your requested quote n° {!relatedTo.Id}"
recipientType="Contact" relatedToType="Opportunity">
<messaging:plainTextEmailBody >
Dear {!recipient.name},
Thank you for your continued interest in our offering. Please see the attached quote per your request.
Feel free to contact me if you have any questions.
Regards,
{!$User.FirstName} {!$User.LastName}
</messaging:plainTextEmailBody>
<messaging:attachment renderAs="pdf" filename="{!relatedTo.name}">
<c:ProbeQuoteProducts opportunityID="{!relatedTo.Id}"/>
</messaging:attachment>
</messaging:emailTemplate>
Apex Class
public class ProbeQuoteEmail {
Schema.DescribeFieldResult F = Product2.Family.getDescribe();
List<Schema.PicklistEntry> P = F.getPicklistValues();
public Opportunity Probe { get; set; }
public Id opportunityID { get; set; }
public List<Opportunity> ProbeProducts = new List<Opportunity>();
Integer Counter = 1;
public ProbeQuoteEmail() {
for (Schema.PicklistEntry fam:P){
Integer i = 0;
String FamilyLabel = fam.GetLabel();
Probe = [SELECT o.Id, o.Name, o.Amount, o.ProductFamily__c, (SELECT op.Quantity, op.UnitPrice, op.TotalPrice,
op.PricebookEntry.Name, op.OpportunityId, op.PricebookEntry.ProductCode,
op.PricebookEntry.Product2.Family, op.LineCount__c
FROM OpportunityLineItems op WHERE op.PricebookEntry.Product2.Family = :FamilyLabel)
FROM Opportunity o where Id = :opportunityID];
Probe.Amount = 0;
Probe.ProductFamily__c = FamilyLabel;
for(i=0;i<Probe.opportunityLineItems.size();i++) {
Probe.Amount += Probe.opportunityLineItems[i].TotalPrice;
Probe.opportunityLineItems[i].LineCount__c = Counter;
Counter++;
}
ProbeProducts.add(Probe);
}
}
public List<Opportunity> getProbeProducts() {
return ProbeProducts;
}
}