Files
Riabu_Integration/force-app/main/default/classes/RiabuOrderSync.cls
2025-11-26 16:38:23 +05:30

116 lines
3.7 KiB
OpenEdge ABL

public class RiabuOrderSync {
public static String syncOrders(String riabuCustomerId) {
System.debug('START RiabuOrderSync for CustomerId: ' + riabuCustomerId);
// Load Integration Config
RIABU_Integration__mdt config = [
SELECT Access_Token__c, RIABU_Fetch_Orders_Endpoint__c
FROM RIABU_Integration__mdt
WHERE DeveloperName = 'Riabu_Record'
LIMIT 1
];
if (config == null || config.RIABU_Fetch_Orders_Endpoint__c == null) {
return 'Orders Endpoint missing in Metadata';
}
// Ensure correct format with trailing slash
String baseEndpoint = config.RIABU_Fetch_Orders_Endpoint__c;
if (!baseEndpoint.endsWith('/')) {
baseEndpoint += '/';
}
String endpoint = baseEndpoint + riabuCustomerId + '?per-page=99999&page=1';
System.debug('Final API Endpoint: ' + endpoint);
HttpRequest req = new HttpRequest();
req.setEndpoint(endpoint);
req.setMethod('GET');
req.setHeader('Authorization', 'Bearer ' + config.Access_Token__c);
Http http = new Http();
HttpResponse res = http.send(req);
System.debug('Response Code: ' + res.getStatusCode());
System.debug('Response Body: ' + res.getBody());
if (res.getStatusCode() != 200) {
return 'Riabu Order Fetch Error: ' + res.getStatus();
}
Map<String, Object> root =
(Map<String, Object>) JSON.deserializeUntyped(res.getBody());
if (root == null || root.get('data') == null) {
return 'Invalid or Empty Riabu Response';
}
Map<String, Object> data = (Map<String, Object>) root.get('data');
List<Object> items = (List<Object>) data.get('items');
if (items == null || items.isEmpty()) {
return 'No Orders Found in Riabu';
}
System.debug('Total Orders Returned: ' + items.size());
Account acc;
try {
acc = [
SELECT Id FROM Account
WHERE RIABU_Customer_ID__c = :riabuCustomerId
LIMIT 1
];
} catch (Exception e) {
return 'No Matching Salesforce Account Found';
}
List<Opportunity> oppsToUpsert = new List<Opportunity>();
for (Object o : items) {
Map<String, Object> order = (Map<String, Object>) o;
String riabuOrderId = String.valueOf(order.get('id'));
Opportunity opp = new Opportunity();
opp.Riabu_Order_Id__c = riabuOrderId;
opp.AccountId = acc.Id;
// Name
opp.Name = String.isNotBlank((String)order.get('opportunity'))
? (String) order.get('opportunity')
: 'Order ' + riabuOrderId;
// Amount
if (order.get('total_invoice_amount') != null) {
opp.Amount = Decimal.valueOf(String.valueOf(order.get('total_invoice_amount')));
}
// Close Date
try {
if (order.get('invoice_due_date') != null) {
opp.CloseDate = Date.valueOf(
String.valueOf(order.get('invoice_due_date'))
);
} else {
opp.CloseDate = Date.today().addDays(7);
}
} catch (Exception ex) {
opp.CloseDate = Date.today().addDays(7);
}
opp.StageName = 'Prospecting';
oppsToUpsert.add(opp);
}
if (!oppsToUpsert.isEmpty()) {
upsert oppsToUpsert Riabu_Order_Id__c;
return oppsToUpsert.size() + ' Orders Synced (Upserted)';
}
return 'No New Orders to Sync';
}
}