/**
 * ongoing member expired
 */
function mgm_ongoing_member_expired($user, $member, $spacks_obj, $data, $other_purchases = false, $process_inactive_users = false)
{
    // only check for Active members iss#645
    // if($member->status != MGM_STATUS_ACTIVE) return $member;
    // find expire date
    $expire_date = $member->expire_date;
    // duration exprs
    $duration_exprs = $spacks_obj->get_duration_exprs();
    // active lifetime user:
    // $non_date_expr  = array('l','dr');
    $non_date_expr = array_keys($spacks_obj->get_duration_types('non_date_expr'));
    // log
    // mgm_log('non_date_expr: '. print_r($non_date_expr, true), __FUNCTION__);
    // exit lifetime users
    if (in_array($member->duration_type, $non_date_expr) || empty($expire_date)) {
        // before exit update life time users if wrongly processed earlier
        if ($member->duration_type == 'l' && $member->status == MGM_STATUS_EXPIRED) {
            // set new status
            $member->status = MGM_STATUS_ACTIVE;
            // status string
            $member->status_str = __('Life time membership extended', 'mgm');
            // save
            if ($other_purchases) {
                mgm_save_another_membership_fields($member, $user->ID);
            } else {
                $member->save();
            }
            // log
            // mgm_log(sprintf('life time member %d reactivated: %s', $user->ID, $member->status), __FUNCTION__);
        }
        // exit
        return $member;
        // lifetime and date_range
    }
    // check on expire date
    // days to expire
    $date_diff = strtotime($expire_date) - $data['current_timestamp'];
    $days_to_expire = floor($date_diff / (60 * 60 * 24));
    $days_to_expire2 = abs($date_diff / (60 * 60 * 24));
    $date_format_time = mgm_get_date_format('date_format_time');
    // log
    /*mgm_log(sprintf('expire users: user: %d, days_to_expire1: %d, days_to_expire2: %d, expire_date: %s, current_date: %s', 
    		$user->ID, $days_to_expire, $days_to_expire2, $expire_date, date('Y-m-d H:i:s', $data['current_timestamp'])), (__FUNCTION__ . '_user_' . $user->ID));*/
    // days match, support for expired check, negative days
    // commented the below line because the membership was expiring one day early.
    if ($days_to_expire <= 0) {
        // check pack
        $subs_pack = array();
        // get pack
        if (isset($member->pack_id) && (int) $member->pack_id > 0) {
            $subs_pack = $spacks_obj->get_pack($member->pack_id);
        }
        // check pack
        if (empty($subs_pack)) {
            // fetch from old data
            $subs_pack = $spacks_obj->validate_pack($member->amount, $member->duration, $member->duration_type, $member->membership_type);
        }
        // ok
        if (isset($subs_pack['id'])) {
            //issue#: 478
            $num_cycles = isset($member->active_num_cycles) && !empty($member->active_num_cycles) ? $member->active_num_cycles : $subs_pack['num_cycles'];
            // lifetime ongoing/fixed cycle ongoing
            // issue #: 418
            if ($num_cycles == 0 || $num_cycles > 1 && (int) $member->rebilled <= (int) $num_cycles) {
                // 100 to dynamic
                // make sure scheduler considers it after expiry date only:
                if ($days_to_expire2 >= 1 && $days_to_expire < 0) {
                    //This will check the next day after expiry date to consider payments happened on expiry date as well
                    // member reached rebill cycle, expire now
                    // set expired status
                    if ($num_cycles > 1 && (int) $member->rebilled == $num_cycles) {
                        // old status
                        $old_status = $member->status;
                        // set new status
                        $member->status = $new_status = MGM_STATUS_EXPIRED;
                        // set status
                        $member->status_str = sprintf(__('Membership expired on %s - rebill cycle completed', 'mgm'), date($date_format_time, $data['current_timestamp']));
                        // reassign expiry membership pack if exists: issue#: 535
                        $member = apply_filters('mgm_reassign_member_subscription', $user->ID, $member, 'EXPIRE', true);
                    } else {
                        // #767, for ongoing membership, set Inactive members as Active, depends on settings
                        if ($num_cycles == 0) {
                            // change, checking all status to allow expire date extend for Active users
                            // paid users
                            if (!empty($member->last_pay_date)) {
                                // change status for Inactive only
                                if ($member->status == MGM_STATUS_NULL) {
                                    // inactive
                                    // only when set to process inactive user
                                    if ($process_inactive_users == true) {
                                        // old status
                                        $old_status = $member->status;
                                        // set new status
                                        $member->status = $new_status = MGM_STATUS_ACTIVE;
                                        // status string
                                        $member->status_str = __('Last payment cycle processed successfully', 'mgm');
                                    }
                                } elseif ($member->status == MGM_STATUS_ACTIVE) {
                                    // active
                                    // current cycle expire date
                                    if (!empty($member->expire_date)) {
                                        // date add
                                        $date_add = sprintf('+ %d %s', $subs_pack['duration'], $duration_exprs[$subs_pack['duration_type']]);
                                        // new expire date, calc by cycle so pack is used,
                                        $new_expire_date = mgm_get_current_rebill_cycle_expiry_date($member->expire_date, $date_add);
                                        // expire date should not overlap, #1223
                                        if (strtotime($new_expire_date) > strtotime($member->expire_date)) {
                                            // set
                                            $member->expire_date = $new_expire_date;
                                            // last pay
                                            if (!empty($member->last_pay_date)) {
                                                $member->last_pay_date = date('Y-m-d', strtotime(str_replace('+', '-', $date_add), strtotime($member->expire_date)));
                                            }
                                            // status string
                                            $member->status_str = __('Last payment cycle processed successfully - membership expire extended using pack', 'mgm');
                                        }
                                    }
                                }
                                // end paid active
                            } else {
                                // unpaid users
                                // old status
                                if ($member->status != MGM_STATUS_NULL) {
                                    // copy
                                    $old_status = $member->status;
                                    // set new status
                                    $member->status = $new_status = MGM_STATUS_NULL;
                                    // set status
                                    $member->status_str = __('Last payment incomplete', 'mgm');
                                }
                            }
                            // end unpaid
                        }
                        // end	ongoing
                    }
                    // update member
                    if ($other_purchases) {
                        mgm_save_another_membership_fields($member, $user->ID);
                    } else {
                        $member->save();
                    }
                    // action
                    if (isset($new_status)) {
                        do_action('mgm_user_status_change', $user->ID, $new_status, $old_status, 'schedular_reset_ongoing_memberships', $member->pack_id);
                    }
                }
            } elseif ((int) $num_cycles == 1 && $data['current_timestamp'] > strtotime($expire_date)) {
                //one-time billing,double check for date calc bug #1126
                // old status
                $old_status = $member->status;
                // set new status
                $member->status = $new_status = MGM_STATUS_EXPIRED;
                // set status
                $member->status_str = sprintf(__('Membership expired on %s - onetime billing completed', 'mgm'), date($date_format_time, $data['current_timestamp']));
                // reassign expiry membership pack if exists: issue#: 535
                $member = apply_filters('mgm_reassign_member_subscription', $user->ID, $member, 'EXPIRE', true);
                // update member
                if ($other_purchases) {
                    mgm_save_another_membership_fields($member, $user->ID);
                } else {
                    $member->save();
                }
                // remove role from user:
                mgm_remove_userroles($user->ID, $member);
                // action
                do_action('mgm_user_status_change', $user->ID, $new_status, $old_status, 'schedular_reset_ongoing_memberships', $member->pack_id);
            }
        } else {
            // pack not found manual update, expire users if days negative
            if (empty($subs_pack) && $days_to_expire <= 0) {
                // old status
                $old_status = $member->status;
                // set new status
                $member->status = $new_status = MGM_STATUS_EXPIRED;
                // set status
                $member->status_str = sprintf(__('Membership expired on %s - no pack found', 'mgm'), date($date_format_time, $data['current_timestamp']));
                // update member
                if ($other_purchases) {
                    mgm_save_another_membership_fields($member, $user->ID);
                } else {
                    $member->save();
                }
                // remove role from user:
                mgm_remove_userroles($user->ID, $member);
                // action
                do_action('mgm_user_status_change', $user->ID, $new_status, $old_status, 'schedular_reset_ongoing_memberships', $member->pack_id);
            }
        }
    }
    // return
    return $member;
}
 private function _save_member_object($user_id, $member, $previous_membership)
 {
     // pack
     $pack = mgm_get_class('subscription_packs')->get_pack($member->pack_id);
     // multiple_level_purchase
     $multiple_level_purchase = bool_from_yn(mgm_get_class('system')->get_setting('enable_multiple_level_purchase'));
     // update options
     $update_options = mgm_post_var('update_opt');
     // new level
     if (in_array('subscription', $update_options) && mgm_post_var('insert_new_level') == 'new') {
         // save flag
         $save = true;
         // guest
         if ($previous_membership->membership_type == "guest" && $previous_membership->amount == 0) {
             // check selected membership already selected:
             if ($previous_membership->membership_type == $member->membership_type) {
                 $save = false;
             }
         } else {
             // old
             $old_subtypes = mgm_get_subscribed_membershiptypes($user_id);
             //check selected membership already selected:
             if (in_array($member->membership_type, $old_subtypes)) {
                 $save = false;
             } else {
                 if (isset($member->custom_fields)) {
                     unset($member->custom_fields);
                 }
                 if (isset($member->other_membership_types) || empty($member->other_membership_types)) {
                     unset($member->other_membership_types);
                 }
             }
         }
         // save
         if ($save) {
             // multiple
             if ($multiple_level_purchase) {
                 mgm_save_another_membership_fields($member, $user_id);
             } else {
                 $member->save();
             }
         }
         // assign role:
         $change_order = isset($_POST['highlight_role']) && isset($_POST['upd_subscription_pack']) && $_POST['upd_subscription_pack'] != '-' ? true : false;
         // set
         $obj_role = new mgm_roles();
         $obj_role->add_user_role($user_id, $pack['role'], $change_order);
     } else {
         if (isset($_POST['ps_mem'][$user_id]) && !empty($_POST['ps_mem'][$user_id])) {
             if (isset($member->custom_fields)) {
                 unset($member->custom_fields);
             }
             if (isset($member->other_membership_types) || empty($member->other_membership_types)) {
                 unset($member->other_membership_types);
             }
             $prev_index = isset($_POST['ps_mem_index'][$user_id][$previous_membership->membership_type]) ? $_POST['ps_mem_index'][$user_id][$previous_membership->membership_type] : null;
             //uncomment
             mgm_save_another_membership_fields($member, $user_id, $prev_index);
         } else {
             $member->save();
         }
         if ($member->status == MGM_STATUS_EXPIRED) {
             //remove role from user:
             mgm_remove_userroles($user_id, $member);
         } else {
             //if($member->membership_type != $previous_membership->membership_type) {//check this condition
             //mgm role object:
             $change_order = isset($_POST['highlight_role']) && isset($_POST['upd_subscription_pack']) && $_POST['upd_subscription_pack'] != '-' ? true : false;
             $obj_role = new mgm_roles();
             //update role/change order
             $obj_role->add_user_role($user_id, $pack['role'], $change_order);
             //}
         }
     }
     return true;
 }