function _cancel_membership($user_id, $redirect = false)
 {
     // system
     $system_obj = mgm_get_class('system');
     $s_packs = mgm_get_class('subscription_packs');
     $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails'));
     $dpne = bool_from_yn($system_obj->get_setting('disable_payment_notify_emails'));
     //issue #1521
     $is_admin = is_super_admin() ? true : false;
     // find user
     $user = get_userdata($user_id);
     $member = mgm_get_member($user_id);
     // multiple membesrhip level update:
     $multiple_update = false;
     // check
     if (isset($_POST['membership_type']) && $member->membership_type != $_POST['membership_type']) {
         $multiple_update = true;
         $member = mgm_get_member_another_purchase($user_id, $_POST['membership_type']);
     }
     // get pack
     if ($member->pack_id) {
         $subs_pack = $s_packs->get_pack($member->pack_id);
     } else {
         $subs_pack = $s_packs->validate_pack($member->amount, $member->duration, $member->duration_type, $member->membership_type);
     }
     // reset payment info
     $member->payment_info->txn_type = 'subscription_cancel';
     // types
     $duration_exprs = $s_packs->get_duration_exprs();
     // default expire date
     $expire_date = $member->expire_date;
     // if lifetime:
     if ($member->duration_type == 'l') {
         $expire_date = date('Y-m-d');
     }
     // if trial on
     if (isset($subs_pack['trial_on']) && (bool) $subs_pack['trial_on'] == true && isset($duration_exprs[$subs_pack['trial_duration_type']])) {
         // if cancel data is before trial end, set cancel on trial expire_date
         $trial_expire_date = strtotime('+' . $subs_pack['trial_duration'] . ' ' . $duration_exprs[$subs_pack['trial_duration_type']], $member->join_date);
         // if lower
         if (time() < $trial_expire_date) {
             $expire_date = date('Y-m-d', $trial_expire_date);
         }
     }
     // transaction_id
     $trans_id = $member->transaction_id;
     // if today
     if ($expire_date == date('Y-m-d')) {
         // status
         $new_status = MGM_STATUS_CANCELLED;
         $new_status_str = __('Subscription cancelled', 'mgm');
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         $member->expire_date = date('Y-m-d');
         // reassign expiry membership pack if exists: issue#: 535
         $member = apply_filters('mgm_reassign_member_subscription', $user_id, $member, 'CANCEL', true);
     } else {
         // date
         $date_format = mgm_get_date_format('date_format');
         // status
         $new_status = MGM_STATUS_AWAITING_CANCEL;
         $new_status_str = sprintf(__('Subscription awaiting cancellation on %s', 'mgm'), date($date_format, strtotime($expire_date)));
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         // set reset date
         $member->status_reset_on = $expire_date;
         $member->status_reset_as = MGM_STATUS_CANCELLED;
     }
     // multiple memberhip level update:
     if ($multiple_update) {
         mgm_save_another_membership_fields($member, $user_id);
     } else {
         $member->save();
     }
     // transaction status
     mgm_update_transaction_status($trans_id, $new_status, $new_status_str);
     // send email notification to client
     $blogname = get_option('blogname');
     // notify user
     if (!$dpne) {
         // notify user
         mgm_notify_user_membership_cancellation($blogname, $user, $member, $system_obj, $new_status, $membership_type);
     }
     // notify admin
     if (!$dge) {
         // notify admin
         mgm_notify_admin_membership_cancellation($blogname, $user, $member);
     }
     // after cancellation hook
     do_action('mgm_membership_subscription_cancelled', array('user_id' => $user_id));
     // redirect only internal
     if ($redirect) {
         // message
         $lformat = mgm_get_date_format('date_format_long');
         $message = sprintf(__("You have successfully unsubscribed. Your account has been marked for cancellation on %s", "mgm"), $expire_date == date('Y-m-d') ? 'Today' : date($lformat, strtotime($expire_date)));
         //issue #1521
         if ($is_admin) {
             mgm_redirect(add_query_arg(array('user_id' => $user_id, 'unsubscribe_errors' => urlencode($message)), admin_url('user-edit.php')));
         }
         // redirect
         mgm_redirect(mgm_get_custom_url('membership_details', false, array('unsubscribed' => 'true', 'unsubscribe_errors' => urlencode($message))));
     }
 }
Ejemplo n.º 2
0
                $member->membership_type = $new_type_code;
                // save
                $member->save();
            }
            // check if any multiple levels exist:
            if (isset($member->other_membership_types) && is_array($member->other_membership_types) && count($member->other_membership_types) > 0) {
                // loop
                foreach ($member->other_membership_types as $key => $memtypes) {
                    // make sure its an object:
                    $memtypes = mgm_convert_array_to_memberobj($memtypes, $user->ID);
                    // verify
                    if ($memtypes->membership_type == $type_code) {
                        // set
                        $memtypes->membership_type = $new_type_code;
                        // save
                        mgm_save_another_membership_fields($memtypes, $user->ID, $key);
                    }
                }
            }
            // unset
            unset($member);
        }
        //unset
        $membership_types_obj->unset_membership_type($type_code);
        // set
        $membership_types_obj->set_name($type_name, $new_type_code);
    } else {
        $membership_types_obj->set_name($type_name, $type_code);
    }
    $membership_types_obj->save();
}
Ejemplo n.º 3
0
 function _cancel_membership()
 {
     // system
     $system_obj = mgm_get_class('system');
     $s_packs = mgm_get_class('subscription_packs');
     $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails'));
     $dpne = bool_from_yn($system_obj->get_setting('disable_payment_notify_emails'));
     // get passthrough, stop further process if fails to parse
     $custom = $this->_get_transaction_passthrough($_POST['M_custom']);
     // local var
     extract($custom);
     // find user
     $user = get_userdata($user_id);
     $member = mgm_get_member($user_id);
     // multiple membesrhip level update:
     $multiple_update = false;
     // check
     if (isset($_POST['membership_type']) && $member->membership_type != $_POST['membership_type'] || isset($is_another_membership_purchase) && $is_another_membership_purchase == 'Y') {
         $multiple_update = true;
         $multi_memtype = isset($_POST['membership_type']) ? $_POST['membership_type'] : $membership_type;
         $member = mgm_get_member_another_purchase($user_id, $multi_memtype);
     }
     // get pack
     if ($member->pack_id) {
         $subs_pack = $s_packs->get_pack($member->pack_id);
     } else {
         $subs_pack = $s_packs->validate_pack($member->amount, $member->duration, $member->duration_type, $member->membership_type);
     }
     // tracking fields module_field => post_field
     $tracking_fields = array('txn_type' => 'futurePayStatusChange', 'subscr_id' => 'futurePayId', 'txn_id' => 'ctransreceipt');
     // save tracking fields
     $this->_save_tracking_fields($tracking_fields, $member);
     // types
     $duration_exprs = $s_packs->get_duration_exprs();
     // default expire date
     $expire_date = $member->expire_date;
     // if lifetime:
     if ($member->duration_type == 'l') {
         $expire_date = date('Y-m-d');
     }
     // if trial on
     if ($subs_pack['trial_on'] && isset($duration_exprs[$subs_pack['trial_duration_type']])) {
         // if cancel data is before trial end, set cancel on trial expire_date
         $trial_expire_date = strtotime("+{$subs_pack['trial_duration']} {$duration_exprs[$subs_pack['trial_duration_type']]}", $member->join_date);
         // if lower
         if (time() < $trial_expire_date) {
             $expire_date = date('Y-m-d', $trial_expire_date);
         }
     }
     // transaction_id
     $trans_id = $member->transaction_id;
     // if today
     if ($expire_date == date('Y-m-d')) {
         // status
         $new_status = MGM_STATUS_CANCELLED;
         $new_status_str = __('Subscription cancelled', 'mgm');
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         $member->expire_date = date('Y-m-d');
         // reassign expiry membership pack if exists: issue#: 535
         $member = apply_filters('mgm_reassign_member_subscription', $user_id, $member, 'CANCEL', true);
     } else {
         // date
         $date_format = mgm_get_date_format('date_format');
         // status
         $new_status = MGM_STATUS_AWAITING_CANCEL;
         $new_status_str = sprintf(__('Subscription awaiting cancellation on %s', 'mgm'), date($date_format, strtotime($expire_date)));
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         // set reset date
         $member->status_reset_on = $expire_date;
         $member->status_reset_as = MGM_STATUS_CANCELLED;
     }
     // multiple membesrhip level update:
     if ($multiple_update) {
         mgm_save_another_membership_fields($member, $user_id);
     } else {
         $member->save();
     }
     // transaction status
     mgm_update_transaction_status($trans_id, $new_status, $new_status_str);
     // send email notification to client
     $blogname = get_option('blogname');
     // subject
     $subject = $system_obj->get_template('subscription_cancelled_email_template_subject', array('blogname' => $blogname), true);
     // body
     $message = $system_obj->get_template('subscription_cancelled_email_template_body', array('blogname' => $blogname, 'name' => $user->display_name, 'email' => $user->user_email, 'admin_email' => $system_obj->setting['admin_email']), true);
     // send email notification to user
     if (!$dpne) {
         //issue #862
         $subject = mgm_replace_email_tags($subject, $user_id);
         $message = mgm_replace_email_tags($message, $user_id);
         // mail
         mgm_mail($user->user_email, $subject, $message);
     }
     // send email notification to system administrator
     if (!$dge) {
         $subject = "[{$blogname}] {$user->user_email} - {$new_status}";
         $message = "\tUser display name: {$user->display_name}\n\n<br />\r\r\n\t\t\t\t\tUser email: {$user->user_email}\n\n<br />\r\r\n\t\t\t\t\tUser ID: {$user->ID}\n\n<br />\r\r\n\t\t\t\t\tMembership Type: {$membership_type}\n\n<br />\r\r\n\t\t\t\t\tNew status: {$new_status}\n\n<br />\r\r\n\t\t\t\t\tStatus message: {$member->status_str}\n\n<br />\t\t\t\t\t\r\r\n\t\t\t\t\tPayment Mode: Cancelled\n\n<br />\r\r\n\t\t\t\t\tPOST Data was: \n\n<br /><br /><pre>" . print_r($_POST, true) . '</pre>';
         mgm_mail($system_obj->setting['admin_email'], $subject, $message);
     }
     // after cancellation hook
     do_action('mgm_membership_subscription_cancelled', array('user_id' => $user_id));
 }
