From 410599fdf4f96d7f19b51bc28e544fa4e8780a1e Mon Sep 17 00:00:00 2001
From: binxie <137736985@qq.com>
Date: 星期一, 26 六月 2023 14:06:00 +0800
Subject: [PATCH] backup

---
 force-app/main/default/classes/LayoutDescriberHelper.cls        | 1335 +++++----------------
 .sf/config.json                                                 |    4 
 manifest/package.xml                                            |    7 
 force-app/main/default/classes/LayoutDescriberHelperTest.cls    |  206 ++-
 force-app/main/default/classes/NewAndEditLeadController.cls     | 1699 +++++++++-------------------
 force-app/main/default/classes/NewAndEditLeadControllerTest.cls |  348 +++++
 6 files changed, 1,332 insertions(+), 2,267 deletions(-)

diff --git a/.sf/config.json b/.sf/config.json
index 3debff0..5b4e627 100644
--- a/.sf/config.json
+++ b/.sf/config.json
@@ -1,3 +1,3 @@
 {
-  "target-org": "OlympusStageEnv"
-}
\ No newline at end of file
+  "target-org": "OlympusDev"
+}
diff --git a/force-app/main/default/classes/LayoutDescriberHelper.cls b/force-app/main/default/classes/LayoutDescriberHelper.cls
index ec17bad..388a57d 100644
--- a/force-app/main/default/classes/LayoutDescriberHelper.cls
+++ b/force-app/main/default/classes/LayoutDescriberHelper.cls
@@ -3,1009 +3,362 @@
  * Created Date: 01/19/2022
  * Purpose: Utility class for describe layouts
  * Test Class: LayoutDescriberHelper_Test
- * History: 
+ * History:
  * 		01/19/2022 - Bubba Li - Initial Code.
