* @return int
* Id of deleted Membership on success, false otherwise.
*/
- public static function del($membershipId) {
+ public static function del($membershipId, $preserveContrib = 0) {
//delete related first and then delete parent.
self::deleteRelatedMemberships($membershipId);
- return self::deleteMembership($membershipId);
+ return self::deleteMembership($membershipId, $preserveContrib);
}
/**
* @return int
* Id of deleted Membership on success, false otherwise.
*/
- public static function deleteMembership($membershipId) {
+ public static function deleteMembership($membershipId, $preserveContrib = 0) {
// CRM-12147, retrieve membership data before we delete it for hooks
$params = array('id' => $membershipId);
$memValues = array();
$params['source_record_id'] = $membershipId;
CRM_Activity_BAO_Activity::deleteActivity($params);
}
- self::deleteMembershipPayment($membershipId);
+ self::deleteMembershipPayment($membershipId, $preserveContrib);
$results = $membership->delete();
$transaction->commit();
* @return object
* $membershipPayment deleted membership payment object
*/
- public static function deleteMembershipPayment($membershipId) {
+ public static function deleteMembershipPayment($membershipId, $preserveContrib = 0) {
$membershipPayment = new CRM_Member_DAO_MembershipPayment();
$membershipPayment->membership_id = $membershipId;
$membershipPayment->find();
while ($membershipPayment->fetch()) {
- CRM_Contribute_BAO_Contribution::deleteContribution($membershipPayment->contribution_id);
+ if (!$preserveContrib) {
+ CRM_Contribute_BAO_Contribution::deleteContribution($membershipPayment->contribution_id);
+ }
CRM_Utils_Hook::pre('delete', 'MembershipPayment', $membershipPayment->id, $membershipPayment);
$membershipPayment->delete();
CRM_Utils_Hook::post('delete', 'MembershipPayment', $membershipPayment->id, $membershipPayment);
* @package CiviCRM_APIv3
*/
+/**
+ * Adjust Metadata for Delete action.
+ *
+ * The metadata is used for setting defaults, documentation & validation.
+ *
+ * @param array $params
+ * Array of parameters determined by getfields.
+ */
+function _civicrm_api3_membership_delete_spec(&$params) {
+ $params['preserve_contribution']['api.required'] = 0;
+}
+
/**
* Deletes an existing contact Membership.
*
* API result array.
*/
function civicrm_api3_membership_delete($params) {
- return _civicrm_api3_basic_delete(_civicrm_api3_get_BAO(__FUNCTION__), $params);
+ if (isset($params['preserve_contribution'])){
+ if (CRM_Member_BAO_Membership::del($params['id'], $params['preserve_contribution'])) {
+ return civicrm_api3_create_success(TRUE, $params);
+ }
+ else {
+ return civicrm_api3_create_error('Could not delete membership');
+ }
+ }
+ else {
+ return _civicrm_api3_basic_delete(_civicrm_api3_get_BAO(__FUNCTION__), $params);
+ }
}
/**
$this->callAPIFailure('membership', 'delete', $membershipId);
}
+ /**
+ * Test membership deletion and with the preserve contribution param.
+ */
+ public function testMembershipDeletePreserveContribution() {
+ $membershipID = $this->contactMembershipCreate($this->_params); //DELETE
+ $this->assertDBRowExist('CRM_Member_DAO_Membership', $membershipID); //DELETE
+ $ContributionCreate = $this->callAPISuccess('Contribution', 'create', array(
+ 'sequential' => 1,
+ 'financial_type_id' => "Member Dues",
+ 'total_amount' => 100,
+ 'contact_id' => $this->_params['contact_id'],
+ ));
+ $membershipPaymentCreate = $this->callAPISuccess('MembershipPayment', 'create', array(
+ 'sequential' => 1,
+ 'contribution_id' => $ContributionCreate['values'][0]['id'],
+ 'membership_id' => $membershipID,
+ ));
+ $memParams = array(
+ 'id' => $membershipID,
+ 'preserve_contribution' => 1,
+ );
+ $contribParams = array(
+ 'id' => $ContributionCreate['values'][0]['id'],
+ );
+ $this->callAPIAndDocument('membership', 'delete', $memParams, __FUNCTION__, __FILE__);
+ $this->assertDBRowNotExist('CRM_Member_DAO_Membership', $membershipID);
+ $this->assertDBRowExist('CRM_Contribute_DAO_Contribution', $ContributionCreate['values'][0]['id']);
+ $this->callAPISuccess('Contribution', 'delete', $contribParams);
+ $this->assertDBRowNotExist('CRM_Contribute_DAO_Contribution', $ContributionCreate['values'][0]['id']);
+ }
+
/**
* Test membership get.
*/