Ejemplo n.º 4
0
    function _cancel_membership($user_id = NULL, $redirect = false)
    {
        // system
        $system_obj = mgm_get_class('system');
        $s_packs = mgm_get_class('subscription_packs');
        $duration_str = $s_packs->duration_str;
        $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails'));
        $dpne = bool_from_yn($system_obj->get_setting('disable_payment_notify_emails'));
        //issue #1521
        $is_admin = is_super_admin() ? true : false;
        // if passthrough provided
        if (isset($_REQUEST['extra'])) {
            // get passthrough, stop further process if fails to parse
            $custom = $this->_get_transaction_passthrough($_REQUEST['extra']);
            // local var
            extract($custom);
        } elseif (isset($_REQUEST['SUBSCRIPTION_ID']) || isset($_REQUEST['SubscriptionID'])) {
            // get tran
            $tran = mgm_get_transaction_by_option('zombaio_subscription_id', isset($_REQUEST['SUBSCRIPTION_ID']) ? $_REQUEST['SUBSCRIPTION_ID'] : $_REQUEST['SubscriptionID']);
            // local var
            extract($tran['data']);
        } elseif (isset($_REQUEST['TRANSACTION_ID'])) {
            // get tran
            $tran = mgm_get_transaction_by_option('zombaio_transaction_id', $_REQUEST['TRANSACTION_ID']);
            // local var
            extract($tran['data']);
        } elseif (isset($_REQUEST['username'])) {
            // get user
            if ($user = get_user_by('login', $_REQUEST['username'])) {
                $user_id = $user->ID;
            }
        }
        // log
        // mgm_log($user_id, ($this->module . '_' . __FUNCTION__));
        // no user id
        if (!$user_id) {
            // message
            $message = 'Could not read member in the following REQUEST data. 
			            Please debug or contact magic members to fix the problem making sure to pass 
						on the following data. <br /><br /><pre>' . "\n\n" . print_r($_REQUEST, true) . '</pre>';
            // notify admin, only if gateway emails on
            if (!$dge) {
                // mail
                mgm_mail($system_obj->get_setting('admin_email'), 'Error in Zombaio membership cancellation', $message);
            } else {
                // log
                mgm_log($message, $this->module . '_' . __FUNCTION__);
            }
            // exit
            exit;
        }
        // find user
        $user = get_userdata($user_id);
        $member = mgm_get_member($user_id);
        // multiple membesrhip level update:
        $multiple_update = false;
        // check
        if (isset($_POST['membership_type']) && $member->membership_type != $_POST['membership_type'] || isset($membership_type) && $member->membership_type != $membership_type) {
            $multiple_update = true;
            $member = mgm_get_member_another_purchase($user_id, $_POST['membership_type']);
        }
        // get pack
        if ($member->pack_id) {
            $subs_pack = $s_packs->get_pack($member->pack_id);
        } else {
            $subs_pack = $s_packs->validate_pack($member->amount, $member->duration, $member->duration_type, $member->membership_type);
        }
        // tracking fields module_field => post_field
        $tracking_fields = array('txn_type' => 'Action', 'subscr_id' => array('SUBSCRIPTION_ID', 'SubscriptionID'), 'txn_id' => 'TRANSACTION_ID');
        // save tracking fields
        $this->_save_tracking_fields($tracking_fields, $member, $_REQUEST);
        // types
        $duration_exprs = $s_packs->get_duration_exprs();
        // default expire date
        $expire_date = $member->expire_date;
        // if lifetime:
        if ($member->duration_type == 'l') {
            $expire_date = date('Y-m-d');
        }
        // if trial on
        if ($subs_pack['trial_on'] && isset($duration_exprs[$subs_pack['trial_duration_type']])) {
            // if cancel data is before trial end, set cancel on trial expire_date
            $trial_expire_date = strtotime("+{$subs_pack['trial_duration']} {$duration_exprs[$subs_pack['trial_duration_type']]}", $member->join_date);
            // if lower
            if (time() < $trial_expire_date) {
                $expire_date = date('Y-m-d', $trial_expire_date);
            }
        }
        // transaction_id
        $trans_id = $member->transaction_id;
        // log
        // mgm_log($member, ($this->module . '_' . __FUNCTION__));
        // mgm_log($expire_date . ' ' . date('Y-m-d H:i:s'), ($this->module . '_' . __FUNCTION__));
        // if today
        if (time() >= strtotime($expire_date)) {
            // status
            $new_status = MGM_STATUS_CANCELLED;
            $new_status_str = __('Subscription cancelled', 'mgm');
            // set
            $member->status = $new_status;
            $member->status_str = $new_status_str;
            $member->expire_date = date('Y-m-d H:i:s');
            // reassign expiry membership pack if exists: issue#: 535
            $member = apply_filters('mgm_reassign_member_subscription', $user_id, $member, 'CANCEL', true);
        } else {
            // date
            $date_format = mgm_get_date_format('date_format');
            // status
            $new_status = MGM_STATUS_AWAITING_CANCEL;
            $new_status_str = sprintf(__('Subscription awaiting cancellation on %s', 'mgm'), date($date_format, strtotime($expire_date)));
            // set
            $member->status = $new_status;
            $member->status_str = $new_status_str;
            // set reset date
            $member->status_reset_on = $expire_date;
            $member->status_reset_as = MGM_STATUS_CANCELLED;
        }
        // log
        // mgm_log($member, ($this->module . '_' . __FUNCTION__));
        // update user
        // multiple membesrhip level update:
        if ($multiple_update) {
            mgm_save_another_membership_fields($member, $user_id);
        } else {
            $member->save();
        }
        // transaction status
        mgm_update_transaction_status($trans_id, $new_status, $new_status_str);
        // send email notification to client
        $blogname = get_option('blogname');
        // subject
        $subject = $system_obj->get_template('subscription_cancelled_email_template_subject', array('blogname' => $blogname), true);
        // body
        $message = $system_obj->get_template('subscription_cancelled_email_template_body', array('blogname' => $blogname, 'name' => $user->display_name, 'email' => $user->user_email, 'admin_email' => $system_obj->setting['admin_email']), true);
        // send email notification to user
        if (!$dpne) {
            //issue #862
            $subject = mgm_replace_email_tags($subject, $user_id);
            $message = mgm_replace_email_tags($message, $user_id);
            // mail
            mgm_mail($user->user_email, $subject, $message);
        }
        // notify admin, only if gateway emails on
        if (!$dge) {
            $subject = "[{$blogname}] {$user->user_email} - {$new_status}";
            $message = "\tUser display name: {$user->display_name}\n\n<br />\r\r\n\t\t\t\t\tUser email: {$user->user_email}\n\n<br />\r\r\n\t\t\t\t\tUser ID: {$user->ID}\n\n<br />\r\r\n\t\t\t\t\tMembership Type: {$membership_type}\n\n<br />\r\r\n\t\t\t\t\tNew status: {$new_status}\n\n<br />\r\r\n\t\t\t\t\tStatus message: {$member->status_str}\n\n<br />\t\t\t\t\t\r\r\n\t\t\t\t\tPayment Mode: Cancelled\n\n<br />\r\r\n\t\t\t\t\tPOST Data was: \n\n<br /><br /><pre>" . print_r($_POST, true) . '</pre>';
            mgm_mail($system_obj->setting['admin_email'], $subject, $message);
        }
        // after cancellation hook
        do_action('mgm_membership_subscription_cancelled', array('user_id' => $user_id));
        // redirect
        if ($redirect) {
            // message
            $lformat = mgm_get_date_format('date_format_long');
            $message = sprintf(__("You have successfully unsubscribed. Your account has been marked for cancellation on %s", "mgm"), $expire_date == date('Y-m-d') ? 'Today' : date($lformat, strtotime($expire_date)));
            //issue #1521
            if ($is_admin) {
                mgm_redirect(add_query_arg(array('user_id' => $user_id, 'unsubscribe_errors' => urlencode($message)), admin_url('user-edit.php')));
            }
            // redirect
            mgm_redirect(mgm_get_custom_url('membership_details', false, array('unsubscribed' => 'true', 'unsubscribe_errors' => urlencode($message))));
        }
    }