- * 
+ *
  * */
 
 public class LayoutDescriberHelper {
-    public static String urlPrefixToUse {get;set;}
-    public static List<String> requiredFieldAPIList{set;get;}
-    public static Map<String,String> fieldAPIToLabelMap{set;get;}
-    public static Set<String> CaseWebFields = new Set<String>{'SuppliedCompany','SuppliedName','SuppliedEmail','SuppliedPhone'};
-    public static Set<String> ConcatenationNameSType = new Set<String>{'Lead','Contact'};
-    public static LayoutWrapper describeSectionWithFieldsWrapper(Id recordTypeId, String objectType,String userMode){
-        if(String.isEmpty(recordTypeId)){
-            //Assign default record type for sobject
-            recordTypeId = getDefaultRecordType(objectType);
-        }
-        List<LayoutSection> layoutSections = null;
-        if(Test.isRunningTest()){
-            layoutSections = (List<LayoutSection>)Json.deserialize('[{"useHeader":true,"name":"Information","layoutFields":[{"isRequired":false,"isPlaceHolder":false,"fieldType":"reference","fieldLabel":"Owner","fieldAPI":"OwnerId","editableField":false,"defaultValue":null},{"isRequired":false,"isPlaceHolder":false,"fieldType":"string","fieldLabel":"鏂囦欢鍚�","fieldAPI":"FileName__c","editableField":true,"defaultValue":null},{"isRequired":false,"isPlaceHolder":false,"fieldType":"picklist","fieldLabel":"Currency","fieldAPI":"CurrencyIsoCode","editableField":true,"defaultValue":null},{"isRequired":false,"isPlaceHolder":false,"fieldType":"string","fieldLabel":"棰勮閾炬帴","fieldAPI":"ViewLink__c","editableField":true,"defaultValue":null},{"isRequired":false,"isPlaceHolder":true,"fieldType":"","fieldLabel":"","fieldAPI":"","editableField":false,"defaultValue":null},{"isRequired":false,"isPlaceHolder":false,"fieldType":"string","fieldLabel":"涓嬭浇閾炬帴","fieldAPI":"DownloadLink__c","editableField":true,"defaultValue":null},{"isRequired":false,"isPlaceHolder":true,"fieldType":"","fieldLabel":"","fieldAPI":"","editableField":false,"defaultValue":null},{"isRequired":false,"isPlaceHolder":false,"fieldType":"string","fieldLabel":"鐖剁骇鐩綍","fieldAPI":"ParentRecordId__c","editableField":true,"defaultValue":null},{"isRequired":false,"isPlaceHolder":true,"fieldType":"","fieldLabel":"","fieldAPI":"","editableField":false,"defaultValue":null},{"isRequired":false,"isPlaceHolder":false,"fieldType":"string","fieldLabel":"AWS File Key","fieldAPI":"AWS_File_Key__c","editableField":true,"defaultValue":null},{"isRequired":false,"isPlaceHolder":true,"fieldType":"","fieldLabel":"","fieldAPI":"","editableField":false,"defaultValue":null}],"columns":2,"allowCollapse":false}]', List<LayoutSection>.class);
-        }else{
-            layoutSections = describeSectionWithFields(recordTypeId,objectType,userMode);
-        }
-        
-        LayoutWrapper layoutWrapperValue = new LayoutWrapper();
-        layoutWrapperValue.layoutSections = layoutSections;
-        layoutWrapperValue.requiredFieldAPIList = requiredFieldAPIList;
-        layoutWrapperValue.fieldAPIToLabelMap = fieldAPIToLabelMap;
-        system.debug('required API List:'+JSON.serialize(layoutWrapperValue));
-        return layoutWrapperValue;
+  public static String urlPrefixToUse { get; set; }
+  public static List<String> requiredFieldAPIList { get; set; }
+  public static Map<String, String> fieldAPIToLabelMap { get; set; }
+  public static Set<String> CaseWebFields = new Set<String>{
+    'SuppliedCompany',
+    'SuppliedName',
+    'SuppliedEmail',
+    'SuppliedPhone'
+  };
+  public static Set<String> ConcatenationNameSType = new Set<String>{
+    'Lead',
+    'Contact'
+  };
+  public static LayoutWrapper describeSectionWithFieldsWrapper(
+    Id recordTypeId,
+    String objectType,
+    String userMode
+  ) {
+    if (String.isEmpty(recordTypeId)) {
+      //Assign default record type for sobject
+      recordTypeId = getDefaultRecordType(objectType);
     }
-    public static List<LayoutSection> describeSectionWithFields(Id recordTypeId, String objectType,String userMode){
-        system.debug('record type id ===>'+ recordTypeId+' object type===>'+objectType + ' userMode===>'+userMode);
-        List<LayoutSection> layoutSections;
-        Map<String,List<LayoutField>> layoutFields;
-        requiredFieldAPIList = new List<String>();
-        fieldAPIToLabelMap = new Map<String,String>();
-        layoutSections = new List<LayoutSection>();
-        String theRespBody = getLayoutSchema(recordTypeId, objectType,userMode);      
-        Map<String, Object> layoutSection = (Map<String, Object>) JSON.deserializeUntyped(theRespBody);
-        Map<String,object> m = new Map<String,object>();
-        if(String.isBlank(recordTypeId)){
-            List<object> pageLayoutDetail = (List<object>)layoutSection.get('layouts');
-            System.debug('Page Layout Section Detail:'+JSON.serialize(pageLayoutDetail[0]));
-            m = (Map<String,object>) pageLayoutDetail[0];
-        }else{
-            m = layoutSection;
-        } 
-        if(m.containsKey('editLayoutSections')){
-            List<object > targetLayout = (List<object>) m.get('editLayoutSections');
-            for(object sectionObject: targetLayout){
-                Map<String,object> section = (Map<String,object>) sectionObject;
-                String sectionH = (String)section.get('heading');
-                boolean useH = (boolean)section.get('useHeading');
-                integer columns = (integer)section.get('columns');
-                boolean useCollapse = (boolean)section.get('useCollapsibleSection');
-                LayoutSection ls = new LayoutSection();
-                ls.Name = sectionH;
-                ls.useHeader = useH;
-                ls.columns = columns;
-                ls.allowCollapse = useCollapse;
-                ls.layoutFields = new List<LayoutField>();                
-                layoutSections.add(ls);
-                List<object> layoutRows = (List<object>)  section.get('layoutRows');
-                system.debug('layout rows ====> '+layoutRows);
-                for(Object itemObject : layoutRows ){
-                    Map<String,object> item = (Map<String,object>) itemObject;
-                    List<object> layoutItem = (List<object>)item.get('layoutItems');
-                    boolean priorFieldLayoutAdded = true;//initially true
-                    for(object fieldItemObject : layoutItem){
-                        Map<String, object> fields = (Map<String,object>) fieldItemObject;
-                        List<object> layoutComponents = (List<object>) fields.get('layoutComponents');
-                        String apiName = '';
-                        String fieldType = '';
-                        String fieldTypeDetail = '';                   
-                        for(Object layoutComponent: layoutComponents){
-                            Map<String, object> componentMap = (Map<String,object>)layoutComponent;
-                            if(componentMap.containsKey('value')){
-                                apiName = (String) componentMap.get('value');
-                            }
-                            
-                            if(componentMap.containsKey('type')){
-                                fieldType = (String) componentMap.get('type');
-                            }
-                            
-                            if(componentMap.containsKey('details')){
-                                Map<String,object> detailsMap = (Map<String,object>) componentMap.get('details');
-                                boolean calculatedField = (boolean)detailsMap.get('calculated');
-                                boolean autoNumberField = (boolean)detailsMap.get('autoNumber');
-                                if(calculatedField || autoNumberField){
-                                    apiName = '';
-                                }                                   
-                                fieldTypeDetail = (String)detailsMap.get('type');
-                            }
-                        }
-                        /*Map<String, object> nameDetails = (Map<String,object>) layoutComponents.get('Name');*/
-                        String fieldLabel = (String) fields.get('label'); 
-                        boolean placeholderF = (boolean) fields.get('placeholder'); 
-                        boolean isEditable = (boolean) fields.get('editableForUpdate')||(boolean)fields.get('editableForNew'); // Check the editable prop
-                        if( (apiName != '' && fieldType =='Field') || (placeholderF)){
-                            if(userMode == 'classic' && fieldTypeDetail == 'address'){
-                                String fieldLabelPrefix = fieldLabel.split(' ')[0] == 'Address'?'':fieldLabel.split(' ')[0];
-                                List<String> addressDetail = new List<String>{'Country','PostalCode','State','City','Street'};
-                                for(String addressType:addressDetail){
-                                    LayoutField lf = new LayoutField();
-                                    lf.isRequired = (Boolean)fields.get('required');
-                                    lf.isPlaceHolder = placeholderF;
-                                    lf.editableField = isEditable;
-                                    lf.fieldAPI = fieldLabelPrefix+addressType;
-                                    
-                                    lf.fieldLabel = fieldLabelPrefix+' '+addressType;
-                                    lf.fieldType = 'string';                                 
-                                    if(ls.Name != '' || layoutSections.size() == 1){
-                                        ls.layoutFields.add(lf);
-                                    }else if(layoutSections.size() - 2 >= 0){
-                                        layoutSections.get(layoutSections.size() - 2).layoutFields.add(lf); 
-                                    }
-                                    if(lf.isRequired){
-                                        system.debug(lf.fieldAPI+' is required');
-                                        requiredFieldAPIList.add(lf.fieldAPI);
-                                    }
-                                    if(string.isBlank(lf.fieldAPI)){
-                                        system.debug('==================================2');
-                                        continue;
-                                    }else{
-                                        fieldAPIToLabelMap.put(lf.fieldAPI,lf.fieldLabel);
-                                    }
-                                }
-                                continue;
-                            }
-                            if(userMode == 'classic' && apiName == 'Name' && ConcatenationNameSType.contains(objectType)){
-                                List<String> nameDetail = new List<String>{'Salutation','LastName'};
-                                for(String nameField:nameDetail){
-                                    LayoutField lf = new LayoutField();
-                                    lf.isRequired = (Boolean)fields.get('required');
-                                    if(nameField == 'Salutation'){
-                                        lf.isRequired = false;
-                                    }
-                                    lf.isPlaceHolder = placeholderF;
-                                    lf.editableField = isEditable;
-                                    lf.fieldAPI = nameField;
-                                    lf.fieldLabel = nameField;
-                                    lf.fieldType = 'string';
-                                    if(ls.Name != '' || layoutSections.size() == 1){
-                                        ls.layoutFields.add(lf);
-                                    }else if(layoutSections.size() - 2 >= 0){
-                                        layoutSections.get(layoutSections.size() - 2).layoutFields.add(lf); 
-                                    }
-                                    if(lf.isRequired){
-                                        system.debug(lf.fieldAPI+' is required');
-                                        requiredFieldAPIList.add(lf.fieldAPI);
-                                    }                                      
-                                    if(string.isBlank(lf.fieldAPI)){
-                                        system.debug('==================================3');
-                                        continue;
-                                    }else{
-                                        fieldAPIToLabelMap.put(lf.fieldAPI,lf.fieldLabel);
-                                    }
-                                }
-                                continue;
-                            }
-                            if(objectType == 'Case' && CaseWebFields.contains(apiName)){
-                                continue;
-                            }
-                            LayoutField lf = new LayoutField();
-                            lf.isRequired = (Boolean)fields.get('required');
-    						lf.isPlaceHolder = placeholderF;
-                            lf.editableField = isEditable;
-                            lf.fieldAPI = apiName;
-                            lf.fieldLabel = fieldLabel;
-                            lf.fieldType = fieldTypeDetail;
-    						if(ls.Name != '' || layoutSections.size() == 1){
-                                ls.layoutFields.add(lf);
-                            }else if(layoutSections.size() - 2 >= 0){
-                                layoutSections.get(layoutSections.size() - 2).layoutFields.add(lf);
-                            }
-                            if(lf.isRequired){
-                                system.debug(lf.fieldAPI+' is required');
-                                requiredFieldAPIList.add(lf.fieldAPI);
-                            }
-                            if(string.isBlank(lf.fieldAPI)){
-                                system.debug('==================================1');
-                                continue;
-                            }else{
-                                fieldAPIToLabelMap.put(lf.fieldAPI,lf.fieldLabel);
-                            }
-                            
-                            priorFieldLayoutAdded = true;
-						}else
-                            priorFieldLayoutAdded = false;
-                    }                  
+    List<LayoutSection> layoutSections = null;
+    if (Test.isRunningTest()) {
+      layoutSections = (List<LayoutSection>) Json.deserialize(
+        '[{"useHeader":true,"name":"Information","layoutFields":[{"isRequired":false,"isPlaceHolder":false,"fieldType":"reference","fieldLabel":"Owner","fieldAPI":"OwnerId","editableField":false,"defaultValue":null},{"isRequired":false,"isPlaceHolder":false,"fieldType":"string","fieldLabel":"鏂囦欢鍚�","fieldAPI":"FileName__c","editableField":true,"defaultValue":null},{"isRequired":false,"isPlaceHolder":false,"fieldType":"picklist","fieldLabel":"Currency","fieldAPI":"CurrencyIsoCode","editableField":true,"defaultValue":null},{"isRequired":false,"isPlaceHolder":false,"fieldType":"string","fieldLabel":"棰勮閾炬帴","fieldAPI":"ViewLink__c","editableField":true,"defaultValue":null},{"isRequired":false,"isPlaceHolder":true,"fieldType":"","fieldLabel":"","fieldAPI":"","editableField":false,"defaultValue":null},{"isRequired":false,"isPlaceHolder":false,"fieldType":"string","fieldLabel":"涓嬭浇閾炬帴","fieldAPI":"DownloadLink__c","editableField":true,"defaultValue":null},{"isRequired":false,"isPlaceHolder":true,"fieldType":"","fieldLabel":"","fieldAPI":"","editableField":false,"defaultValue":null},{"isRequired":false,"isPlaceHolder":false,"fieldType":"string","fieldLabel":"鐖剁骇鐩綍","fieldAPI":"ParentRecordId__c","editableField":true,"defaultValue":null},{"isRequired":false,"isPlaceHolder":true,"fieldType":"","fieldLabel":"","fieldAPI":"","editableField":false,"defaultValue":null},{"isRequired":false,"isPlaceHolder":false,"fieldType":"string","fieldLabel":"AWS File Key","fieldAPI":"AWS_File_Key__c","editableField":true,"defaultValue":null},{"isRequired":false,"isPlaceHolder":true,"fieldType":"","fieldLabel":"","fieldAPI":"","editableField":false,"defaultValue":null}],"columns":2,"allowCollapse":false}]',
+        List<LayoutSection>.class
+      );
+    } else {
+      layoutSections = describeSectionWithFields(
+        recordTypeId,
+        objectType,
+        userMode
+      );
+    }
+
+    LayoutWrapper layoutWrapperValue = new LayoutWrapper();
+    layoutWrapperValue.layoutSections = layoutSections;
+    layoutWrapperValue.requiredFieldAPIList = requiredFieldAPIList;
+    layoutWrapperValue.fieldAPIToLabelMap = fieldAPIToLabelMap;
+    system.debug('required API List:' + JSON.serialize(layoutWrapperValue));
+    return layoutWrapperValue;
+  }
+  public static List<LayoutSection> describeSectionWithFields(
+    Id recordTypeId,
+    String objectType,
+    String userMode
+  ) {
+    system.debug(
+      'record type id ===>' +
+        recordTypeId +
+        ' object type===>' +
+        objectType +
+        ' userMode===>' +
+        userMode
+    );
+    List<LayoutSection> layoutSections;
+    Map<String, List<LayoutField>> layoutFields;
+    requiredFieldAPIList = new List<String>();
+    fieldAPIToLabelMap = new Map<String, String>();
+    layoutSections = new List<LayoutSection>();
+    String theRespBody = getLayoutSchema(recordTypeId, objectType, userMode);
+    System.debug('theRespBody = ' + theRespBody);
+    Map<String, Object> layoutSection = (Map<String, Object>) JSON.deserializeUntyped(
+      theRespBody
+    );
+    Map<String, object> m = new Map<String, object>();
+    if (String.isBlank(recordTypeId)) {
+      List<object> pageLayoutDetail = (List<object>) layoutSection.get(
+        'layouts'
+      );
+      System.debug(
+        'Page Layout Section Detail:' + JSON.serialize(pageLayoutDetail[0])
+      );
+      m = (Map<String, object>) pageLayoutDetail[0];
+    } else {
+      m = layoutSection;
+    }
+    if (m.containsKey('editLayoutSections')) {
+      List<object> targetLayout = (List<object>) m.get('editLayoutSections');
+      for (object sectionObject : targetLayout) {
+        Map<String, object> section = (Map<String, object>) sectionObject;
+        String sectionH = (String) section.get('heading');
+        boolean useH = (boolean) section.get('useHeading');
+        integer columns = (integer) section.get('columns');
+        boolean useCollapse = (boolean) section.get('useCollapsibleSection');
+        LayoutSection ls = new LayoutSection();
+        ls.Name = sectionH;
+        ls.useHeader = useH;
+        ls.columns = columns;
+        ls.allowCollapse = useCollapse;
+        ls.layoutFields = new List<LayoutField>();
+        layoutSections.add(ls);
+        List<object> layoutRows = (List<object>) section.get('layoutRows');
+        system.debug('layout rows ====> ' + layoutRows);
+        for (Object itemObject : layoutRows) {
+          Map<String, object> item = (Map<String, object>) itemObject;
+          List<object> layoutItem = (List<object>) item.get('layoutItems');
+          boolean priorFieldLayoutAdded = true; //initially true
+          for (object fieldItemObject : layoutItem) {
+            Map<String, object> fields = (Map<String, object>) fieldItemObject;
+            List<object> layoutComponents = (List<object>) fields.get(
+              'layoutComponents'
+            );
+            String apiName = '';
+            String fieldType = '';
+            String fieldTypeDetail = '';
+            for (Object layoutComponent : layoutComponents) {
+              Map<String, object> componentMap = (Map<String, object>) layoutComponent;
+              if (componentMap.containsKey('value')) {
+                apiName = (String) componentMap.get('value');
+              }
+
+              if (componentMap.containsKey('type')) {
+                fieldType = (String) componentMap.get('type');
+              }
+
+              if (componentMap.containsKey('details')) {
+                Map<String, object> detailsMap = (Map<String, object>) componentMap.get(
+                  'details'
+                );
+                boolean calculatedField = (boolean) detailsMap.get(
+                  'calculated'
+                );
+                boolean autoNumberField = (boolean) detailsMap.get(
+                  'autoNumber'
+                );
+                if (calculatedField || autoNumberField) {
+                  apiName = '';
                 }
-                if(layoutSections.get(layoutSections.size() -1).layoutFields.size() <= 0) {
-                    layoutSections.remove(layoutSections.size() - 1);
-                }                
+                fieldTypeDetail = (String) detailsMap.get('type');
+              }
             }
-        }
-        System.debug('Layout Section Result:'+JSon.serialize(layoutSections));
-        system.debug('required API List:'+JSON.serialize(requiredFieldAPIList));
-        return layoutSections;
-    }
-    public static String getUrlPrefix(){
-        String baseurl= System.URL.getOrgDomainUrl().getHost();
-        system.debug('original url ===>'+ baseurl);
-        return baseurl;
-    }
+            /*Map<String, object> nameDetails = (Map<String,object>) layoutComponents.get('Name');*/
+            String fieldLabel = (String) fields.get('label');
+            boolean placeholderF = (boolean) fields.get('placeholder');
+            boolean isEditable =
+              (boolean) fields.get('editableForUpdate') ||
+              (boolean) fields.get('editableForNew'); // Check the editable prop
+            if ((apiName != '' && fieldType == 'Field') || (placeholderF)) {
+              if (userMode == 'classic' && fieldTypeDetail == 'address') {
+                String fieldLabelPrefix = fieldLabel.split(' ')[0] == 'Address'
+                  ? ''
+                  : fieldLabel.split(' ')[0];
+                List<String> addressDetail = new List<String>{
+                  'Country',
+                  'PostalCode',
+                  'State',
+                  'City',
+                  'Street'
+                };
+                for (String addressType : addressDetail) {
+                  LayoutField lf = new LayoutField();
+                  lf.isRequired = (Boolean) fields.get('required');
+                  lf.isPlaceHolder = placeholderF;
+                  lf.editableField = isEditable;
+                  lf.fieldAPI = fieldLabelPrefix + addressType;
 
-    public static String getLayoutSchema(Id recordTypeId, String objectType,String userMode){
-        String urlPost = '/services/data/v53.0/sobjects/'+objectType+'/describe/layouts/';
-        if(String.isNotEmpty(recordTypeId) && String.isNotBlank(recordTypeId)){
-            urlPost = urlPost + recordTypeId;
-        }
-        String urlForClassic = 'https://'+getUrlPrefix()+urlPost;
-        
-        system.debug('URL Post:'+urlForClassic);
-        HttpResponse resp = null;
-        HttpRequest req = new HttpRequest();         
-        req.setMethod('GET');        
-        if(userMode =='lightning'){
-            req.setEndPoint('callout:SF_Rest_API'+urlPost);
-            system.debug('callout:SF_Rest_API'+urlPost);
-        }else if(userMode == 'classic'){
-            req.setEndpoint(urlForClassic); 
-            req.setHeader('Authorization', 'Bearer ' + UserInfo.getsessionid());
-        }       
-        Http client = new Http();    
-        resp = client.send(req);
-        system.debug('Schema Body:'+JSON.serialize(resp.getBody()));
-        return resp.getBody();
-    }
+                  lf.fieldLabel = fieldLabelPrefix + ' ' + addressType;
+                  lf.fieldType = 'string';
+                  if (ls.Name != '' || layoutSections.size() == 1) {
+                    ls.layoutFields.add(lf);
+                  } else if (layoutSections.size() - 2 >= 0) {
+                    layoutSections.get(layoutSections.size() - 2)
+                      .layoutFields.add(lf);
+                  }
+                  if (lf.isRequired) {
+                    system.debug(lf.fieldAPI + ' is required');
+                    requiredFieldAPIList.add(lf.fieldAPI);
+                  }
+                  if (string.isBlank(lf.fieldAPI)) {
+                    system.debug('==================================2');
+                    continue;
+                  } else {
+                    fieldAPIToLabelMap.put(lf.fieldAPI, lf.fieldLabel);
+                  }
+                }
+                continue;
+              }
+              if (
+                userMode == 'classic' &&
+                apiName == 'Name' &&
+                ConcatenationNameSType.contains(objectType)
+              ) {
+                List<String> nameDetail = new List<String>{
+                  'Salutation',
+                  'LastName'
+                };
+                for (String nameField : nameDetail) {
+                  LayoutField lf = new LayoutField();
+                  lf.isRequired = (Boolean) fields.get('required');
+                  if (nameField == 'Salutation') {
+                    lf.isRequired = false;
+                  }
+                  lf.isPlaceHolder = placeholderF;
+                  lf.editableField = isEditable;
+                  lf.fieldAPI = nameField;
+                  lf.fieldLabel = nameField;
+                  lf.fieldType = 'string';
+                  if (ls.Name != '' || layoutSections.size() == 1) {
+                    ls.layoutFields.add(lf);
+                  } else if (layoutSections.size() - 2 >= 0) {
+                    layoutSections.get(layoutSections.size() - 2)
+                      .layoutFields.add(lf);
+                  }
+                  if (lf.isRequired) {
+                    system.debug(lf.fieldAPI + ' is required');
+                    requiredFieldAPIList.add(lf.fieldAPI);
+                  }
+                  if (string.isBlank(lf.fieldAPI)) {
+                    system.debug('==================================3');
+                    continue;
+                  } else {
+                    fieldAPIToLabelMap.put(lf.fieldAPI, lf.fieldLabel);
+                  }
+                }
+                continue;
+              }
+              if (objectType == 'Case' && CaseWebFields.contains(apiName)) {
+                continue;
+              }
+              LayoutField lf = new LayoutField();
+              lf.isRequired = (Boolean) fields.get('required');
+              lf.isPlaceHolder = placeholderF;
+              lf.editableField = isEditable;
+              lf.fieldAPI = apiName;
+              lf.fieldLabel = fieldLabel;
+              lf.fieldType = fieldTypeDetail;
+              if (ls.Name != '' || layoutSections.size() == 1) {
+                ls.layoutFields.add(lf);
+              } else if (layoutSections.size() - 2 >= 0) {
+                layoutSections.get(layoutSections.size() - 2)
+                  .layoutFields.add(lf);
+              }
+              if (lf.isRequired) {
+                system.debug(lf.fieldAPI + ' is required');
+                requiredFieldAPIList.add(lf.fieldAPI);
+              }
+              if (string.isBlank(lf.fieldAPI)) {
+                system.debug('==================================1');
+                continue;
+              } else {
+                fieldAPIToLabelMap.put(lf.fieldAPI, lf.fieldLabel);
+              }
 
-    public static Id  getDefaultRecordType(String ObjectName) {
-        Map<String, Schema.SObjectType> GlobalDescribeMap = Schema.getGlobalDescribe();
-        Schema.SObjectType obj = GlobalDescribeMap.get(ObjectName);
-        Schema.DescribeSObjectResult describeResult = obj.getDescribe();
-        List<Schema.RecordTypeInfo> rtInfos = describeResult.getRecordTypeInfos();
-        for(Schema.RecordTypeInfo rtInfo : rtInfos) {
-            if(rtInfo.DefaultRecordTypeMapping) {              
-                return  rtInfo.getRecordTypeId();    
-            }
+              priorFieldLayoutAdded = true;
+            } else
+              priorFieldLayoutAdded = false;
+          }
         }
-        return null;
+        if (
+          layoutSections.get(layoutSections.size() - 1).layoutFields.size() <= 0
+        ) {
+          layoutSections.remove(layoutSections.size() - 1);
+        }
+      }
     }
-    public class LayoutWrapper{
-        @AuraEnabled public List<LayoutSection> layoutSections{set;get;}
-        @AuraEnabled public List<String> requiredFieldAPIList{set;get;}
-        @AuraEnabled public Map<String,String> fieldAPIToLabelMap{set;get;}
+    System.debug('Layout Section Result:' + JSon.serialize(layoutSections));
+    system.debug('required API List:' + JSON.serialize(requiredFieldAPIList));
+    return layoutSections;
+  }
+  public static String getUrlPrefix() {
+    String baseurl = System.URL.getOrgDomainUrl().getHost();
+    system.debug('original url ===>' + baseurl);
+    return baseurl;
+  }
+
+  public static String getLayoutSchema(
+    Id recordTypeId,
+    String objectType,
+    String userMode
+  ) {
+    String urlPost =
+      '/services/data/v53.0/sobjects/' +
+      objectType +
+      '/describe/layouts/';
+    if (String.isNotEmpty(recordTypeId) && String.isNotBlank(recordTypeId)) {
+      urlPost = urlPost + recordTypeId;
     }
-    public class LayoutSection{
-        @AuraEnabled public boolean useHeader {get;set;}
-        @AuraEnabled public String name {get;set;}
-        @AuraEnabled public boolean allowCollapse {get;set;}  
-        @AuraEnabled public integer columns {get;set;}
-        @AuraEnabled public List<LayoutField> layoutFields {get;set;}
+    String urlForClassic = 'https://' + getUrlPrefix() + urlPost;
+
+    system.debug('URL Post:' + urlForClassic);
+    HttpResponse resp = null;
+    HttpRequest req = new HttpRequest();
+    req.setMethod('GET');
+    if (userMode == 'lightning') {
+      req.setEndPoint('callout:SF_Rest_API' + urlPost);
+      system.debug('callout:SF_Rest_API' + urlPost);
+    } else if (userMode == 'classic') {
+      req.setEndpoint(urlForClassic);
+      req.setHeader('Authorization', 'Bearer ' + UserInfo.getsessionid());
     }
-    
-    public class LayoutField{         
-        @AuraEnabled public String fieldAPI {get;set;}
-        @AuraEnabled public String fieldLabel{set;get;}
-        @AuraEnabled public String fieldType{set;get;}
-        @AuraEnabled public boolean editableField {get;set;}
-        @AuraEnabled public boolean isRequired {get; set;}
-        @AuraEnabled public boolean isPlaceHolder {get;set;}      
-        @AuraEnabled public String defaultValue{set;get;}      
+    Http client = new Http();
+    System.debug('req = ' + req);
+    resp = client.send(req);
+    system.debug('Schema Body:' + JSON.serialize(resp.getBody()));
+    return resp.getBody();
+  }
+
+  public static Id getDefaultRecordType(String ObjectName) {
+    Map<String, Schema.SObjectType> GlobalDescribeMap = Schema.getGlobalDescribe();
+    Schema.SObjectType obj = GlobalDescribeMap.get(ObjectName);
+    Schema.DescribeSObjectResult describeResult = obj.getDescribe();
+    List<Schema.RecordTypeInfo> rtInfos = describeResult.getRecordTypeInfos();
+    for (Schema.RecordTypeInfo rtInfo : rtInfos) {
+      if (rtInfo.DefaultRecordTypeMapping) {
+        return rtInfo.getRecordTypeId();
+      }
     }
-public static Integer ControllerUtil() {
-Integer i = 0;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-i++;
-return i;
+    return null;
+  }
+  public class LayoutWrapper {
+    @AuraEnabled
+    public List<LayoutSection> layoutSections { get; set; }
+    @AuraEnabled
+    public List<String> requiredFieldAPIList { get; set; }
+    @AuraEnabled
+    public Map<String, String> fieldAPIToLabelMap { get; set; }
+  }
+  public class LayoutSection {
+    @AuraEnabled
+    public boolean useHeader { get; set; }
+    @AuraEnabled
+    public String name { get; set; }
+    @AuraEnabled
+    public boolean allowCollapse { get; set; }
+    @AuraEnabled
+    public integer columns { get; set; }
+    @AuraEnabled
+    public List<LayoutField> layoutFields { get; set; }
+  }
+
+  public class LayoutField {
+    @AuraEnabled
+    public String fieldAPI { get; set; }
+    @AuraEnabled
+    public String fieldLabel { get; set; }
+    @AuraEnabled
+    public String fieldType { get; set; }
+    @AuraEnabled
+    public boolean editableField { get; set; }
+    @AuraEnabled
+    public boolean isRequired { get; set; }
+    @AuraEnabled
+    public boolean isPlaceHolder { get; set; }
+    @AuraEnabled
+    public String defaultValue { get; set; }
+  }
+  public static Integer ControllerUtil() {
+    Integer i = 0;
+    return i;
+  }
 }
-
-}
\ No newline at end of file
diff --git a/force-app/main/default/classes/LayoutDescriberHelperTest.cls b/force-app/main/default/classes/LayoutDescriberHelperTest.cls
index 2915d9a..4cd2167 100644
--- a/force-app/main/default/classes/LayoutDescriberHelperTest.cls
+++ b/force-app/main/default/classes/LayoutDescriberHelperTest.cls
@@ -1,90 +1,128 @@
 @isTest
 private class LayoutDescriberHelperTest {
-    static testMethod void testMethod1() {
-    	String userMode = 'classic';//classic  lightning
-    	String objectType = 'Contact';
-    	String recordTypeId = Schema.SObjectType.Contact.getRecordTypeInfosByDeveloperName().get('Doctor').getRecordTypeId();
+  static testMethod void testMethod1() {
+    String userMode = 'classic'; //classic  lightning
+    String objectType = 'Contact';
+    String recordTypeId = Schema.SObjectType.Contact.getRecordTypeInfosByDeveloperName()
+      .get('Doctor')
+      .getRecordTypeId();
+    System.debug(
+      'record type id ===>' +
+        recordTypeId +
+        ' object type===>' +
+        objectType +
+        ' userMode===>' +
+        userMode
+    );
+    boolean useHeader = false;
+    String baseurl = System.URL.getOrgDomainUrl().getHost();
+    Map<String, object> detailsMap = new Map<String, object>();
+    Map<String, object> detailsMap2 = new Map<String, object>();
+    Map<String, object> detailsMap3 = new Map<String, object>();
+    detailsMap.put('calculated', true);
+    detailsMap.put('autoNumber', false);
+    detailsMap.put('type', 'address');
+    detailsMap2.put('calculated', false);
+    detailsMap2.put('autoNumber', false);
+    detailsMap2.put('type', 'repair');
+    detailsMap3.put('calculated', false);
+    detailsMap3.put('autoNumber', false);
+    detailsMap3.put('type', 'repair');
+    String fieldTypeDetail = (String) detailsMap.get('type');
 
-    	Map<String,object> detailsMap = new Map<String,object>();
-    	Map<String,object> detailsMap2 = new Map<String,object>();
-    	Map<String,object> detailsMap3 = new Map<String,object>();
-    	detailsMap.put('calculated',true);
-    	detailsMap.put('autoNumber',false);
-    	detailsMap.put('type','address');
-    	detailsMap2.put('calculated',false);
-    	detailsMap2.put('autoNumber',false);
-    	detailsMap2.put('type','repair');
-    	detailsMap3.put('calculated',false);
-    	detailsMap3.put('autoNumber',false);
-    	detailsMap3.put('type','repair');
+    List<Map<String, object>> componentMapList = new List<Map<String, object>>();
+    List<Map<String, object>> componentMapList2 = new List<Map<String, object>>();
+    List<Map<String, object>> componentMapList3 = new List<Map<String, object>>();
+    Map<String, object> componentMap = new Map<String, object>();
+    Map<String, object> componentMap2 = new Map<String, object>();
+    Map<String, object> componentMap3 = new Map<String, object>();
+    componentMap.put('value', 'Name');
+    componentMap.put('type', 'Field');
+    componentMap.put('details', detailsMap);
+    componentMapList.add(componentMap);
+    componentMap2.put('value', 'Name');
+    componentMap2.put('type', 'Field');
+    componentMap2.put('details', detailsMap2);
+    componentMapList2.add(componentMap2);
+    componentMap3.put('value', 'LastName');
+    componentMap3.put('type', 'Field');
+    componentMap3.put('details', detailsMap3);
+    componentMapList3.add(componentMap3);
+    String apiName = (String) componentMap.get('value');
+    String fieldType = (String) componentMap.get('type');
 
-    	List<Map<String, object>> componentMapList = new List<Map<String, object>>();
-    	List<Map<String, object>> componentMapList2 = new List<Map<String, object>>();
-    	List<Map<String, object>> componentMapList3 = new List<Map<String, object>>();
-    	Map<String, object> componentMap = new Map<String, object>();
-    	Map<String, object> componentMap2 = new Map<String, object>();
-    	Map<String, object> componentMap3 = new Map<String, object>();
-    	componentMap.put('value','Name');
-    	componentMap.put('type','Field');
-    	componentMap.put('details',detailsMap);
-    	componentMapList.add(componentMap);
-    	componentMap2.put('value','Name');
-    	componentMap2.put('type','Field');
-    	componentMap2.put('details',detailsMap2);
-    	componentMapList2.add(componentMap2);
-    	componentMap3.put('value','LastName');
-    	componentMap3.put('type','Field');
-    	componentMap3.put('details',detailsMap3);
-    	componentMapList3.add(componentMap3);
+    List<Map<String, object>> layoutComponentsList = new List<Map<String, object>>();
+    Map<String, object> layoutComponents = new Map<String, object>();
+    layoutComponents.put('layoutComponents', componentMapList);
+    layoutComponents.put('label', 'Address');
+    layoutComponents.put('placeholder', true);
+    layoutComponents.put('editableForNew', true);
+    layoutComponents.put('editableForUpdate', true);
+    layoutComponents.put('required', false);
+    layoutComponentsList.add(layoutComponents);
+    Map<String, object> layoutComponents2 = new Map<String, object>();
+    layoutComponents2.put('layoutComponents', componentMapList2);
+    layoutComponents2.put('label', 'Repair');
+    layoutComponents2.put('placeholder', true);
+    layoutComponents2.put('editableForNew', true);
+    layoutComponents2.put('editableForUpdate', true);
+    layoutComponents2.put('required', false);
+    layoutComponentsList.add(layoutComponents2);
+    Map<String, object> layoutComponents3 = new Map<String, object>();
+    layoutComponents3.put('layoutComponents', componentMapList3);
+    layoutComponents3.put('label', 'Repair');
+    layoutComponents3.put('placeholder', true);
+    layoutComponents3.put('editableForNew', true);
+    layoutComponents3.put('editableForUpdate', true);
+    layoutComponents3.put('required', false);
+    layoutComponentsList.add(layoutComponents3);
 
-    	List<Map<String, object>> layoutComponentsList = new List<Map<String, object>>();
-    	Map<String, object> layoutComponents = new Map<String, object>();
-    	layoutComponents.put('layoutComponents',componentMapList);
-    	layoutComponents.put('label','Address');
-    	layoutComponents.put('placeholder',true);
-    	layoutComponents.put('editableForNew',true);
-    	layoutComponents.put('required',false);
-    	layoutComponentsList.add(layoutComponents);
-    	Map<String, object> layoutComponents2 = new Map<String, object>();
-    	layoutComponents2.put('layoutComponents',componentMapList2);
-    	layoutComponents2.put('label','Repair');
-    	layoutComponents2.put('placeholder',true);
-    	layoutComponents2.put('editableForNew',true);
-    	layoutComponents2.put('required',false);
-    	layoutComponentsList.add(layoutComponents2);
-    	Map<String, object> layoutComponents3 = new Map<String, object>();
-    	layoutComponents3.put('layoutComponents',componentMapList3);
-    	layoutComponents3.put('label','Repair');
-    	layoutComponents3.put('placeholder',true);
-    	layoutComponents3.put('editableForNew',true);
-    	layoutComponents3.put('required',false);
-    	layoutComponentsList.add(layoutComponents3);
+    boolean placeholderF = (boolean) layoutComponents.get('placeholder');
+    boolean isEditable =
+      (boolean) layoutComponents.get('editableForUpdate') ||
+      (boolean) layoutComponents.get('editableForNew');
+    System.debug('isEditable ===>' + isEditable);
+    List<Map<String, object>> itemList = new List<Map<String, object>>();
+    Map<String, object> item = new Map<String, object>();
+    item.put('layoutItems', layoutComponentsList);
+    itemList.add(item);
+    useHeader = true;
+    List<Map<String, object>> sectionList = new List<Map<String, object>>();
+    Map<String, object> section = new Map<String, object>();
+    section.put('heading', '');
+    section.put('useHeading', useHeader);
+    section.put('columns', 1);
+    section.put('useCollapsibleSection', true);
+    section.put('layoutRows', itemList);
+    sectionList.add(section);
 
-
-    	List<Map<String,object>> itemList = new List<Map<String,object>>();
-    	Map<String,object> item = new Map<String,object>();
-    	item.put('layoutItems',layoutComponentsList);
-    	itemList.add(item);
-    	
-    	List<Map<String,object>> sectionList = new List<Map<String,object>>();
-    	Map<String,object> section = new Map<String,object>();
-    	section.put('heading','');
-    	section.put('useHeading',true);
-    	section.put('columns',1);
-    	section.put('useCollapsibleSection',true);
-    	section.put('layoutRows',itemList);
-    	sectionList.add(section);
-
-		Map<String, Object> layoutSection = new Map<String,Object>();
-    	layoutSection.put('layouts','123');
-    	layoutSection.put('editLayoutSections',sectionList);
-		String layoutSectionJson = JSON.serialize(layoutSection);
-		LayoutDescriberHelper.ControllerUtil();
-        Test.setMock(HttpCalloutMock.class, new TestDataUtility.BaseHttpMock(layoutSectionJson,'OK','200'));
-
-        Test.startTest();
-        LayoutDescriberHelper.describeSectionWithFieldsWrapper(recordTypeId,objectType,userMode);
-        LayoutDescriberHelper.describeSectionWithFieldsWrapper(null,objectType,userMode);
-        Test.stopTest();
-    }
-}
\ No newline at end of file
+    Map<String, Object> layoutSection = new Map<String, Object>();
+    layoutSection.put('layouts', '123');
+    layoutSection.put('editLayoutSections', sectionList);
+    String layoutSectionJson = JSON.serialize(layoutSection);
+    LayoutDescriberHelper.ControllerUtil();
+    Test.setMock(
+      HttpCalloutMock.class,
+      new TestDataUtility.BaseHttpMock(layoutSectionJson, 'OK', '200')
+    );
+    Test.startTest();
+    LayoutDescriberHelper.describeSectionWithFieldsWrapper(
+      recordTypeId,
+      objectType,
+      userMode
+    );
+    LayoutDescriberHelper.describeSectionWithFieldsWrapper(
+      null,
+      objectType,
+      userMode
+    );
+    LayoutDescriberHelper.describeSectionWithFields(
+      recordTypeId,
+      objectType,
+      userMode
+    );
+    LayoutDescriberHelper.getLayoutSchema(recordTypeId, objectType, userMode);
+    LayoutDescriberHelper.getUrlPrefix();
+    Test.stopTest();
+  }
+}
diff --git a/force-app/main/default/classes/NewAndEditLeadController.cls b/force-app/main/default/classes/NewAndEditLeadController.cls
index c5db97e..023e13b 100644
--- a/force-app/main/default/classes/NewAndEditLeadController.cls
+++ b/force-app/main/default/classes/NewAndEditLeadController.cls
@@ -3,1162 +3,575 @@
  * Created Date: 01/19/2022
  * Purpose: Utility class for describe layouts
  * Test Class: NewAndEditLeadController
- * History: 
+ * History:
  *      01/19/2022 - Bubba Li - Initial Code.
- * 
+ *
  * */
 global without sharing class NewAndEditLeadController {
-    public List <LayoutDescriberHelper.LayoutSection > layoutSections{set;get;}
-    public String awsToken{set;get;}
-    public static Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe();
-    public static String sobjectTypeValue = 'Lead';
-    public Boolean isNewMode{set;get;}
-    public Boolean isCloneMode{protected set;get;}
-    public String rtTypeId {get; set;}
-    public String AWSDataId{set;get;}
-    public String AWSDataIdInquiryForm{set;get;}
-    public String contactId{set;get;}//For Lookup field
-    public List<String> encryptedAPIList{set;get;}
-    public String staticResource {get; set;}
-    public String staticResourceContact {get; set;}
-    public String staticResourceInquiryForm{get; set;}
-    public String requiredFieldAPIListStr {get; set;}
-    public String fieldAPIToLabelMapStr {get; set;}
-    public String Input_Required_Field_Msg{set;get;}
-    public String PIPL_Name_Label{set;get;}
-    public String PIPL_Input_Account_Error_Msg{set;get;}
-    public String sobjectPrefix{set;get;}
-    public String sobjecttypeForFrontEnd{set;get;}
-    public String contactsInfo {set;get;}//key sfid;value awsid
-    public Inquiry_form__c ifc{get; private set;}
-    public String contactDataId{get; set;}
-    public String layoutSectionsStr {get; set;}
-    public String isDecryptContact {get; set;}
-    public final string ApiPrefix{get;private set;} //Add By Li Jun 20220403
-    public Map<string,string> AWSToSobjectEncryptedMap{get;private set;}
-    public string AWSToSobjectEncryptedMapJson{get{return JSON.serialize(AWSToSobjectEncryptedMap);}}
-    public String LeadCreatedDate { get; set; } // XLIU-CFE8M7 20220624 ssm
-    public String VLookUpFieldsJson{get;private set;}
+  public List<LayoutDescriberHelper.LayoutSection> layoutSections { get; set; }
+  public String awsToken { get; set; }
+  public static Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe();
+  public static String sobjectTypeValue = 'Lead';
+  public Boolean isNewMode { get; set; }
+  public Boolean isCloneMode { get; protected set; }
+  public String rtTypeId { get; set; }
+  public String AWSDataId { get; set; }
+  public String AWSDataIdInquiryForm { get; set; }
+  public String contactId { get; set; } //For Lookup field
+  public List<String> encryptedAPIList { get; set; }
+  public String staticResource { get; set; }
+  public String staticResourceContact { get; set; }
+  public String staticResourceInquiryForm { get; set; }
+  public String requiredFieldAPIListStr { get; set; }
+  public String fieldAPIToLabelMapStr { get; set; }
+  public String Input_Required_Field_Msg { get; set; }
+  public String PIPL_Name_Label { get; set; }
+  public String PIPL_Input_Account_Error_Msg { get; set; }
+  public String sobjectPrefix { get; set; }
+  public String sobjecttypeForFrontEnd { get; set; }
+  public String contactsInfo { get; set; } //key sfid;value awsid
+  public Inquiry_form__c ifc { get; private set; }
+  public String contactDataId { get; set; }
+  public String layoutSectionsStr { get; set; }
+  public String isDecryptContact { get; set; }
+  public final string ApiPrefix { get; private set; } //Add By Li Jun 20220403
+  public Map<string, string> AWSToSobjectEncryptedMap { get; private set; }
+  public string AWSToSobjectEncryptedMapJson {
+    get {
+      return JSON.serialize(AWSToSobjectEncryptedMap);
+    }
+  }
+  public String LeadCreatedDate { get; set; } // XLIU-CFE8M7 20220624 ssm
+  public String VLookUpFieldsJson { get; private set; }
+  //zhj MEBG鏂版柟妗堟敼閫� 2022-11-29 start
+  public String staticResourceV2 { get; set; }
+  //zhj MEBG鏂版柟妗堟敼閫� 2022-11-29 end
+
+  public NewAndEditLeadController(ApexPages.StandardController controller) {
+    ApiPrefix = 'PIBackApi';
+    isDecryptContact = '0';
+    isNewMode = true;
+    isCloneMode = false;
+    Input_Required_Field_Msg = Label.Input_Required_Field_Msg;
+    PIPL_Name_Label = Label.PIPL_Name_Label;
+    PIPL_Input_Account_Error_Msg = label.PIPL_Input_Account_Error_Msg;
+    sobjecttypeForFrontEnd = sobjectTypeValue;
+    Map<string, string> mso = ApexPages.currentPage().getParameters();
+    if (mso != null && mso.containsKey('newclone')) {
+      isCloneMode = true;
+    }
+    //鑾峰彇鎵�鏈夊瓧娈�
+    List<String> fieldList = new List<String>(
+      Schema.getGlobalDescribe()
+        .get('Lead')
+        .getDescribe()
+        .fields.getMap()
+        .keyset()
+    );
+    // Add fields to controller. This is to avoid the SOQL error in visualforce page
+    if (!Test.isRunningTest()) {
+      controller.addFields(fieldList);
+    }
+    SObject obj = controller.getRecord();
+
+    // XLIU-CFE8M7 20220624 ssm
+    this.LeadCreatedDate = obj.get('CreatedDate') != null
+      ? Date.newInstance(
+            ((Datetime) obj.get('CreatedDate')).year(),
+            ((Datetime) obj.get('CreatedDate')).month(),
+            ((Datetime) obj.get('CreatedDate')).day()
+          )
+          .format()
+      : Date.today().format();
+    // this.LeadCreatedDate = Date.today().format();
+
+    if (
+      ApexPages.currentPage().getParameters().get('CF00N1000000962np_lkid') !=
+      null
+    ) {
+      System.debug('CF00N1000000962np_lkid');
+      //浜у搧鍜ㄨ鍗曡繃鏉ョ殑
+      String InquiryFormId = ApexPages.currentPage()
+        .getParameters()
+        .get('CF00N1000000962np_lkid');
+      ifc = [
+        SELECT
+          Id,
+          AWS_Data_Id__c,
+          Contact_Name__c,
+          Contact_Id__c,
+          Hospital_Name__c,
+          Hospital_ID__c,
+          Department_Class__c,
+          Department_ID__c,
+          Opp_Name_Search__c,
+          Opp_Name_Search_ID__c,
+          Campaign__c,
+          Campaign_ID__c,
+          Name,
+          Cancel_Reason__c,
+          Phone__c,
+          Email__c,
+          Last_Name__c,
+          LeadSource__c,
+          Opportunity_Division__c,
+          Request1__c,
+          Urgent__c,
+          Inquiry_Num__c,
+          Product_Owner__c
+        FROM Inquiry_form__c
+        WHERE id = :InquiryFormId
+      ];
+      System.debug('ifc = ' + ifc);
+      if (ifc.Contact_Id__c != null && ifc.Contact_Id__c != '') {
+        Contact c = [
+          SELECT AWS_Data_Id__c
+          FROM Contact
+          WHERE id = :ifc.Contact_Id__c
+        ];
+        contactDataId = c.AWS_Data_Id__c;
+      }
+      AWSDataIdInquiryForm = ifc.AWS_Data_Id__c;
+      System.debug('ifc = ' + ifc);
+      rtTypeId = ApexPages.currentPage().getParameters().get('RecordType');
+      obj.put('OwnerId', UserInfo.getUserId());
+      obj.put('Inquiry_Num__c', ifc.Inquiry_Num__c); // 20220413 SWAG-CBUB2W you
+      obj.put('owner_not_automatically_update__c', ifc.Product_Owner__c);
+      controller.getRecord().put('LeadSource', ifc.LeadSource__c);
+      // controller.getRecord().put('Lead_Inquiry_form__c', ifc.Id);
+    } else if (obj.Id != null) {
+      //鏇存柊
+      isNewMode = false;
+      Lead leadData = [
+        SELECT
+          Id,
+          RecordTypeId,
+          AWS_Data_Id__c,
+          Contact_Name__r.Id,
+          Contact_Name__r.AWS_Data_Id__c
+        FROM Lead
+        WHERE id = :obj.Id
+      ];
+      rtTypeId = leadData.RecordTypeId;
+      AWSDataId = leadData.AWS_Data_Id__c;
+      Map<String, String> sfIdToAWSIdMap = new Map<String, String>();
+      if (leadData.Contact_Name__r.Id != null) {
+        sfIdToAWSIdMap.put(
+          String.valueof(leadData.Contact_Name__r.Id).subString(0, 15),
+          leadData.Contact_Name__r.AWS_Data_Id__c
+        );
+      }
+      contactsInfo = JSON.serialize(sfIdToAWSIdMap);
+    } else {
+      //鐪嬮摼鎺ヤ腑鏈夋棤甯﹁繃鏉ョ殑鍙傛暟(瀹㈡埛浜哄憳)
+      // Map<string,string> mso = ApexPages.currentPage().getParameters();
+      for (String key : mso.keySet()) {
+        System.debug('key=' + key + ',value=' + mso.get(key));
+      }
+      //鑱旂郴浜�
+      if (mso.containsKey('CF00N10000006ps6f_lkid')) {
+        isDecryptContact = '1';
+        String contactId = mso.get('CF00N10000006ps6f_lkid');
+        //鏌ヨAWS_Data_Id__c
+        List<Contact> contactList = new List<Contact>(
+          [SELECT AWS_Data_Id__c FROM Contact WHERE id = :contactId]
+        );
+        Contact c = new Contact();
+        if (contactList != null && contactList.size() > 0) {
+          c = contactList[0];
+        }
+        if (c != null && c.AWS_Data_Id__c != '') {
+          contactDataId = c.AWS_Data_Id__c;
+        }
+        //鏌ヨ鎴樼暐绉戝鍒嗙被
+        List<Contact> cs = [
+          SELECT Account.Department_Class__c
+          FROM Contact
+          WHERE id = :contactId
+        ];
+        if (cs.size() > 0) {
+          controller.getRecord()
+            .put('Department_Class__c', cs[0].Account.Department_Class__c);
+        }
+        controller.getRecord()
+          .put('Contact_Name__c', mso.get('CF00N10000006ps6f_lkid'));
+      }
+      //鍖婚櫌鍚�
+      if (mso.containsKey('CF00N10000002CvC5_lkid')) {
+        controller.getRecord()
+          .put('Hospital_Name__c', mso.get('CF00N10000002CvC5_lkid'));
+        //閫氳繃鍖婚櫌id鏌ヨ鎴樼暐绉戝鍒嗙被
+        String hospitalId = mso.get('CF00N10000002CvC5_lkid');
+        List<Account> hospitalAccount = [
+          SELECT Department_Class__c
+          FROM Account
+          WHERE Id = :hospitalId
+        ];
+        if (hospitalAccount.size() > 0) {
+          List<Account> departmentAccount = [
+            SELECT Id
+            FROM Account
+            WHERE Id = :hospitalAccount[0].Department_Class__c
+          ];
+          if (departmentAccount.size() > 0) {
+            System.debug('Department_Class__c = ' + departmentAccount[0].Id);
+            controller.getRecord()
+              .put('Department_Class__c', departmentAccount[0].Id);
+          }
+        }
+      }
+      //鍏徃锛堢瀹わ級
+      if (mso.containsKey('CF00N10000002CvC5')) {
+        controller.getRecord().put('Company', mso.get('CF00N10000002CvC5'));
+      }
+      //鎴樼暐绉戝CF00N10000006qNtt_lkid
+      // if(mso.containsKey('CF00N10000006qNtt_lkid ')){
+      //     controller.getRecord().put('Department_Class__c',mso.get('CF00N10000006qNtt_lkid '));
+      // }
+      // 2022-04-13 鏉ユ簮 jz start 0414 lt
+      if (mso.containsKey('LeadSource')) {
+        controller.getRecord().put('LeadSource', mso.get('LeadSource'));
+      }
+      if (mso.containsKey(System.Label.Opportunity_stage)) {
+        controller.getRecord()
+          .put('Opportunity_stage__c', mso.get(System.Label.Opportunity_stage));
+      }
+      //20220505 lt 娉ㄩ噴鎺�
+      // if (mso.containsKey('00N10000006qOF0')) {
+      //     controller.getRecord().put('Close_Forecasted_Date__c', Date.parse(mso.get('00N10000006qOF0')));
+      // }
+      if (mso.containsKey(System.Label.Opp_Name)) {
+        controller.getRecord()
+          .put('Opp_Name__c', mso.get(System.Label.Opp_Name));
+      }
+      // if (mso.containsKey('00N100000048UBf')) {
+      //     controller.getRecord().put('Contact__c', mso.get('00N100000048UBf'));
+      // }
+      if (mso.containsKey(System.Label.Purchase_Reason)) {
+        controller.getRecord()
+          .put('Purchase_Reason__c', mso.get(System.Label.Purchase_Reason));
+      }
+      if (mso.containsKey(System.Label.Fund_Basis)) {
+        controller.getRecord()
+          .put('Fund_Basis__c', mso.get(System.Label.Fund_Basis));
+      }
+      if (mso.containsKey(System.Label.Purchase_Type)) {
+        controller.getRecord()
+          .put('Purchase_Type__c', mso.get(System.Label.Purchase_Type));
+      }
+      //20220427
+      if (mso.containsKey(System.Label.Tender_information)) {
+        //鎷涙爣椤圭洰Id
+        controller.getRecord()
+          .put(
+            'Tender_information__c',
+            mso.get(System.Label.Tender_information)
+          );
+      }
+      if (mso.containsKey(System.Label.Agency_Opportunity)) {
+        //缁忛攢鍟嗚浠稩d
+        controller.getRecord()
+          .put(
+            'Agency_Opportunity__c',
+            mso.get(System.Label.Agency_Opportunity)
+          );
+      }
+      if (mso.containsKey(System.Label.Sales_Method)) {
+        //缁忛攢鍟嗚浠�--鎷涙爣鏂瑰紡
+        controller.getRecord()
+          .put('Sales_Method__c', mso.get(System.Label.Sales_Method));
+      }
+      if (mso.containsKey(System.Label.Request)) {
+        controller.getRecord().put('Request__c', mso.get(System.Label.Request));
+      }
+      if (mso.containsKey(System.Label.Request_Detail)) {
+        controller.getRecord()
+          .put('Request_Detail__c', mso.get(System.Label.Request_Detail));
+      }
+      // 2022-04-13 鏉ユ簮 jz end 0414 lt
+      rtTypeId = ApexPages.currentPage().getParameters().get('RecordType');
+      // 20220420 lt OBSAP start
+      if (String.isBlank(rtTypeId) && mso.containsKey('RecordTypeId')) {
+        rtTypeId = mso.get('RecordTypeId');
+      }
+      // 20220420 lt OBSAP end
+      obj.put('OwnerId', UserInfo.getUserId());
+    }
+    system.debug('RecordTypeId:' + rtTypeId);
+    LayoutDescriberHelper.LayoutWrapper LayoutWrapperValue = LayoutDescriberHelper.describeSectionWithFieldsWrapper(
+      rtTypeId,
+      'Lead',
+      'classic'
+    );
+    layoutSections = LayoutWrapperValue.layoutSections;
+    List<String> requiredFieldAPIList = LayoutWrapperValue.requiredFieldAPIList;
+    Map<String, String> fieldAPIToLabelMap = LayoutWrapperValue.fieldAPIToLabelMap;
+    requiredFieldAPIListStr = JSON.serialize(requiredFieldAPIList);
+    fieldAPIToLabelMapStr = JSON.serialize(fieldAPIToLabelMap);
+    PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo(
+      'Lead'
+    );
+    staticResource = JSON.serialize(piIntegration);
+    staticResourceContact = JSON.serialize(
+      PIHelper.getPIIntegrationInfo('Contact')
+    );
+    staticResourceInquiryForm = JSON.serialize(
+      PIHelper.getPIIntegrationInfo('Inquiry_form__c')
+    );
     //zhj MEBG鏂版柟妗堟敼閫� 2022-11-29 start
-    public String staticResourceV2 {get; set;}
+    staticResourceV2 = JSON.serialize(PIHelper.getPIIntegrationInfo('LeadV2'));
     //zhj MEBG鏂版柟妗堟敼閫� 2022-11-29 end
+    encryptedAPIList = piIntegration.PIFields;
+    sobjectPrefix = piIntegration.sobjectPrefix;
+    layoutSectionsStr = JSON.serialize(layoutSections);
+    AWSToSobjectEncryptedMap = new Map<String, String>();
+    for (PI_Field_Policy_Detail__c PIDetail : piIntegration.PIDetails) {
+      AWSToSobjectEncryptedMap.put(
+        PIDetail.AWS_Field_API__c,
+        PIDetail.SF_Field_API_Name__c
+      );
+    }
+    //鑾峰彇lookup瀛楁
+    List<String> VLookUpFields = new List<String>();
+    for (LayoutDescriberHelper.LayoutSection ls : layoutSections) {
+      for (LayoutDescriberHelper.LayoutField lf : ls.layoutFields) {
+        if (lf.fieldAPI != '' && lf.fieldType == 'reference') {
+          VLookUpFields.add(lf.fieldAPI);
+        }
+      }
+    }
+    VLookUpFieldsJson = Json.serialize(VLookUpFields);
+  }
 
-    public NewAndEditLeadController(ApexPages.StandardController controller) {
-        ApiPrefix = 'PIBackApi';       
-        isDecryptContact = '0';
-        isNewMode = true;
-        isCloneMode = false;
-        Input_Required_Field_Msg = Label.Input_Required_Field_Msg;
-        PIPL_Name_Label = Label.PIPL_Name_Label;
-        PIPL_Input_Account_Error_Msg = label.PIPL_Input_Account_Error_Msg;
-        sobjecttypeForFrontEnd = sobjectTypeValue;
-        Map<string,string> mso = ApexPages.currentPage().getParameters();
-        if(mso != null && mso.containsKey('newclone')){
-            isCloneMode = true;
-        }
-        //鑾峰彇鎵�鏈夊瓧娈�
-        List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Lead').getDescribe().fields.getMap().keyset());  
-        // Add fields to controller. This is to avoid the SOQL error in visualforce page
-        if (!Test.isRunningTest()) { 
-            controller.addFields(fieldList);
-        }       
-        SObject obj = controller.getRecord();    
+  global class Response {
+    public String recordId { get; set; }
+    public String message { get; set; }
+    public String status { get; set; }
+  }
 
-        // XLIU-CFE8M7 20220624 ssm
-        this.LeadCreatedDate = obj.get('CreatedDate') != null ? Date.newInstance(((Datetime)obj.get('CreatedDate')).year(), ((Datetime)obj.get('CreatedDate')).month(), ((Datetime)obj.get('CreatedDate')).day()).format() : Date.today().format();
-        // this.LeadCreatedDate = Date.today().format();
-        
-        if(ApexPages.currentPage().getParameters().get('CF00N1000000962np_lkid') != null){
-            System.debug('CF00N1000000962np_lkid');
-            //浜у搧鍜ㄨ鍗曡繃鏉ョ殑
-            String InquiryFormId = ApexPages.currentPage().getParameters().get('CF00N1000000962np_lkid');
-            ifc = [select Id,AWS_Data_Id__c,Contact_Name__c,Contact_Id__c,Hospital_Name__c,Hospital_ID__c,Department_Class__c,
-            Department_ID__c,Opp_Name_Search__c,Opp_Name_Search_ID__c,Campaign__c,
-            Campaign_ID__c,Name,Cancel_Reason__c,Phone__c,Email__c,Last_Name__c,LeadSource__c,Opportunity_Division__c,Request1__c,
-            Urgent__c,Inquiry_Num__c,Product_Owner__c from Inquiry_form__c where id = :InquiryFormId];
-            System.debug('ifc = ' + ifc);
-            if(ifc.Contact_Id__c !=null && ifc.Contact_Id__c != ''){
-                Contact c = [select AWS_Data_Id__c from Contact where id = :ifc.Contact_Id__c];
-                contactDataId = c.AWS_Data_Id__c;
-            }
-            AWSDataIdInquiryForm = ifc.AWS_Data_Id__c;
-            System.debug('ifc = ' + ifc);
-            rtTypeId = ApexPages.currentPage().getParameters().get('RecordType');
-            obj.put('OwnerId',UserInfo.getUserId());
-            obj.put('Inquiry_Num__c',ifc.Inquiry_Num__c);// 20220413 SWAG-CBUB2W you
-            obj.put('owner_not_automatically_update__c',ifc.Product_Owner__c);
-            controller.getRecord().put('LeadSource', ifc.LeadSource__c);
-            // controller.getRecord().put('Lead_Inquiry_form__c', ifc.Id);
-        }else if(obj.Id != null){
-            //鏇存柊
-            isNewMode = false;
-            Lead leadData = [select Id,RecordTypeId,AWS_Data_Id__c,Contact_Name__r.Id,Contact_Name__r.AWS_Data_Id__c from Lead where id =: obj.Id];
-            rtTypeId = leadData.RecordTypeId;
-            AWSDataId = leadData.AWS_Data_Id__c;
-            Map<String,String> sfIdToAWSIdMap = new Map<String,String>();
-            if(leadData.Contact_Name__r.Id != null){
-                sfIdToAWSIdMap.put(String.valueof(leadData.Contact_Name__r.Id).subString(0,15),leadData.Contact_Name__r.AWS_Data_Id__c);
-            }
-            contactsInfo = JSON.serialize(sfIdToAWSIdMap);
-        }else{
-            //鐪嬮摼鎺ヤ腑鏈夋棤甯﹁繃鏉ョ殑鍙傛暟(瀹㈡埛浜哄憳)
-            // Map<string,string> mso = ApexPages.currentPage().getParameters();
-            for(String key : mso.keySet()){
-                System.debug('key=' + key + ',value=' + mso.get(key));
-            }
-            //鑱旂郴浜�
-            if(mso.containsKey('CF00N10000006ps6f_lkid')){
-                isDecryptContact = '1';
-                String contactId = mso.get('CF00N10000006ps6f_lkid');
-                //鏌ヨAWS_Data_Id__c
-                List<Contact> contactList = new List<Contact>([select AWS_Data_Id__c from Contact where id=:contactId]);
-                Contact c = new Contact();
-                if(contactList!=null&&contactList.size()>0){
-                    c = contactList[0];
-                }
-                if (c != null&&c.AWS_Data_Id__c!='') {
-                    contactDataId = c.AWS_Data_Id__c;
-                }
-                //鏌ヨ鎴樼暐绉戝鍒嗙被
-                List<Contact> cs = [select Account.Department_Class__c from Contact where id=:contactId];
-                if(cs.size()>0){
-                    controller.getRecord().put('Department_Class__c',cs[0].Account.Department_Class__c);
-                }
-                controller.getRecord().put('Contact_Name__c',mso.get('CF00N10000006ps6f_lkid'));
-            }
-            //鍖婚櫌鍚�
-            if(mso.containsKey('CF00N10000002CvC5_lkid')){
-                controller.getRecord().put('Hospital_Name__c',mso.get('CF00N10000002CvC5_lkid'));
-                //閫氳繃鍖婚櫌id鏌ヨ鎴樼暐绉戝鍒嗙被
-                String hospitalId = mso.get('CF00N10000002CvC5_lkid');
-                List<Account> hospitalAccount = [select Department_Class__c from Account where Id=:hospitalId];
-                if(hospitalAccount.size()>0){
-                    List<Account> departmentAccount = [select Id from Account where Id=:hospitalAccount[0].Department_Class__c];
-                    if (departmentAccount.size()>0) {
-                        System.debug('Department_Class__c = ' + departmentAccount[0].Id);
-                        controller.getRecord().put('Department_Class__c',departmentAccount[0].Id);
-                    }
-                }
-            }
-            //鍏徃锛堢瀹わ級
-            if(mso.containsKey('CF00N10000002CvC5')){
-                controller.getRecord().put('Company',mso.get('CF00N10000002CvC5'));
-            }
-            //鎴樼暐绉戝CF00N10000006qNtt_lkid 
-            // if(mso.containsKey('CF00N10000006qNtt_lkid ')){
-            //     controller.getRecord().put('Department_Class__c',mso.get('CF00N10000006qNtt_lkid '));
-            // }
-            // 2022-04-13 鏉ユ簮 jz start 0414 lt
-            if (mso.containsKey('LeadSource')) {
-                controller.getRecord().put('LeadSource', mso.get('LeadSource'));
-            }
-            if (mso.containsKey(System.Label.Opportunity_stage)) {
-                controller.getRecord().put('Opportunity_stage__c', mso.get(System.Label.Opportunity_stage));
-            }
-            //20220505 lt 娉ㄩ噴鎺�
-            // if (mso.containsKey('00N10000006qOF0')) {
-            //     controller.getRecord().put('Close_Forecasted_Date__c', Date.parse(mso.get('00N10000006qOF0')));
-            // }
-            if (mso.containsKey(System.Label.Opp_Name)) {
-                controller.getRecord().put('Opp_Name__c', mso.get(System.Label.Opp_Name));
-            }
-            // if (mso.containsKey('00N100000048UBf')) {
-            //     controller.getRecord().put('Contact__c', mso.get('00N100000048UBf'));
-            // }
-            if (mso.containsKey(System.Label.Purchase_Reason)) {
-                controller.getRecord().put('Purchase_Reason__c', mso.get(System.Label.Purchase_Reason));
-            }
-            if (mso.containsKey(System.Label.Fund_Basis)) {
-                controller.getRecord().put('Fund_Basis__c', mso.get(System.Label.Fund_Basis));
-            }
-            if (mso.containsKey(System.Label.Purchase_Type)) {
-                controller.getRecord().put('Purchase_Type__c', mso.get(System.Label.Purchase_Type));
-            }
-            //20220427 
-            if (mso.containsKey(System.Label.Tender_information)) { //鎷涙爣椤圭洰Id
-                controller.getRecord().put('Tender_information__c', mso.get(System.Label.Tender_information));
-            }
-            if (mso.containsKey(System.Label.Agency_Opportunity)) { //缁忛攢鍟嗚浠稩d
-                controller.getRecord().put('Agency_Opportunity__c', mso.get(System.Label.Agency_Opportunity));
-            }
-            if (mso.containsKey(System.Label.Sales_Method)) { //缁忛攢鍟嗚浠�--鎷涙爣鏂瑰紡
-                controller.getRecord().put('Sales_Method__c', mso.get(System.Label.Sales_Method));
-            }
-            if (mso.containsKey(System.Label.Request)) {
-                controller.getRecord().put('Request__c', mso.get(System.Label.Request));
-            }
-            if (mso.containsKey(System.Label.Request_Detail)) { 
-                controller.getRecord().put('Request_Detail__c', mso.get(System.Label.Request_Detail));
-            }
-            // 2022-04-13 鏉ユ簮 jz end 0414 lt
-            rtTypeId = ApexPages.currentPage().getParameters().get('RecordType');
-            // 20220420 lt OBSAP start
-            if (String.isBlank(rtTypeId) && mso.containsKey('RecordTypeId')) {
-                rtTypeId = mso.get('RecordTypeId');
-            }
-            // 20220420 lt OBSAP end
-            obj.put('OwnerId',UserInfo.getUserId());
+  @RemoteAction
+  global static Response saveLead(
+    String leadJson,
+    String transId,
+    Boolean isNew
+  ) {
+    System.debug('Lead Info:' + JSON.serialize(leadJson));
+    //1. Prepare the payload for  Lead
+    Schema.SObjectType leadSchema = schemaMap.get(sobjectTypeValue);
+    Map<String, Schema.SObjectField> fieldAPIToTypeMap = leadSchema.getDescribe()
+      .fields.getMap();
+    Map<String, Object> fieldValueMap = (Map<String, Object>) JSON.deserializeUntyped(
+      leadJson
+    );
+    Lead leadInfo = new Lead();
+    String status = 'success';
+    Response resp = new Response();
+    Savepoint sp = Database.setSavepoint();
+    Boolean isClone = false;
+    String rid = '';
+    String awsDataId = '';
+    try {
+      //鑷畾涔夋牸寮忚浆鎹�
+      for (String fieldAPI : fieldValueMap.keySet()) {
+        system.debug('field API=' + fieldAPI);
+        if (!fieldAPIToTypeMap.containskey(fieldAPI)) {
+          continue;
         }
-        system.debug('RecordTypeId:'+rtTypeId);
-        LayoutDescriberHelper.LayoutWrapper LayoutWrapperValue = LayoutDescriberHelper.describeSectionWithFieldsWrapper(rtTypeId, 'Lead','classic');
-        layoutSections = LayoutWrapperValue.layoutSections;
-        List<String> requiredFieldAPIList = LayoutWrapperValue.requiredFieldAPIList;
-        Map<String,String> fieldAPIToLabelMap = LayoutWrapperValue.fieldAPIToLabelMap;
-        requiredFieldAPIListStr = JSON.serialize(requiredFieldAPIList);
-        fieldAPIToLabelMapStr = JSON.serialize(fieldAPIToLabelMap);
-        PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo('Lead');
-        staticResource = JSON.serialize(piIntegration);
-        staticResourceContact = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact'));
-        staticResourceInquiryForm = JSON.serialize(PIHelper.getPIIntegrationInfo('Inquiry_form__c'));
-        //zhj MEBG鏂版柟妗堟敼閫� 2022-11-29 start
-        staticResourceV2 = JSON.serialize(PIHelper.getPIIntegrationInfo('LeadV2'));
-        //zhj MEBG鏂版柟妗堟敼閫� 2022-11-29 end
-        encryptedAPIList = piIntegration.PIFields;
-        sobjectPrefix = piIntegration.sobjectPrefix;
-        layoutSectionsStr = JSON.serialize(layoutSections);
-        AWSToSobjectEncryptedMap = new Map<String,String>();
-        for (PI_Field_Policy_Detail__c PIDetail : piIntegration.PIDetails) {
-            AWSToSobjectEncryptedMap.put(PIDetail.AWS_Field_API__c, PIDetail.SF_Field_API_Name__c);
+        Schema.DisplayType fielddataType = fieldAPIToTypeMap.get(fieldAPI)
+          .getDescribe()
+          .getType();
+        String fieldValue = String.valueOf(fieldValueMap.get(fieldAPI));
+        system.debug(
+          'Field Type:' + fielddataType + ' field Value=' + fieldValue
+        );
+        if (String.valueOf(fielddataType) == 'DATE') {
+          leadInfo.put(
+            fieldAPI,
+            (String.isBlank(fieldValue) || String.isEmpty(fieldValue))
+              ? null
+              : Date.valueOf(fieldValue.replace('/', '-'))
+          );
+        } else if (String.valueOf(fielddataType) == 'DATETIME') {
+          if (String.isNotBlank(fieldValue) && fieldValue.contains('T')) {
+            fieldValue = fieldValue.replace('T', ' ');
+            leadInfo.put(fieldAPI, Datetime.valueOfGmt(fieldValue));
+          } else {
+            leadInfo.put(fieldAPI, null);
+          }
+        } else if (
+          String.valueof(fielddataType) == 'CURRENCY' ||
+          String.valueof(fielddataType) == 'PERCENT' ||
+          String.valueOf(fielddataType) == 'Number' ||
+          String.valueOf(fielddataType) == 'DOUBLE'
+        ) {
+          leadInfo.put(
+            fieldAPI,
+            (String.isBlank(fieldValue) || String.isEmpty(fieldValue))
+              ? null
+              : Decimal.valueOf(fieldValue.replace(',', ''))
+          );
+        } else if (String.valueof(fielddataType) == 'BOOLEAN') {
+          leadInfo.put(fieldAPI, fieldValueMap.get(fieldAPI));
+        } else {
+          leadInfo.put(fieldAPI, fieldValue);
         }
-        //鑾峰彇lookup瀛楁
-        List<String> VLookUpFields = new List<String>();
-        for (LayoutDescriberHelper.LayoutSection ls : layoutSections) {
-            for (LayoutDescriberHelper.LayoutField lf : ls.layoutFields) {
-                if (lf.fieldAPI != '' && lf.fieldType == 'reference') {
-                    VLookUpFields.add(lf.fieldAPI);
-                }
-            }
+      }
+
+      //2. Save Record Process
+
+      System.debug('abcde');
+      awsDataId = (String) leadInfo.get('AWS_Data_Id__c');
+      System.debug('awsDataId = ' + awsDataId);
+      Lead[] leads = [SELECT id FROM Lead WHERE AWS_Data_Id__c = :awsDataId];
+
+      if (!isNew) {
+        isClone = leads.size() == 0;
+      }
+      System.debug('isClone---------' + isClone);
+      //2022-6-10 yjk SWAG-CEY8GZ start
+      if (leadInfo.Hospital_Name__c != null) {
+        Account acc = [
+          SELECT id, Hospital__c
+          FROM Account
+          WHERE id = :leadInfo.Hospital_Name__c
+        ];
+        leadInfo.hospital__c = acc.Hospital__c;
+      }
+      //2022-6-10 yjk SWAG-CEY8GZ end
+      if (isNew || isClone) {
+        System.debug('leadInfozhj = ' + leadInfo);
+        if (!Test.isRunningTest()) {
+          insert leadInfo;
         }
-        VLookUpFieldsJson = Json.serialize(VLookUpFields);
+      } else {
+        System.debug('into update');
+        // String awsDataId = (String)leadInfo.get('AWS_Data_Id__c');
+        // System.debug('awsDataId = ' + awsDataId);
+        // Lead[] leads = [select id from Lead where AWS_Data_Id__c =:awsDataId];
+        System.debug('leads[0].id = ' + leads[0].id);
+        leadInfo.put('Id', leads[0].id); //For testing;
+        if (!Test.isRunningTest()) {
+          update leadInfo;
+        }
+      }
+      rid = leadInfo.Id;
+      PIHelper.saveTransLog(
+        sobjectTypeValue,
+        (String) leadInfo.get('AWS_Data_Id__c'),
+        rid,
+        transId,
+        leadJson,
+        status,
+        ''
+      );
+      resp.recordId = leadInfo.Id;
+      resp.message = '';
+      resp.status = status;
+      System.debug('resp from sfdx back-end' + resp);
+      return resp;
+    } catch (DmlException e) {
+      Integer index = 0;
+      System.debug(e.getNumDml());
+      System.debug(e.getDmlFields(index));
+      System.debug(e.getDmlId(index));
+      System.debug(e.getDmlIndex(index));
+      System.debug(e.getDmlMessage(index));
+      System.debug(e.getDmlStatusCode(index));
+      System.debug(e.getDmlType(index));
+      system.debug(e.getMessage());
+      system.debug(e.getStackTraceString());
+
+      System.debug('into catch' + e.getMessage());
+      Database.rollback(sp);
+      resp.status = 'Exception';
+      resp.message = '淇濆瓨澶辫触锛屽師鍥�:' + e.getDmlMessage(index);
+      PIHelper.saveTransLog(
+        sobjectTypeValue,
+        (String) leadInfo.get('AWS_Data_Id__c'),
+        rid,
+        transId,
+        leadJson,
+        status,
+        e.getMessage() + e.getStackTraceString()
+      );
+      return resp;
+    } catch (Exception e) {
+      System.debug('into catch' + e.getMessage());
+      Database.rollback(sp);
+      status = 'fail';
+      PIHelper.saveTransLog(
+        sobjectTypeValue,
+        (String) leadInfo.get('AWS_Data_Id__c'),
+        rid,
+        transId,
+        leadJson,
+        status,
+        e.getMessage()
+      );
+      resp.message = e.getMessage();
+      resp.status = status;
+      return resp;
+    }
+  }
+
+  @RemoteAction
+  global static String queryAccount(String accountTypes, String accountId) {
+    System.debug('accountType=' + accountTypes);
+    System.debug('accountId=' + accountId);
+    List<Object> types = (List<Object>) JSON.deserializeUntyped(accountTypes);
+    System.debug('types=' + types);
+    String soql = 'select Id,Name,';
+    for (Object t : types) {
+      soql += (String) t + ',';
+    }
+    soql = soql.substring(0, soql.length() - 1);
+    soql += ' from Account where id=\'' + accountId + '\'';
+    System.debug('soql=' + soql);
+    Sobject account = new Account();
+    if (!Test.isRunningTest()) {
+      account = Database.query(soql);
+    } else {
+      account.put('Id', '000000000000000');
     }
 
-    global class Response{
-        public String recordId{set;get;}
-        public String message{set;get;}
-        public String status{set;get;}
+    Map<String, Map<String, String>> m = new Map<String, Map<String, String>>();
+
+    System.debug('account=' + account);
+    for (Object ty : types) {
+      String t = (String) ty;
+      if (account.get(t) != null || Test.isRunningTest()) {
+        Sobject acc = new Account();
+        if (Test.isRunningTest()) {
+          acc.put('Id', '000000000000000');
+          acc.put('Name', 'Name');
+        } else {
+          acc = Database.query(
+            'select Id,Name from Account where id=\'' + account.get(t) + '\''
+          );
+        }
+        Map<String, String> n = new Map<String, String>();
+        n.put('Id', (String) acc.get('Id'));
+        n.put('Name', (String) acc.get('Name'));
+        m.put(t, n);
+      }
     }
+    // if (account.get('Hospital__c') != null){
+    //     m.put('Hospital__c', (String)account.get('Hospital__c'));
+    //     m.put('Hospital__r.Name', (String)account.get('Hospital__r.Name'));
+    // }
+    // if (account.get('Department_Class__c') != null){
+    //     m.put('Department_Class__c', (String)account.get('Department_Class__c'));
+    //     m.put('Department_Class__r.Name', (String)account.get('Department_Class__r.Name'));
+    // }
+    System.debug('m=' + m);
+    return JSON.serialize(m);
 
-    @RemoteAction
-    global static Response saveLead(String leadJson,String transId,Boolean isNew) {
-        System.debug('Lead Info:' + JSON.serialize(leadJson));
-        //1. Prepare the payload for  Lead
-        Schema.SObjectType leadSchema = schemaMap.get(sobjectTypeValue);
-        Map<String, Schema.SObjectField> fieldAPIToTypeMap = leadSchema.getDescribe().fields.getMap();
-        Map<String,Object> fieldValueMap = (Map<String,Object>)JSON.deserializeUntyped(leadJson);
-        Lead leadInfo = new Lead();
-        String status = 'success';    
-        Response resp = new Response();
-        Savepoint sp = Database.setSavepoint();
-        Boolean isClone = false;
-        String rid = '';
-        String awsDataId = '';
-        try{
-            //鑷畾涔夋牸寮忚浆鎹�
-            for (String fieldAPI: fieldValueMap.keySet()) {
-                system.debug('field API='+fieldAPI);
-                if(!fieldAPIToTypeMap.containskey(fieldAPI)){
-                    continue;
-                }
-                Schema.DisplayType fielddataType = fieldAPIToTypeMap.get(fieldAPI).getDescribe().getType();  
-                String fieldValue = String.valueOf(fieldValueMap.get(fieldAPI)); 
-                system.debug('Field Type:'+fielddataType+' field Value='+fieldValue);
-                if(String.valueOf(fielddataType)=='DATE'){
-                    leadInfo.put(fieldAPI,(String.isBlank(fieldValue)||String.isEmpty(fieldValue))? null:Date.valueOf(fieldValue.replace('/', '-')));              
-                }else if(String.valueOf(fielddataType)=='DATETIME'){
-                    if(String.isNotBlank(fieldValue)&&fieldValue.contains('T')){
-                        fieldValue = fieldValue.replace('T',' ');
-                        leadInfo.put(fieldAPI, Datetime.valueOfGmt(fieldValue));
-                    }else{
-                        leadInfo.put(fieldAPI, null);
-                    }                    
-                }else if(String.valueof(fielddataType)=='CURRENCY'|| String.valueof(fielddataType)=='PERCENT'||String.valueOf(fielddataType)=='Number'||String.valueOf(fielddataType)=='DOUBLE' ){
-                    leadInfo.put(fieldAPI, (String.isBlank(fieldValue)||String.isEmpty(fieldValue))?null:Decimal.valueOf(fieldValue.replace(',', ''))); 
-                } else if(String.valueof(fielddataType)=='BOOLEAN'){
-                    leadInfo.put(fieldAPI, fieldValueMap.get(fieldAPI));
-                }else {
-                    leadInfo.put(fieldAPI,fieldValue);
-                }                  
-            }
-            
-            //2. Save Record Process
-        
-        
-            System.debug('abcde');
-            awsDataId = (String)leadInfo.get('AWS_Data_Id__c');
-            System.debug('awsDataId = ' + awsDataId);
-            Lead[] leads = [select id from Lead where AWS_Data_Id__c =:awsDataId];
-            
-            if(!isNew){
-                isClone = leads.size() == 0;
-            }
-            System.debug('isClone---------'+isClone);
-            //2022-6-10 yjk SWAG-CEY8GZ start
-            if(leadInfo.Hospital_Name__c != null){
-                Account acc = [select id,Hospital__c from Account where id= :leadInfo.Hospital_Name__c];
-                leadInfo.hospital__c = acc.Hospital__c;
-            }
-            //2022-6-10 yjk SWAG-CEY8GZ end
-            if(isNew || isClone){
-                System.debug('leadInfozhj = ' + leadInfo);
-                if(!Test.isRunningTest()){
-                    insert leadInfo;
-                }
-            }else{
-                System.debug('into update');
-                // String awsDataId = (String)leadInfo.get('AWS_Data_Id__c');
-                // System.debug('awsDataId = ' + awsDataId);
-                // Lead[] leads = [select id from Lead where AWS_Data_Id__c =:awsDataId];
-                System.debug('leads[0].id = ' + leads[0].id);
-                leadInfo.put('Id',leads[0].id);//For testing;
-                if(!Test.isRunningTest()){
-                    update leadInfo;
-                }
-            }
-            rid=leadInfo.Id;
-            PIHelper.saveTransLog(sobjectTypeValue,(String)leadInfo.get('AWS_Data_Id__c'),rid,transId,leadJson ,status,'');
-            resp.recordId = leadInfo.Id;
-            resp.message = '';
-            resp.status = status;
-            System.debug('resp from sfdx back-end' + resp);
-            return resp;
+    // return (String)account.get('Hospital__c');
+  }
 
-        } catch(DmlException e) {
-            Integer index = 0;
-            System.debug(e.getNumDml());
-            System.debug(e.getDmlFields(index));
-            System.debug(e.getDmlId(index));
-            System.debug(e.getDmlIndex(index));
-            System.debug(e.getDmlMessage(index));
-            System.debug(e.getDmlStatusCode(index));
-            System.debug(e.getDmlType(index));
-            system.debug(e.getMessage());
-            system.debug(e.getStackTraceString());
+  public static Integer ControllerUtil() {
+    Integer i = 0;
 
-            System.debug('into catch'+e.getMessage());
-            Database.rollback(sp);
-            resp.status = 'Exception';
-            resp.message ='淇濆瓨澶辫触锛屽師鍥�:'+ e.getDmlMessage(index);
-            PIHelper.saveTransLog(sobjectTypeValue,(String)leadInfo.get('AWS_Data_Id__c'),rid,transId, leadJson ,status,e.getMessage()+e.getStackTraceString());
-            return resp;
-            
-        } catch(Exception e) {
-            System.debug('into catch'+e.getMessage());
-            Database.rollback(sp);
-            status = 'fail';
-            PIHelper.saveTransLog(sobjectTypeValue,(String)leadInfo.get('AWS_Data_Id__c'),rid,transId,leadJson,status,e.getMessage());
-            resp.message = e.getMessage();            
-            resp.status = status;
-            return resp;
-        }
-    }
-
-    @RemoteAction
-    global static String queryAccount(String accountTypes,String accountId) {
-        System.debug('accountType='+accountTypes);
-        System.debug('accountId='+accountId);
-        List<Object> types = (List<Object>)JSON.deserializeUntyped(accountTypes);
-        System.debug('types='+types);
-        String soql = 'select Id,Name,';
-        for (Object t : types) {
-            soql += (String)t+',';
-        }
-        soql = soql.substring(0,soql.length()-1);
-        soql += ' from Account where id=\''+accountId+'\'';
-        System.debug('soql='+soql);
-        Sobject account = new Account();
-        if(!Test.isRunningTest()){
-            account = Database.query(soql);
-        }else{
-            account.put('Id','000000000000000');
-        }
-        
-
-        Map<String, Map<String, String>> m = new Map<String, Map<String, String>>();
-        
-        System.debug('account='+account);
-        for (Object ty : types) {
-            String t = (String)ty;
-            if (account.get(t) != null||Test.isRunningTest()){
-                Sobject acc = new Account();
-                if(Test.isRunningTest()){
-                    acc.put('Id','000000000000000');
-                    acc.put('Name','Name');
-                }else{
-                    acc = Database.query('select Id,Name from Account where id=\''+account.get(t)+'\'');
-                }
-                Map<String, String> n = new Map<String, String>();
-                n.put('Id', (String)acc.get('Id'));
-                n.put('Name', (String)acc.get('Name'));
-                m.put(t, n);
-            }
-        }
-        // if (account.get('Hospital__c') != null){
-        //     m.put('Hospital__c', (String)account.get('Hospital__c'));
-        //     m.put('Hospital__r.Name', (String)account.get('Hospital__r.Name'));
-        // }
-        // if (account.get('Department_Class__c') != null){
-        //     m.put('Department_Class__c', (String)account.get('Department_Class__c'));
-        //     m.put('Department_Class__r.Name', (String)account.get('Department_Class__r.Name'));
-        // }
-        System.debug('m='+m);
-        return JSON.serialize(m);
-
-        // return (String)account.get('Hospital__c');
-    }
-
-    public static Integer ControllerUtil() {
-        Integer i = 0;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        i++;
-        return i;}
-}
\ No newline at end of file
+    return i;
+  }
+}
diff --git a/force-app/main/default/classes/NewAndEditLeadControllerTest.cls b/force-app/main/default/classes/NewAndEditLeadControllerTest.cls
index 9aec75f..3c85e99 100644
--- a/force-app/main/default/classes/NewAndEditLeadControllerTest.cls
+++ b/force-app/main/default/classes/NewAndEditLeadControllerTest.cls
@@ -2,58 +2,316 @@
  * Author: Guo, Aline Yaying
  * Created Date: 03/22/2022
  * Purpose: Test Class
- * History: 
+ * History:
  *      03/22/2022 - Guo, Aline Yaying - Initial Code.
- * 
+ *
  * */
 @isTest
 private class NewAndEditLeadControllerTest {
-    @TestSetup
-    static void makeData(){
-        List<String> strList= new List<String>();
-        strList.add('Lead');
-        strList.add('Contact');
-        strList.add('Inquiry_form__c');
-        strList.add('LeadV2');
-        TestDataUtility.CreatePIPolicyConfigurations(strList);
+  @TestSetup
+  static void makeData() {
+    List<String> strList = new List<String>();
+    strList.add('Lead');
+    strList.add('Contact');
+    strList.add('Inquiry_form__c');
+    strList.add('LeadV2');
+    TestDataUtility.CreatePIPolicyConfigurations(strList);
+  }
+  static testMethod void testMethod1() {
+    Test.setMock(
+      HttpCalloutMock.class,
+      new TestDataUtility.CreateMetaDataUtilityHttpMock()
+    );
+    Test.startTest();
+    List<RecordType> rectCo = [
+      SELECT Id
+      FROM RecordType
+      WHERE IsActive = TRUE AND SobjectType = 'Account' AND Name = '鐥呴櫌'
+    ];
+    if (rectCo.size() == 0) {
+      return;
     }
-    static testMethod void testMethod1() {
+    List<RecordType> rectAcc = [
+      SELECT Id
+      FROM RecordType
+      WHERE
+        IsActive = TRUE
+        AND SobjectType = 'Account'
+        AND Name = '鎴︾暐绉戝鍒嗛 鍛煎惛绉�'
+    ];
+    if (rectAcc.size() == 0) {
+      return;
+    }
+    Account accountItem1 = new Account(
+      Name = 'testaccount001',
+      Dealer_discount__c = 10,
+      RecordTypeId = rectCo[0].Id
+    );
+    insert accountItem1;
+    Account accountItem3 = new Account(
+      Name = 'testaccount001',
+      Dealer_discount__c = 10,
+      RecordTypeId = rectAcc[0].Id,
+      ParentId = accountItem1.Id
+    );
+    insert accountItem3;
+    Account accountItem2 = new Account(
+      Name = 'testaccount002',
+      Dealer_discount__c = 10,
+      RecordTypeId = rectCo[0].Id,
+      Hospital__c = accountItem1.Id,
+      Department_Class__c = accountItem3.Id
+    );
+    insert accountItem2;
 
-        Test.setMock(HttpCalloutMock.class, new TestDataUtility.CreateMetaDataUtilityHttpMock());
-        Test.startTest();
-        Lead leadTest = new Lead();
-        Contact cont = new Contact();
-        ApexPages.StandardController con =  new ApexPages.StandardController(leadTest);
-        NewAndEditLeadController lead = new NewAndEditLeadController(con);
-        
-        String leadJson = '{"RecordTypeId":"01210000000QiRaAAK","Lead_No__c":"IN-JS-2022040127183","Status":"鏈窡杩�","Hospital_Name__c":"0011000000VAPEt","Department_Class__c":"0011000000V9bh5","Salutation":"","LastName":"***","Contact_Name__c":"0031m00000DHrkV","Cancel_Reason__c":"","Phone":"","Opp_Name_Search__c":"000000000000000","Email":"","Opp_Name__c":"Test","owner_not_automatically_update__c":false,"Purchase_Plan__c":"鏈�(鏃犻绠�)","Lead_Inquiry_form__c":"000000000000000","Opportunity_Division__c":"璇环","LeadSource":"鐢佃瘽","Campaign__c":"000000000000000","urgent__c":false,"SI_PromoteInquiry__c":false,"Request__c":"","Request_Detail__c":"","Opportunity_stage__c":"棰勭畻娌℃湁鎵瑰噯","Close_Forecasted_Date__c":"2022/04/01","Purchase_Reason__c":"鏇存柊","Sales_Method__c":"鍗曚竴鏉ユ簮閲囪喘","Fund_Basis__c":"閵�琛岃硣閲�","Purchase_Type__c":"涓�鑸紩鍚�","Company":"姹熻嫃鐪佷汉姘戝尰闄� 鍛煎惛绉� 鍛煎惛绉�","Name_Encrypted__c":"48a2693f6bf73d16e0abd48caf7fb756","Phone_Encrypted__c":"","Email_Encrypted__c":"","AWS_Data_Id__c":"959584917346320385"}';
-        NewAndEditLeadController.saveLead(leadJson,'avgwshDFcxAS',False);
-        NewAndEditLeadController.saveLead(leadJson,'avgwshDFcxAS',True);
+    Contact contact2 = new Contact();
+    contact2.AccountId = accountItem2.Id;
+    contact2.FirstName = '璨换鑰�';
+    contact2.LastName = 'test1缁忛攢鍟�';
+    contact2.AWS_Data_Id__c = 'Test123';
+    insert contact2;
 
-        Test.stopTest();
+    Lead leadTest = new Lead();
+    leadTest.LastName = 'test';
+    leadTest.Company = 'test';
+    leadTest.hospital__c = accountItem2.Hospital__c;
+    leadTest.Contact_Name__c = contact2.Id;
+    insert leadTest;
+
+    Inquiry_form__c inquiryform = new Inquiry_form__c();
+    inquiryform.Name = '2023062001';
+    inquiryform.Request1__c = '闇�瑕佹姤浠�';
+    inquiryform.Product1__c = '瓒呭0';
+    inquiryform.Hospital__c = accountItem2.Hospital__c;
+    inquiryform.Contact_Name__c = contact2.Id;
+
+    inquiryform.Opportunity_Division__c = '璇环';
+    insert inquiryform;
+
+    String contactDataId = contact2.AWS_Data_Id__c;
+
+    Boolean isClone = true;
+    Boolean isNew = true;
+    Map<string, string> AWSToSobjectEncryptedMap = new Map<String, String>();
+    String AWSToSobjectEncryptedMapJson = JSON.serialize(
+      AWSToSobjectEncryptedMap
+    );
+    PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo(
+      'Lead'
+    );
+    for (PI_Field_Policy_Detail__c PIDetail : piIntegration.PIDetails) {
+      AWSToSobjectEncryptedMap.put(
+        PIDetail.AWS_Field_API__c,
+        PIDetail.SF_Field_API_Name__c
+      );
+    }
+    Map<string, string> mso = ApexPages.currentPage().getParameters();
+    mso.put('newclone', 'newclone');
+    mso.put('CF00N1000000962np_lkid', inquiryform.Id);
+    mso.put('CF00N10000006ps6f_lkid', contact2.Id);
+    mso.put('CF00N10000002CvC5_lkid', accountItem2.Hospital__c);
+    mso.put('CF00N10000002CvC5', 'Company');
+    mso.put('LeadSource', 'LeadSource');
+
+    String InquiryFormId = mso.get('CF00N1000000962np_lkid');
+    String contactId = mso.get('CF00N10000006ps6f_lkid');
+    Boolean isNewMode = false;
+    String recordId = leadTest.Id;
+    String rid = '';
+    ApexPages.StandardController con = new ApexPages.StandardController(
+      leadTest
+    );
+    NewAndEditLeadController lead = new NewAndEditLeadController(con);
+    Inquiry_form__c ifc = lead.ifc;
+    String token = lead.awsToken;
+    String AWSDataId = lead.AWSDataId;
+    String AWSDataIdInquiryForm = lead.AWSDataIdInquiryForm;
+    contactId = lead.contactId; //For Lookup field
+    String contactsInfo = lead.contactsInfo; //key sfid;value awsid
+    Map<String, String> sfIdToAWSIdMap = new Map<String, String>();
+
+    SObject obj = con.getRecord();
+    obj.put('Hospital_Name__c', mso.get('CF00N10000002CvC5_lkid'));
+    String hospitalId = mso.get('CF00N10000002CvC5_lkid');
+    if (obj.Id != null) {
+      Lead leadData = [
+        SELECT
+          Id,
+          RecordTypeId,
+          AWS_Data_Id__c,
+          Contact_Name__r.Id,
+          Contact_Name__r.AWS_Data_Id__c
+        FROM Lead
+        WHERE id = :obj.Id
+      ];
+      String rtTypeId = leadData.RecordTypeId;
+      AWSDataId = leadData.AWS_Data_Id__c;
+      if (leadData.Contact_Name__r.Id != null) {
+        sfIdToAWSIdMap.put(
+          String.valueof(leadData.Contact_Name__r.Id).subString(0, 15),
+          leadData.Contact_Name__r.AWS_Data_Id__c
+        );
+      }
+      contactsInfo = JSON.serialize(sfIdToAWSIdMap);
     }
 
-    static testMethod void testMethod3() {
-        Lead leadTest = new Lead();
-        String url = ApexPages.currentPage().getParameters().put('CF00N10000006ps6f_lkid','000000000000000');
-        url = ApexPages.currentPage().getParameters().put('RecordType','01210000000QiRf');
-        Test.startTest();
-        try{
-            NewAndEditLeadController.ControllerUtil();
-            ApexPages.StandardController con =  new ApexPages.StandardController(leadTest);
-            NewAndEditLeadController lc = new NewAndEditLeadController(con);
-            String jsonString = '["Department_Class__c"]';
-            system.debug('jsonString:'+JSON.deserializeUntyped(jsonString));
-            String token = lc.awsToken;
-            String AWSDataId = lc.AWSDataId;
-            String AWSDataIdInquiryForm = lc.AWSDataIdInquiryForm;
-            String contactId = lc.contactId;//For Lookup field
-            String contactsInfo = lc.contactsInfo ;//key sfid;value awsid
-            Inquiry_form__c ifc = lc.ifc;
-            NewAndEditLeadController.queryAccount(jsonString, '000000000000000');
-        }catch(Exception e){
-            system.debug('Exception from query account:'+e.getMessage());
-        }
-        Test.stopTest();
+    String leadJson = '{"RecordTypeId":"01210000000QiRaAAK","Lead_No__c":"IN-JS-2022040127183","Status":"鏈窡杩�","Hospital_Name__c":"0011000000VAPEt","Department_Class__c":"0011000000V9bh5","Salutation":"","LastName":"***","Contact_Name__c":"0031m00000DHrkV","Cancel_Reason__c":"","Phone":"","Opp_Name_Search__c":"000000000000000","Email":"","Opp_Name__c":"Test","owner_not_automatically_update__c":false,"Purchase_Plan__c":"鏈�(鏃犻绠�)","Lead_Inquiry_form__c":"000000000000000","Opportunity_Division__c":"璇环","LeadSource":"鐢佃瘽","Campaign__c":"000000000000000","urgent__c":false,"SI_PromoteInquiry__c":false,"Request__c":"","Request_Detail__c":"","Opportunity_stage__c":"棰勭畻娌℃湁鎵瑰噯","Close_Forecasted_Date__c":"2022/04/01","Purchase_Reason__c":"鏇存柊","Sales_Method__c":"鍗曚竴鏉ユ簮閲囪喘","Fund_Basis__c":"閵�琛岃硣閲�","Purchase_Type__c":"涓�鑸紩鍚�","Company":"姹熻嫃鐪佷汉姘戝尰闄� 鍛煎惛绉� 鍛煎惛绉�","Name_Encrypted__c":"48a2693f6bf73d16e0abd48caf7fb756","Phone_Encrypted__c":"","Email_Encrypted__c":"","AWS_Data_Id__c":"959584917346320385"}';
+    NewAndEditLeadController.saveLead(leadJson, 'avgwshDFcxAS', false);
+    NewAndEditLeadController.saveLead(leadJson, 'avgwshDFcxAS', true);
+    NewAndEditLeadController.saveLead(leadJson, 'avgwshDFcxAS', isNew);
+
+    Test.stopTest();
+  }
+
+  static testMethod void testMethod2() {
+    Test.setMock(
+      HttpCalloutMock.class,
+      new TestDataUtility.CreateMetaDataUtilityHttpMock()
+    );
+    Test.startTest();
+    List<RecordType> rectCo = [
+      SELECT Id
+      FROM RecordType
+      WHERE IsActive = TRUE AND SobjectType = 'Account' AND Name = '鐥呴櫌'
+    ];
+    if (rectCo.size() == 0) {
+      return;
     }
-}
\ No newline at end of file
+    List<RecordType> rectAcc = [
+      SELECT Id
+      FROM RecordType
+      WHERE
+        IsActive = TRUE
+        AND SobjectType = 'Account'
+        AND Name = '鎴︾暐绉戝鍒嗛 鍛煎惛绉�'
+    ];
+    if (rectAcc.size() == 0) {
+      return;
+    }
+    Account accountItem1 = new Account(
+      Name = 'testaccount001',
+      Dealer_discount__c = 10,
+      RecordTypeId = rectCo[0].Id
+    );
+    insert accountItem1;
+    Account accountItem3 = new Account(
+      Name = 'testaccount001',
+      Dealer_discount__c = 10,
+      RecordTypeId = rectAcc[0].Id,
+      ParentId = accountItem1.Id
+    );
+    insert accountItem3;
+    Account accountItem2 = new Account(
+      Name = 'testaccount002',
+      Dealer_discount__c = 10,
+      RecordTypeId = rectCo[0].Id,
+      Hospital__c = accountItem1.Id,
+      Department_Class__c = accountItem3.Id
+    );
+    insert accountItem2;
+
+    Contact contact2 = new Contact();
+    contact2.AccountId = accountItem2.Id;
+    contact2.FirstName = '璨换鑰�';
+    contact2.LastName = 'test1缁忛攢鍟�';
+    contact2.AWS_Data_Id__c = 'Test123';
+    insert contact2;
+
+    Lead leadTest = new Lead();
+    leadTest.LastName = 'test';
+    leadTest.Company = 'test';
+    leadTest.hospital__c = accountItem2.Hospital__c;
+    leadTest.Contact_Name__c = contact2.Id;
+    insert leadTest;
+
+    Inquiry_form__c inquiryform = new Inquiry_form__c();
+    inquiryform.Name = '2023062001';
+    inquiryform.Request1__c = '闇�瑕佹姤浠�';
+    inquiryform.Product1__c = '瓒呭0';
+    inquiryform.Hospital__c = accountItem2.Hospital__c;
+    inquiryform.Contact_Name__c = contact2.Id;
+
+    inquiryform.Opportunity_Division__c = '璇环';
+    insert inquiryform;
+
+    String contactDataId = contact2.AWS_Data_Id__c;
+
+    Boolean isClone = true;
+    Boolean isNew = true;
+    Map<string, string> AWSToSobjectEncryptedMap = new Map<String, String>();
+    String AWSToSobjectEncryptedMapJson = JSON.serialize(
+      AWSToSobjectEncryptedMap
+    );
+    PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo(
+      'Lead'
+    );
+    for (PI_Field_Policy_Detail__c PIDetail : piIntegration.PIDetails) {
+      AWSToSobjectEncryptedMap.put(
+        PIDetail.AWS_Field_API__c,
+        PIDetail.SF_Field_API_Name__c
+      );
+    }
+    Map<string, string> mso = ApexPages.currentPage().getParameters();
+    mso.put('newclone', 'newclone');
+    mso.put('CF00N1000000962np_lkid', null);
+    mso.put('CF00N10000006ps6f_lkid', contact2.Id);
+    mso.put('CF00N10000002CvC5_lkid', accountItem2.Hospital__c);
+    mso.put('CF00N10000002CvC5', 'Company');
+    mso.put('LeadSource', 'LeadSource');
+
+    String InquiryFormId = mso.get('CF00N1000000962np_lkid');
+    String contactId = mso.get('CF00N10000006ps6f_lkid');
+    Boolean isNewMode = false;
+    String recordId = leadTest.Id;
+    String rid = '';
+    ApexPages.StandardController con = new ApexPages.StandardController(
+      leadTest
+    );
+    NewAndEditLeadController lead = new NewAndEditLeadController(con);
+    Inquiry_form__c ifc = lead.ifc;
+    String token = lead.awsToken;
+    String AWSDataId = lead.AWSDataId;
+    String AWSDataIdInquiryForm = lead.AWSDataIdInquiryForm;
+    String contactsInfo = lead.contactsInfo; //key sfid;value awsid
+    Map<String, String> sfIdToAWSIdMap = new Map<String, String>();
+    SObject obj = con.getRecord();
+    obj.put('Hospital_Name__c', mso.get('CF00N10000002CvC5_lkid'));
+    String hospitalId = mso.get('CF00N10000002CvC5_lkid');
+
+    String leadJson = '{"RecordTypeId":"01210000000QiRaAAK","Lead_No__c":"IN-JS-2022040127183","Status":"鏈窡杩�","Hospital_Name__c":"0011000000VAPEt","Department_Class__c":"0011000000V9bh5","Salutation":"","LastName":"***","Contact_Name__c":"0031m00000DHrkV","Cancel_Reason__c":"","Phone":"","Opp_Name_Search__c":"000000000000000","Email":"","Opp_Name__c":"Test","owner_not_automatically_update__c":false,"Purchase_Plan__c":"鏈�(鏃犻绠�)","Lead_Inquiry_form__c":"000000000000000","Opportunity_Division__c":"璇环","LeadSource":"鐢佃瘽","Campaign__c":"000000000000000","urgent__c":false,"SI_PromoteInquiry__c":false,"Request__c":"","Request_Detail__c":"","Opportunity_stage__c":"棰勭畻娌℃湁鎵瑰噯","Close_Forecasted_Date__c":"2022/04/01","Purchase_Reason__c":"鏇存柊","Sales_Method__c":"鍗曚竴鏉ユ簮閲囪喘","Fund_Basis__c":"閵�琛岃硣閲�","Purchase_Type__c":"涓�鑸紩鍚�","Company":"姹熻嫃鐪佷汉姘戝尰闄� 鍛煎惛绉� 鍛煎惛绉�","Name_Encrypted__c":"48a2693f6bf73d16e0abd48caf7fb756","Phone_Encrypted__c":"","Email_Encrypted__c":"","AWS_Data_Id__c":"959584917346320385"}';
+    NewAndEditLeadController.saveLead(leadJson, 'avgwshDFcxAS', false);
+    NewAndEditLeadController.saveLead(leadJson, 'avgwshDFcxAS', true);
+    NewAndEditLeadController.saveLead(leadJson, 'avgwshDFcxAS', isNew);
+    Test.stopTest();
+  }
+
+  static testMethod void testMethod3() {
+    Lead leadTest = new Lead();
+    String url = ApexPages.currentPage()
+      .getParameters()
+      .put('CF00N10000006ps6f_lkid', '000000000000000');
+    url = ApexPages.currentPage()
+      .getParameters()
+      .put('RecordType', '01210000000QiRf');
+    Test.startTest();
+    try {
+      NewAndEditLeadController.ControllerUtil();
+      ApexPages.StandardController con = new ApexPages.StandardController(
+        leadTest
+      );
+      NewAndEditLeadController lc = new NewAndEditLeadController(con);
+      String jsonString = '["Department_Class__c"]';
+      system.debug('jsonString:' + JSON.deserializeUntyped(jsonString));
+      String token = lc.awsToken;
+      String AWSDataId = lc.AWSDataId;
+      String AWSDataIdInquiryForm = lc.AWSDataIdInquiryForm;
+      String contactId = lc.contactId; //For Lookup field
+      String contactsInfo = lc.contactsInfo; //key sfid;value awsid
+      Inquiry_form__c ifc = lc.ifc;
+      NewAndEditLeadController.queryAccount(jsonString, '000000000000000');
+    } catch (Exception e) {
+      system.debug('Exception from query account:' + e.getMessage());
+    }
+    Test.stopTest();
+  }
+}
diff --git a/manifest/package.xml b/manifest/package.xml
index eb566a1..3929886 100644
--- a/manifest/package.xml
+++ b/manifest/package.xml
@@ -1,8 +1,11 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
 <Package xmlns="http://soap.sforce.com/2006/04/metadata">
     <types>
-        <members>CreateTarget</members>
-        <name>AuraDefinitionBundle</name>
+        <members>LayoutDescriberHelperTest</members>
+        <members>LayoutDescriberHelper</members>
+        <members>NewAndEditLeadController</members>
+        <members>NewAndEditLeadControllerTest</members>
+        <name>ApexClass</name>
     </types>    
     <version>52.0</version>
 </Package>

--
Gitblit v1.9.1