The Accorto pricing engine is very powerful and can be extended (or replaced) by custom logic.
Examples are volume- or value-based pricing or custom price metrics.
As the first step, the price is calculated based on the logic of the Accorto Pricing engine, and the information is then passed over to the custom apex class for adding bespoke logic.
/** * Custom Resource Pricing implementation example */ global with sharing class ResourcePricing implements Callable { public Object call(String action, Map<String,Object> args) { if (action == 'getRate') { return getRate( (Id) args.get('resourceId'), (Date) args.get('invoiceDate'), (Id) args.get('accountId'), (Id) args.get('contractId'), (Id) args.get('projectId'), (Id) args.get('activityId'), (String) args.get('isoCode'), (Id) args.get('finAccountId'), (Decimal) args.get('qty'), // hours (Decimal) args.get('price'), (Decimal) args.get('costs') ); } return null; } // call /** * @return list with price|cost */ public List<Decimal> getRate(Id resourceId, Date invoiceDate, Id accountId, Id contractId, Id projectId, Id activityId, String isoCode, Id finAccountId, Decimal qty, Decimal price, Decimal costs) { // add fixed amount to price/costs if there is an account if (accountId != null) { List<Decimal> rates = new List<Decimal>(); rates.add(price == null ? 10 : price + 10); // overwritten price rates.add(costs == null ? 9 : costs + 9); // optional costs return rates; } return null; } // getRate } // ResourcePricing
You can test the implementation via
Id resourceId = accorto.TestData.theResource.Id; Date invoiceDate = Date.today(); Id accountId = accorto.TestData.theAccount.Id; Id contractId = null; Id projectId = null; Id activityId = null; String isoCode = null; Id finAccountId = null; Decimal qty = null; // hours accorto__Resource_Price__c rp = accorto.Resource.getResourcePrice( resourceId, invoiceDate, accountId, contractId, projectId, activityId, isoCode, finAccountId); System.assertEquals(10, rp.accorto__UnitPrice__c); System.assertEquals(9, rp.accorto__Cost_h__c);