Last active
April 14, 2016 11:28
-
-
Save adrianmi8/2f2886de073bf146c8eed742bc681680 to your computer and use it in GitHub Desktop.
Mass Ship to Contacts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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