Ejemplo n.º 5
0
 function _cancel_membership($user_id = NULL, $redirect = false)
 {
     // system
     $system_obj = mgm_get_class('system');
     $s_packs = mgm_get_class('subscription_packs');
     $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails'));
     $dpne = bool_from_yn($system_obj->get_setting('disable_payment_notify_emails'));
     //issue #1521
     $is_admin = is_super_admin() ? true : false;
     // passthrough var
     $alt_tran_id = $this->_get_alternate_transaction_id();
     // get custom field values if not called with user id( internal)
     if (!$user_id) {
         // get passthrough, stop further process if fails to parse
         $custom = $this->_get_transaction_passthrough($alt_tran_id);
         // local var
         extract($custom);
     }
     // user
     $user = get_userdata($user_id);
     $member = mgm_get_member($user_id);
     // multiple membesrhip level update:
     $multiple_update = false;
     // check
     if (isset($_POST['membership_type']) && $member->membership_type != $_POST['membership_type'] || isset($membership_type) && $member->membership_type != $membership_type) {
         $multiple_update = true;
         $member = mgm_get_member_another_purchase($user_id, $_POST['membership_type']);
     }
     // skip if IPN POST for previous subscription:
     if (!empty($alt_tran_id) && !empty($member->transaction_id) && $alt_tran_id != $member->transaction_id) {
         return false;
     }
     // get pack
     if ($member->pack_id) {
         $subs_pack = $s_packs->get_pack($member->pack_id);
     } else {
         $subs_pack = $s_packs->validate_pack($member->amount, $member->duration, $member->duration_type, $member->membership_type);
     }
     // tracking fields module_field => post_field
     $tracking_fields = array('txn_type' => 'message_type', 'subscr_id' => array('order_number', 'sale_id'), 'txn_id' => array('order_number', 'sale_id'));
     // save tracking fields
     $this->_save_tracking_fields($tracking_fields, $member);
     // types
     $duration_exprs = $s_packs->get_duration_exprs();
     // default expire date
     $expire_date = $member->expire_date;
     // if lifetime:
     if ($member->duration_type == 'l') {
         $expire_date = date('Y-m-d');
     }
     // if trial on
     if ($subs_pack['trial_on'] && isset($duration_exprs[$subs_pack['trial_duration_type']])) {
         // if cancel data is before trial end, set cancel on trial expire_date
         $trial_expire_date = strtotime("+{$subs_pack['trial_duration']} {$duration_exprs[$subs_pack['trial_duration_type']]}", $member->join_date);
         // if lower
         if (time() < $trial_expire_date) {
             $expire_date = date('Y-m-d', $trial_expire_date);
         }
     }
     // transaction_id
     $trans_id = $member->transaction_id;
     // if today or set as instant cancel
     if ($expire_date == date('Y-m-d') || $this->setting['subs_cancel'] == 'instant') {
         // status
         $new_status = MGM_STATUS_CANCELLED;
         $new_status_str = __('Subscription cancelled', 'mgm');
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         $member->expire_date = date('Y-m-d');
         // reassign expiry membership pack if exists: issue#: 535
         $member = apply_filters('mgm_reassign_member_subscription', $user_id, $member, 'CANCEL', true);
     } else {
         // date
         $date_format = mgm_get_date_format('date_format');
         // status
         $new_status = MGM_STATUS_AWAITING_CANCEL;
         $new_status_str = sprintf(__('Subscription awaiting cancellation on %s', 'mgm'), date($date_format, strtotime($expire_date)));
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         // set reset date
         $member->status_reset_on = $expire_date;
         $member->status_reset_as = MGM_STATUS_CANCELLED;
     }
     // multiple membesrhip level update:
     if ($multiple_update) {
         mgm_save_another_membership_fields($member, $user_id);
     } else {
         $member->save();
     }
     // transaction status
     mgm_update_transaction_status($trans_id, $new_status, $new_status_str);
     // send email notification to client
     $blogname = get_option('blogname');
     // notify user
     if (!$dpne) {
         // notify user
         mgm_notify_user_membership_cancellation($blogname, $user, $member, $system_obj, $new_status, $membership_type);
     }
     // notify admin
     if (!$dge) {
         // notify admin
         mgm_notify_admin_membership_cancellation($blogname, $user, $member);
     }
     // after cancellation hook
     do_action('mgm_membership_subscription_cancelled', array('user_id' => $user_id));
     // redirect only internal
     if ($redirect) {
         // message
         $lformat = mgm_get_date_format('date_format_long');
         $message = sprintf(__("You have successfully unsubscribed. Your account has been marked for cancellation on %s", "mgm"), $expire_date == date('Y-m-d') ? 'Today' : date($lformat, strtotime($expire_date)));
         //issue #1521
         if ($is_admin) {
             mgm_redirect(add_query_arg(array('user_id' => $user_id, 'unsubscribe_errors' => urlencode($message)), admin_url('user-edit.php')));
         }
         // redirect
         mgm_redirect(add_query_arg(array('unsubscribed' => 'true', 'unsubscribe_errors' => urlencode($message)), mgm_get_custom_url('membership_details')));
     }
 }
