You need to sign in to do that
Don't have an account?
Eric Blaxton 11
Review the Class and help in writing a Test case for this...thank you
Hi and thanks for any help or direction.
1. Please tell me if this is good Apex class. By good I mean, up to SF best practices, bulkification etc.
2. I need help in writing a test class.
@RestResource(urlMapping='/TmwCaseUpdates/v1/*')
global class TmwCaseUpdates
{
global class OrderResponse
{
string OrderNumber;
List<string> Comments = new List<string>();
List<string> Errors = new List<string>();
string CaseNumber;
}
global class FuelOrderItem
{
string FuelOrderNumber;
string FuelType;
string CaseNumber;
long FuelOrderedAmount;
long FuelDeliveredAmount;
}
global class SalesforceUpdateCase
{
string Status;
string FuelOrderStatus;
string TMWOrderNumber;
DateTime DeliveredTime;
DateTime CarrierConfirmDateTime;
string[] CaseComments;
List<FuelOrderItem> FuelOrderItems;
string NotifiedDate;
string CreditAlertType;
Date RequestDeliveryDate;
string RequestDeliveryTimeframe;
string Description;
string Subject;
string CompanyCode;
string Origin;
long QuantityDelivered;
long QuantityRequested;
}
global static string GetAccountID(string companyId)
{
string cmpID = 'TMW-' + companyId;
string accountID = [SELECT IntegratedSite__c FROM Translation_Table__c where Surrogate_ID__c='TMW-JMJHOR01' LIMIT 1].Id;
return accountID;
}
@HttpPost
global static List<OrderResponse> UpdateOrders()
{
string requestBody = RestContext.request.requestBody.tostring();
System.debug('input data is ' + requestBody);
List<SalesforceUpdateCase> updOrders = (List<SalesforceUpdateCase>)JSON.deserialize(requestBody, List<SalesforceUpdateCase>.class);
System.debug(updOrders);
// create OrderResponse list to be returned to the caller
List<OrderResponse> orderList = new List<OrderResponse>();
// loop through SalesforceUpdateCase objects. Create new cases for valid orders. Return any case comments
for (SalesforceUpdateCase theOrder : updOrders)
{
OrderResponse theResponse = new OrderResponse();
List<Case> theCases = new List<Case>();
theCases = [ select id, status, AccountId, TMW_Order_Num__c, CaseNumber, Fuel_Order_Status__c
FROM case WHERE TMW_Order_Num__c = :theOrder.TMWOrderNumber ];
System.debug('order # is ' + theOrder.TMWOrderNumber);
if (theCases.size() > 1)
{
theResponse.Errors.Add('Case ' + theCases[0].CaseNumber + 'for TMW Order ' + theOrder.TMWOrderNumber + ' already exists');
System.debug('Case ' + theCases[0].CaseNumber + 'for TMW Order ' + theOrder.TMWOrderNumber + ' already exists');
theResponse.OrderNumber = theOrder.TMWOrderNumber;
theResponse.CaseNumber = theCases[0].CaseNumber;
orderList.Add(theResponse);
} else if (theCases.size() == 0)
{
// Create new SF case
Case newCase = new Case();
newCase.Status = theOrder.Status;
newCase.Fuel_Order_Status__c = theOrder.FuelOrderStatus;
newCase.TMW_Order_Num__c = theOrder.TMWOrderNumber;
newCase.TMWSentDt__c = Date.today();
newCase.Credit_Alert_Type__c = theOrder.CreditAlerttype;
newCase.Delivered_Time__c = theOrder.DeliveredTime;
// Get the company code from the translation table. Company codes are stored as TMW-xxxxx
string translatedCompanyCode = 'TMW-' + theOrder.CompanyCode;
System.debug(translatedCompanyCode);
newCase.AccountId = [SELECT IntegratedSite__c
FROM Translation_Table__c
WHERE Surrogate_ID__c = :translatedCompanyCode].IntegratedSite__c;
newCase.RQ_Delivery_Timeframe__c = theOrder.RequestDeliveryTimeframe;
newCase.RQ_Delivery_Date__c = theOrder.RequestDeliveryDate;
newCase.Origin = theOrder.Origin;
integer i = 0;
for (FuelOrderItem item : theOrder.FuelOrderItems)
{
i++;
switch on i
{
when 1
{
newCase.Fuel1_Requested_Type__c = item.FuelType;
if (theOrder.FuelOrderStatus == 'Delivered')
{
newCase.Fuel1_Delivered_Type__c = item.FuelType;
newCase.Fuel1_Delivered_Amount__c = item.FuelDeliveredAmount;
}
}
when 2
{
newCase.Fuel2_Requested_Type__c = item.FuelType;
if (theOrder.FuelOrderStatus == 'Delivered')
{
newCase.Fuel2_Delivered_Type__c = item.FuelType;
newCase.Fuel2_Delivered_Amount__c = item.FuelDeliveredAmount;
}
}
when 3
{
newCase.Fuel3_Requested_Type__c = item.FuelType;
if (theOrder.FuelOrderStatus == 'Delivered')
{
newCase.Fuel3_Delivered_Type__c = item.FuelType;
newCase.Fuel3_Delivered_Amount__c = item.FuelDeliveredAmount;
}
}
when 4
{
newCase.Fuel4_Requested_Type__c = item.FuelType;
if (theOrder.FuelOrderStatus == 'Delivered')
{
newCase.Fuel4_Delivered_Type__c = item.FuelType;
newCase.Fuel4_Delivered_Amount__c = item.FuelDeliveredAmount;
}
}
}
}
System.debug('about to insert case');
Insert newCase;
theResponse.OrderNumber = theOrder.TMWOrderNumber;
theResponse.CaseNumber = newCase.CaseNumber;
orderList.Add(theResponse);
}
else
{
// Update existing case
Case updCase = theCases[0];
if (updCase.Fuel_Order_Status__c != theOrder.FuelOrderStatus)
{
updCase.Status = theOrder.Status;
updCase.Fuel_Order_Status__c = theOrder.FuelOrderStatus;
updCase.TMW_Order_Num__c = theOrder.TMWOrderNumber;
updCase.TMWSentDt__c = Date.today();
updCase.Credit_Alert_Type__c = theOrder.CreditAlerttype;
// update Delivered fields for completed orders
if (theOrder.FuelOrderStatus == 'Delivered')
{
for (FuelOrderItem item : theOrder.FuelOrderItems)
{
if (updCase.Fuel1_Requested_Type__c == item.FuelType)
{
updCase.Fuel1_Delivered_Amount__c = item.FuelDeliveredAmount;
}
else if (updCase.Fuel2_Requested_Type__c == item.FuelType)
{
updCase.Fuel2_Delivered_Amount__c = item.FuelDeliveredAmount;
}
else if (updCase.Fuel3_Requested_Type__c == item.FuelType)
{
updCase.Fuel3_Delivered_Amount__c = item.FuelDeliveredAmount;
}
else if (updCase.Fuel4_Requested_Type__c == item.FuelType)
{
updCase.Fuel4_Delivered_Amount__c = item.FuelDeliveredAmount;
}
}
updCase.Delivered_Time__c = theOrder.DeliveredTime;
updCase.Carrier_Confirm_Date_Time__c = theOrder.CarrierConfirmDateTime;
}
System.debug('about to update case');
Update updCase;
theResponse.OrderNumber = theOrder.TMWOrderNumber;
theResponse.CaseNumber = updCase.CaseNumber;
orderList.Add(theResponse);
}
}
}
return orderList;
}
}
1. Please tell me if this is good Apex class. By good I mean, up to SF best practices, bulkification etc.
2. I need help in writing a test class.
@RestResource(urlMapping='/TmwCaseUpdates/v1/*')
global class TmwCaseUpdates
{
global class OrderResponse
{
string OrderNumber;
List<string> Comments = new List<string>();
List<string> Errors = new List<string>();
string CaseNumber;
}
global class FuelOrderItem
{
string FuelOrderNumber;
string FuelType;
string CaseNumber;
long FuelOrderedAmount;
long FuelDeliveredAmount;
}
global class SalesforceUpdateCase
{
string Status;
string FuelOrderStatus;
string TMWOrderNumber;
DateTime DeliveredTime;
DateTime CarrierConfirmDateTime;
string[] CaseComments;
List<FuelOrderItem> FuelOrderItems;
string NotifiedDate;
string CreditAlertType;
Date RequestDeliveryDate;
string RequestDeliveryTimeframe;
string Description;
string Subject;
string CompanyCode;
string Origin;
long QuantityDelivered;
long QuantityRequested;
}
global static string GetAccountID(string companyId)
{
string cmpID = 'TMW-' + companyId;
string accountID = [SELECT IntegratedSite__c FROM Translation_Table__c where Surrogate_ID__c='TMW-JMJHOR01' LIMIT 1].Id;
return accountID;
}
@HttpPost
global static List<OrderResponse> UpdateOrders()
{
string requestBody = RestContext.request.requestBody.tostring();
System.debug('input data is ' + requestBody);
List<SalesforceUpdateCase> updOrders = (List<SalesforceUpdateCase>)JSON.deserialize(requestBody, List<SalesforceUpdateCase>.class);
System.debug(updOrders);
// create OrderResponse list to be returned to the caller
List<OrderResponse> orderList = new List<OrderResponse>();
// loop through SalesforceUpdateCase objects. Create new cases for valid orders. Return any case comments
for (SalesforceUpdateCase theOrder : updOrders)
{
OrderResponse theResponse = new OrderResponse();
List<Case> theCases = new List<Case>();
theCases = [ select id, status, AccountId, TMW_Order_Num__c, CaseNumber, Fuel_Order_Status__c
FROM case WHERE TMW_Order_Num__c = :theOrder.TMWOrderNumber ];
System.debug('order # is ' + theOrder.TMWOrderNumber);
if (theCases.size() > 1)
{
theResponse.Errors.Add('Case ' + theCases[0].CaseNumber + 'for TMW Order ' + theOrder.TMWOrderNumber + ' already exists');
System.debug('Case ' + theCases[0].CaseNumber + 'for TMW Order ' + theOrder.TMWOrderNumber + ' already exists');
theResponse.OrderNumber = theOrder.TMWOrderNumber;
theResponse.CaseNumber = theCases[0].CaseNumber;
orderList.Add(theResponse);
} else if (theCases.size() == 0)
{
// Create new SF case
Case newCase = new Case();
newCase.Status = theOrder.Status;
newCase.Fuel_Order_Status__c = theOrder.FuelOrderStatus;
newCase.TMW_Order_Num__c = theOrder.TMWOrderNumber;
newCase.TMWSentDt__c = Date.today();
newCase.Credit_Alert_Type__c = theOrder.CreditAlerttype;
newCase.Delivered_Time__c = theOrder.DeliveredTime;
// Get the company code from the translation table. Company codes are stored as TMW-xxxxx
string translatedCompanyCode = 'TMW-' + theOrder.CompanyCode;
System.debug(translatedCompanyCode);
newCase.AccountId = [SELECT IntegratedSite__c
FROM Translation_Table__c
WHERE Surrogate_ID__c = :translatedCompanyCode].IntegratedSite__c;
newCase.RQ_Delivery_Timeframe__c = theOrder.RequestDeliveryTimeframe;
newCase.RQ_Delivery_Date__c = theOrder.RequestDeliveryDate;
newCase.Origin = theOrder.Origin;
integer i = 0;
for (FuelOrderItem item : theOrder.FuelOrderItems)
{
i++;
switch on i
{
when 1
{
newCase.Fuel1_Requested_Type__c = item.FuelType;
if (theOrder.FuelOrderStatus == 'Delivered')
{
newCase.Fuel1_Delivered_Type__c = item.FuelType;
newCase.Fuel1_Delivered_Amount__c = item.FuelDeliveredAmount;
}
}
when 2
{
newCase.Fuel2_Requested_Type__c = item.FuelType;
if (theOrder.FuelOrderStatus == 'Delivered')
{
newCase.Fuel2_Delivered_Type__c = item.FuelType;
newCase.Fuel2_Delivered_Amount__c = item.FuelDeliveredAmount;
}
}
when 3
{
newCase.Fuel3_Requested_Type__c = item.FuelType;
if (theOrder.FuelOrderStatus == 'Delivered')
{
newCase.Fuel3_Delivered_Type__c = item.FuelType;
newCase.Fuel3_Delivered_Amount__c = item.FuelDeliveredAmount;
}
}
when 4
{
newCase.Fuel4_Requested_Type__c = item.FuelType;
if (theOrder.FuelOrderStatus == 'Delivered')
{
newCase.Fuel4_Delivered_Type__c = item.FuelType;
newCase.Fuel4_Delivered_Amount__c = item.FuelDeliveredAmount;
}
}
}
}
System.debug('about to insert case');
Insert newCase;
theResponse.OrderNumber = theOrder.TMWOrderNumber;
theResponse.CaseNumber = newCase.CaseNumber;
orderList.Add(theResponse);
}
else
{
// Update existing case
Case updCase = theCases[0];
if (updCase.Fuel_Order_Status__c != theOrder.FuelOrderStatus)
{
updCase.Status = theOrder.Status;
updCase.Fuel_Order_Status__c = theOrder.FuelOrderStatus;
updCase.TMW_Order_Num__c = theOrder.TMWOrderNumber;
updCase.TMWSentDt__c = Date.today();
updCase.Credit_Alert_Type__c = theOrder.CreditAlerttype;
// update Delivered fields for completed orders
if (theOrder.FuelOrderStatus == 'Delivered')
{
for (FuelOrderItem item : theOrder.FuelOrderItems)
{
if (updCase.Fuel1_Requested_Type__c == item.FuelType)
{
updCase.Fuel1_Delivered_Amount__c = item.FuelDeliveredAmount;
}
else if (updCase.Fuel2_Requested_Type__c == item.FuelType)
{
updCase.Fuel2_Delivered_Amount__c = item.FuelDeliveredAmount;
}
else if (updCase.Fuel3_Requested_Type__c == item.FuelType)
{
updCase.Fuel3_Delivered_Amount__c = item.FuelDeliveredAmount;
}
else if (updCase.Fuel4_Requested_Type__c == item.FuelType)
{
updCase.Fuel4_Delivered_Amount__c = item.FuelDeliveredAmount;
}
}
updCase.Delivered_Time__c = theOrder.DeliveredTime;
updCase.Carrier_Confirm_Date_Time__c = theOrder.CarrierConfirmDateTime;
}
System.debug('about to update case');
Update updCase;
theResponse.OrderNumber = theOrder.TMWOrderNumber;
theResponse.CaseNumber = updCase.CaseNumber;
orderList.Add(theResponse);
}
}
}
return orderList;
}
}
That's a no-no.
You will hit governor limits as the SELECT statement will be called on every iteration of the loop.
I would need time to check the rest, buts that's a start point.
Regards
Andrew G
All Answers
That's a no-no.
You will hit governor limits as the SELECT statement will be called on every iteration of the loop.
I would need time to check the rest, buts that's a start point.
Regards
Andrew G
Please check once below sample code :
Hope this helps you!
If my answer helps resolve your query, please mark it as the 'Best Answer' & upvote it to benefit others.
Thanks
Varaprasad
Salesforce Freelance Consultant/Developer/Administrator
@For Salesforce Project Support: varaprasad4sfdc@gmail.com
Salesforce latest interview questions :
https://www.youtube.com/channel/UCOcam_Hb4KjeBdYJlJWV_ZA?sub_confirmation=1
Varapasa - I tried the code you sent and it has lots of errors.