Details
- 
    Type:
Bug
 - 
    Status: Done/Fixed
 - 
    Priority:
Trivial
 - 
    Resolution: Fixed/Completed
 - 
    Affects Version/s: 4.4.1
 - 
    Fix Version/s: 4.4.3
 - 
    Component/s: CiviMember
 - 
    Labels:None
 
Description
In file /CRM/Member/BAO/Membership.php, Undefined Index notices are being fired when the Update Membership Statuses scheduled job is run when there are memberships with disabled membership types.
In the updateAllMembershipStatus() function, the following call returns a list of only enabled (is_active) membership types:
    $allTypes      = CRM_Member_PseudoConstant::membershipType();
The following query returns a list of memberships that include both enabled and disabled membership types:
    $query = "
SELECT     civicrm_membership.id                    as membership_id,
           civicrm_membership.is_override           as is_override,
           civicrm_membership.membership_type_id    as membership_type_id,
           civicrm_membership.status_id             as status_id,
           civicrm_membership.join_date             as join_date,
           civicrm_membership.start_date            as start_date,
           civicrm_membership.end_date              as end_date,
           civicrm_membership.source                as source,
           civicrm_contact.id                       as contact_id,
           civicrm_contact.is_deceased              as is_deceased,
           civicrm_membership.owner_membership_id   as owner_membership_id,
           civicrm_membership.contribution_recur_id as recur_id
FROM       civicrm_membership
INNER JOIN civicrm_contact ON ( civicrm_membership.contact_id = civicrm_contact.id )
WHERE      civicrm_membership.is_test = 0";
When the following call tries to access $allTypes[$dao->membership_type_id] for the disabled memberships, it throws an "Undefined Index" notice.
      // Put common parameters into array for easy access
      $memberParams = array(
        'id' => $dao->membership_id,
        'status_id' => $dao->status_id,
        'contact_id' => $dao->contact_id,
        'membership_type_id' => $dao->membership_type_id,
        'membership_type' => $allTypes[$dao->membership_type_id],
        'join_date' => $dao->join_date,
        'start_date' => $dao->start_date,
        'end_date' => $dao->end_date,
        'source' => $dao->source,
        'skipStatusCal' => TRUE,
        'skipRecentView' => TRUE,
      );
Adding an additional INNER JOIN on the civicrm_membership_type table seems to stop these notices by excluding memberships with disabled membership types from the result set.
INNER JOIN civicrm_membership_type ON ( civicrm_membership.membership_type_id = civicrm_membership_type.id AND civicrm_membership_type.is_active = 1)
New query:
    $query = "
SELECT     civicrm_membership.id                    as membership_id,
           civicrm_membership.is_override           as is_override,
           civicrm_membership.membership_type_id    as membership_type_id,
           civicrm_membership.status_id             as status_id,
           civicrm_membership.join_date             as join_date,
           civicrm_membership.start_date            as start_date,
           civicrm_membership.end_date              as end_date,
           civicrm_membership.source                as source,
           civicrm_contact.id                       as contact_id,
           civicrm_contact.is_deceased              as is_deceased,
           civicrm_membership.owner_membership_id   as owner_membership_id,
           civicrm_membership.contribution_recur_id as recur_id
FROM       civicrm_membership
INNER JOIN civicrm_contact ON ( civicrm_membership.contact_id = civicrm_contact.id )
INNER JOIN civicrm_membership_type ON ( civicrm_membership.membership_type_id = civicrm_membership_type.id AND civicrm_membership_type.is_active = 1)
WHERE      civicrm_membership.is_test = 0";