Ejemplo n.º 6
0
 function _buy_membership($transid = null)
 {
     // system
     $system_obj = mgm_get_class('system');
     $s_packs = mgm_get_class('subscription_packs');
     // get details
     //if transaction id is available:
     if (is_numeric($transid)) {
         $custom = $this->_get_transaction_passthrough($transid);
         extract($custom);
         // mgm_log($custom);
     } else {
         //Purchase Another Membership Level problem : issue #: 752
         $is_another_membership_purchase = 'N';
         $parts = explode('_', $_REQUEST['custom']);
         $params = array('user_id' => 0, 'duration' => '', 'duration_type' => '', 'pack_id' => 0, 'is_another_membership_purchase' => 'N', 'membership_type' => '');
         $i = 0;
         foreach ($params as $param => $default) {
             if (isset($parts[$i])) {
                 ${$param} = $parts[$i];
             } else {
                 ${$param} = $default;
             }
             $i++;
         }
     }
     // get pack
     $pack = $s_packs->get_pack($pack_id);
     // membership_type -issue #1005
     if (empty($membership_type)) {
         $membership_type = $pack['membership_type'];
     }
     // user
     if ($user = get_userdata($user_id)) {
         //Purchase Another Membership Level problem : issue #: 752
         if ($is_another_membership_purchase == 'Y') {
             // another_subscription modification
             //issue #1073
             $member = mgm_get_member_another_purchase($user_id, $membership_type);
         } else {
             // get member
             $member = mgm_get_member($user_id);
         }
         //pack currency over rides genral setting currency - issue #1602
         if (isset($pack['currency']) && !empty($pack['currency'])) {
             $currency = $pack['currency'];
         } else {
             $currency = $system_obj->setting['currency'];
         }
         // check
         //uncommented the below line as it is not updating in upgrade subscription
         //if (!$member->duration) {
         $member->duration = $duration ? $duration : 1;
         // one year
         $member->duration_type = $duration_type ? $duration_type : 'y';
         $member->amount = 0.0;
         //$member->currency        = 'USD';//not sure y hardcoded
         $member->currency = $currency;
         $member->membership_type = $membership_type;
         //}
         // set pack
         $member->pack_id = $pack_id;
         $member->active_num_cycles = isset($num_cycles) && !empty($num_cycles) ? $num_cycles : $pack['num_cycles'];
         // set status
         $member->status = MGM_STATUS_ACTIVE;
         $member->account_desc = __('Free Account', 'mgm');
         $member->last_pay_date = '';
         //reset payment_info if already set:
         if (isset($member->payment_info)) {
             unset($member->payment_info);
         }
         //unset rebill:
         if (isset($member->rebilled)) {
             unset($member->rebilled);
         }
         //unset transaction_id:
         if (isset($member->transaction_id)) {
             unset($member->transaction_id);
         }
         // join date
         $time = time();
         // set
         if (!isset($member->join_date) || isset($member->join_date) && empty($member->join_date)) {
             $member->join_date = $time;
         }
         // old content hide - issue #1227
         if (isset($hide_old_content)) {
             $member->hide_old_content = $hide_old_content;
         }
         // type expanded
         $duration_exprs = $s_packs->get_duration_exprs();
         // if not lifetime/date range
         if (in_array($member->duration_type, array_keys($duration_exprs))) {
             // take only date exprs
             // @TODO, time should be last expire date #773, 3 use cases must be tracked
             // expect new param in tran subscription_type: new, upgrade, downgrade, extend
             $expire_date_ts = !$member->expire_date ? $time : strtotime($member->expire_date);
             // time
             $expire_date_ts = strtotime("+{$member->duration} {$duration_exprs[$member->duration_type]}", $expire_date_ts);
             // formatted
             $expire_date = date('Y-m-d', $expire_date_ts);
             // date extended
             if (!$member->expire_date || $expire_date_ts > strtotime($member->expire_date)) {
                 $member->expire_date = $expire_date;
             }
         } else {
             //if lifetime:
             if ($member->duration_type == 'l') {
                 // el = lifetime
                 $member->expire_date = '';
             }
             //issue #1096
             if ($member->duration_type == 'dr') {
                 // el = /date range
                 $member->expire_date = $duration_range_end_dt;
             }
         }
         //Purchase Another Membership Level problem : issue #: 752
         if (bool_from_yn($is_another_membership_purchase)) {
             $custom = array('is_another_membership_purchase' => 'Y');
         }
         // old status
         $old_status = $member->status;
         // set new status
         $member->status = $new_status = MGM_STATUS_ACTIVE;
         // whether to subscriber the user to Autoresponder - This should happen only once
         //issue #1073
         if (!empty($transid) && $transid != null) {
             $acknowledge_ar = mgm_subscribe_to_autoresponder($member, $transid);
         } else {
             $acknowledge_ar = mgm_subscribe_to_autoresponder($member, null);
         }
         // update
         if (isset($custom['is_another_membership_purchase']) && bool_from_yn($custom['is_another_membership_purchase'])) {
             // get object - issue #1227
             $obj_sp = mgm_get_class('subscription_packs')->get($member->pack_id);
             if ($obj_sp['hide_old_content']) {
                 $member->hide_old_content = $obj_sp['hide_old_content'];
             }
             mgm_save_another_membership_fields($member, $user_id);
             // Multiple membership upgrade: first time
             if ($transid && isset($custom['multiple_upgrade_prev_packid']) && is_numeric($custom['multiple_upgrade_prev_packid'])) {
                 mgm_multiple_upgrade_save_memberobject($custom, $transid);
             }
         } else {
             // update
             $member->save();
         }
         // on status - issue #1468
         switch ($member->status) {
             case MGM_STATUS_ACTIVE:
                 //sending notification email to user
                 if ($notify_user && $is_registration == 'Y') {
                     $user_pass = mgm_decrypt_password($member->user_password, $user_id);
                     do_action('mgm_register_user_notification', $user_id, $user_pass);
                 }
                 break;
         }
         // status change event
         do_action('mgm_user_status_change', $user_id, $new_status, $old_status, 'module_' . $this->module, $member->pack_id);
         //update coupon usage
         do_action('mgm_update_coupon_usage', array('user_id' => $user_id));
         // role
         if (isset($role)) {
             $obj_role = new mgm_roles();
             $obj_role->add_user_role($user_id, $role);
         }
         // update pack/transaction
         if (is_numeric($transid)) {
             mgm_update_transaction(array('module' => $this->module, 'status_text' => __('Success', 'mgm')), $transid);
         }
         // return action
         do_action('mgm_return_' . $this->module, array('user_id' => $user_id));
         // backward compatibility
         do_action('mgm_return_subscription_payment_' . $this->module, array('user_id' => $user_id));
         // new , individual
         do_action('mgm_return_subscription_payment', array('user_id' => $user_id, 'acknowledge_ar' => $acknowledge_ar, 'mgm_member' => $member));
         // new, global: pass mgm_member object to consider multiple level purchases as well.
     }
 }
Ejemplo n.º 7
0
 function _cancel_membership($user_id = null, $redirect = false)
 {
     // system
     $system_obj = mgm_get_class('system');
     $s_packs = mgm_get_class('subscription_packs');
     $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails'));
     $dpne = bool_from_yn($system_obj->get_setting('disable_payment_notify_emails'));
     //issue #1521
     $is_admin = is_super_admin() ? true : false;
     // get passthrough, stop further process if fails to parse
     $custom = $this->_get_transaction_passthrough($_POST['COMPLUS']);
     // local var
     extract($custom);
     // currency
     if (!$currency) {
         $currency = $this->setting['currency'];
     }
     // find user
     $user = get_userdata($user_id);
     $member = mgm_get_member($user_id);
     // multiple membesrhip level update:
     $multiple_update = false;
     if (isset($_POST['membership_type']) && $member->membership_type != $_POST['membership_type'] || isset($is_another_membership_purchase) && $is_another_membership_purchase == 'Y') {
         $multiple_update = true;
         $multi_memtype = isset($_POST['membership_type']) ? $_POST['membership_type'] : $membership_type;
         $member = mgm_get_member_another_purchase($user_id, $multi_memtype);
     }
     // tracking fields module_field => post_field
     $tracking_fields = array('txn_type' => 'txn_type', 'subscr_id' => 'subscr_id', 'txn_id' => 'txn_id');
     // save tracking fields
     $this->_save_tracking_fields($tracking_fields, $member);
     $expire_date = $member->expire_date;
     // if lifetime:
     if ($member->duration_type == 'l') {
         $expire_date = date('Y-m-d');
     }
     // transaction_id
     $trans_id = $member->transaction_id;
     // if today
     if ($expire_date == date('Y-m-d')) {
         // status
         $new_status = MGM_STATUS_CANCELLED;
         $new_status_str = __('Subscription cancelled', 'mgm');
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         $member->expire_date = date('Y-m-d');
         // reassign expiry membership pack if exists: issue#: 535
         $member = apply_filters('mgm_reassign_member_subscription', $user_id, $member, 'CANCEL', true);
     } else {
         // date
         $date_format = mgm_get_date_format('date_format');
         // status
         $new_status = MGM_STATUS_AWAITING_CANCEL;
         $new_status_str = sprintf(__('Subscription awaiting cancellation on %s', 'mgm'), date($date_format, strtotime($expire_date)));
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         // set reset date
         $member->status_reset_on = $expire_date;
         $member->status_reset_as = MGM_STATUS_CANCELLED;
     }
     // multiple membesrhip level update:
     if ($multiple_update) {
         mgm_save_another_membership_fields($member, $user_id);
     } else {
         $member->save();
     }
     // transaction status
     mgm_update_transaction_status($trans_id, $new_status, $new_status_str);
     // send email notification to client
     $blogname = get_option('blogname');
     // notify user
     if (!$dpne) {
         // notify user
         mgm_notify_user_membership_cancellation($blogname, $user, $member, $system_obj, $new_status, $membership_type);
     }
     // notify admin
     if (!$dge) {
         // notify admin
         mgm_notify_admin_membership_cancellation($blogname, $user, $member);
     }
     // after cancellation hook
     do_action('mgm_membership_subscription_cancelled', array('user_id' => $user_id));
     // redirect only internal
     if ($redirect) {
         // message
         $lformat = mgm_get_date_format('date_format_long');
         $message = sprintf(__("You have successfully unsubscribed. Your account has been marked for cancellation on %s", "mgm"), $expire_date == date('Y-m-d') ? 'Today' : date($lformat, strtotime($expire_date)));
         //issue #1521
         if ($is_admin) {
             mgm_redirect(add_query_arg(array('user_id' => $user_id, 'unsubscribe_errors' => urlencode($message)), admin_url('user-edit.php')));
         }
         // redirect
         mgm_redirect(mgm_get_custom_url('membership_details', false, array('unsubscribed' => 'true', 'unsubscribe_errors' => urlencode($message))));
     }
 }
/**
 * 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;
}
/**
 * create purchase another button
 *
 * @param array userdata
 * @retun string html output
 */
