/home/alixis5/integrate.sellofinance.com/src/Services
Edit: /home/alixis5/integrate.sellofinance.com/src/Services/ProductPolicyLoader.php (3818B)
> nested: policies[].groups[].rules[]
*/
public function loadForProduct(string $productId): array
{
// Find linked programs (reverse m:n via linkedWith, mirrors Phase 2A pattern)
$programsRes = $this->client->get('CFinancialProgram', [
'select' => 'id',
'maxSize' => 20,
'where' => [
['type' => 'linkedWith', 'attribute' => 'financialProducts', 'value' => [$productId]],
],
]);
$programIds = array_column($programsRes['list'] ?? [], 'id');
// Build where for policies
$policyWhere = [
['type' => 'equals', 'attribute' => 'status', 'value' => 'active'],
[
'type' => 'or',
'value' => array_values(array_filter([
!empty($programIds) ? ['type' => 'in', 'attribute' => 'financialProgramId', 'value' => $programIds] : null,
['type' => 'equals', 'attribute' => 'financialProductId', 'value' => $productId],
])),
],
];
$policiesRes = $this->client->get('CDecisionPolicy', [
'select' => 'id,name,policyLevel,overrideAllowed,financialProgramId,financialProductId,status',
'maxSize' => 50,
'where' => $policyWhere,
]);
$policies = $policiesRes['list'] ?? [];
if (empty($policies)) {
return [];
}
// Groups for those policies
$policyIds = array_column($policies, 'id');
$groupsRes = $this->client->get('CRuleGroup', [
'select' => 'id,decisionPolicyId,logicOperator,status',
'maxSize' => 200,
'where' => [
['type' => 'in', 'attribute' => 'decisionPolicyId', 'value' => $policyIds],
['type' => 'equals', 'attribute' => 'status', 'value' => 'active'],
],
]);
$groupsByPolicy = [];
foreach ($groupsRes['list'] ?? [] as $g) {
$groupsByPolicy[$g['decisionPolicyId']][] = $g;
}
// Rules for those groups
$groupIds = array_column($groupsRes['list'] ?? [], 'id');
$rulesByGroup = [];
if (!empty($groupIds)) {
$rulesRes = $this->client->get('CEligibilityRule', [
'select' => 'id,ruleGroupId,conditionFieldId,operator,value,valueFrom,valueTo,valueList,status',
'maxSize' => 200,
'where' => [
['type' => 'in', 'attribute' => 'ruleGroupId', 'value' => $groupIds],
['type' => 'equals', 'attribute' => 'status', 'value' => 'active'],
],
]);
foreach ($rulesRes['list'] ?? [] as $r) {
$rulesByGroup[$r['ruleGroupId']][] = $r;
}
}
// Assemble the nested shape
foreach ($policies as &$p) {
$groups = $groupsByPolicy[$p['id']] ?? [];
foreach ($groups as &$g) {
$g['rules'] = $rulesByGroup[$g['id']] ?? [];
}
unset($g);
$p['groups'] = $groups;
}
unset($p);
return $policies;
}
}