Merge branch '4.7.21-rc' into master
[civicrm-core.git] / CRM / Member / BAO / Membership.php
index 527ba6435873d0ac9e2e6381817642dec816fbec..6d206aa137b10365629e19600d18df5dc846214a 100644 (file)
@@ -139,38 +139,66 @@ class CRM_Member_BAO_Membership extends CRM_Member_DAO_Membership {
     // reset the group contact cache since smart groups might be affected due to this
     CRM_Contact_BAO_GroupContactCache::opportunisticCacheFlush();
 
+    $allStatus = CRM_Member_BAO_Membership::buildOptions('status_id', 'get');
+    $activityParams = array(
+      'status_id' => CRM_Utils_Array::value('membership_activity_status', $params, 'Completed'),
+    );
+    if (in_array($allStatus[$membership->status_id], array('Pending', 'Grace'))) {
+      $activityParams['status_id'] = 'Scheduled';
+    }
+    $activityParams['status_id'] = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_status_id', $activityParams['status_id']);
+
+    $targetContactID = $membership->contact_id;
+    if (!empty($params['is_for_organization'])) {
+      $targetContactID = CRM_Utils_Array::value('userId', $ids);
+    }
     if ($id) {
       if ($membership->status_id != $oldStatus) {
-        $allStatus = CRM_Member_BAO_Membership::buildOptions('status_id', 'get');
-        $activityParam = array(
-          'subject' => "Status changed from {$allStatus[$oldStatus]} to {$allStatus[$membership->status_id]}",
-          'source_contact_id' => $membershipLog['modified_id'],
-          'target_contact_id' => $membership->contact_id,
-          'source_record_id' => $membership->id,
-          'activity_type_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Change Membership Status'),
-          'status_id' => 2,
-          'priority_id' => 2,
-          'activity_date_time' => date('Y-m-d H:i:s'),
+        CRM_Activity_BAO_Activity::addActivity($membership,
+          'Change Membership Status',
+          NULL,
+          array(
+            'subject' => "Status changed from {$allStatus[$oldStatus]} to {$allStatus[$membership->status_id]}",
+            'source_contact_id' => $membershipLog['modified_id'],
+            'priority_id' => 'Normal',
+          )
         );
-        civicrm_api3('activity', 'create', $activityParam);
       }
       if (isset($membership->membership_type_id) && $membership->membership_type_id != $oldType) {
         $membershipTypes = CRM_Member_BAO_Membership::buildOptions('membership_type_id', 'get');
-        $activityParam = array(
-          'subject' => "Type changed from {$membershipTypes[$oldType]} to {$membershipTypes[$membership->membership_type_id]}",
-          'source_contact_id' => $membershipLog['modified_id'],
-          'target_contact_id' => $membership->contact_id,
-          'source_record_id' => $membership->id,
-          'activity_type_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Change Membership Type'),
-          'status_id' => 2,
-          'priority_id' => 2,
-          'activity_date_time' => date('Y-m-d H:i:s'),
+        CRM_Activity_BAO_Activity::addActivity($membership,
+          'Change Membership Type',
+          NULL,
+          array(
+            'subject' => "Type changed from {$membershipTypes[$oldType]} to {$membershipTypes[$membership->membership_type_id]}",
+            'source_contact_id' => $membershipLog['modified_id'],
+            'priority_id' => 'Normal',
+          )
         );
-        civicrm_api3('activity', 'create', $activityParam);
       }
+
+      foreach (array('Membership Signup', 'Membership Renewal') as $activityType) {
+        $activityParams['id'] = CRM_Utils_Array::value('id',
+          civicrm_api3('Activity', 'Get',
+            array(
+              'source_record_id' => $membership->id,
+              'activity_type_id' => $activityType,
+              'status_id' => 'Scheduled',
+            )
+          )
+        );
+        // 1. Update Schedule Membership Signup/Renwal activity to completed on successful payment of pending membership
+        // 2. OR Create renewal activity scheduled if its membership renewal will be paid later
+        if (!empty($params['membership_activity_status']) && (!empty($activityParams['id']) || $activityType == 'Membership Renewal')) {
+          CRM_Activity_BAO_Activity::addActivity($membership, $activityType, $targetContactID, $activityParams);
+          break;
+        }
+      }
+
       CRM_Utils_Hook::post('edit', 'Membership', $membership->id, $membership);
     }
     else {
+      CRM_Activity_BAO_Activity::addActivity($membership, 'Membership Signup', $targetContactID, $activityParams);
       CRM_Utils_Hook::post('create', 'Membership', $membership->id, $membership);
     }
 
@@ -229,13 +257,12 @@ class CRM_Member_BAO_Membership extends CRM_Member_DAO_Membership {
    * @param array $ids
    *   Deprecated parameter The array that holds all the db ids.
    * @param bool $skipRedirect
-   * @param string $activityType
    *
    * @throws CRM_Core_Exception
    *
    * @return CRM_Member_BAO_Membership|CRM_Core_Error
    */
-  public static function create(&$params, &$ids, $skipRedirect = FALSE, $activityType = 'Membership Signup') {
+  public static function create(&$params, &$ids, $skipRedirect = FALSE) {
     // always calculate status if is_override/skipStatusCal is not true.
     // giving respect to is_override during import.  CRM-4012
 
@@ -378,54 +405,6 @@ class CRM_Member_BAO_Membership extends CRM_Member_DAO_Membership {
       ));
     }
 
-    // add activity record only during create mode and renew mode
-    // also add activity if status changed CRM-3984 and CRM-2521
-    if (empty($ids['membership']) ||
-      $activityType == 'Membership Renewal' || !empty($params['createActivity'])
-    ) {
-      if (!empty($ids['membership'])) {
-        $data = array();
-        CRM_Core_DAO::commonRetrieveAll('CRM_Member_DAO_Membership',
-          'id',
-          $membership->id,
-          $data,
-          array('contact_id', 'membership_type_id', 'source')
-        );
-
-        $membership->contact_id = $data[$membership->id]['contact_id'];
-        $membership->membership_type_id = $data[$membership->id]['membership_type_id'];
-        $membership->source = CRM_Utils_Array::value('source', $data[$membership->id]);
-      }
-
-      // since we are going to create activity record w/
-      // individual contact as a target in case of on behalf signup,
-      // so get the copy of organization id, CRM-5551
-      $realMembershipContactId = $membership->contact_id;
-
-      // create activity source = individual, target = org CRM-4027
-      $targetContactID = NULL;
-      if (!empty($params['is_for_organization'])) {
-        $targetContactID = $membership->contact_id;
-        $membership->contact_id = CRM_Utils_Array::value('userId', $ids);
-      }
-
-      if (empty($membership->contact_id) && (!empty($membership->owner_membership_id))) {
-        $membership->contact_id = $realMembershipContactId;
-      }
-
-      if (!empty($ids['membership']) && $activityType != 'Membership Signup') {
-        CRM_Activity_BAO_Activity::addActivity($membership, $activityType, $targetContactID);
-      }
-      elseif (empty($ids['membership'])) {
-        CRM_Activity_BAO_Activity::addActivity($membership, $activityType, $targetContactID);
-      }
-
-      // we might created activity record w/ individual
-      // contact as target so update membership object w/
-      // original organization id, CRM-5551
-      $membership->contact_id = $realMembershipContactId;
-    }
-
     $transaction->commit();
 
     self::createRelatedMemberships($params, $membership);
@@ -845,7 +824,7 @@ INNER JOIN  civicrm_membership_type type ON ( type.id = membership.membership_ty
     }
 
     //avoid pending membership as current membership: CRM-3027
-    $statusIds[] = array_search('Pending', CRM_Member_PseudoConstant::membershipStatus());
+    $statusIds = array(array_search('Pending', CRM_Member_PseudoConstant::membershipStatus()));
     if (!$membershipId) {
       // CRM-15475
       $statusIds[] = array_search(
@@ -1000,7 +979,7 @@ INNER JOIN  civicrm_membership_type type ON ( type.id = membership.membership_ty
     $fields = array_merge($fields, $expFieldMembership);
     $membershipStatus = array(
       'membership_status' => array(
-        'title' => 'Membership Status',
+        'title' => ts('Membership Status'),
         'name' => 'membership_status',
         'type' => CRM_Utils_Type::T_STRING,
         'where' => 'civicrm_membership_status.name',
@@ -1191,6 +1170,7 @@ AND civicrm_membership.is_test = %2";
     $currentMembership['today_date'] = $today;
 
     if ($status['id'] !== $currentMembership['status_id']) {
+      $oldStatus = $currentMembership['status_id'];
       $memberDAO = new CRM_Member_DAO_Membership();
       $memberDAO->id = $currentMembership['id'];
       $memberDAO->find(TRUE);
@@ -1237,6 +1217,19 @@ AND civicrm_membership.is_test = %2";
       else {
         $logParams['modified_id'] = $currentMembership['contact_id'];
       }
+
+      //Create activity for status change.
+      $allStatus = CRM_Member_BAO_Membership::buildOptions('status_id', 'get');
+      CRM_Activity_BAO_Activity::addActivity($memberDAO,
+        'Change Membership Status',
+        NULL,
+        array(
+          'subject' => "Status changed from {$allStatus[$oldStatus]} to {$allStatus[$status['id']]}",
+          'source_contact_id' => $logParams['modified_id'],
+          'priority_id' => 'Normal',
+        )
+      );
+
       CRM_Member_BAO_MembershipLog::add($logParams, CRM_Core_DAO::$_nullArray);
     }
   }
@@ -1854,7 +1847,6 @@ INNER JOIN  civicrm_contact contact ON ( contact.id = membership.contact_id AND
       $is_test, $membershipID, TRUE
     );
     if ($currentMembership) {
-      $activityType = 'Membership Renewal';
       $renewalMode = TRUE;
 
       // Do NOT do anything.
@@ -1876,11 +1868,13 @@ INNER JOIN  civicrm_contact contact ON ( contact.id = membership.contact_id AND
           'join_date' => $currentMembership['join_date'],
           'membership_type_id' => $membershipTypeID,
           'max_related' => !empty($membershipTypeDetails['max_related']) ? $membershipTypeDetails['max_related'] : NULL,
+          'membership_activity_status' => ($pending || $isPayLater) ? 'Scheduled' : 'Completed',
         );
         if ($contributionRecurID) {
           $memParams['contribution_recur_id'] = $contributionRecurID;
         }
-        $membership = self::create($memParams, $ids, FALSE, $activityType);
+
+        $membership = self::create($memParams, $ids, FALSE);
         return array($membership, $renewalMode, $dates);
       }
 
@@ -1966,6 +1960,7 @@ INNER JOIN  civicrm_contact contact ON ( contact.id = membership.contact_id AND
         if (!empty($currentMembership['id'])) {
           $ids['membership'] = $currentMembership['id'];
         }
+        $memParams['membership_activity_status'] = ($pending || $isPayLater) ? 'Scheduled' : 'Completed';
       }
       //CRM-4555
       if ($pending) {
@@ -1974,8 +1969,6 @@ INNER JOIN  civicrm_contact contact ON ( contact.id = membership.contact_id AND
     }
     else {
       // NEW Membership
-
-      $activityType = 'Membership Signup';
       $memParams = array(
         'contact_id' => $contactID,
         'membership_type_id' => $membershipTypeID,
@@ -2054,7 +2047,7 @@ INNER JOIN  civicrm_contact contact ON ( contact.id = membership.contact_id AND
     // Load all line items & process all in membership. Don't do in contribution.
     // Relevant tests in api_v3_ContributionPageTest.
     $memParams['line_item'] = $lineItems;
-    $membership = self::create($memParams, $ids, FALSE, $activityType);
+    $membership = self::create($memParams, $ids, FALSE);
 
     // not sure why this statement is here, seems quite odd :( - Lobo: 12/26/2010
     // related to: http://forum.civicrm.org/index.php/topic,11416.msg49072.html#msg49072
@@ -2143,14 +2136,24 @@ INNER JOIN  civicrm_contact contact ON ( contact.id = membership.contact_id AND
    *
    * @param int $membershipId
    *   Membership id.
+   * @all bool
+   *   if more than one payment associated with membership id need to be returned.
    *
    * @return int
    *   contribution id
    */
-  public static function getMembershipContributionId($membershipId) {
+  public static function getMembershipContributionId($membershipId, $all = FALSE) {
 
     $membershipPayment = new CRM_Member_DAO_MembershipPayment();
     $membershipPayment->membership_id = $membershipId;
+    if ($all && $membershipPayment->find()) {
+      $contributionIds = array();
+      while ($membershipPayment->fetch()) {
+        $contributionIds[] = $membershipPayment->contribution_id;
+      }
+      return $contributionIds;
+    }
+
     if ($membershipPayment->find(TRUE)) {
       return $membershipPayment->contribution_id;
     }
@@ -2408,6 +2411,8 @@ WHERE      civicrm_membership.is_test = 0";
       'tax_amount',
       'skipLineItem',
       'contribution_recur_id',
+      'pan_truncation',
+      'card_type_id',
     );
     foreach ($recordContribution as $f) {
       $contributionParams[$f] = CRM_Utils_Array::value($f, $params);