diff --git a/CRM/Member/Form/Task/Batch.php b/CRM/Member/Form/Task/Batch.php index 814ced3cbb8..04c7bbb0c7b 100644 --- a/CRM/Member/Form/Task/Batch.php +++ b/CRM/Member/Form/Task/Batch.php @@ -187,78 +187,86 @@ public function setDefaultValues() { /** * Process the form after the input has been submitted and validated. * - * - * @return void + * @throws \CRM_Core_Exception + * @throws \CiviCRM_API3_Exception */ public function postProcess() { $params = $this->exportValues(); - // @todo extract submit functions & - // extend CRM_Event_Form_Task_BatchTest::testSubmit with a data provider to test - // handling of custom data, specifically checkbox fields. + if (isset($params['field'])) { + $this->submit($params); + CRM_Core_Session::setStatus(ts('Your updates have been saved.'), ts('Saved'), 'success'); + } + else { + CRM_Core_Session::setStatus(ts('No updates have been saved.'), ts('Not Saved'), 'alert'); + } + } + + /** + * @param array $params + * + * @return mixed + * @throws \CRM_Core_Exception + * @throws \CiviCRM_API3_Exception + */ + public function submit(array $params) { $dates = [ 'membership_join_date', 'membership_start_date', 'membership_end_date', ]; - if (isset($params['field'])) { - $customFields = []; - foreach ($params['field'] as $key => $value) { - $params['id'] = $key; - if (!empty($value['membership_source'])) { - $value['source'] = $value['membership_source']; - } + $customFields = []; + foreach ($params['field'] as $key => $value) { + $value['id'] = $key; + if (!empty($value['membership_source'])) { + $value['source'] = $value['membership_source']; + } - if (!empty($value['membership_type'])) { - $membershipTypeId = $value['membership_type_id'] = $value['membership_type'][1]; - } + if (!empty($value['membership_type'])) { + $membershipTypeId = $value['membership_type_id'] = $value['membership_type'][1]; + } - unset($value['membership_source']); - unset($value['membership_type']); + unset($value['membership_source']); + unset($value['membership_type']); - //Get the membership status - $value['status_id'] = (CRM_Utils_Array::value('membership_status', $value)) ? $value['membership_status'] : CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $key, 'status_id'); - unset($value['membership_status']); - foreach ($dates as $val) { - if (isset($value[$val])) { - $value[$val] = CRM_Utils_Date::processDate($value[$val]); - } + //Get the membership status + $value['status_id'] = (CRM_Utils_Array::value('membership_status', $value)) ? $value['membership_status'] : CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $key, 'status_id'); + unset($value['membership_status']); + foreach ($dates as $val) { + if (isset($value[$val])) { + $value[$val] = CRM_Utils_Date::processDate($value[$val]); + } + } + if (empty($customFields)) { + if (empty($value['membership_type_id'])) { + $membershipTypeId = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $key, 'membership_type_id'); } - if (empty($customFields)) { - if (empty($value['membership_type_id'])) { - $membershipTypeId = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $key, 'membership_type_id'); - } - // membership type custom data - $customFields = CRM_Core_BAO_CustomField::getFields('Membership', FALSE, FALSE, $membershipTypeId); + // membership type custom data + $customFields = CRM_Core_BAO_CustomField::getFields('Membership', FALSE, FALSE, $membershipTypeId); - $customFields = CRM_Utils_Array::crmArrayMerge($customFields, - CRM_Core_BAO_CustomField::getFields('Membership', - FALSE, FALSE, NULL, NULL, TRUE - ) - ); - } - //check for custom data - $value['custom'] = CRM_Core_BAO_CustomField::postProcess($params['field'][$key], - $key, - 'Membership', - $membershipTypeId + $customFields = CRM_Utils_Array::crmArrayMerge($customFields, + CRM_Core_BAO_CustomField::getFields('Membership', + FALSE, FALSE, NULL, NULL, TRUE + ) ); + } + //check for custom data + $value['custom'] = CRM_Core_BAO_CustomField::postProcess($params['field'][$key], + $key, + 'Membership', + $membershipTypeId + ); - $membership = CRM_Member_BAO_Membership::add($value); + $membership = CRM_Member_BAO_Membership::add($value); - // add custom field values - if (!empty($value['custom']) && - is_array($value['custom']) - ) { - CRM_Core_BAO_CustomValueTable::store($value['custom'], 'civicrm_membership', $membership->id); - } + // add custom field values + if (!empty($value['custom']) && + is_array($value['custom']) + ) { + CRM_Core_BAO_CustomValueTable::store($value['custom'], 'civicrm_membership', $membership->id); } - - CRM_Core_Session::setStatus(ts("Your updates have been saved."), ts('Saved'), 'success'); - } - else { - CRM_Core_Session::setStatus(ts("No updates have been saved."), ts('Not Saved'), 'alert'); } + return $value; } } diff --git a/tests/phpunit/CRM/Member/Form/Task/BatchTest.php b/tests/phpunit/CRM/Member/Form/Task/BatchTest.php new file mode 100644 index 00000000000..ce464ce4973 --- /dev/null +++ b/tests/phpunit/CRM/Member/Form/Task/BatchTest.php @@ -0,0 +1,63 @@ +validateAllContributions(); + $this->validateAllPayments(); + $this->quickCleanUpFinancialEntities(); + } + + /** + * Test batch submission. + * + * @throws \CRM_Core_Exception + */ + public function testBatchSubmit() { + $form = $this->getFormObject('CRM_Member_Form_Task_Batch'); + $membership1 = $this->contactMembershipCreate(['contact_id' => $this->individualCreate()]); + $membership2 = $this->contactMembershipCreate(['contact_id' => $this->individualCreate()]); + $this->createCustomGroupWithFieldOfType(['extends' => 'Membership'], 'text'); + $form->submit([ + 'field' => [ + $membership1 => [ + $this->getCustomFieldName('text') => '80', + 'membership_join_date' => '2019-12-26', + ], + $membership2 => [ + $this->getCustomFieldName('text') => '100', + 'membership_join_date' => '2019-11-26', + 'membership_source' => 'form', + ], + ], + ]); + $memberships = $this->callAPISuccess('Membership', 'get', [])['values']; + $this->assertEquals('2019-12-26', $memberships[$membership1]['join_date']); + $this->assertEquals('2019-11-26', $memberships[$membership2]['join_date']); + $this->assertEquals('form', $memberships[$membership2]['source']); + $this->assertEquals(80, $memberships[$membership1][$this->getCustomFieldName('text')]); + $this->assertEquals(100, $memberships[$membership2][$this->getCustomFieldName('text')]); + } + +}