An Email template containing a VF component is being launched by flow.
Email Template
<messaging:emailTemplate subject="Manifest - Maritime Carrier Notification" recipientType="Contact" relatedToType="Account">
<messaging:htmlEmailBody>
<html>
<body>
<c:ManifestCarrierEmailTmpl accountRecord="{!relatedTo}"/>
</body>
</html>
</messaging:htmlEmailBody>
</messaging:emailTemplate>
VF Component
<apex:component controller="ManifestCarrierEmailTmplController" access="global">
<apex:attribute name="accountRecord" description="The account record of the carrier" type="Account"
assignTo="{!carrier}"/>
<table style="table-layout: fixed; width: 100%; font-family: Arial, Helvetica, sans-serif;">
<tr>
<td></td>
<td align="center">
State of Blank<br/>
DEPARTMENT OF BLANK <br/>
</td>
<td></td>
</tr>
<tr/>
<tr>
<td></td>
<td align="center"><b style="font-size: 20pt;">E-MANIFEST NOTIFICATION <br/> </b></td>
<td></td>
</tr>
<tr/>
<tr>
<td>
</td>
<td align="center" style="font-size: 20;">
<!--<b>{!carrier.CarrierEmailParentManifest__r.RecordType.Name}</b>-->
<b>{!carrierRecord.CarrierEmailParentManifest__c}</b>
</td>
<td></td>
</tr>
<tr/>
<tr>
<td>
<b>DATE: {!TODAY()}</b>
</td>
<td>
<b>Emanifest Name: {!carrier.CarrierEmailParentManifest__c}</b>
</td>
</tr>
<tr/>
<tr>
<td>
<b>TO: {!carrier.Name}</b>
</td>
</tr>
<tr/>
<tr>
<td>
<b>FROM: </b>
</td>
<td>
Plant Quarantine Branch
</td>
</tr>
<tr>
<td>
{!$User.FirstName} {!$User.LastName}
</td>
</tr>
</table>
<!--On Hold-->
<apex:outputText rendered="{!onHoldShipments.size > 0}">
<table style="table-layout: fixed; width: 100%; font-family: Arial, Helvetica, sans-serif;">
<tr>
<td>
<b>Status:</b>
</td>
<td>
</td>
<td align="center" style="font-size: 30pt; color:red;">
<b>ON HOLD</b>
</td>
<td></td>
</tr>
</table>
<table style="table-layout: fixed; width: 100%; font-family: Arial, Helvetica, sans-serif; border-collapse: collapse;">
<thead style="background-color: grey;">
<tr>
<th style="padding: 5px; border: 1px solid #000;">Vessel/Voyage</th>
<th style="padding: 5px; border: 1px solid #000;">Arrival Date</th>
<th style="padding: 5px; border: 1px solid #000;">Container</th>
<th style="padding: 5px; border: 1px solid #000;">Importer</th>
<th style="padding: 5px; border: 1px solid #000;">Inspection Status</th>
<th style="padding: 5px; border: 1px solid #000;">Hold Location</th>
</tr>
</thead>
<tbody>
<apex:repeat value="{!onHoldShipments}" var="onHoldShipment">
<tr>
<td style="padding: 5px; border: 1px solid #000;">
<apex:outputField value="{!onHoldShipment.VoyageFlight__c}"/>
</td>
<td style="padding: 5px; border: 1px solid #000;">
<apex:outputField value="{!onHoldShipment.DateOfArrival__c}"/>
</td>
<td style="padding: 5px; border: 1px solid #000;">
<apex:outputField value="{!onHoldShipment.ContainerNo__c}"/>
</td>
<td style="padding: 5px; border: 1px solid #000;">
<apex:outputField value="{!onHoldShipment.Importer__r.Name}"/>
</td>
<td style="padding: 5px; border: 1px solid #000;">
<apex:outputField value="{!onHoldShipment.Status__c}"/>
</td>
<td style="padding: 5px; border: 1px solid #000;">
<apex:outputField value="{!onHoldShipment.HoldLocation__c}"/>
</td>
</tr>
</apex:repeat>
</tbody>
</table>
</apex:outputText>
<br/>
<br/>
<!--Released-->
<apex:outputText rendered="{!releasedShipments.size > 0}">
<table style="table-layout: fixed; width: 100%; font-family: Arial, Helvetica, sans-serif;">
<tr>
<td>
<b>Status:</b>
</td>
<td>
</td>
<td align="center" style="font-size: 30pt; color: green">
<b>RELEASED</b>
</td>
<td></td>
</tr>
</table>
<table style="background-color: grey; table-layout: fixed; width: 100%; font-family: Arial, Helvetica, sans-serif; border-collapse: collapse;">
<thead>
<tr>
<th style="padding: 5px; border: 1px solid #000;">Vessel/Voyage</th>
<th style="padding: 5px; border: 1px solid #000;">Arrival Date</th>
<th style="padding: 5px; border: 1px solid #000;">Container</th>
<th style="padding: 5px; border: 1px solid #000;">Importer</th>
<th style="padding: 5px; border: 1px solid #000;">Inspection Status</th>
<th style="padding: 5px; border: 1px solid #000;">Hold Location</th>
</tr>
</thead>
<tbody>
<apex:repeat value="{!releasedShipments}" var="releasedShipment">
<tr>
<td style="padding: 5px; border: 1px solid #000;">
<apex:outputField value="{!releasedShipment.VoyageFlight__c}"/>
</td>
<td style="padding: 5px; border: 1px solid #000;">
<apex:outputField value="{!releasedShipment.DateOfArrival__c}"/>
</td>
<td style="padding: 5px; border: 1px solid #000;">
<apex:outputField value="{!releasedShipment.ContainerNo__c}"/>
</td>
<td style="padding: 5px; border: 1px solid #000;">
<apex:outputField value="{!releasedShipment.Importer__r.Name}"/>
</td>
<td style="padding: 5px; border: 1px solid #000;">
<apex:outputField value="{!releasedShipment.Status__c}"/>
</td>
<td style="padding: 5px; border: 1px solid #000;">
<apex:outputField value="{!releasedShipment.HoldLocation__c}"/>
</td>
</tr>
</apex:repeat>
</tbody>
</table>
</apex:outputText>
<!--No Hold and No Released-->
<apex:outputText rendered="{!(releasedShipments.size = 0 && onHoldShipments.size == 0)}">
<tr>
<td colspan="4" align="center" style="padding: 5px; border: 1px solid #000;">
No Data
</td>
</tr>
</apex:outputText>
<p style="font-family: Arial, Helvetica, sans-serif;">
If there are any questions, please call: <br/> <apex:outputField value="{!carrier.CarrierEmailParentManifest__c}"/> <br/>
Processed By: {!$User.FirstName} {!$User.LastName} {!NOW()} <br/>
Carrier Copy
</p>
</apex:component>
Apex Controller
public class ManifestCarrierEmailTmplController {
Set<String> allowedStatus = new Set<String>{
'Hold',
'QA',
'Partial Hold',
'Released'
};
Set<String> holdLocations = new Set<String>{
'Air Cargo Facility',
'Sea Port'
};
public Account carrier {
set;
get;
}
public Account getCarrierRecord() {
return [SELECT Id,
Name,
CarrierEmailParentManifest__r.RecordType.Name,
CarrierEmailParentManifest__c,
CarrierEmailParentManifest__r.Name,
CarrierEmailParentManifest__r.PortContactPhone__c
FROM Account WHERE Id =: carrier.Id][0];
}
public List<Shipment__c> getReleasedShipments() {
Account acc = [
SELECT CarrierEmailParentManifest__c
FROM Account
WHERE Id = :carrier.Id
];
return [SELECT
Id,
VoyageFlight__c,
DateOfArrival__c,
ContainerNo__c,
Importer__r.Name,
Status__c,
HoldLocation__c
FROM Shipment__c
WHERE Manifest__c =: acc.CarrierEmailParentManifest__c
AND Carrier__c =: carrier.Id
AND Status__c IN: allowedStatus
AND HoldLocation__c NOT IN: holdLocations
ORDER BY VoyageFlight__c
];
}
public List<Shipment__c> getOnHoldShipments() {
Account acc = [
SELECT CarrierEmailParentManifest__c
FROM Account
WHERE Id = :carrier.Id
];
return [SELECT
Id,
VoyageFlight__c,
DateOfArrival__c,
ContainerNo__c,
Importer__r.Name,
Status__c,
HoldLocation__c
FROM Shipment__c
WHERE Manifest__c =: acc.CarrierEmailParentManifest__c
AND Carrier__c =: carrier.Id
AND Status__c IN: allowedStatus
AND HoldLocation__c IN: holdLocations
ORDER BY VoyageFlight__c
];
}
}
I'm calling the carrierRecord getter in the VF component but the error says that its missing a requested field "CarrierEmailParentManifest__c", etc when in fact, its part of the soql query. Can somebody point out what i'm missing ?