Skip to content

Instantly share code, notes, and snippets.

@adrianmi8
Last active April 14, 2016 11:28
Show Gist options
  • Save adrianmi8/2f2886de073bf146c8eed742bc681680 to your computer and use it in GitHub Desktop.
Save adrianmi8/2f2886de073bf146c8eed742bc681680 to your computer and use it in GitHub Desktop.
Mass Ship to Contacts
public with sharing class NewShipmentsContactsController {
private ApexPages.StandardSetController standardController;
private Id bulkShipmentId;
private String batchId;
private static final String SERVICE_TYPE_FEDEX = 'FedEx';
private final BulkShipmentSettings__c settings;
private Set<Id> contactsIds;
public String statusMessage {get; set;}
public static final String workingObject = 'Contact';
public Boolean startPoller {get; set;}
private Boolean validationComplete {get; set;}
private Boolean hasValidationErrors {get; set;}
private Boolean hasProcessingErrors {get; set;}
private String previousStatus {get; set;}
private static final String VALIDATION_COMPLETE = 'VALIDATION_COMPLETED';
private static final String PROCESSING_COMPLETE = 'PROCESSING_COMPLETED';
private static final String ERROR_STATUS = 'ERROR';
private static final String SUCCESS_STATUS = 'SUCCESS';
public NewShipmentsContactsController(ApexPages.StandardSetController controller) {
standardController = controller;
contactsIds = new Set<Id>();
for (sObject c : standardController.getSelected()) {
contactsIds.add(c.Id);
}
settings = BulkShipmentSettings__c.getInstance(SERVICE_TYPE_FEDEX);
hasValidationErrors = false;
hasProcessingErrors = false;
validationComplete = false;
}
public void processBulkShipment() {
createBulkShippingObjects();
this.batchId = zkfedex.BulkShipmentInterface.validateBulkShipment(this.bulkShipmentId, true);
startPoller = true;
this.statusMessage = 'Shipments creation process has been initiated.';
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, this.statusMessage));
}
public PageReference checkBatchStatus() {
hasValidationErrors = false;
if (validationComplete) {
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'Shipments validation has been completed.'));
}
List<zkfedex__BulkShipmentStatus__c> statuses = [
SELECT zkfedex__Status__c, zkfedex__StatusMessage__c
FROM zkfedex__BulkShipmentStatus__c
WHERE zkfedex__BatchId__c = :this.batchId];
if ( ! statuses.isEmpty() ) {
this.previousStatus = statuses.get(0).zkfedex__Status__c;
if (previousStatus == ERROR_STATUS) {
this.statusMessage = statuses.get(0).zkfedex__StatusMessage__c;
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, this.statusMessage));
startPoller = false;
return null;
} else if(previousStatus == VALIDATION_COMPLETE ) {
validationComplete = true;
List<zkfedex__QueuedShipmentStatus__c> errorsList = [
SELECT zkfedex__StatusMessage__c
FROM zkfedex__QueuedShipmentStatus__c
WHERE zkfedex__BatchId__c = :this.batchId AND
zkfedex__Status__c = 'ERROR'
LIMIT 100];
if ( ! errorsList.isEmpty() ) {
hasValidationErrors = true;
startPoller = false;
String errorMessage = '';
for (zkfedex__QueuedShipmentStatus__c err : errorsList) {
errorMessage = errorMessage + err.zkfedex__StatusMessage__c + '<br/>';
}
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Validation Error: ' + errorMessage));
return null;
}
if ( ! hasValidationErrors ) {
this.batchId = zkfedex.BulkShipmentInterface.processBulkShipment(this.bulkShipmentId);
}
} else if(previousStatus == PROCESSING_COMPLETE) {
List<zkfedex__QueuedShipmentStatus__c> errorsList = [
SELECT zkfedex__StatusMessage__c
FROM zkfedex__QueuedShipmentStatus__c
WHERE zkfedex__BatchId__c = :this.batchId AND
zkfedex__Status__c = 'ERROR'
LIMIT 100];
if ( ! errorsList.isEmpty() ) {
hasValidationErrors = true;
startPoller = false;
String errorMessage = '';
for (zkfedex__QueuedShipmentStatus__c err : errorsList) {
errorMessage = errorMessage + err.zkfedex__StatusMessage__c + '<br/>';
}
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Creation Error: ' + errorMessage));
return null;
}
if ( ! hasValidationErrors) {
return new PageReference('/003');
}
}
return null;
} else {
return null;
}
}
public void createBulkShippingObjects() {
List<zkfedex__ShipmatePreference__c> shipmateList = [
SELECT zkfedex__CompanyName__c, zkfedex__ShippingIsResidential__c, zkfedex__ShippingCity__c,
zkfedex__ShippingCountry__c, zkfedex__SenderEMailDefault__c, zkfedex__SenderPhoneDefault__c,
zkfedex__ShippingState__c, zkfedex__ShippingStreet__c, zkfedex__ShippingPostalCode__c,
zkfedex__DropoffTypeDefault__c, zkfedex__LabelImageTypeDefault__c
FROM zkfedex__ShipmatePreference__c
WHERE Name = :settings.ShipmatePreferenceName__c
LIMIT 1];
if ( ! shipmateList.isEmpty() ) {
// 1. zkfedex__BulkShipment__c object
zkfedex__BulkShipment__c bulkShipment = new zkfedex__BulkShipment__c (
zkfedex__ShipmatePreference__c = shipmateList.get(0).Id
);
insert bulkShipment;
// save id
this.bulkShipmentId = bulkShipment.Id;
List<Contact> currentContacts = [
SELECT MailingCity, Account.Name, MailingCountry,
Email, FirstName, LastName,
Phone, MailingState, MailingStreet,
MailingPostalCode
FROM Contact
WHERE Id IN :contactsIds
LIMIT 20000];
// 2. zkfedex__QueuedShipment__c object
List<zkfedex__QueuedShipment__c> queuedShipmentsToInsert = new List<zkfedex__QueuedShipment__c>();
for (Contact con : currentContacts) {
zkfedex__QueuedShipment__c queuedShipment = new zkfedex__QueuedShipment__c (
zkfedex__BulkShipment__c = bulkShipment.Id,
zkfedex__ShipDate__c = Date.today(),
zkfedex__DropoffType__c = dropoffTypeMap.get(shipmateList.get(0).zkfedex__DropoffTypeDefault__c),
zkfedex__LabelImageType__c = shipmateList.get(0).zkfedex__LabelImageTypeDefault__c,
zkfedex__ServiceType__c = 'Domestic: FedEx First Overnight',
zkfedex__PackagingType__c = settings.DefaultPackagingType__c,
zkfedex__WeightDimensionUnits__c = settings.DimensionUnits__c,
// sender info
zkfedex__SenderName__c = shipmateList.get(0).zkfedex__CompanyName__c,
zkfedex__SenderIsResidential__c = shipmateList.get(0).zkfedex__ShippingIsResidential__c,
zkfedex__SenderCity__c = shipmateList.get(0).zkfedex__ShippingCity__c,
zkfedex__SenderCompany__c = shipmateList.get(0).zkfedex__CompanyName__c,
zkfedex__SenderCountry__c = shipmateList.get(0).zkfedex__ShippingCountry__c,
zkfedex__SenderEmail__c = shipmateList.get(0).zkfedex__SenderEMailDefault__c,
zkfedex__SenderPhone__c = shipmateList.get(0).zkfedex__SenderPhoneDefault__c,
zkfedex__SenderState__c = shipmateList.get(0).zkfedex__ShippingState__c,
zkfedex__SenderStreet__c = shipmateList.get(0).zkfedex__ShippingStreet__c,
zkfedex__SenderPostalCode__c = shipmateList.get(0).zkfedex__ShippingPostalCode__c,
// recipient info
zkfedex__RecipientIsResidential__c = false,
zkfedex__RecipientCity__c = con.MailingCity,
zkfedex__RecipientCompany__c = con.Account.Name,
zkfedex__RecipientCountry__c = con.MailingCountry,
zkfedex__RecipientEmail__c = con.Email,
zkfedex__RecipientName__c = con.FirstName + ' ' + con.LastName,
zkfedex__RecipientPhone__c = con.Phone,
zkfedex__RecipientState__c = con.MailingState,
zkfedex__RecipientStreet__c = con.MailingStreet,
zkfedex__RecipientPostalCode__c = con.MailingPostalCode,
zkfedex__PaymentType__c = settings.PaymentType__c,
zkfedex__Contact__c = con.Id
);
queuedShipmentsToInsert.add(queuedShipment);
}
insert queuedShipmentsToInsert;
// 3. zkfedex__QueuedPackage__c object
List<zkfedex__QueuedPackage__c> queuedPackagesToInsert = new List<zkfedex__QueuedPackage__c>();
for (zkfedex__QueuedShipment__c qs : queuedShipmentsToInsert) {
zkfedex__QueuedPackage__c queuedPackage = new zkfedex__QueuedPackage__c (
zkfedex__DeclaredValue__c = settings.DefaultDeclaredValue__c,
zkfedex__Weight__c = settings.DefaultWeight__c,
zkfedex__QueuedShipment__c = qs.Id
);
queuedPackagesToInsert.add(queuedPackage);
}
insert queuedPackagesToInsert;
} else {
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, ' Invalid Shipmate Preferences. '));
}
}
private Map<String, String> serviceTypeMapping = new Map<String, String>{
'First Overnight' => 'Domestic: FedEx First Overnight',
'Priority Overnight' => 'Domestic: FedEx Priority Overnight',
'Standard Overnight' => 'Domestic: FedEx Standard Overnight',
'2 Day AM' => 'Domestic: FedEx 2Day A.M.',
'2 DAy' => 'Domestic: FedEx 2Day',
'Express Saver' => 'Domestic: FedEx Express Saver',
'Ground' => 'Domestic: FedEx Ground',
'Home Delivery (Ground)' => 'Domestic: FedEx Home Delivery'
};
private Map<String,String> dropoffTypeMap = new Map<String,String> {
'BUSINESS_SERVICE_CENTER' => 'Business Service Center',
'DROP_BOX' => 'Drop Box',
'REGULAR_PICKUP' => 'Regular Pickup',
'REQUEST_COURIER' => 'Request Courier',
'STATION' => 'Station'
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment