fix: wrap test group members under testdefgrp

Align CALC/GROUP request and response payloads to use the testdefgrp.members structure in controller handling, feature tests, and OpenAPI schemas/examples for a consistent API contract.
This commit is contained in:
mahdahar 2026-04-02 09:06:42 +07:00
parent eeaed768c9
commit 694c5a6211
5 changed files with 235 additions and 191 deletions

View File

@ -92,9 +92,13 @@ class TestsController extends BaseController
if ($typeCode === 'CALC') { if ($typeCode === 'CALC') {
$row['testdefcal'] = $this->modelCal->getByTestSiteID($id); $row['testdefcal'] = $this->modelCal->getByTestSiteID($id);
$row['members'] = $this->modelGrp->getGroupMembers($id); $row['testdefgrp'] = [
'members' => $this->modelGrp->getGroupMembers($id),
];
} elseif ($typeCode === 'GROUP') { } elseif ($typeCode === 'GROUP') {
$row['members'] = $this->modelGrp->getGroupMembers($id); $row['testdefgrp'] = [
'members' => $this->modelGrp->getGroupMembers($id),
];
} elseif ($typeCode !== 'TITLE') { } elseif ($typeCode !== 'TITLE') {
$refType = $row['RefType'] ?? ''; $refType = $row['RefType'] ?? '';
$resultType = $row['ResultType'] ?? ''; $resultType = $row['ResultType'] ?? '';
@ -511,7 +515,7 @@ class TestsController extends BaseController
{ {
$memberIDs = []; $memberIDs = [];
$rawMembers = $input['members'] ?? []; $rawMembers = $input['testdefgrp']['members'] ?? [];
if (is_array($rawMembers)) { if (is_array($rawMembers)) {
foreach ($rawMembers as $member) { foreach ($rawMembers as $member) {
if (is_array($member)) { if (is_array($member)) {

View File

@ -4671,6 +4671,10 @@ paths:
FormulaCode: FormulaCode:
type: string type: string
description: Formula expression for calculated tests (e.g., "{TBIL} - {DBIL}") description: Formula expression for calculated tests (e.g., "{TBIL} - {DBIL}")
testdefgrp:
type: object
description: Group definition wrapper for CALC/GROUP member assignments.
properties:
members: members:
type: array type: array
description: Array of member TestSiteIDs for CALC/GROUP definitions. description: Array of member TestSiteIDs for CALC/GROUP definitions.
@ -5096,6 +5100,7 @@ paths:
DepartmentID: 2 DepartmentID: 2
testdefcal: testdefcal:
FormulaCode: CKD_EPI(CREA,AGE,GENDER) FormulaCode: CKD_EPI(CREA,AGE,GENDER)
testdefgrp:
members: members:
- TestSiteID: 21 - TestSiteID: 21
- TestSiteID: 22 - TestSiteID: 22
@ -5137,6 +5142,7 @@ paths:
DepartmentID: 2 DepartmentID: 2
testdefcal: testdefcal:
FormulaCode: CKD_EPI(CREA,AGE,GENDER) FormulaCode: CKD_EPI(CREA,AGE,GENDER)
testdefgrp:
members: members:
- TestSiteID: 21 - TestSiteID: 21
- TestSiteID: 22 - TestSiteID: 22
@ -5163,6 +5169,7 @@ paths:
ConDefID: 1 ConDefID: 1
ClientTestCode: LIPID_C ClientTestCode: LIPID_C
ClientTestName: Lipid Client ClientTestName: Lipid Client
testdefgrp:
members: members:
- TestSiteID: 169 - TestSiteID: 169
- TestSiteID: 170 - TestSiteID: 170
@ -5327,6 +5334,10 @@ paths:
FormulaCode: FormulaCode:
type: string type: string
description: Formula expression for calculated tests (e.g., "{TBIL} - {DBIL}") description: Formula expression for calculated tests (e.g., "{TBIL} - {DBIL}")
testdefgrp:
type: object
description: Group definition wrapper for CALC/GROUP member assignments.
properties:
members: members:
type: array type: array
description: Array of member TestSiteIDs for CALC/GROUP definitions. description: Array of member TestSiteIDs for CALC/GROUP definitions.
@ -7050,11 +7061,15 @@ components:
description: Calculated test details (only for CALC type) description: Calculated test details (only for CALC type)
items: items:
type: object type: object
testdefgrp:
type: object
description: Group definition payload for GROUP and CALC types.
properties:
members: members:
type: array type: array
description: | description: |
Group members (for GROUP and CALC types). Group members (for GROUP and CALC types).
When creating or updating, provide members in members array with TestSiteID field. When creating or updating, provide members in testdefgrp.members with TestSiteID field.
Do NOT use Member, SeqScr, or Members fields when creating/updating. Do NOT use Member, SeqScr, or Members fields when creating/updating.
items: items:
type: object type: object
@ -7069,7 +7084,7 @@ components:
type: integer type: integer
description: | description: |
Member TestSiteID (foreign key to testdefsite). Member TestSiteID (foreign key to testdefsite).
**Note**: This field is in the response. When creating/updating, use TestSiteID in members array instead. **Note**: This field is in the response. When creating/updating, use TestSiteID in testdefgrp.members instead.
TestSiteCode: TestSiteCode:
type: string type: string
description: Member test code description: Member test code
@ -7338,6 +7353,7 @@ components:
FormulaCode: CKD_EPI(CREA,AGE,GENDER) FormulaCode: CKD_EPI(CREA,AGE,GENDER)
Unit1: mL/min/1.73m2 Unit1: mL/min/1.73m2
Decimal: 0 Decimal: 0
testdefgrp:
members: members:
- TestSiteID: 21 - TestSiteID: 21
TestSiteCode: CREA TestSiteCode: CREA
@ -7380,6 +7396,7 @@ components:
isVisibleScr: 1 isVisibleScr: 1
isVisibleRpt: 1 isVisibleRpt: 1
isCountStat: 1 isCountStat: 1
testdefgrp:
members: members:
- TestGrpID: 1 - TestGrpID: 1
TestSiteID: 6 TestSiteID: 6

View File

@ -183,11 +183,15 @@ TestDefinition:
description: Calculated test details (only for CALC type) description: Calculated test details (only for CALC type)
items: items:
type: object type: object
testdefgrp:
type: object
description: Group definition payload for GROUP and CALC types.
properties:
members: members:
type: array type: array
description: | description: |
Group members (for GROUP and CALC types). Group members (for GROUP and CALC types).
When creating or updating, provide members in members array with TestSiteID field. When creating or updating, provide members in testdefgrp.members with TestSiteID field.
Do NOT use Member, SeqScr, or Members fields when creating/updating. Do NOT use Member, SeqScr, or Members fields when creating/updating.
items: items:
type: object type: object
@ -202,7 +206,7 @@ TestDefinition:
type: integer type: integer
description: | description: |
Member TestSiteID (foreign key to testdefsite). Member TestSiteID (foreign key to testdefsite).
**Note**: This field is in the response. When creating/updating, use TestSiteID in members array instead. **Note**: This field is in the response. When creating/updating, use TestSiteID in testdefgrp.members instead.
TestSiteCode: TestSiteCode:
type: string type: string
description: Member test code description: Member test code
@ -467,6 +471,7 @@ TestDefinition:
FormulaCode: CKD_EPI(CREA,AGE,GENDER) FormulaCode: CKD_EPI(CREA,AGE,GENDER)
Unit1: mL/min/1.73m2 Unit1: mL/min/1.73m2
Decimal: 0 Decimal: 0
testdefgrp:
members: members:
- TestSiteID: 21 - TestSiteID: 21
TestSiteCode: CREA TestSiteCode: CREA
@ -509,6 +514,7 @@ TestDefinition:
isVisibleScr: 1 isVisibleScr: 1
isVisibleRpt: 1 isVisibleRpt: 1
isCountStat: 1 isCountStat: 1
testdefgrp:
members: members:
- TestGrpID: 1 - TestGrpID: 1
TestSiteID: 6 TestSiteID: 6

View File

@ -185,6 +185,10 @@
FormulaCode: FormulaCode:
type: string type: string
description: Formula expression for calculated tests (e.g., "{TBIL} - {DBIL}") description: Formula expression for calculated tests (e.g., "{TBIL} - {DBIL}")
testdefgrp:
type: object
description: Group definition wrapper for CALC/GROUP member assignments.
properties:
members: members:
type: array type: array
description: Array of member TestSiteIDs for CALC/GROUP definitions. description: Array of member TestSiteIDs for CALC/GROUP definitions.
@ -610,6 +614,7 @@
DepartmentID: 2 DepartmentID: 2
testdefcal: testdefcal:
FormulaCode: CKD_EPI(CREA,AGE,GENDER) FormulaCode: CKD_EPI(CREA,AGE,GENDER)
testdefgrp:
members: members:
- TestSiteID: 21 - TestSiteID: 21
- TestSiteID: 22 - TestSiteID: 22
@ -651,6 +656,7 @@
DepartmentID: 2 DepartmentID: 2
testdefcal: testdefcal:
FormulaCode: CKD_EPI(CREA,AGE,GENDER) FormulaCode: CKD_EPI(CREA,AGE,GENDER)
testdefgrp:
members: members:
- TestSiteID: 21 - TestSiteID: 21
- TestSiteID: 22 - TestSiteID: 22
@ -677,6 +683,7 @@
ConDefID: 1 ConDefID: 1
ClientTestCode: LIPID_C ClientTestCode: LIPID_C
ClientTestName: Lipid Client ClientTestName: Lipid Client
testdefgrp:
members: members:
- TestSiteID: 169 - TestSiteID: 169
- TestSiteID: 170 - TestSiteID: 170
@ -827,6 +834,10 @@
FormulaCode: FormulaCode:
type: string type: string
description: Formula expression for calculated tests (e.g., "{TBIL} - {DBIL}") description: Formula expression for calculated tests (e.g., "{TBIL} - {DBIL}")
testdefgrp:
type: object
description: Group definition wrapper for CALC/GROUP member assignments.
properties:
members: members:
type: array type: array
description: Array of member TestSiteIDs for CALC/GROUP definitions. description: Array of member TestSiteIDs for CALC/GROUP definitions.

View File

@ -364,11 +364,12 @@ class TestCreateVariantsTest extends CIUnitTestCase
$show->assertStatus(200); $show->assertStatus(200);
$showData = json_decode($show->getJSON(), true)['data']; $showData = json_decode($show->getJSON(), true)['data'];
$this->assertArrayHasKey('members', $showData); $this->assertArrayHasKey('testdefgrp', $showData);
$this->assertArrayNotHasKey('testdefgrp', $showData); $this->assertArrayHasKey('members', $showData['testdefgrp']);
$this->assertArrayNotHasKey('members', $showData);
if ($members !== []) { if ($members !== []) {
$this->assertCount(count($members), $showData['members']); $this->assertCount(count($members), $showData['testdefgrp']['members']);
} }
} }
@ -435,9 +436,10 @@ class TestCreateVariantsTest extends CIUnitTestCase
$show->assertStatus(200); $show->assertStatus(200);
$showData = json_decode($show->getJSON(), true)['data']; $showData = json_decode($show->getJSON(), true)['data'];
$this->assertArrayHasKey('members', $showData); $this->assertArrayHasKey('testdefgrp', $showData);
$this->assertArrayNotHasKey('testdefgrp', $showData); $this->assertArrayHasKey('members', $showData['testdefgrp']);
$this->assertCount(count($members), $showData['members']); $this->assertArrayNotHasKey('members', $showData);
$this->assertCount(count($members), $showData['testdefgrp']['members']);
} }
private function buildTechnicalPayload(string $testType, array $details = []): array private function buildTechnicalPayload(string $testType, array $details = []): array
@ -471,7 +473,9 @@ class TestCreateVariantsTest extends CIUnitTestCase
'isVisibleScr' => 1, 'isVisibleScr' => 1,
'isVisibleRpt' => 1, 'isVisibleRpt' => 1,
'isCountStat' => 0, 'isCountStat' => 0,
'testdefgrp' => [
'members' => array_map(fn ($id) => ['TestSiteID' => $id], $members), 'members' => array_map(fn ($id) => ['TestSiteID' => $id], $members),
],
'details' => [ 'details' => [
'DisciplineID' => 2, 'DisciplineID' => 2,
'DepartmentID' => 2, 'DepartmentID' => 2,
@ -494,7 +498,9 @@ class TestCreateVariantsTest extends CIUnitTestCase
'isVisibleScr' => 1, 'isVisibleScr' => 1,
'isVisibleRpt' => 1, 'isVisibleRpt' => 1,
'isCountStat' => 1, 'isCountStat' => 1,
'testdefgrp' => [
'members' => array_map(fn ($id) => ['TestSiteID' => $id], $members), 'members' => array_map(fn ($id) => ['TestSiteID' => $id], $members),
],
'testmap' => $testmap, 'testmap' => $testmap,
]; ];
} }