diff --git a/Civi/Api4/Action/Address/AddressSaveTrait.php b/Civi/Api4/Action/Address/AddressSaveTrait.php index af121c42b9b9..2f966d97e1ef 100644 --- a/Civi/Api4/Action/Address/AddressSaveTrait.php +++ b/Civi/Api4/Action/Address/AddressSaveTrait.php @@ -54,7 +54,7 @@ trait AddressSaveTrait { /** * @inheritDoc */ - protected function writeObjects($items) { + protected function writeObjects(&$items) { foreach ($items as &$item) { if ($this->streetParsing && !empty($item['street_address'])) { $item = array_merge($item, \CRM_Core_BAO_Address::parseStreetAddress($item['street_address'])); diff --git a/Civi/Api4/Action/CiviCase/CiviCaseSaveTrait.php b/Civi/Api4/Action/CiviCase/CiviCaseSaveTrait.php index 8f83c11206c7..33d2d1514120 100644 --- a/Civi/Api4/Action/CiviCase/CiviCaseSaveTrait.php +++ b/Civi/Api4/Action/CiviCase/CiviCaseSaveTrait.php @@ -28,7 +28,7 @@ trait CiviCaseSaveTrait { * @param array $cases * @return array */ - protected function writeObjects($cases) { + protected function writeObjects(&$cases) { $cases = array_values($cases); $result = parent::writeObjects($cases); diff --git a/Civi/Api4/Action/GroupContact/GroupContactSaveTrait.php b/Civi/Api4/Action/GroupContact/GroupContactSaveTrait.php index 85492afdb486..546a94458f79 100644 --- a/Civi/Api4/Action/GroupContact/GroupContactSaveTrait.php +++ b/Civi/Api4/Action/GroupContact/GroupContactSaveTrait.php @@ -46,7 +46,7 @@ trait GroupContactSaveTrait { /** * @inheritDoc */ - protected function writeObjects($items) { + protected function writeObjects(&$items) { foreach ($items as &$item) { $item['method'] = $this->method; $item['tracking'] = $this->tracking; diff --git a/Civi/Api4/Generic/DAOCreateAction.php b/Civi/Api4/Generic/DAOCreateAction.php index d2371d3180f4..336b26be7502 100644 --- a/Civi/Api4/Generic/DAOCreateAction.php +++ b/Civi/Api4/Generic/DAOCreateAction.php @@ -36,10 +36,9 @@ public function _run(Result $result) { $this->validateValues(); $params = $this->values; $this->fillDefaults($params); + $items = [$params]; - $resultArray = $this->writeObjects([$params]); - - $result->exchangeArray($resultArray); + $result->exchangeArray($this->writeObjects($items)); } /** diff --git a/Civi/Api4/Generic/DAOUpdateAction.php b/Civi/Api4/Generic/DAOUpdateAction.php index 0d4bf1755115..a3c86dbfe622 100644 --- a/Civi/Api4/Generic/DAOUpdateAction.php +++ b/Civi/Api4/Generic/DAOUpdateAction.php @@ -60,7 +60,8 @@ public function _run(Result $result) { // Update a single record by ID unless select requires more than id if ($this->getSelect() === ['id'] && count($this->where) === 1 && $this->where[0][0] === 'id' && $this->where[0][1] === '=' && !empty($this->where[0][2])) { $this->values['id'] = $this->where[0][2]; - $result->exchangeArray($this->writeObjects([$this->values])); + $items = [$this->values]; + $result->exchangeArray($this->writeObjects($items)); return; } diff --git a/Civi/Api4/Generic/Traits/CustomValueActionTrait.php b/Civi/Api4/Generic/Traits/CustomValueActionTrait.php index 5a7a0e331276..6d595b04ae2b 100644 --- a/Civi/Api4/Generic/Traits/CustomValueActionTrait.php +++ b/Civi/Api4/Generic/Traits/CustomValueActionTrait.php @@ -51,7 +51,7 @@ public function getEntityName() { /** * @inheritDoc */ - protected function writeObjects($items) { + protected function writeObjects(&$items) { $fields = $this->entityFields(); foreach ($items as $idx => $item) { FormattingUtil::formatWriteParams($item, $fields); diff --git a/Civi/Api4/Generic/Traits/DAOActionTrait.php b/Civi/Api4/Generic/Traits/DAOActionTrait.php index 2a94bfbe4f2c..197e8936ac76 100644 --- a/Civi/Api4/Generic/Traits/DAOActionTrait.php +++ b/Civi/Api4/Generic/Traits/DAOActionTrait.php @@ -103,7 +103,7 @@ protected function fillDefaults(&$params) { * @throws \API_Exception * @throws \CRM_Core_Exception */ - protected function writeObjects($items) { + protected function writeObjects(&$items) { $baoName = $this->getBaoName(); // Some BAOs are weird and don't support a straightforward "create" method. @@ -118,7 +118,7 @@ protected function writeObjects($items) { $result = []; - foreach ($items as $item) { + foreach ($items as &$item) { $entityId = $item['id'] ?? NULL; FormattingUtil::formatWriteParams($item, $this->entityFields()); $this->formatCustomParams($item, $entityId); diff --git a/Civi/Api4/Service/Spec/Provider/CaseCreationSpecProvider.php b/Civi/Api4/Service/Spec/Provider/CaseCreationSpecProvider.php index ce0dcf726fa6..1e768dfd4606 100644 --- a/Civi/Api4/Service/Spec/Provider/CaseCreationSpecProvider.php +++ b/Civi/Api4/Service/Spec/Provider/CaseCreationSpecProvider.php @@ -59,6 +59,16 @@ public function modifySpec(RequestSpec $spec) { $duration->setInputType('Number'); $duration->setDescription('Open Case activity duration (minutes).'); $spec->addFieldSpec($duration); + + $defaultStatus = \CRM_Core_DAO::singleValueQuery('SELECT value FROM civicrm_option_value + WHERE is_default + AND domain_id = ' . \CRM_Core_BAO_Domain::getDomain()->id . ' + AND option_group_id = (SELECT id FROM civicrm_option_group WHERE name = "case_status") + LIMIT 1'); + if ($defaultStatus) { + $status = $spec->getFieldByName('status_id'); + $status->setDefaultValue((int) $defaultStatus); + } } /** diff --git a/tests/phpunit/api/v4/DataSets/CaseType.json b/tests/phpunit/api/v4/DataSets/CaseType.json new file mode 100644 index 000000000000..dd1c084386c5 --- /dev/null +++ b/tests/phpunit/api/v4/DataSets/CaseType.json @@ -0,0 +1,58 @@ +{ + "CaseType": [ + { + "name": "test_case_type", + "title": "Test Case Type", + "definition": { + "activityTypes": [ + { + "name": "Open Case", + "max_instances": "1" + }, + { + "name": "Follow up" + } + ], + "activitySets": [ + { + "name": "standard_timeline", + "label": "Standard Timeline", + "timeline": 1, + "activityTypes": [ + { + "name": "Open Case", + "status": "Completed" + }, + { + "name": "Follow up", + "reference_activity": "Open Case", + "reference_offset": "3", + "reference_select": "newest" + } + ] + } + ], + "timelineActivityTypes": [ + { + "name": "Open Case", + "status": "Completed" + }, + { + "name": "Follow up", + "reference_activity": "Open Case", + "reference_offset": "3", + "reference_select": "newest" + } + ], + "caseRoles": [ + { + "name": "Parent of", + "creator": "1", + "manager": "1" + } + ] + }, + "@ref": "test_case_type_1" + } + ] +} diff --git a/tests/phpunit/api/v4/DataSets/ConformanceTest.json b/tests/phpunit/api/v4/DataSets/ConformanceTest.json index 217138e077b3..78a3b72aaa8d 100644 --- a/tests/phpunit/api/v4/DataSets/ConformanceTest.json +++ b/tests/phpunit/api/v4/DataSets/ConformanceTest.json @@ -13,62 +13,6 @@ "@ref": "test_contact_2" } ], - "CaseType": [ - { - "name": "test_case_type", - "title": "Test Case Type", - "definition": { - "activityTypes": [ - { - "name": "Open Case", - "max_instances": "1" - }, - { - "name": "Follow up" - } - ], - "activitySets": [ - { - "name": "standard_timeline", - "label": "Standard Timeline", - "timeline": 1, - "activityTypes": [ - { - "name": "Open Case", - "status": "Completed" - }, - { - "name": "Follow up", - "reference_activity": "Open Case", - "reference_offset": "3", - "reference_select": "newest" - } - ] - } - ], - "timelineActivityTypes": [ - { - "name": "Open Case", - "status": "Completed" - }, - { - "name": "Follow up", - "reference_activity": "Open Case", - "reference_offset": "3", - "reference_select": "newest" - } - ], - "caseRoles": [ - { - "name": "Parent of", - "creator": "1", - "manager": "1" - } - ] - }, - "@ref": "test_case_type_1" - } - ], "Case": [ { "case_type_id": "@ref test_case_type_1.id", diff --git a/tests/phpunit/api/v4/Entity/CaseTest.php b/tests/phpunit/api/v4/Entity/CaseTest.php new file mode 100644 index 000000000000..9145bd8ec9b7 --- /dev/null +++ b/tests/phpunit/api/v4/Entity/CaseTest.php @@ -0,0 +1,51 @@ +loadDataSet('CaseType'); + } + + public function testCreateUsingLoggedInUser() { + $this->createLoggedInUser(); + + $contactID = $this->createEntity(['type' => 'Individual'])['id']; + + $result = CiviCase::create(FALSE) + ->addValue('case_type_id', $this->getReference('test_case_type_1')['id']) + ->addValue('creator_id', 'user_contact_id') + ->addValue('status_id', 1) + ->addValue('contact_id', $contactID) + ->execute() + ->first(); + + } + +} diff --git a/tests/phpunit/api/v4/Entity/ConformanceTest.php b/tests/phpunit/api/v4/Entity/ConformanceTest.php index a523447fb5d8..6af37e8e1378 100644 --- a/tests/phpunit/api/v4/Entity/ConformanceTest.php +++ b/tests/phpunit/api/v4/Entity/ConformanceTest.php @@ -53,6 +53,7 @@ public function setUp(): void { $this->dropByPrefix('civicrm_value_myfavorite'); $this->cleanup(['tablesToTruncate' => $tablesToTruncate]); $this->setUpOptionCleanup(); + $this->loadDataSet('CaseType'); $this->loadDataSet('ConformanceTest'); $this->creationParamProvider = \Civi::container()->get('test.param_provider'); parent::setUp();