• Lisa Haigy 37
  • NEWBIE
  • 0 Points
  • Member since 2019
  • Senior Salesforce Administrator
  • TrialCard

  • Chatter
    Feed
  • 0
    Best Answers
  • 1
    Likes Received
  • 0
    Likes Given
  • 5
    Questions
  • 1
    Replies
I have a VFP that our reps use to record the outcome of any outbound calls they make on a contact.  There is a "call" button on the contact page that brings up the Call Visualforce page.  The Cancel button should close the VFP and return the user to the contact page and delete the call record. The error- Delete failed. First exception on row 0 with id xxxxxxxxxxxxxxxxxx; first error: ENTITY_IS_DELETED, entity is deleted: []  Error is in expression '{!callCancel}' in component <apex:commandButton> in page call: Class.CallExtension.callCancel: line 537, column 1
 
    public void callCancel() {
        //system.debug('****Cancelling***');
        Delete call;
 

So I am in a jam.  I am trying to deploy a few classes and a visual force page and I am getting the following errors.  I'm new to the "developer" side of Salesforce and need at least a starting point to try and figure out what is going on. 
The full error I receive is:
System.NullPointerException: Attempt to de-reference a null object 
Stack Trace: Class.Utilities.readFieldSet: line 111, column 1 Class.Fulfillment.SendToFulfillment: line 70, column 1

global class Fulfillment {
    public static final String USER_ID = 'fulfillmentSvc VE';
    public static final String CREATE_ORDER_METHOD = 'legacyorders';
    
    @future (callout=true)
    global static void SendToFulfillment(string kitOrderId, Boolean isTest){
        Access_Service_Token__c tokenRecord = Utilities.getAccessToken(Utilities.FULFILLMENT_SERVICE_INTERFACE_NAME);
        String accessToken = tokenRecord.Access_Token__c;
        
        // querying all fields because the Custom Fields are configurable
        // which means any Kit Order field could potentially be added
        String queryFields = Utilities.getSOQLFields('Fulfillment_Order__c');
        String query = 'SELECT ' + queryFields + ' FROM Fulfillment_Order__c WHERE Id = \'' + kitOrderId + '\' LIMIT 1';
        system.debug('query: ' + query);
        Fulfillment_Order__c ko = (Fulfillment_Order__c)Database.query(query);
        System.debug('query: ' + query);
        
        
        //only process if valid ship to information was entered
        /* This is not currently used
* */
        
        if(ko.Ship_To_First_Name__c != null && ko.Ship_To_First_Name__c == 'Contact' &&
           ko.Ship_To_Last_Name__c != null && ko.Ship_To_Last_Name__c == 'Placeholder'){
               system.debug('shipping to contact placeholder');
               return;
           }
        
        Utilities.APIMapping apiMap = Utilities.getAPIMappings(Utilities.FULFILLMENT_SERVICE_INTERFACE_NAME);
        
        NewOrderRequest req = new NewOrderRequest();
        req.OrderBatchId = ko.Order_Batch__c == null ? 0 : Integer.valueOf(ko.Order_Batch__c);
        req.PlacementReference = ko.ID;
        req.ShipToFirstName = ko.Ship_To_First_Name__c == null ? ko.Contact_First_Name__c : ko.Ship_To_First_Name__c; // BC
        req.ShipToMiddle = '';
        req.ShipToLastName = ko.Ship_To_Last_Name__c == null ? ko.Contact_Last_Name__c : ko.Ship_To_Last_Name__c; // BC
        req.ShipToAddress1 = ko.Ship_To_Attention__c == null ? ko.Ship_To_Address__c : 'Attn: ' + ko.Ship_To_Attention__c;
        // if attention is populated then address 2 should be the address
        req.ShipToAddress2 = ko.Ship_To_Attention__c == null ? '' :  ko.Ship_To_Address__c;
        req.ShipToCity = ko.Ship_To_City__c == null ? '' : ko.Ship_To_City__c;
        req.ShipToState = ko.Ship_To_State__c == null ? '' : ko.Ship_To_State__c;
        req.ShipToZip = ko.Ship_To_Zip__c == null ? '' : ko.Ship_To_Zip__c;
        req.SiteName = ko.SiteName__c == null ? '': ko.SiteName__c;
        req.ShipToCountry = ko.Ship_To_Country__c == null ? '' : ko.Ship_To_Country__c;
        req.UserId = USER_ID; // this will always be static
        req.IsTestMode = false;
        req.KitsRequired = ko.Quantity__c == null ? 1 : Integer.valueOf(ko.Quantity__c);
        req.Details.SourceSystem = '5';
        
        system.debug('req' + req);
        
        // custom fields uses a fieldset to populate
        // update the Custom_Fields field set to modify the fields/values sent in the customfields
        // field in the request body
        List<String> customFields = new List<String>();
        List<Schema.FieldSetMember> fieldSetMemberList =  Utilities.readFieldSet('Custom_Fields','Fulfillment_Order__c');
        for(Schema.FieldSetMember fieldSetMemberObj : fieldSetMemberList) {
            customFields.add((String)ko.get(fieldSetMemberObj.getFieldPath()));
        }
        req.Details.CustomFields = customFields;
        
        string CallEndPoint = apiMap.EndPoint + '/' + CREATE_ORDER_METHOD;
        system.debug('CallEndPoint:' + CallEndPoint);  
        
        string requestBody = JSON.serializePretty(req);
        
        system.debug(requestBody);
        
        HttpRequest webreq = new HttpRequest();
        HttpResponse webresp = new HttpResponse();
        Http http = new Http();
        
        
        webreq.setEndpoint(CallEndPoint);
        webreq.setMethod('POST');
        webreq.setCompressed(false);
        webreq.setHeader('Content-Type', 'application/json');
        webreq.setTimeout(20000);
        webreq.setHeader('Accept', 'application/json');
        webreq.setHeader('Authorization', 'Bearer ' + accessToken);
        if (apiMap.Prod == False)    
            webreq.setHeader('x-tc-userid', '9MZ_QGFAwueYN8dV_IQj8g~~'); //uat
        else 
            webreq.setHeader('x-tc-userid', '8CeFr9rb7DZ43Pom76kMxA~~'); //prod
        
        webreq.setBody(requestBody);
        System.debug('apiMap.Prod = ' + apiMap.Prod);
        System.debug('Access Token requestBody: '+ requestBody);        
        
        try {
            webresp = http.send(webreq);
            system.debug('successfully sent to fulfillment service' + webresp);
        }
        catch(Exception e){
            system.debug('Exception to fulfillment service: ' + e.getMessage());
            Utilities.logErrors('Exception to fulfillment service: ' + e.getMessage());
        }
        
        //string jsonResponse = '';
        string jsonResponse = webresp.getBody();
        System.debug('Fulfillment jsonResponse: '+ jsonResponse);
        
        //deserialize json into the response object
        NewOrderResponse orderResp = (NewOrderResponse)JSON.deserialize(jsonResponse, NewOrderResponse.class);
        
        system.debug('orderResp' + orderResp);
        
        if(orderResp.Success){
            Integer orderId = orderResp.Data;
            
            //Fulfillment_Order__c ko = req.kitOrder;
            ko.Order_Id__c = String.valueOf(orderId);
            //update the address so we know where it shipped to
            ko.Ship_To_First_Name__c = req.ShipToFirstName;
            ko.Ship_To_Last_Name__c = req.ShipToLastName;
            ko.Ship_To_Attention__c = req.ShipToAddress2 == '' ? '' : req.ShipToAddress1;
            ko.Ship_To_Address__c = req.ShipToAddress2 == '' ? req.ShipToAddress1 : req.ShipToAddress2;
            ko.Ship_To_City__c = req.ShipToCity;
            ko.Ship_To_State__c = req.ShipToState;
            ko.Ship_To_Zip__c = req.ShipToZip;
            ko.SiteName__c = req.SiteName;
            ko.Ship_To_Country__c = req.ShipToCountry;
            
            try{
                Database.update(ko, false);
            }
            catch(Exception ex){
                system.debug('Exception updating kit order after being sent to fulfillment: ' + ex.getMessage());
                Utilities.logErrors('Exception updating kit order after being sent to fulfillment:\n' + ex.getMessage());
            }   
        }
        else{
            //return 'Fail|' + orderResp.Messages[0];
        }
        AccessService.accesssTokenCleanup(tokenRecord);
    }
    global static void GetOrderStatus(string orderId){
        
        HttpRequest webreq = new HttpRequest();
        HttpResponse webresp = new HttpResponse();
        Http http = new Http();
        
        Utilities.APIMapping apiMap = Utilities.getAPIMappings(Utilities.FULFILLMENT_SERVICE_INTERFACE_NAME);
        String endPoint = apiMap.EndPoint + '/' +CREATE_ORDER_METHOD +'/'+ orderId;
        Access_Service_Token__c tokenRecord = Utilities.getAccessToken(Utilities.FULFILLMENT_SERVICE_INTERFACE_NAME);
        String accessToken = tokenRecord.Access_Token__c;
        
        System.debug('Fulfillment.GetOrderStatus: Endpoint ' + endpoint );
        webreq.setEndpoint(endPoint);
        webreq.setMethod('GET');
        webreq.setCompressed(false);
        webreq.setHeader('Content-Type', 'application/json');
        webreq.setTimeout(20000);
        webreq.setHeader('Accept', 'application/json');
        if (apiMap.Prod == False)    
            webreq.setHeader('x-tc-userid', '9MZ_QGFAwueYN8dV_IQj8g~~'); //uat
        else 
            webreq.setHeader('x-tc-userid', '8CeFr9rb7DZ43Pom76kMxA~~'); //prod
        webreq.setHeader('Authorization', 'Bearer ' + accessToken);
        
        try{
            webresp = http.send(webreq);
            system.debug('successfully call order status service'+ webreq);
        }
        catch(Exception e){
            system.debug('Exception to fulfillment service: ' + e.getMessage());
            Utilities.logErrors('Exception to fulfillment service (GetOrders): ' + e.getMessage());
        }
        
        string jsonResponse = webresp.getBody();
        system.debug('jsonResponse: ' + jsonResponse);
        
        if(jsonResponse != null && jsonResponse != ''){
            //deserialize json into the response object
            OrderStatusResponse orderResp = (OrderStatusResponse)JSON.deserialize(jsonResponse, OrderStatusResponse.class);
            
            system.debug('orderResp ' + orderResp);
            
            if(orderResp.Success){
                system.debug('orderResp.Success' + orderResp.Success);   
                //update related order record with status info
                Fulfillment_Order__c ko = [select Id, Is_Acknowledged__c, Status__c, Is_Shipped__c, Ship_Date__c, Tracking_Number__c from Fulfillment_Order__c where Order_Id__c = :orderId];
                
                ko.Order_Id__c = String.valueOf(orderId);
                ko.Is_Acknowledged__c = orderResp.Data.IsAcknowledged;
                ko.Is_Shipped__c = orderResp.Data.IsShipped;
                ko.Status__c = orderResp.Data.OrderStatus;
                //parse dates since they come in as: May 21 2015 3:29PM
                ko.Ship_Date__c = orderResp.Data.ShipDate != null ? Utilities.FormatDate(orderResp.Data.ShipDate): null;
                ko.Tracking_Number__c = orderResp.Data.TrackingNumber;
                
                Database.update(ko, false);
                //return success message
                system.debug('Success' + ko);
            }
            else{
                system.debug(orderResp.Messages[0]);
            }
        }
        else{
            system.debug('Fail|No data was returned from order status service');
        }
        AccessService.accesssTokenCleanup(tokenRecord);
    }
    
    
    global class NewOrderRequest{
        public Integer OrderBatchId {get; set;}
        public string PlacementReference {get; set;}
        public string ShipToFirstName {get; set;}
        public string ShipToMiddle {get; set;}
        public string ShipToLastName {get; set;}
        public string ShipToAddress1 {get; set;}
        public string ShipToAddress2 {get; set;}
        public string ShipToCity {get; set;}
        public string ShipToState {get; set;}
        public string ShipToCountry {get; set;}
        public string ShipToZip {get; set;}
        public string ShipToPhone {get; set;}
        public string ShipToFax {get; set;}
        public string SiteName {get; set;}
        public string UserId {get; set;}
        public Boolean IsTestMode {get; set;}
        public Integer KitsRequired {get; set;}
        public Fulfillment_Order__c kitOrder {get; set;}
        public OrderDetails Details {get; set;}
        
        public NewOrderRequest(){
            Details = new OrderDetails();
        }
    }
    
    global class OrderDetails{
        public string SourceSystem {get; set;}
        public List<string> CustomFields {get; set;}
        
        public OrderDetails(){
        }
    }
    global class OrderStatusResponseData {
        public Boolean IsAcknowledged {get; set;}
        public Integer OrderStatusId {get; set;}
        public String OrderStatus {get; set;}
        public String VendorName {get; set;}
        public String CaseNumber {get; set;}
        public Boolean IsShipped {get; set;}
        public String ShipDate {get; set;}
        public String TrackingNumber {get; set;}
        public Integer OrderId {get; set;}
        public Integer VendorId {get; set;}
        public Integer OrderFulfillmentDetailsId {get; set;}
        
        public OrderStatusResponseData (){
            
        }
    }
    
    global class NewOrderResponse{
        public Boolean Success {get; set;}
        public List<string> Messages {get; set;}
        public Integer Data {get; set;}
        public NewOrderResponse(){
            
        }
    }
    
    global class OrderStatusResponse{
        public Boolean Success {get; set;}
        public List<String> Messages {get; set;}
        public OrderStatusResponseData Data {get;set;}
        public OrderStatusResponse(){
            
        }
    }
    
    
}


Test Class:

@isTest
private class Fulfillment_Test {
    
    // static final Id patientRecordTypeId = [Select Id From RecordType Where SObjectType = 'Account' and DeveloperName = 'IndustriesIndividual'].Id;
    
    static string Kit_Order_Id;
    
    @testSetup static void setup() {
        
        APIEndpointURLMapping__c apiRecord = new APIEndpointURLMapping__c();
        apiRecord.Name = 'FulfillmentService';
        apiRecord.InterfaceName__c = 'FulfillmentService';
        apiRecord.NonProdEndPoint__c = 'https://fulfillment-uat.trialcard.com/api/v2';
        apiRecord.ProdEndPoint__c = 'https://fulfillment-uat.trialcard.com/api/v2';
        apiRecord.NonProdPassword__c = '12345';
        apiRecord.NonProdUserName__c =  'fulfillmentSvc VE';
        apiRecord.Prod__c =  False;
        insert apiRecord;
        
        Program__c program = new Program__c(Name = 'Test Program');
        insert program;
        
        Account patientAcct = new Account(Name = 'Test Patient', Program__c = program.Id);
        insert patientAcct;
        
        Contact patientContact = new Contact(LastName = 'Patient', FirstName = 'Test', AccountId = patientAcct.Id);
        insert patientContact;
        
        Fulfillment_Order__c ko = new Fulfillment_Order__c();
        ko.Contact__c = patientContact.Id;
        ko.Order_Code__c = '123';
        ko.Order_Id__c = '1';
        ko.Ship_To_First_Name__c = 'Bob';
        ko.Ship_To_Last_Name__c = 'Bobberson';
        ko.SiteName__c = 'Lisa Haigy';
        ko.Ship_To_Address__c = '12 Main St.';
        ko.Ship_To_City__c = 'little Town';
        ko.Ship_To_State__c = 'NC';
        ko.Ship_To_Zip__c = '12345';
        ko.Ship_To_Country__c = 'US';
        ko.Status__c='Open';
        insert ko;
        
        Kit_Order_Id =ko.Id;                
    }
    
    static testMethod void testSendToFulfillment() {
        
        Test.startTest();
        
        // Get Kit Order id created in test class
        Fulfillment_Order__c ko1 = [Select Status__c From Fulfillment_Order__c Where Order_Id__c = '1'];
        Kit_Order_Id  = ko1.Id;
        
        //Fulfillment.SendToFulfillment(Kit_Order_Id, False); 
        Map<String, String> responseHeaders = new Map<String, String>();
        responseHeaders.put('Content-Type', 'application/json');
        Fulfillment.NewOrderResponse resp = new Fulfillment.NewOrderResponse();
        resp.Success = True;
        resp.Data = 1;
        string responseBody = JSON.serializePretty(resp);
        
        Test.setMock(HttpCalloutMock.class, new MockHttpResponseGenerator(200, 'Success', responseBody, responseHeaders));
        
        system.debug('Kit_Order_Id: ' + Kit_Order_Id);
        Fulfillment.SendToFulfillment(Kit_Order_Id, False);
        Test.stopTest();
        Fulfillment_Order__c ko = [Select Status__c From Fulfillment_Order__c Where Order_Id__c = '1'];
        system.assertEquals(1 , resp.Data);
    }

    static testMethod void testGetOrderStatus() {

        Map<String, String> responseHeaders = new Map<String, String>();
        responseHeaders.put('Content-Type', 'application/json');
        
        Fulfillment.OrderStatusResponse resp = new Fulfillment.OrderStatusResponse();
        resp.Success = True;
        resp.Data = new Fulfillment.OrderStatusResponseData();
        resp.Data.IsAcknowledged = True;
        resp.Data.OrderStatusId= 1;
        resp.Data.OrderStatus='Open';
        resp.Data.VendorName='TCFax';
        resp.Data.CaseNumber ='';
        resp.Data.IsShipped=False;
        resp.Data.ShipDate = '';
        resp.Data.TrackingNumber = '';
        resp.Data.OrderId= 1;
        resp.Data.VendorId = 86;
        resp.Data.OrderFulfillmentDetailsId = 1;
        string responseBody = JSON.serializePretty(resp);
        
        Test.setMock(HttpCalloutMock.class, new MockHttpResponseGenerator(200, 'Success', responseBody, responseHeaders));
        Test.startTest();
        Fulfillment.GetOrderStatus('1');
        Test.stopTest();
        
        Fulfillment_Order__c ko = [Select Status__c From Fulfillment_Order__c Where Order_Id__c = '1'];
        system.assertEquals('Open', ko.Status__c);
        
    }
}
I am working on the Trailhead Build Logic to Reassign Accounts and I get the following Error  even after using a new DE to check the challenge.

There was an unexpected error while verifying this challenge. Usually this is due to some pre-existing configuration or code in the challenge Org. We recommend using a new Developer Edition (DE) to check this challenge. If you're using a new DE and seeing this error, please post to the developer forums and reference error id: EMGKIEAY
Contract Salesforce developer in Morrisville, NC
We need a short term contract apex/visualforce developer to help with the transition from Classic to Lightning.
 
Looking for a local developer only to be on-site for a few weeks.
 
No recruiters please
Drop Down items disappear in Chrome
My agents use a drop down box on a visualforce page and when in Chrome, the picklist values disappear.  They have to unpin the browser window for them to come back. 

Is this something with Chrome or with the VFP?  Any thoughts?
 
Contract Salesforce developer in Morrisville, NC
We need a short term contract apex/visualforce developer to help with the transition from Classic to Lightning.
 
Looking for a local developer only to be on-site for a few weeks.
 
No recruiters please
I have a VFP that our reps use to record the outcome of any outbound calls they make on a contact.  There is a "call" button on the contact page that brings up the Call Visualforce page.  The Cancel button should close the VFP and return the user to the contact page and delete the call record. The error- Delete failed. First exception on row 0 with id xxxxxxxxxxxxxxxxxx; first error: ENTITY_IS_DELETED, entity is deleted: []  Error is in expression '{!callCancel}' in component <apex:commandButton> in page call: Class.CallExtension.callCancel: line 537, column 1
 
    public void callCancel() {
        //system.debug('****Cancelling***');
        Delete call;