function mgm_get_purchase_another_subscription_button($args = array())
{
    global $wpdb;
    //ceck settings
    $settings = mgm_get_class('system')->get_setting();
    // check
    if (!isset($settings['enable_multiple_level_purchase']) || isset($settings['enable_multiple_level_purchase']) && !bool_from_yn($settings['enable_multiple_level_purchase'])) {
        return;
    }
    // current user
    $user = wp_get_current_user();
    // validate
    if (!$user->ID) {
        // query string
        $user = mgm_get_user_from_querystring();
    }
    // validate
    if (!$user->ID) {
        return __('No such user', 'mgm');
    }
    // userdata
    $username = $user->user_login;
    $mgm_home = get_option('siteurl');
    $member = mgm_get_member($user->ID);
    $system_obj = mgm_get_class('system');
    $membership_type = mgm_get_user_membership_type($user->ID, 'code');
    $packs_obj = mgm_get_class('subscription_packs');
    $packs = $packs_obj->get_packs('upgrade');
    $duration_str = $packs_obj->duration_str;
    $trial_taken = $member->trial_taken;
    // pack_ids
    $pack_ids = mgm_get_members_packids($member);
    $pack_membership_types = mgm_get_subscribed_membershiptypes($user->ID, $member);
    // query_arg
    $form_action = mgm_get_custom_url('transactions', false, array('action' => 'purchase_another', 'username' => $username));
    //issue 1009
    if (isset($settings['membership_details_url'])) {
        $membership_details_url = $settings['membership_details_url'];
    } else {
        $membership_details_url = get_admin_url() . 'profile.php?page=mgm/profile';
    }
    // cancel
    $cancel_url = $membership_details_url;
    // $cancel_url = mgm_get_custom_url('membership_details');
    // active modules
    $a_payment_modules = $system_obj->get_active_modules('payment');
    // 	selected_subscription
    $selected_subs = mgm_get_selected_subscription($args);
    // second step, after post
    if (isset($_POST['submit'])) {
        // verify selected
        if (!isset($_POST['subs_opt'])) {
            // die
            return sprintf(__('Package not selected, <a href="%s">go back</a>.', 'mgm'), $_POST['form_action']);
            exit;
        }
        // get subs data
        $subs_opt_pack = mgm_decode_package($_POST['subs_opt']);
        extract($subs_opt_pack);
        // check
        $valid = false;
        // loop packs
        foreach ($packs as $pack) {
            // check
            //check pack id as well: issue#: 580
            if ($pack['cost'] == $cost && $pack['duration'] == $duration && $pack['duration_type'] == $duration_type && $membership_type == $pack['membership_type'] && $pack_id == $pack['id']) {
                $valid = true;
                break;
            }
        }
        // error
        if (!$valid) {
            return __('Invalid data passed', 'mgm');
            exit;
        }
        // get object
        $member = new mgm_member($user->ID);
        $temp_membership = $member->_default_fields();
        $temp_membership['membership_type'] = $membership_type;
        $temp_membership['pack_id'] = $pack_id;
        //issue #860
        //if (isset($_POST['mgm_upgrade_field']['autoresponder']) && ($_POST['mgm_upgrade_field']['autoresponder'])=='Y') {
        if (isset($_POST['mgm_upgrade_field']['autoresponder']) && substr($_POST['mgm_upgrade_field']['autoresponder'], 0, 1) == 'Y') {
            $temp_membership['subscribed'] = 'Y';
            $temp_membership['autoresponder'] = $system_obj->active_modules['autoresponder'];
        }
        //issue #1236
        if (isset($_POST['mgm_upgrade_field']['coupon']) && !empty($_POST['mgm_upgrade_field']['coupon'])) {
            //issue #1250 - Coupon validation
            if (!empty($_POST['form_action'])) {
                // check if its a valid coupon
                if (!($coupon = mgm_get_coupon_data($_POST['mgm_upgrade_field']['coupon']))) {
                    //redirect back to the form
                    $q_arg = array('error_field' => 'Coupon', 'error_type' => 'invalid', 'error_field_value' => $_POST['mgm_upgrade_field']['coupon']);
                    $redirect = add_query_arg($q_arg, $_POST['form_action']);
                    // redirect
                    mgm_redirect($redirect);
                    exit;
                } else {
                    // membership type check
                    // get subs
                    if ($subs_pack = mgm_decode_package(mgm_post_var('subs_opt'))) {
                        // values
                        $coupon_values = mgm_get_coupon_values(NULL, $coupon['value'], true);
                        // check
                        if (isset($coupon_values['new_membership_type']) && $coupon_values['new_membership_type'] != $subs_pack['membership_type']) {
                            $new_membership_type = mgm_get_membership_type_name($coupon_values['new_membership_type']);
                            $q_arg = array('error_field' => 'Coupon', 'error_type' => 'invalid', 'membership_type' => $coupon_values['new_membership_type'], 'error_field_value' => $_POST['mgm_upgrade_field']['coupon']);
                            $redirect = add_query_arg($q_arg, $_POST['form_action']);
                            // redirect
                            mgm_redirect($redirect);
                            exit;
                        }
                    }
                }
            }
        }
        //inserted an incomplete entry for the selected subscription type
        mgm_save_another_membership_fields($temp_membership, $user->ID);
        // save coupon fields and update member object
        $member = mgm_save_partial_fields_purchase_more($user->ID, $membership_type, $cost);
        // coupon
        $purchase_another_coupon = false;
        // array
        if (isset($member->upgrade)) {
            if (is_array($member->upgrade) && isset($member->upgrade['coupon']['id'])) {
                $purchase_another_coupon = $member->upgrade['coupon'];
            } elseif (is_object($member->upgrade) && isset($member->upgrade->coupon->id)) {
                $purchase_another_coupon = mgm_object2array($member->upgrade->coupon);
            }
            // coupon
            mgm_get_purchase_another_coupon_pack($purchase_another_coupon, $pack);
        }
        //save custom fields -issue #1285
        if (isset($_POST['mgm_upgrade_field']) && !empty($_POST['mgm_upgrade_field'])) {
            //member
            $cf_member = mgm_get_member($user->ID);
            //upgrade custom fileds
            $cfu_fileds = mgm_get_class('member_custom_fields')->get_fields_where(array('display' => array('on_multiple_membership_level_purchase' => true)));
            //loop fields
            foreach ($cfu_fileds as $cf_filed) {
                //skip coupon and autoresponder
                if (in_array($cf_filed['name'], array('coupon', 'autoresponder'))) {
                    continue;
                }
                //check
                if (isset($_POST['mgm_upgrade_field'][$cf_filed['name']])) {
                    // check upgrae and required
                    if ((bool) $cf_filed['attributes']['required'] === true) {
                        if (empty($_POST['mgm_upgrade_field'][$cf_filed['name']])) {
                            //redirect back to the form
                            $q_arg = array('error_field' => $cf_filed['label'], 'error_type' => 'empty', 'error_field_value' => $_POST['mgm_upgrade_field'][$cf_filed['name']]);
                            $redirect = add_query_arg($q_arg, $_POST['form_action']);
                            mgm_redirect($redirect);
                            exit;
                        }
                    }
                    //appending custom fields
                    if (isset($cf_member->custom_fields->{$cf_filed}['name'])) {
                        $cf_member->custom_fields->{$cf_filed}['name'] = $_POST['mgm_upgrade_field'][$cf_filed['name']];
                    } else {
                        $cf_member->custom_fields->{$cf_filed}['name'] = $_POST['mgm_upgrade_field'][$cf_filed['name']];
                    }
                }
            }
            $cf_member->save();
        }
        // start html
        $html = '<div>';
        // free
        if (($pack['cost'] == 0 || $membership_type == 'free') && in_array('mgm_free', $a_payment_modules) && mgm_get_module('mgm_free')->is_enabled()) {
            $html .= sprintf('<div>%s - %s</div>', __('Create a free account ', 'mgm'), ucwords($membership_type));
            $module = 'mgm_free';
            // payments url
            $payments_url = mgm_get_custom_url('transactions');
            // if tril module selected and cost is 0 and free moduleis not active
            if ($membership_type == 'trial') {
                if (in_array('mgm_trial', $a_payment_modules)) {
                    $module = 'mgm_trial';
                }
            }
            //Purchase Another Membership Level problem : issue #: 752
            $redirect = add_query_arg(array('method' => 'payment_return', 'module' => $module, 'custom' => $user->ID . '_' . $duration . '_' . $duration_type . '_' . $pack_id . '_Y', 'redirector' => $redirector), $payments_url);
            // redirect
            if (!headers_sent()) {
                @header('location: ' . $redirect);
                exit;
            }
            // js redirect
            $html .= sprintf('<script type="text/javascript">window.location = "%s";</script><div>%s</div>', $redirect, $packs_obj->get_pack_desc($pack));
        } else {
            $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', $packs_obj->get_pack_desc($pack));
            // coupon
            if (isset($purchase_another_coupon['id'])) {
                $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', sprintf(__('Using Coupon "%s" - %s', 'mgm'), $purchase_another_coupon['name'], $purchase_another_coupon['description']));
            }
            $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', __('Please Select from Available Payment Gateways', 'mgm'));
        }
        //bypass if payment gateway field is selected -issue #1764
        if ((double) $pack['cost'] > 0 && isset($_POST['mgm_payment_gateways']) && !empty($_POST['mgm_payment_gateways'])) {
            //init
            $tran_id = 0;
            if (!$tran_id) {
                $tran_id = mgm_add_transaction($pack, array('is_another_membership_purchase' => true, 'user_id' => $user->ID));
            }
            // module
            $mod_obj = mgm_get_module($_POST['mgm_payment_gateways'], 'payment');
            // module end point
            $redirect = $mod_obj->_get_endpoint('html_redirect', false);
            // encode id:
            //encode transaction id
            $encode_tran_id = mgm_encode_id($tran_id);
            //args
            $redirect = add_query_arg(array('tran_id' => $encode_tran_id), $redirect);
            // do the redirect to payment
            mgm_redirect($redirect);
        }
        // init
        $payment_modules = array();
        // when active
        if ($a_payment_modules) {
            // loop
            foreach ($a_payment_modules as $payment_module) {
                // not trial
                if (in_array($payment_module, array('mgm_free', 'mgm_trial'))) {
                    continue;
                }
                //consider only the modules assigned to pack
                if (isset($pack['modules']) && !in_array($payment_module, (array) $pack['modules'])) {
                    continue;
                }
                // store
                $payment_modules[] = $payment_module;
            }
        }
        // loop payment mods if not free
        if (count($payment_modules) && $cost) {
            // transaction
            $tran_id = 0;
            // loop
            foreach ($payment_modules as $module) {
                // module
                $mod_obj = mgm_get_module($module, 'payment');
                // create transaction
                // if(!$tran_id) $tran_id = $mod_obj->_create_transaction($pack, array('is_another_membership_purchase' => true, 'user_id' => $user->ID));
                if (!$tran_id) {
                    $tran_id = mgm_add_transaction($pack, array('is_another_membership_purchase' => true, 'user_id' => $user->ID));
                }
                // button
                $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', $mod_obj->get_button_subscribe(array('pack' => $pack, 'tran_id' => $tran_id)));
            }
        } else {
            if ($cost) {
                $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', __('There are no payment gateways available at this time.', 'mgm'));
            }
        }
        // html
        $html .= '</div>';
    } else {
        // first step show upgrade options
        // html
        $html = sprintf('<p class="message register">%s</p>', __('Please Select from Available Membership Packages', 'mgm'));
        // upgrade_packages
        $upgrade_packages = '';
        // pack to modules
        $pack_modules = array();
        // loop
        foreach ($packs as $pack) {
            // default
            $checked = '';
            // skip already purchased packs
            if (in_array($pack['id'], $pack_ids)) {
                continue;
            }
            //skip same membership level subscriptions
            if (in_array($pack['membership_type'], $pack_membership_types)) {
                continue;
            }
            // do not show trial or free as upgradre
            if ($pack['membership_type'] == 'trial' || $pack['membership_type'] == 'free') {
                continue;
            }
            // reset
            $checked = mgm_select_subscription($pack, $selected_subs);
            // skip other when a package sent as selected
            if ($selected_subs !== false) {
                if (empty($checked)) {
                    continue;
                }
            }
            // checked
            if (!$checked) {
                $checked = (int) $pack['default'] == 1 ? ' checked="checked"' : '';
            }
            // duration
            if ($pack['duration'] == 1) {
                $dur_str = rtrim($duration_str[$pack['duration_type']], 's');
            } else {
                $dur_str = $duration_str[$pack['duration_type']];
            }
            $css_group = mgm_get_css_group();
            // encode pack
            $subs_opt_enc = mgm_encode_package($pack);
            // set
            $pack_modules[$subs_opt_enc] = $pack['modules'];
            //issue #867
            if ($css_group != 'none') {
                //expand this if needed
                $css_link_format = '<link rel="stylesheet" href="%s" type="text/css" media="all" />';
                $css_file = MGM_ASSETS_URL . 'css/' . $css_group . '/mgm.form.fields.css';
                $upgrade_packages .= sprintf($css_link_format, $css_file);
            }
            // free
            if (($pack['cost'] == 0 || strtolower($pack['membership_type']) == 'free') && in_array('mgm_free', $a_payment_modules) && mgm_get_module('mgm_free')->enabled == 'Y') {
                // input
                $input = sprintf('<input type="radio" %s class="checkbox" name="subs_opt" value="%s" rel="mgm_subscription_options"/>', $checked, $subs_opt_enc);
                // html
                $upgrade_packages .= '  
							<div class="mgm_subs_wrapper ' . $pack['membership_type'] . '">
								<div class="mgm_subs_option ' . $pack['membership_type'] . '">
									' . $input . '
								</div>
								<div class="mgm_subs_pack_desc ' . $pack['membership_type'] . '">
									' . $packs_obj->get_pack_desc($pack) . '
								</div>
								 <div class="clearfix"></div>
								 <div class="mgm_subs_desc ' . $pack['membership_type'] . '">
									' . mgm_stripslashes_deep($pack['description']) . '
								 </div>
							</div>';
            } else {
                // input
                $input = sprintf('<input type="radio" %s class="checkbox" name="subs_opt" value="%s" rel="mgm_subscription_options"/>', $checked, $subs_opt_enc);
                // html
                $upgrade_packages .= '  
							<div class="mgm_subs_wrapper ' . $pack['membership_type'] . '">
								<div class="mgm_subs_option ' . $pack['membership_type'] . '">
									' . $input . '
								</div>
								<div class="mgm_subs_pack_desc ' . $pack['membership_type'] . '">
									' . $packs_obj->get_pack_desc($pack) . '
								</div>
								 <div class="clearfix"></div>
								 <div class="mgm_subs_desc ' . $pack['membership_type'] . '">
									' . mgm_stripslashes_deep($pack['description']) . '
								 </div>
							</div>';
            }
        }
        // add pack_modules as json data, may consider jquery data later
        if (!empty($pack_modules)) {
            $html .= sprintf('<script language="javascript">var mgm_pack_modules = %s</script>', json_encode($pack_modules));
        }
        // show error
        if (!$upgrade_packages) {
            // html
            $html .= '<div class="mgm_subs_wrapper">
						<div class="mgm_subs_pack_desc">
							' . __('Sorry, no packages available.', 'mgm') . '
						</div>
					 </div>
					 <p>						
						<input type="button" name="cancel" onclick="window.location=\'' . $cancel_url . '\'" value="' . __('Cancel', 'mgm') . '" class="button-primary" />&nbsp;					
					 </p>';
        } else {
            /*			$error_field = mgm_request_var('error_field'); 
            			if(!empty($error_field)) {
            				$errors = new WP_Error();
            				switch (mgm_request_var('error_type')) {
            					case 'empty':
            						$error_string = 'You must provide a ';
            						break;
            					case 'invalid':
            						$error_string = 'Invalid ';
            						break;	
            				}				
            				//issue #703
            				$errors->add( $error_field, __( '<strong>ERROR</strong>: '.$error_string, 'mgm' ).$error_field );
            				$html .= mgm_set_errors($errors, true);					
            			}*/
            // check errors if any:
            $html .= mgm_subscription_purchase_errors();
            // form
            $html .= '<form action="' . $form_action . '" method="post" class="mgm_form"><div class="mgm_get_pack_form_container">';
            $html .= '<input type="hidden" name="form_action" value="' . $form_action . '" />';
            $html .= $upgrade_packages;
            //issue #1285
            $html .= mgm_get_custom_fields($user->ID, array('on_multiple_membership_level_purchase' => true), 'mgm_upgrade_field');
            // html
            $html .= '<input type="hidden" name="ref" value="' . md5($member->amount . '_' . $member->duration . '_' . $member->duration_type . '_' . $member->membership_type) . '" />';
            // set
            $html .= '<p>						
						<input class="button" type="submit" name="submit" value="' . __('Next', 'mgm') . '" />&nbsp;&nbsp;
						<input class="button" type="button" name="cancel" onclick="window.location=\'' . $cancel_url . '\'" value="' . __('Cancel', 'mgm') . '"/>&nbsp;					
					  </p>';
            // html
            $html .= '</div></form>';
        }
    }
    // return
    return $html;
}
Ejemplo n.º 10
0
 function _buy_membership()
 {
     // system
     $system_obj = mgm_get_class('system');
     $s_packs = mgm_get_class('subscription_packs');
     $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails'));
     $dpne = bool_from_yn($system_obj->get_setting('disable_payment_notify_emails'));
     // get passthrough, stop further process if fails to parse
     $custom = $this->_get_transaction_passthrough($_POST['custom']);
     // local var
     extract($custom);
     // currency
     if (!$currency) {
         $currency = $system_obj->get_setting('currency');
     }
     // find user
     $user = get_userdata($user_id);
     //another_subscription modification
     if (isset($custom['is_another_membership_purchase']) && bool_from_yn($custom['is_another_membership_purchase'])) {
         $member = mgm_get_member_another_purchase($user_id, $custom['membership_type']);
     } else {
         $member = mgm_get_member($user_id);
     }
     // Get the current AC join date
     if (!($join_date = $member->join_date)) {
         $member->join_date = time();
     }
     // Set current AC join date
     // if there is no duration set in the user object then run the following code
     if (empty($duration_type)) {
         //if there is no duration type then use Months
         $duration_type = 'm';
     }
     // membership type default
     if (empty($membership_type)) {
         //if there is no account type in the custom string then use the existing type
         $membership_type = md5($member->membership_type);
     }
     // validate parent method
     $membership_type_verified = $this->_validate_membership_type($membership_type, 'md5|plain');
     // verified
     if (!$membership_type_verified) {
         if (strtolower($member->membership_type) != 'free') {
             // notify admin, only if gateway emails on
             if (!$dge) {
                 mgm_notify_admin_membership_verification_failed($this->name);
             }
             // abort
             return;
         } else {
             $membership_type_verified = $member->membership_type;
         }
     }
     // set
     $membership_type = $membership_type_verified;
     // sub pack
     $subs_pack = $s_packs->get_pack($pack_id);
     // if trial on
     if ($subs_pack['trial_on']) {
         $member->trial_on = $subs_pack['trial_on'];
         $member->trial_cost = $subs_pack['trial_cost'];
         $member->trial_duration = $subs_pack['trial_duration'];
         $member->trial_duration_type = $subs_pack['trial_duration_type'];
         $member->trial_num_cycles = $subs_pack['trial_num_cycles'];
     }
     //pack currency over rides genral setting currency - issue #1602
     if (isset($subs_pack['currency']) && $subs_pack['currency'] != $currency) {
         $currency = $subs_pack['currency'];
     }
     // duration
     $member->duration = $duration;
     $member->duration_type = strtolower($duration_type);
     $member->amount = $amount;
     $member->currency = $currency;
     $member->membership_type = $membership_type;
     $member->pack_id = $pack_id;
     // $member->payment_type = 'subscription';
     $member->active_num_cycles = isset($num_cycles) && !empty($num_cycles) ? $num_cycles : $subs_pack['num_cycles'];
     $member->payment_type = (int) $member->active_num_cycles == 1 ? 'one-time' : 'subscription';
     // payment info for unsubscribe
     $member->payment_info = new stdClass();
     $member->payment_info->module = $this->code;
     // transaction type
     $member->payment_info->txn_type = 'subscription';
     // subscriber id
     $member->payment_info->subscr_id = '';
     // refer id
     $member->payment_info->txn_id = '';
     // mgm transaction id
     $member->transaction_id = $_POST['custom'];
     // process response
     $new_status = $update_role = false;
     // process
     $process = 'Success';
     // status
     switch ($process) {
         case 'Success':
             // set pending status
             $new_status = MGM_STATUS_PENDING;
             // starus string
             $member->status_str = __('Last payment is pending', 'mgm');
             $time = time();
             $last_pay_date = isset($member->last_pay_date) ? $member->last_pay_date : null;
             $member->last_pay_date = date('Y-m-d', $time);
             // for upgrading
             if ($member->status == MGM_STATUS_ACTIVE) {
                 // mark for later status reset
                 $member->status_reset_on = date('Y-m-d', strtotime($member->expire_date));
             }
             // check subscription_option
             if (isset($subscription_option)) {
                 // on option
                 switch ($subscription_option) {
                     // @ToDo, apply expire date login
                     case 'create':
                         // expire date will be based on current time
                     // expire date will be based on current time
                     case 'upgrade':
                         // expire date will be based on current time
                         // already on top
                         break;
                     case 'downgrade':
                         // expire date will be based on expire_date if exists, current time other wise
                     // expire date will be based on expire_date if exists, current time other wise
                     case 'extend':
                         // expire date will be based on expire_date if exists, current time other wise
                         // extend/expire date
                         // calc expiry	- issue #1226
                         // membership extend functionality broken if we try to extend the same day so removed && $last_pay_date != date('Y-m-d', $time) check
                         if (!empty($member->expire_date)) {
                             $expiry = strtotime($member->expire_date);
                             if ($expiry > 0 && $expiry > $time) {
                                 $time = $expiry;
                             }
                         }
                         break;
                 }
             }
             // type expanded
             $duration_exprs = $s_packs->get_duration_exprs();
             // if not lifetime/date range
             if (in_array($member->duration_type, array_keys($duration_exprs))) {
                 // take only date exprs
                 //consider trial duration if trial period is applicable
                 if (isset($trial_on) && $trial_on == 1) {
                     //Do it only once
                     if (!isset($member->rebilled) && isset($member->active_num_cycles) && $member->active_num_cycles != 1) {
                         $time = strtotime("+{$trial_duration} {$duration_exprs[$trial_duration_type]}", $time);
                     }
                 } else {
                     // time - issue #1068
                     $time = strtotime("+{$member->duration} {$duration_exprs[$member->duration_type]}", $time);
                 }
                 // formatted
                 $time_str = date('Y-m-d', $time);
                 // date extended
                 if (!$member->expire_date || strtotime($time_str) > strtotime($member->expire_date)) {
                     $member->expire_date = $time_str;
                 }
             } else {
                 //if lifetime:
                 if ($member->duration_type == 'l') {
                     // el = lifetime
                     $member->expire_date = '';
                 }
                 //issue #1096
                 if ($member->duration_type == 'dr') {
                     // el = /date range
                     $member->expire_date = $duration_range_end_dt;
                 }
             }
             //update rebill: issue #: 489
             if ($member->active_num_cycles != 1 && (int) $member->rebilled < (int) $member->active_num_cycles) {
                 // rebill
                 $member->rebilled = !$member->rebilled ? 1 : (int) $member->rebilled + 1;
             }
             // role update
             if ($role) {
                 $update_role = true;
             }
             // transaction_id
             $transaction_id = $this->_get_transaction_id();
             // hook args
             $args = array('user_id' => $user_id, 'transaction_id' => $transaction_id);
             // another membership
             if (isset($custom['is_another_membership_purchase']) && bool_from_yn($custom['is_another_membership_purchase'])) {
                 $args['another_membership'] = $custom['membership_type'];
             }
             // after succesful payment hook
             do_action('mgm_membership_transaction_success', $args);
             // backward compatibility
             do_action('mgm_subscription_purchase_payment_success', $args);
             // new organized name
             do_action('mgm_return_subscription_payment_' . $this->module, $args);
             // autoresponder
             break;
         case 'Denied':
             $new_status = MGM_STATUS_NULL;
             $member->status_str = __('Last payment was refunded or denied', 'mgm');
             break;
         case 'Pending':
             $new_status = MGM_STATUS_PENDING;
             $reason = 'Unknown';
             $member->status_str = sprintf(__('Last payment is pending. Reason: %s', 'mgm'), $reason);
             break;
         default:
             $new_status = MGM_STATUS_ERROR;
             $member->status_str = sprintf(__('Last payment status: %s', 'mgm'), $_POST['payment_status']);
             break;
     }
     // old status
     $old_status = $member->status;
     // set new status
     $member->status = $new_status;
     // whether to acknowledge the user - This should happen only once
     $acknowledge_user = $this->send_payment_email($_POST['custom']);
     // whether to subscriber the user to Autoresponder - This should happen only once
     $acknowledge_ar = mgm_subscribe_to_autoresponder($member, $_POST['custom']);
     //another_subscription modification
     if (isset($custom['is_another_membership_purchase']) && bool_from_yn($custom['is_another_membership_purchase'])) {
         //issue #1227
         if ($subs_pack['hide_old_content']) {
             $member->hide_old_content = $subs_pack['hide_old_content'];
         }
         mgm_save_another_membership_fields($member, $user_id);
         // Multiple membership upgrade: first time
         if (isset($member->transaction_id) && isset($custom['multiple_upgrade_prev_packid']) && is_numeric($custom['multiple_upgrade_prev_packid'])) {
             mgm_multiple_upgrade_save_memberobject($custom, $member->transaction_id);
         }
     } else {
         $member->save();
     }
     // status change event
     do_action('mgm_user_status_change', $user_id, $new_status, $old_status, 'module_' . $this->module, $member->pack_id);
     //update coupon usage
     do_action('mgm_update_coupon_usage', array('user_id' => $user_id));
     // role
     if ($update_role) {
         $obj_role = new mgm_roles();
         $obj_role->add_user_role($user_id, $role);
     }
     // update transaction
     if (is_numeric($member->transaction_id)) {
         mgm_update_transaction(array('module' => $this->module, 'status' => $member->status, 'status_text' => $member->status_str), $member->transaction_id);
     }
     // return action
     do_action('mgm_return_' . $this->module, array('user_id' => $user_id));
     // backward compatibility
     do_action('mgm_return_subscription_payment_' . $this->module, array('user_id' => $user_id));
     // new , individual
     do_action('mgm_return_subscription_payment', array('user_id' => $user_id, 'acknowledge_ar' => $acknowledge_ar, 'mgm_member' => $member));
     // new, global
     // read member again for internal updates if any
     // another_subscription modification
     if (isset($custom['is_another_membership_purchase']) && bool_from_yn($custom['is_another_membership_purchase'])) {
         $member = mgm_get_member_another_purchase($user_id, $custom['membership_type']);
     } else {
         $member = mgm_get_member($user_id);
     }
     // send email notification to client
     $blogname = get_option('blogname');
     // notify
     if ($acknowledge_user) {
         // notify user, only if gateway emails on
         if (!$dpne) {
             // notify
             if (mgm_notify_user_membership_purchase($blogname, $user, $member, $custom, $subs_pack, $s_packs, $system_obj)) {
                 // update as email sent
                 $this->update_paymentemail_sent($alt_tran_id);
             }
         }
         // notify admin, only if gateway emails on
         if (!$dge) {
             // pack duration
             $pack_duration = $s_packs->get_pack_duration($subs_pack);
             // notify admin,
             mgm_notify_admin_membership_purchase($blogname, $user, $member, $pack_duration);
         }
     }
 }
