public class RiabuAccountSync { public static String insertAccounts() { RIABU_Integration__mdt config = [ SELECT Access_Token__c, Refresh_Token__c, Endpoint__c, RIABU_Fetch_Accounts_Endpoint__c FROM RIABU_Integration__mdt WHERE DeveloperName = 'Riabu_Record' LIMIT 1 ]; HttpRequest req = new HttpRequest(); req.setEndpoint(config.RIABU_Fetch_Accounts_Endpoint__c); req.setMethod('GET'); if (config.Access_Token__c == null) { RiabuAuthAccessToken.getAccessToken(); } req.setHeader('Authorization', 'Bearer ' + config.Access_Token__c); Http http = new Http(); HttpResponse res = http.send(req); if (res.getStatusCode() != 200) { return 'Invalid Field Callout'; } Map root = (Map) JSON.deserializeUntyped(res.getBody()); List dataList = (List) root.get('data'); if (dataList == null || dataList.isEmpty()) { return 'No Data Returned'; } // step 1: collect incoming riabu ids Set incomingIds = new Set(); for (Object o : dataList) { Map item = (Map) o; incomingIds.add(String.valueOf(item.get('id'))); } // step 2: fetch existing SF accounts Map existingMap = new Map(); if (!incomingIds.isEmpty()) { for (Account acc : [ SELECT Id, RIABU_Customer_ID__c FROM Account WHERE RIABU_Customer_ID__c IN :incomingIds ]) { existingMap.put(acc.RIABU_Customer_ID__c, acc); } } // step 3: build list of new accounts Set processedIds = new Set(); List toInsert = new List(); for (Object o : dataList) { Map item = (Map) o; String riabuId = String.valueOf(item.get('id')); if (riabuId == null) continue; // skip duplicates in API response if (processedIds.contains(riabuId)) continue; processedIds.add(riabuId); // skip existing SF accounts if (existingMap.containsKey(riabuId)) { System.debug('[' + riabuId + '] ALREADY EXISTS IN SALESFORCE'); continue; } // insert new Account a = new Account(); a.Name = (String) item.get('name'); a.RIABU_Customer_ID__c = riabuId; a.Days_to_Pay__c = (Integer) item.get('agreed_credit_terms_day'); toInsert.add(a); System.debug('[' + riabuId + '] Record Inserted ***'); } // step 4: insert if (!toInsert.isEmpty()) { insert toInsert; return toInsert.size() + ' new records inserted'; } return 'No new records'; } }