/** 
  * update subscription package
  *
  * @param none
  * @return subscription package
  * @verb POST
  * @action update 	
  * @url <site>/mgmapi/subscription_packages/update.<format>
  * @since 1.0
  */
 public function update_post()
 {
     // post vars
     $post_vars = $this->request->data['post'];
     // status
     $status = 'error';
     $data = array();
     // message
     $message = __('Subscription package update failed, ', 'mgm');
     // save
     if (!($errors = $this->_validate_data('update', $post_vars))) {
         // trim
         $id = (int) $post_vars['id'];
         // pack
         $pack = isset($post_vars['pack']) ? $post_vars['pack'] : array();
         // update
         if (mgm_update_subscription_package($id, $pack)) {
             // status
             $status = 'success';
             // message
             $message = __('Subscription package updated successfully', 'mgm');
             // data
             $data = array('pack' => mgm_get_subscription_package($id));
         } else {
             $message .= __('Database error', 'mgm');
         }
     }
     // response
     $response = array('status' => $status, 'message' => $message, 'data' => $data);
     // errors
     if ($errors !== FALSE) {
         $response = $response + array('errors' => $errors);
     }
     // return
     return array($response, 200);
 }
 /**
  * Specifically check recurring status of each rebill for an expiry date
  * ALong with IPN post mechanism for rebills, the module will need to specifically request for the rebill status
  * @param int $user_id
  * @param object $member
  * @return boolean
  */
 function query_rebill_status($user_id, $member = NULL)
 {
     // check
     if (isset($member->payment_info->subscr_id) && !empty($member->payment_info->subscr_id)) {
         // check pack
         if (isset($member->pack_id)) {
             if ($pack = mgm_get_subscription_package($member->pack_id)) {
                 // one time billing cycle
                 if (isset($pack['num_cycles']) && (int) $pack['num_cycles'] == 1) {
                     // log
                     mgm_log('Exit Flag for One time billing', $this->module . '_' . __FUNCTION__);
                     // exit
                     return false;
                 }
             }
         }
         // add internal vars
         $data = array('PARTNER' => $this->setting['partner'], 'VENDOR' => $this->setting['vendor'], 'USER' => $this->setting['username'], 'PWD' => $this->setting['password'], 'TRXTYPE' => 'R', 'TENDER' => 'C', 'ACTION' => 'I', 'ORIGPROFILEID' => $member->payment_info->subscr_id);
         // log
         mgm_log($data, $this->module . '_' . __FUNCTION__);
         // data
         $data_str = _http_build_query($data, null, '&', '', false);
         // do not urlencode
         // post url
         $post_url = $this->_get_endpoint();
         //issue #1508
         $url_parsed = parse_url($post_url);
         // domain/host
         $domain = $url_parsed['host'];
         // headers
         $http_headers = array('POST /cgi-bin/webscr HTTP/1.1\\r\\n', 'Content-Type: application/x-www-form-urlencoded\\r\\n', 'Host: ' . $domain . '\\r\\n', 'Connection: close\\r\\n\\r\\n');
         // post
         $http_response = mgm_remote_post($post_url, $data_str, array('headers' => $http_headers, 'timeout' => 30, 'sslverify' => false));
         // respomse
         $response = array();
         // parse
         parse_str($http_response, $response);
         // log
         mgm_log($response, $this->module . '_' . __FUNCTION__);
         // check
         if (isset($response['STATUS'])) {
             // old status
             $old_status = $member->status;
             // set status
             switch ($response['STATUS']) {
                 case 'ACTIVE':
                     // set new status
                     $member->status = $new_status = MGM_STATUS_ACTIVE;
                     // status string
                     $member->status_str = __('Last payment cycle processed successfully', 'mgm');
                     // last pay date
                     $last_pay_date = date('Y-m-d');
                     // today
                     // date to add
                     $date_add = mgm_get_pack_cycle_date((int) $member->pack_id, $member);
                     // date to add
                     if (isset($response['NEXTPAYMENT']) && !empty($response['NEXTPAYMENT'])) {
                         // convert to date
                         $response['NEXTPAYMENT'] = $this->_maketime($response['NEXTPAYMENT']);
                         // make time
                         // check
                         if ($date_add !== false) {
                             // new expire date should be later than current expire date, #1223
                             $last_pay_date = strtotime(str_replace('+', '-', $date_add), $response['NEXTPAYMENT']);
                             // start date
                             // $response['START'] = $this->_maketime($response['START']); // mmddyyyy
                             // check before start date
                             if ($last_pay_date < $member->join_date) {
                                 $last_pay_date = $member->join_date;
                             }
                             // format
                             $last_pay_date = date('Y-m-d', $last_pay_date);
                         }
                     }
                     // last pay date
                     $member->last_pay_date = $last_pay_date;
                     //date('Y-m-d', strtotime($last_pay_date));
                     // last pay date
                     // $member->last_pay_date = (isset($response['LASTPAYMENTDATE'])) ? date('Y-m-d', strtotime($response['LASTPAYMENTDATE'])) : date('Y-m-d');
                     // expire date
                     if (isset($response['NEXTPAYMENT']) && !empty($member->expire_date)) {
                         // date to add
                         // $date_add = mgm_get_pack_cycle_date((int)$member->pack_id, $member);
                         // check
                         if ($date_add !== false) {
                             // new expire date should be later than current expire date, #1223
                             $new_expire_date = date('Y-m-d', strtotime($date_add, strtotime($member->last_pay_date)));
                             // apply on last pay date so the calc always treat last pay date form gateway
                             if (strtotime($new_expire_date) > strtotime($member->expire_date)) {
                                 $member->expire_date = $new_expire_date;
                             }
                         } else {
                             // set last pay date if greater than expire date
                             if (strtotime($member->last_pay_date) > strtotime($member->expire_date)) {
                                 $member->expire_date = $member->last_pay_date;
                             }
                         }
                     }
                     // save
                     $member->save();
                     // only run in cron, other wise too many tracking will be added
                     // if( defined('DOING_QUERY_REBILL_STATUS') && DOING_QUERY_REBILL_STATUS != 'manual' ){
                     // transaction_id
                     $transaction_id = $member->transaction_id;
                     // hook args
                     $args = array('user_id' => $user_id, 'transaction_id' => $transaction_id);
                     // after succesful payment hook
                     do_action('mgm_membership_transaction_success', $args);
                     // backward compatibility
                     do_action('mgm_subscription_purchase_payment_success', $args);
                     // new organized name
                     // }
                     break;
                 case 'VENDOR INACTIVE':
                 case 'DEACTIVATED BY MERCHANT':
                     // if expire date in future, let as awaiting
                     if (!empty($member->expire_date) && strtotime($member->expire_date) > time()) {
                         // 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($member->expire_date)));
                         // set reset date
                         $member->status_reset_on = $member->expire_date;
                         // reset as
                         $member->status_reset_as = MGM_STATUS_CANCELLED;
                     } else {
                         // set cancelled
                         // set new status
                         $member->status = $new_status = MGM_STATUS_CANCELLED;
                         // status string
                         $member->status_str = __('Last payment cycle cancelled', 'mgm');
                     }
                     // save
                     $member->save();
                     // only run in cron, other wise too many tracking will be added
                     // if( defined('DOING_QUERY_REBILL_STATUS') && DOING_QUERY_REBILL_STATUS != 'manual' ){
                     // after cancellation hook
                     do_action('mgm_membership_subscription_cancelled', array('user_id' => $user_id));
                     // }
                     break;
                 case 'EXPIRED':
                     // set new status
                     $member->status = $new_status = MGM_STATUS_EXPIRED;
                     // status string
                     $member->status_str = __('Last payment cycle expired', 'mgm');
                     // save
                     $member->save();
                     break;
                 case 'TOO MANY FAILURES':
                     // set new status
                     $member->status = $new_status = MGM_STATUS_NULL;
                     // status string
                     $member->status_str = __('Last payment cycle failed, too many failed transactions.', 'mgm');
                     // save
                     $member->save();
                     break;
             }
             // action
             if (isset($new_status) && $new_status != $old_status) {
                 // user status change
                 do_action('mgm_user_status_change', $user_id, $new_status, $old_status, 'module_' . $this->module, $member->pack_id);
                 // rebill status change
                 do_action('mgm_rebill_status_change', $user_id, $new_status, $old_status, 'query');
                 // query or notify
             }
             // return as a successful rebill
             return true;
         }
     }
     // return
     return false;
     //default to false to skip normal modules
 }