/home/alixis5/integrate.sellofinance.com/src/Services
NameSizeModeActions
ApplicationService.php290940644editdlrm
AuthService.php127280644editdlrm
CatalogAggregator.php57910644editdlrm
CustomerBundleLoader.php39520644editdlrm
EligibilityEvaluator.php176030644editdlrm
GoogleAuthService.php82850644editdlrm
MeritRanker.php62790644editdlrm
OnboardingService.php229470644editdlrm
ProductPolicyLoader.php38180644editdlrm
VerificationService.php37520644editdlrm
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; } }