public static function create_new_invoice_for_subscription_payment($invoice_id, $invoice_payment_id, $invoice_payment_subscription_id) { // we have an inbound subscription payment for an invoice. // we have to generate a new invoice (or find the generated invoice if one exists) // first we have to check if this payment is for this invoice (ie: the first subscription payment) $invoice_data = self::get_invoice($invoice_id); if ($invoice_data['total_amount_due'] > 0) { // this invoice is unpaid, we apply this subscription payment against thsi invoice return array('invoice_id' => $invoice_id, 'invoice_payment_id' => $invoice_payment_id); } // first we look for a generated invoice, this is easiest. if (class_exists('module_subscription', false)) { // check if this invoice is part of a subscription. // if it is we hunt through the subscription history until we find a recent unpaid invoice // THIS CODE IS SIMILAR TO module_invoice::is_automatic_paying_invoice($invoice_id) $subscription_history_item = get_single('subscription_history', 'invoice_id', $invoice_id); if ($subscription_history_item && $subscription_history_item['subscription_owner_id']) { // we have an invoice that is on a subscription! $subscription_owner = module_subscription::get_subscription_owner($subscription_history_item['subscription_owner_id']); // check if there are unpaid invoices that were generated after this invoice. if ($subscription_owner['subscription_owner_id'] == $subscription_history_item['subscription_owner_id']) { $subscription_history = get_multiple('subscription_history', array('subscription_owner_id' => $subscription_owner['subscription_owner_id'])); foreach ($subscription_history as $h) { if ($h['invoice_id'] > $invoice_id && $h['paid_date'] == '0000-00-00') { // found an invoice for this subscription that was generated after the initial invoice that is unpaid. // apply subscription payment to this one. $invoice_data = module_invoice::get_invoice($h['invoice_id']); if ($invoice_data['total_amount_due'] > 0) { $invoice_payment_id = update_insert('invoice_payment_id', false, 'invoice_payment', array('invoice_id' => $h['invoice_id'], 'payment_type' => _INVOICE_PAYMENT_TYPE_NORMAL, 'method' => _l('Pending Subscription'), 'currency_id' => $invoice_data['currency_id'], 'invoice_payment_subscription_id' => $invoice_payment_subscription_id)); return array('invoice_id' => $h['invoice_id'], 'invoice_payment_id' => $invoice_payment_id); } } } // if we get here it means we have a subscription invoice that hasn't been renewed yet. $subscription = module_subscription::get_subscription($subscription_owner['subscription_id']); // we force the renewal of the next invoice in this subscription lot and mark it as paid. $invoice_id = module_subscription::generate_subscription_invoice($subscription_owner['subscription_id'], $subscription_owner['owner_table'], $subscription_owner['owner_id'], date('Y-m-d'), $subscription['amount']); if ($invoice_id) { $invoice_data = module_invoice::get_invoice($invoice_id); $invoice_payment_id = update_insert('invoice_payment_id', false, 'invoice_payment', array('invoice_id' => $invoice_id, 'payment_type' => _INVOICE_PAYMENT_TYPE_NORMAL, 'method' => _l('Pending Subscription'), 'currency_id' => $invoice_data['currency_id'], 'invoice_payment_subscription_id' => $invoice_payment_subscription_id)); if ($subscription['automatic_email'] && module_config::c('invoice_subscription_send_due_email_before_payment', 1)) { if (module_invoice::email_invoice_to_customer($invoice_id)) { } else { echo " - failed to send subscription invoice " . module_invoice::link_open($invoice_id, true) . " to customer <br>\n"; } exit; } return array('invoice_id' => $invoice_id, 'invoice_payment_id' => $invoice_payment_id); } } } } }