Ejemplo n.º 11
0
function mgm_reset_cancelled_member($args)
{
    // check
    if (isset($args['user_id'])) {
        // user_id
        $user_id = $args['user_id'];
        // get member
        //another_subscription modification
        if (isset($args['another_membership'])) {
            $member = mgm_get_member_another_purchase($user_id, $args['another_membership']);
        } else {
            $member = mgm_get_member($user_id);
        }
        // check
        if (isset($member->status_reset_as) && $member->status_reset_as == MGM_STATUS_CANCELLED) {
            // unset
            unset($member->status_reset_as, $member->status_reset_on);
            // update user
            //another_subscription modification
            if (isset($args['another_membership'])) {
                mgm_save_another_membership_fields($member, $user_id);
            } else {
                // update_user_option($user_id, 'mgm_member', $member, true);
                $member->save();
            }
        }
    }
}
 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;
 }
/**
 * unsubscribe default callback
 */
function mgm_member_unsubscribe()
{
    // user_id from post
    extract($_POST);
    // system
    $system_obj = mgm_get_class('system');
    $packs_obj = mgm_get_class('subscription_packs');
    $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails'));
    // find user
    $user = get_userdata($user_id);
    $member = mgm_get_member($user_id);
    // multiple membesrhip level update:
    if (isset($_POST['membership_type']) && $member->membership_type != $_POST['membership_type']) {
        $member = mgm_get_member_another_purchase($user_id, $_POST['membership_type']);
    }
    // get pack
    if ($member->pack_id) {
        $subs_pack = $packs_obj->get_pack($member->pack_id);
    } else {
        $subs_pack = $packs_obj->validate_pack($member->amount, $member->duration, $member->duration_type, $member->membership_type);
    }
    // types
    $duration_exprs = $packs_obj->get_duration_exprs();
    // default expire date
    $expire_date = $member->expire_date;
    if ($member->duration_type == 'l') {
        $expire_date = date('Y-m-d');
    }
    // if trial on
    if ($subs_pack['trial_on'] && isset($duration_exprs[$subs_pack['trial_duration_type']])) {
        // if cancel data is before trial end, set cancel on trial expire_date
        $trial_expire_date = strtotime("+{$subs_pack['trial_duration']} {$duration_exprs[$subs_pack['trial_duration_type']]}", $member->join_date);
        // if lower
        if (time() < $trial_expire_date) {
            $expire_date = date('Y-m-d', $trial_expire_date);
        }
    }
    // old status
    $old_status = $member->status;
    // if today
    if ($expire_date == date('Y-m-d')) {
        // set new status
        $member->status = $new_status = MGM_STATUS_CANCELLED;
        // status string
        $member->status_str = __('Subscription Cancelled', 'mgm');
        $member->expire_date = date('Y-m-d');
    } else {
        // date format
        $date_format = mgm_get_date_format('date_format');
        // set new status
        $member->status = $new_status = MGM_STATUS_AWAITING_CANCEL;
        // status string
        $member->status_str = sprintf(__('Subscription awaiting cancellation on %s', 'mgm'), date($date_format, strtotime($expire_date)));
        // reset on
        $member->status_reset_on = $expire_date;
        $member->status_reset_as = MGM_STATUS_CANCELLED;
    }
    // multiple memberhip level update:
    if ($post_membership_type = mgm_post_var('membership_type') && $member->membership_type != $post_membership_type) {
        mgm_save_another_membership_fields($member, $user_id);
    } else {
        $member->save();
    }
    // status change event
    do_action('mgm_user_status_change', $user_id, $new_status, $old_status, 'member_unsubscribe', $member->pack_id);
    // send email notification to client
    $blogname = get_option('blogname');
    // email
    $subject = sprintf(__('[%s] Subscription Cancelled', 'mgm'), $blogname);
    $message = __('This is an automatic notification from %1$s to %2$s (%3$s). This is a notification to inform you that your subscription has been cancelled. For more information please contact %4$s', 'mgm');
    $message = sprintf($message, $blogname, $user->display_name, $user->user_email, $system_obj->setting['admin_email']);
    // send email notification to user
    mgm_mail($user->user_email, $subject, $message);
    // notify admin, only if gateway emails on
    if (!$dge) {
        $subject = "[{$blogname}] {$user->user_email} - {$new_status}";
        $message = "\tUser display name: {$user->display_name}\n\n<br />\r\r\n\t\t\t\tUser email: {$user->user_email}\n\n<br />\r\r\n\t\t\t\tUser ID: {$user->ID}\n\n<br />\r\r\n\t\t\t\tMembership Type: {$membership_type}\n\n<br />\r\r\n\t\t\t\tNew status: {$new_status}\n\n<br />\r\r\n\t\t\t\tStatus message: {$member->status_str}\n\n<br />\t\t\t\t\t\r\r\n\t\t\t\tPayment Mode: Cancelled\n\n<br />\r\r\n\t\t\t\tPOST Data was: \n\n<br /><br /><pre>" . print_r($_POST, true) . '</pre>';
        mgm_mail($system_obj->setting['admin_email'], $subject, $message);
    }
    // after cancellation hook
    do_action('mgm_membership_subscription_cancelled', array('user_id' => $user_id));
    // message
    $lformat = mgm_get_date_format('date_format_long');
    $message = sprintf(__("You have successfully Unsubscribed. Your account has been marked for cancellation on %s", "mgm"), $expire_date == date('Y-m-d') ? 'Today' : date($lformat, strtotime($expire_date)));
    // redirect
    //mgm_redirect('wp-admin/profile.php?page=mgm/profile&unsubscribed=true&unsubscribe_errors='.urlencode($message));
    mgm_redirect(mgm_get_custom_url('membership_details', false, array('unsubscribe_errors' => urlencode($message))));
}
 function _cancel_membership()
 {
     // system
     $system_obj = mgm_get_class('system');
     $s_packs = mgm_get_class('subscription_packs');
     $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails'));
     $dpne = bool_from_yn($system_obj->get_setting('disable_payment_notify_emails'));
     // get passthrough, stop further process if fails to parse
     $custom = $this->_get_transaction_passthrough($_POST['custom']);
     // local var
     extract($custom);
     // currency
     if (!$currency) {
         $currency = $this->setting['currency'];
     }
     // find user
     $user = get_userdata($user_id);
     $member = mgm_get_member($user_id);
     $multiple_update = false;
     // multiple membesrhip level update:
     if (isset($_POST['membership_type']) && $member->membership_type != $_POST['membership_type'] || isset($is_another_membership_purchase) && $is_another_membership_purchase == 'Y') {
         $multiple_update = true;
         $multi_memtype = isset($_POST['membership_type']) ? $_POST['membership_type'] : $membership_type;
         $member = mgm_get_member_another_purchase($user_id, $multi_memtype);
     }
     // tracking fields module_field => post_field
     $tracking_fields = array('txn_type' => 'rec_payment_type', 'subscr_id' => 'customer_id', 'txn_id' => 'rec_payment_id');
     // save tracking fields
     $this->_save_tracking_fields($tracking_fields, $member);
     // expire
     $expire_date = $member->expire_date;
     // if lifetime:
     if ($member->duration_type == 'l') {
         $expire_date = date('Y-m-d');
     }
     // transaction_id
     $trans_id = $member->transaction_id;
     // if today
     if ($expire_date == date('Y-m-d')) {
         // status
         $new_status = MGM_STATUS_CANCELLED;
         $new_status_str = __('Subscription cancelled', 'mgm');
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         $member->expire_date = date('Y-m-d');
         // reassign expiry membership pack if exists: issue#: 535
         $member = apply_filters('mgm_reassign_member_subscription', $user_id, $member, 'CANCEL', true);
     } else {
         // date
         $date_format = mgm_get_date_format('date_format');
         // status
         $new_status = MGM_STATUS_AWAITING_CANCEL;
         $new_status_str = sprintf(__('Subscription awaiting cancellation on %s', 'mgm'), date($date_format, strtotime($expire_date)));
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         // set reset date
         $member->status_reset_on = $expire_date;
         $member->status_reset_as = MGM_STATUS_CANCELLED;
     }
     // multiple membesrhip level update:
     if ($multiple_update) {
         mgm_save_another_membership_fields($member, $user_id);
     } else {
         $member->save();
     }
     // transaction status
     mgm_update_transaction_status($trans_id, $new_status, $new_status_str);
     // send email notification to client
     $blogname = get_option('blogname');
     // notify user
     if (!$dpne) {
         // notify user
         mgm_notify_user_membership_cancellation($blogname, $user, $member, $system_obj, $new_status, $membership_type);
     }
     // notify admin
     if (!$dge) {
         // notify admin
         mgm_notify_admin_membership_cancellation($blogname, $user, $member);
     }
     // after cancellation hook
     do_action('mgm_membership_subscription_cancelled', array('user_id' => $user_id));
 }