public function content() { global $dbh, $postvar, $getvar, $instance; if (main::isint(str_replace("P2H-", "", $getvar['view']))) { //Display the invoice if (substr_count($getvar['view'], "P2H-")) { $p2hid = str_replace("P2H-", "", $getvar['view']); $userid = $dbh->select("users", array("id", "=", $p2hid)); $userid = $userid['id']; $userdata = coupons::admin_userdata($userid); } else { $invoiceid = $getvar['view']; $invoice_data_top = $dbh->select("invoices", array("id", "=", $invoiceid)); $pid = $invoice_data_top['pid']; $userid = $invoice_data_top['uid']; $uidtopack = main::uidtopack($userid, $pid); if (!$pid) { $dbh->update("invoices", array("pid" => $uidtopack['pid']), array("id", "=", $invoice_data_top['id'])); } $userdata = coupons::admin_userdata($userid); } if ($_POST['submitaddcoupon']) { if (!$postvar['addcoupon']) { main::errors("Please enter a coupon code."); } else { $coupcode = $postvar['addcoupon']; $user = main::uname($userid); $pack_data = main::uidtopack($userid, $pid); $packid = $pack_data['packages']['id']; $multi_coupons = $dbh->config("multicoupons"); if ($p2hid) { $monthly = $pack_data['additional']['monthly']; $monthly = coupons::get_discount("p2hmonthly", $monthly, $userid); $total_posted = coupons::totalposts($userid); $amt_owed = max(0, $monthly - $total_posted); } else { $invoice_info = $dbh->select("invoices", array("id", "=", $invoiceid)); if ($invoice_info['pid'] != $pack_data['pid']) { $pack_data = upgrade::pidtobak($invoice_info['pid'], $invoice_info["uid"]); } $total_paid = coupons::totalpaid($invoiceid); $amt_owed = max(0, $invoice_info['amount'] - $total_paid); } if ($amt_owed == 0) { main::errors("The user's balance is already paid in full, so you can't add another coupon."); } else { $coupon_info = coupons::coupon_data($coupcode); $coupid = $coupon_info['id']; $use_coupon = coupons::use_coupon($coupid, $packid, $invoiceid, $userid); if (!$use_coupon) { if (!$multi_coupons) { main::errors("Coupon code entered was invalid or user is already using a coupon. You can give them a credit instead."); } else { main::errors("Coupon code entered was invalid or the user is already using this coupon."); } } else { main::redirect("?page=invoices&view=" . $getvar['view']); } } } } if ($_POST['submitcredit']) { $postvar['credit'] = str_replace(array(" ", ","), array("", "."), $postvar['credit']); if (!is_numeric($postvar['credit'])) { main::errors("Please enter the amount to be credited or debited."); } else { if ($postvar['creditreason']) { $creditreason = $postvar['creditreason']; $creditreason = ' <a title="' . $creditreason . '" class="tooltip"><img src="<URL>themes/icons/information.png"></a>'; $creditreason = str_replace(",", "", $creditreason); //Can't have commas, no way no how! ;) lol We need to be able to explode(",", $invoice_info['txn']); } if ($p2hid) { $credit_fee = $postvar['credit']; } else { $credit_fee = main::addzeros($postvar['credit']); } if ($credit_fee != 0) { if (substr_count($credit_fee, "-")) { $creditfee_lable = "CHARGE"; } else { $creditfee_lable = "CREDIT"; } $packinfo = main::uidtopack($userid, $pid); if (!$packinfo['user_data']['pid'] && !$p2hid) { $packinfo = upgrade::pidtobak($pid, $userid); } $monthly = $packinfo['additional']['monthly']; if ($p2hid) { $amt_owed = max(0, $monthly - coupons::totalposts($userid)); } else { $amt_owed = max(0, $monthly - coupons::totalpaid($invoiceid)); } if ($amt_owed == 0 && $creditfee_lable == "CREDIT") { main::errors("The user's balance is already paid in full, so you can't add a credit."); } else { if ($p2hid) { $p2h_info = $dbh->select("coupons_p2h", array("uid", "=", $userid)); if ($p2h_info['datepaid']) { $comma = ","; } $datepaid = $p2h_info['datepaid'] . $comma . time(); $txn = $p2h_info['txn'] . $comma . $creditfee_lable . $creditreason; $amt_paid = $p2h_info['amt_paid'] . $comma . $credit_fee; $gateway = $p2h_info['gateway'] . $comma . "INTERNAL"; $update_coupons_p2h = array("datepaid" => $datepaid, "txn" => $txn, "amt_paid" => $amt_paid, "gateway" => $gateway); $dbh->update("coupons_p2h", $update_coupons_p2h, array("uid", "=", $userid), "1"); } else { $invoice_info = $dbh->select("invoices", array("id", "=", $invoiceid)); if ($invoice_info['pid'] != $packinfo['pid']) { $pack_info = upgrade::pidtobak($invoice_info['pid'], $invoice_info["uid"]); } if ($invoice_info['datepaid']) { $comma = ","; } $datepaid = $invoice_info['datepaid'] . $comma . time(); $txn = $invoice_info['txn'] . $comma . $creditfee_lable . $creditreason; $amt_paid = $invoice_info['amt_paid'] . $comma . $credit_fee; $gateway = $invoice_info['gateway'] . $comma . "INTERNAL"; $update_invoices = array("datepaid" => $datepaid, "txn" => $txn, "amt_paid" => $amt_paid, "gateway" => $gateway); $dbh->update("invoices", $update_invoices, array("id", "=", $invoiceid), "1"); } main::redirect("?page=invoices&view=" . $getvar['view']); } } } } if ($_POST['submitpayarrange']) { $invoice_info = $dbh->select("invoices", array("id", "=", $invoiceid)); $duedate = $invoice_info['due']; $days_modify = $postvar['days']; $days_modify = $days_modify * 24 * 60 * 60; if ($postvar['addsub'] == "add") { $new_due_date = $duedate + $days_modify; } else { $new_due_date = $duedate - $days_modify; } $dbh->update("invoices", array("due" => $new_due_date), array("id", "=", $invoiceid), "1"); main::redirect("?page=invoices&view=" . $getvar['view']); } if ($p2hid) { $p2h_info = $dbh->select("users", array("id", "=", $p2hid)); } else { $invoice_info = $dbh->select("invoices", array("id", "=", $invoiceid)); } if (empty($invoice_info) && empty($p2h_info)) { main::redirect("?page=invoices"); exit; } if ($getvar['deleteinv']) { if ($postvar['yes']) { if ($p2hid) { $dbh->delete("coupons_p2h", array("uid", "=", $userid), "1"); main::redirect("?page=invoices&view=" . $getvar['view']); } else { $dbh->delete("invoices", array("id", "=", $invoiceid), "1"); main::redirect("?page=invoices"); } } elseif ($postvar['no']) { main::redirect("?page=invoices&view=" . $getvar['view']); } else { $warning_array['HIDDEN'] = "<input type = 'hidden' name = 'confirm' value = 'confirm'>"; echo style::replaceVar("tpl/warning.tpl", $warning_array); $warning_page = '1'; } } if ($userdata['removed'] == 1) { $upackage = $dbh->select("users_bak", array("id", "=", $userid)); } else { $upackage = $dbh->select("users", array("id", "=", $userid)); } if (!$p2hid) { $package = $dbh->select("packages", array("id", "=", $invoice_info['pid'])); } else { $package = $dbh->select("packages", array("id", "=", $upackage['pid'])); } $monthly = type::additional($package['id']); $subtotal = $monthly['monthly']; if (is_numeric($getvar['remove'])) { $remove_id = $getvar['remove']; if ($p2hid) { coupons::remove_p2h_coupon($remove_id, $userid); } else { coupons::remove_coupon($remove_id, $package['id'], $invoice_info['id'], $userid); } main::redirect("?page=invoices&view=" . $getvar['view']); exit; } if ($p2hid) { $due = date("m/t/Y"); $created = date("m/1/Y"); $p2h = $instance->packtypes["p2h"]; $monthly_with_disc = coupons::get_discount("p2hmonthly", $subtotal, $userid); $total_posts = $p2h->userposts($package['id'], $p2hid); $total_paid = coupons::totalposts($userid); if (empty($total_paid)) { $total_paid = 0; } if (empty($total_posts)) { $total_posts = 0; } $acct_balance = max(0, $monthly_with_disc - $total_paid); $view_invoice_array['BASEAMOUNT'] = $invoice_info['amount'] != $subtotal ? main::s($invoice_info['amount'], " Post") . " (Package price: " . main::s($subtotal, " Post") . ")" : main::s($invoice_info['amount'], " Post"); $view_invoice_array['COUPONTOTAL'] = main::s($subtotal - $monthly_with_disc, " Post"); $invoice_transactions_array['TOTALAMOUNT'] = main::s($acct_balance, " Post"); $invoice_transactions_array['TOTALPAID'] = main::s($total_paid, " Post"); $admin_ops_array['TOTALAMT'] = main::s($acct_balance, " Post"); $admin_ops_array['DELRESET'] = "Reset"; $admin_ops_modify_array['CREDIT'] = $acct_balance; $admin_ops_modify_array['CURRSYMBOL'] = ""; $admin_ops_modify_array['POSTS'] = " Posts"; } else { $created = $invoice_info['created']; $thirty_days = 30 * 24 * 60 * 60; $orig_due = $created + $thirty_days; if ($getvar['resetpayarange']) { $dbh->update("invoices", array("due" => $orig_due), array("id", "=", $invoiceid), "1"); main::redirect("?page=invoices&view=" . $invoiceid); } if (main::convertdate("n/d/Y", $invoice_info['due']) != main::convertdate("n/d/Y", $created + $thirty_days)) { $due_text = " (Originally " . main::convertdate("n/d/Y", $orig_due) . ") - <a href = '?page=invoices&view=" . $invoiceid . "&resetpayarange=1'>Reset</a>"; } $due = main::convertdate("n/d/Y", $invoice_info['due']); $created = main::convertdate("n/d/Y", $created); $total_paid_real = coupons::totalpaid($invoiceid); if ($total_paid_real < 0) { $total_paid = "0.00"; } else { $total_paid = $total_paid_real; } $acct_balance = $invoice_info['amount'] - $total_paid_real; $acct_balance = main::addzeros($acct_balance); if ($acct_balance < 0) { $acct_balance = "0.00"; } if ($acct_balance == 0 && $invoice_info['is_paid'] == '0') { $dbh->update("invoices", array("is_paid" => "1"), array("id", "=", $invoice_info['id']), "1"); unset($where); $where[] = array("id", "=", $invoice_info['uid'], "AND"); $where[] = array("status", "=", "4"); $dbh->update("users", array("status" => "1"), $where, "1"); unset($where); $where[] = array("id", "=", $invoice_info['uid'], "AND"); $where[] = array("status", "=", "4"); $dbh->update("users", array("status" => "1"), $where, "1"); main::redirect("?page=invoices&view=" . $invoiceid); } if ($acct_balance > 0 && $invoice_info['is_paid'] == '1') { $dbh->update("invoices", array("is_paid" => "0"), array("id", "=", $invoice_info['id']), "1"); main::redirect("?page=invoices&view=" . $invoiceid); } $view_invoice_array['BASEAMOUNT'] = $invoice_info['amount'] != $subtotal ? main::money($invoice_info['amount']) . " (Package price: " . main::money($subtotal) . ")" : main::money($invoice_info['amount']); $view_invoice_array['COUPONTOTAL'] = main::money($subtotal - coupons::get_discount("paid", $subtotal, $userid)); $invoice_transactions_array['TOTALAMOUNT'] = main::money($acct_balance); $invoice_transactions_array['TOTALPAID'] = main::money($total_paid); $admin_ops_array['TOTALAMT'] = main::money($acct_balance); $admin_ops_array['DELRESET'] = "Delete"; $admin_ops_modify_array['CREDIT'] = $acct_balance; $admin_ops_modify_array['CURRSYMBOL'] = main::money($acct_balance, "", 1) . " "; $admin_ops_modify_array['POSTS'] = ""; } $view_invoice_array['ID'] = $getvar['view']; $view_invoice_array['DUE'] = $due . $due_text; $view_invoice_array['PACKDUE'] = $due; $view_invoice_array['CREATED'] = $created; $view_invoice_array['UNAME'] = $userdata['user']; $view_invoice_array['FNAME'] = $userdata['firstname']; $view_invoice_array['LNAME'] = $userdata['lastname']; $view_invoice_array['ADDRESS'] = $userdata['address']; $view_invoice_array['CITY'] = $userdata['city']; $view_invoice_array['STATE'] = $userdata['state']; $view_invoice_array['ZIP'] = $userdata['zip']; $view_invoice_array['COUNTRY'] = strtoupper($userdata['country']); $view_invoice_array['DOMAIN'] = $upackage['domain']; $view_invoice_array['PACKAGE'] = $package['name']; $view_invoice_array['STATUS'] = $acct_balance == 0 ? "<font color = '#779500'>Paid</font>" : "<font color = '#FF7800'>Unpaid</font>"; if ($invoice_info['changed_plan'] && $invoice_info['hadcoupons']) { $coupon_list = explode(",", $invoice_info['hadcoupons']); $coupon_values = explode(",", $invoice_info['couponvals']); if ($coupon_list) { for ($i = 0; $i < count($coupon_list); $i++) { $coupons_list_array['COUPONAMOUNT'] = main::money($coupon_values[$i]); $coupons_list_array['COUPCODE'] = $coupon_list[$i]; $coupons_list_array['REMOVE'] = ""; $view_invoice_array['COUPONSLIST'] .= style::replaceVar("tpl/invoices/coupons-list.tpl", $coupons_list_array); $coup_total = $coup_total + $coupon_values[$i]; } $view_invoice_array['COUPONTOTAL'] = main::money(min($subtotal, $coup_total)); } } else { unset($where); $where[] = array("user", "=", $userid, "AND"); $where[] = array("disabled", "=", "0"); $coupons_query = $dbh->select("coupons_used", $where, array("id", "ASC"), 0, 1); while ($coupons_used_fetch = $dbh->fetch_array($coupons_query)) { $valid_coupon = coupons::check_expire($coupons_used_fetch['coupcode'], $userid); if ($valid_coupon) { if ($p2hid) { $coupamt = main::s($coupons_used_fetch['p2hmonthlydisc'], " Post"); } else { $coupamt = main::money($coupons_used_fetch['paiddisc']); } $coupons_list_array['COUPONAMOUNT'] = $coupamt; $coupons_list_array['COUPCODE'] = $coupons_used_fetch['coupcode']; $coupons_list_array['REMOVE'] = $userdata['removed'] == 1 ? "" : '(<a href = "?page=invoices&view=' . $getvar['view'] . '&remove=' . $coupons_used_fetch['id'] . '">Remove</a>)'; $view_invoice_array['COUPONSLIST'] .= style::replaceVar("tpl/invoices/coupons-list.tpl", $coupons_list_array); } } } if (!$view_invoice_array['COUPONSLIST']) { $view_invoice_array['COUPONSLIST'] = "<tr><td></td><td align = 'center'>None</td></tr>"; } if ($p2hid) { $p2h_payments = $dbh->select("coupons_p2h", array("uid", "=", $userid)); $package_info = main::uidtopack($userid); if (empty($p2h_payments)) { $p2h_pay_array = array("uid" => $userid, "amt_paid" => $total_posts, "txn" => $package_info['uadditional']['fuser'], "datepaid" => time(), "gateway" => $package_info['additional']['forum']); $dbh->insert("coupons_p2h", $p2h_pay_array); $p2h_payments = $dbh->select("coupons_p2h", array("uid", "=", $userid)); } $amt_paid = $p2h_payments['amt_paid']; $txn = $p2h_payments['txn']; $datepaid = $p2h_payments['datepaid']; $gateway = $p2h_payments['gateway']; } else { $amt_paid = $invoice_info['amt_paid']; $txn = $invoice_info['txn']; $datepaid = $invoice_info['datepaid']; $gateway = $invoice_info['gateway']; } $amt_paid = explode(",", $amt_paid); $txn = explode(",", $txn); $datepaid = explode(",", $datepaid); $gateway = explode(",", $gateway); $remnum = 1; for ($i = 0; $i < count($amt_paid); $i++) { unset($remtxn); if ($gateway[$i] == "INTERNAL" && !$userdata['removed']) { $remtxn = ' <a href = "?page=invoices&view=' . $getvar['view'] . '&remtxn=' . $remnum . '">[Delete]</a>'; } if ($txn[$i] == $package_info['uadditional']['fuser']) { if ($amt_paid[$i] != $total_posts) { $reload = 1; } $amt_paid[$i] = $total_posts; $datepaid[$i] = time(); } $paid_this = $paid_this + $amt_paid[$i]; if ($p2hid) { $transaction_list_array['PAIDAMOUNT'] = main::s(str_replace("-", "−", $amt_paid[$i]), " Post") . $remtxn; } else { $transaction_list_array['PAIDAMOUNT'] = main::money($amt_paid[$i]) . $remtxn; } $transaction_list_array['TXN'] = $txn[$i]; $transaction_list_array['PAIDDATE'] = main::convertdate("n/d/Y", $datepaid[$i]); $transaction_list_array['GATEWAY'] = $gateway[$i]; $invoice_transactions_array['TXNS'] .= style::replaceVar("tpl/invoices/transaction-list.tpl", $transaction_list_array); if ($getvar['remtxn'] != $i + 1) { $paidamts = $paidamts . "," . $amt_paid[$i]; $paidtxn = $paidtxn . "," . $txn[$i]; $paiddate = $paiddate . "," . $datepaid[$i]; $paidgateway = $paidgateway . "," . $gateway[$i]; } $remnum++; } if ($p2hid) { $paidamts = substr($paidamts, 1, strlen($paidamts)); $paidtxn = substr($paidtxn, 1, strlen($paidtxn)); $paiddate = substr($paiddate, 1, strlen($paiddate)); $paidgateway = substr($paidgateway, 1, strlen($paidgateway)); $p2h_pay_array = array("amt_paid" => $paidamts, "txn" => $paidtxn, "datepaid" => $paiddate, "gateway" => $paidgateway); unset($where); $where[] = array("uid", "=", $userid); $dbh->update("coupons_p2h", $p2h_pay_array, $where); if ($getvar['remtxn'] || $reload) { main::redirect("?page=invoices&view=" . $getvar['view']); } } else { if ($getvar['remtxn']) { $paidamts = substr($paidamts, 1, strlen($paidamts)); $paidtxn = substr($paidtxn, 1, strlen($paidtxn)); $paiddate = substr($paiddate, 1, strlen($paiddate)); $paidgateway = substr($paidgateway, 1, strlen($paidgateway)); $update_invoices = array("amt_paid" => $paidamts, "txn" => $paidtxn, "datepaid" => $paiddate, "gateway" => $paidgateway); $dbh->update("invoices", $update_invoices, array("id", "=", $invoiceid), "1"); main::redirect("?page=invoices&view=" . $invoiceid); } } if ($invoice_info['amt_paid'] || $p2hid) { $view_invoice_array['TRANSACTIONS'] = style::replaceVar("tpl/invoices/invoice-transactions.tpl", $invoice_transactions_array); } $addsub[] = array("Add", "add"); $addsub[] = array("Subtract", "subtract"); $days[] = array("1 Day", "1"); for ($num = 2; $num < 31; $num++) { $days[] = array($num . " Days", $num); } $payment_arrangments_array['ADDSUB'] = main::dropDown("addsub", $addsub, "add", 0); $payment_arrangments_array['DAYS'] = main::dropDown("days", $days, 1, 0); if ($userdata['removed'] == 1) { $admin_ops_array['MODIFYFUNCS'] = ' <tr> <td align="center" colspan = "2"><font color = "#FF0055"><strong>The owner of this invoice has been dismembered. Er... I mean the member who owned this invoice has been removed.</strong></font></td> </tr>'; } else { if (!$p2hid) { $admin_ops_modify_array['PAYARRANGE'] = style::replaceVar("tpl/admin/invoices/payment-arrangments.tpl", $payment_arrangments_array); } else { $admin_ops_modify_array['PAYARRANGE'] = ""; } $admin_ops_array['MODIFYFUNCS'] = style::replaceVar("tpl/admin/invoices/admin-ops-modify.tpl", $admin_ops_modify_array); if ($invoice_info['changed_plan']) { $admin_ops_array['MODIFYFUNCS'] .= ' <tr> <td align="center" colspan = "2"><font color = "#FF0055"><strong>The owner of this invoice has upgraded their account and this is an invoice from an old account.</strong></font></td> </tr>'; } } $view_invoice_array['TRANSACTIONS'] .= style::replaceVar("tpl/admin/invoices/admin-ops.tpl", $admin_ops_array); if (!$warning_page) { echo style::replaceVar("tpl/invoices/view-invoice.tpl", $view_invoice_array); } } else { //Display the invoice list //Status search $showstatus = "all"; if ($postvar['submitstatus']) { $showstatus = $postvar['status']; } //End ststus search //Type search $showtype = "all"; if ($postvar['submittype']) { $showtype = $postvar['invtype']; } //End type search $users[] = array("All", "all"); $users[] = array("Orphans", "orphans"); $users_query = $dbh->select("users", 0, array("user", "ASC")); while ($users_data = $dbh->fetch_array($users_query)) { $users[] = array($users_data['user'], $users_data['id']); } //User search $users_default = "all"; if ($postvar['submitusers']) { $users_default = $postvar['users']; if ($users_default != "all" && $users_default != "orphans") { $show_user = array("uid", "=", $users_default); $show_p2h_user_where = array("id", "=", $users_default, "AND"); $username = main::uname($users_default); $for_user = "******" . $username; } } //End user search $num_invoices = 0; $num_paid = 0; $num_unpaid = 0; $total_unpaid = 0; if ($showtype == "all" || $showtype == "p2h") { $p2h_query = $dbh->select("packages", array("type", "=", "p2h"), 0, 0, 1); while ($p2h_data = $dbh->fetch_array($p2h_query)) { $show_p2h_user_where[] = array("pid", "=", $p2h_data['id']); $user_query = $dbh->select("users", $show_p2h_user_where, 0, 0, 1); while ($user_data = $dbh->fetch_array($user_query)) { unset($user_show); unset($orphaned); $user_show = main::uname($user_data["id"]); if (!$user_show) { $user_show = '<font color = "FF0055">ORPHANED</font>'; $orphaned = 1; } if ($orphaned && $users_default == "orphans" || $users_default != "orphans") { $pack_info = main::uidtopack($user_data['id']); $p2h = $instance->packtypes["p2h"]; $monthly = $pack_info['additional']['monthly']; $monthly_with_disc = coupons::get_discount("p2hmonthly", $monthly, $user_data['id']); $userposts = coupons::totalposts($user_data['id']); $invoice_list_item_array['ID'] = "P2H-" . $user_data['id']; $invoice_list_item_array['USERFIELD'] = '<td width="100" align="center">' . $user_show . '</td>'; $invoice_list_item_array['DUE'] = main::convertdate("n/d/Y", mktime(date("H"), date("i"), date("s"), date("n"), date("t"), date("Y"))); $invoice_list_item_array['CREATED'] = main::convertdate("n/d/Y", mktime(date("H"), date("i"), date("s"), date("n"), 1, date("Y"))); $invoice_list_item_array['AMOUNT'] = main::s($monthly, " Post"); $invoice_list_item_array['AMTPAID'] = main::s($userposts, " Post"); if ($showstatus == "unpaid" || $showstatus == "all") { if ($monthly_with_disc - $userposts > 0) { $pulled = 1; $invoice_list_item_array["PAID"] = "<font color = '#FF7800'>Unpaid</font>"; $admin_page_array['LIST'] .= style::replaceVar("tpl/invoices/invoice-list-item.tpl", $invoice_list_item_array); } } if ($showstatus == "paid" || $showstatus == "all" && !$pulled) { if ($monthly_with_disc - $userposts <= 0) { $invoice_list_item_array["PAID"] = "<font color = '#779500'>Paid</font>"; $admin_page_array['LIST'] .= style::replaceVar("tpl/invoices/invoice-list-item.tpl", $invoice_list_item_array); } } if ($monthly_with_disc - $userposts > 0) { $total_unpaid = $total_unpaid + 1; } $pulled = 0; $num_invoices = $num_invoices + 1; } } } } if ($showtype == "all" || $showtype == "paid") { $invoices_query = $dbh->select("invoices", $show_user, array("id", "DESC"), 0, 1); while ($invoices_data = $dbh->fetch_array($invoices_query)) { unset($user_show); unset($orphaned); unset($invoice_locked); $user_show = main::uname($invoices_data["uid"]); if (!$user_show) { $user_show = '<font color = "FF0055">ORPHANED</font>'; $orphaned = 1; } if ($orphaned && $users_default == "orphans" || $users_default != "orphans") { $pack_info = main::uidtopack($invoices_data["uid"], $invoices_data['pid']); if (!$invoices_data['pid']) { $dbh->update("invoices", array("pid" => $pack_info['user_data']['pid']), array("id", "=", $invoices_data['id'])); $invoices_data['pid'] = $pack_info['user_data']['pid']; } if ($invoices_data['pid'] != $pack_info['user_data']['pid']) { $pack_info = upgrade::pidtobak($invoices_data['pid'], $invoices_data["uid"]); } $invoice_list_item_array['ID'] = $invoices_data['id']; $invoice_list_item_array['USERFIELD'] = '<td width="100" align="center">' . $user_show . '</td>'; $invoice_list_item_array['DUE'] = main::convertdate("n/d/Y", $invoices_data['due']); $invoice_list_item_array['CREATED'] = main::convertdate("n/d/Y", $invoices_data['created']); $total_paid_real = coupons::totalpaid($invoices_data['id']); $invoice_list_item_array['AMOUNT'] = main::money($invoices_data['amount']); $invoice_list_item_array['AMTPAID'] = main::money($total_paid_real); if ($showstatus == "unpaid" || $showstatus == "all") { if ($invoices_data["is_paid"] == 0) { $pulled = 1; $invoice_list_item_array["PAID"] = "<font color = '#FF7800'>Unpaid</font>" . $invoice_locked; $admin_page_array['LIST'] .= style::replaceVar("tpl/invoices/invoice-list-item.tpl", $invoice_list_item_array); } } if ($showstatus == "paid" || $showstatus == "all" && !$pulled) { if ($invoices_data["is_paid"] == 1) { $invoice_list_item_array["PAID"] = "<font color = '#779500'>Paid</font>" . $invoice_locked; $admin_page_array['LIST'] .= style::replaceVar("tpl/invoices/invoice-list-item.tpl", $invoice_list_item_array); } } if ($invoices_data["is_paid"] == 0) { $total_unpaid = $total_unpaid + 1; } $pulled = 0; $num_invoices = $num_invoices + 1; } } } if (!$admin_page_array['LIST']) { $admin_page_array['LIST'] = "<tr>\n<td colspan = '7' align = 'center'>There are not currently any invoices to show.</td>\n</tr>"; } $statusopts[] = array("All", "all"); $statusopts[] = array("Unpaid", "unpaid"); $statusopts[] = array("Paid", "paid"); $typeopts[] = array("All", "all"); $typeopts[] = array("P2H", "p2h"); $typeopts[] = array("Paid", "paid"); $admin_page_array['USERS'] = main::dropDown("users", $users, $users_default, 0); $admin_page_array['TYPEOPTS'] = main::dropDown("invtype", $typeopts, $showtype, 0); $admin_page_array['STATUSOPTS'] = main::dropDown("status", $statusopts, $showstatus, 0); $admin_page_array['FORUSER'] = $for_user; $admin_page_array['NUM'] = $num_invoices; $admin_page_array['NUMPAID'] = $num_invoices - $total_unpaid; $admin_page_array['NUMUNPAID'] = $total_unpaid; echo style::replaceVar("tpl/admin/invoices/admin-page.tpl", $admin_page_array); } }
function validate_ipn() { global $dbh, $postvar, $getvar, $instance; $invoice_id = $getvar['invoiceID']; $url_parsed = parse_url($this->paypal_url); $post_string = ''; foreach ($postvar as $field => $value) { $this->ipn_data["{$field}"] = $value; $post_string .= $field . '=' . urlencode($value) . '&'; } $post_string .= "cmd=_notify-validate"; $fp = fsockopen("ssl://" . $url_parsed[host], "443", $err_num, $err_str, 30); if (!$fp) { // could not open the connection. If logging is on, the error message // will be in the logged. $this->last_error = "fsockopen error no. {$err_num}: {$err_str}"; $this->log_ipn_results(false); return false; } else { // Post the data back to paypal fputs($fp, "POST /cgi-bin/webscr HTTP/1.0\r\n"); fputs($fp, "Content-Type: application/x-www-form-urlencoded\r\n"); fputs($fp, "Content-Length: " . strlen($post_string) . "\r\n\r\n"); fputs($fp, $post_string . "\r\n\r\n"); // loop through the response from the server and append to variable while (!feof($fp)) { $this->ipn_response .= fgets($fp, 1024); } fclose($fp); // close connection } $invoice_info = $dbh->select("invoices", array("id", "=", $invoice_id)); $due_date = $invoice_info['due']; $amt_paid = $invoice_info['amt_paid']; $txn = $invoice_info['txn']; $datepaid = $invoice_info['datepaid']; $gateway = $invoice_info['gateway']; if ($amt_paid) { $amt_paid = $amt_paid . "," . $this->ipn_data["mc_gross"]; } else { $amt_paid = $this->ipn_data["mc_gross"]; } if ($this->ipn_data["parent_txn_id"]) { $new_txn = $this->ipn_data["parent_txn_id"]; } else { $new_txn = $this->ipn_data["txn_id"]; } if ($txn) { $txn = $txn . "," . $new_txn; } else { $txn = $new_txn; } if ($datepaid) { $datepaid = $datepaid . "," . time(); } else { $datepaid = time(); } if ($gateway) { $gateway = $gateway . ",PayPal"; } else { $gateway = "PayPal"; } if ($this->ipn_data["mc_gross"] < 0) { //As the transaction was revered or refunded, we need to set the is_paid flag to 0 and make sure they don't get terminated if this was an //invoice older than 30 days. if (is_numeric($invoice_id)) { $total_paid = coupons::totalpaid($invoice_id) + $this->ipn_data["mc_gross"]; if ($invoice_info['amount'] > $total_paid) { $suspenddays = intval($dbh->config('suspensiondays')); $suspendseconds = $suspenddays * 24 * 60 * 60; $time = time(); if ($time - $suspendseconds > intval($due_date)) { $due_date = $time - $suspendseconds; } $amt_due = array("is_paid" => "0", "due" => $due_date); } $gateway = $gateway . " (Reversal)"; $invoices_update = array("amt_paid" => $amt_paid, "txn" => $txn, "datepaid" => $datepaid, "gateway" => $gateway); if ($amt_due) { $invoices_update = array_merge($invoices_update, $amt_due); } $dbh->update("invoices", $invoices_update, array("id", "=", $invoice_id)); } $this->log_ipn_results(true); } if (eregi("VERIFIED", $this->ipn_response)) { // Valid IPN transaction. $this->log_ipn_results(true); $invoices_update = array("amt_paid" => $amt_paid, "txn" => $txn, "datepaid" => $datepaid, "gateway" => $gateway); $dbh->update("invoices", $invoices_update, array("id", "=", $invoice_id)); $total_paid = coupons::totalpaid($invoice_id); if ($invoice_info['amount'] > $total_paid) { return false; } else { return true; } } else { // Invalid IPN transaction. Check the log for details. $this->last_error = 'IPN Validation Failed.'; $this->log_ipn_results(false); return false; } }
public function prorate($pid, $coupcode = "", $userid = "", $admin = "") { global $dbh, $postvar, $getvar, $instance; if (!$userid) { $userid = $_SESSION['cuser']; } $upackinfo = main::uidtopack($userid); $umonthly = $upackinfo['additional']['monthly']; $usignup = $upackinfo['additional']['signup']; $utype = $upackinfo['packages']['type']; $pack_data = $dbh->select("packages", array("id", "=", $pid)); $packinfo = type::additional($pid); $monthly = $packinfo['monthly']; $signup = $packinfo['signup']; $pack_type = $pack_data['type']; //For P2H $umonthly_discount = max(0, coupons::get_discount("p2hmonthly", $umonthly, $userid)); if ($coupcode) { $user = main::uname($userid); $response = coupons::validate_coupon($coupcode, "orders", $user, $pid); if ($response) { $coup_data = coupons::coupon_data($coupcode); $signup = max(0, $signup - $coup_data['p2hinitdisc']); } } switch ($utype) { case "free": switch ($pack_type) { case "free": //No need to prorate it. return "now"; break; case "paid": //No need to prorate it. return "now"; break; case "p2h": if ($upackinfo['uadditional']['fuser']) { $total_posts = coupons::totalposts($userid, $pid); if ($total_posts < $signup) { $inelegible = 1; } } else { $check = 1; } if (!$inelegible && !$check || $admin && !$check) { //They haven't paid yet, so they can get the account changed now. return "now"; } elseif ($inelegible && !$admin) { //They don't have the required number of posts made to be allowed to switch to this plan. return "inelegible"; } elseif ($check) { //We need to check if they have enough posts to be allowed to change the plan. This means the user has to enter their credentials for the forum since we don't have it yet. return "check"; } break; } break; case "paid": unset($where); $where[] = array("uid", "=", $userid, "AND"); $where[] = array("changed_plan", "=", "0"); $invoices_query = $dbh->select("invoices", $where, 0, 0, 1); while ($invoices_data = $dbh->fetch_array($invoices_query)) { $paid = coupons::totalpaid($invoices_data['id']); if ($paid >= $invoices_data['amount'] && $paid > 0) { $amt_owed = $monthly - $paid; $prorate = 1; } if ($paid < $invoices_data['amount']) { //They change to a different paid plan only. The new plan will be added to the newest invoice anyway. $owes_money = 1; } if ($not_first_pull) { //This avoids having someone upgrade and not pay that bill, then upgrade again and not pay that bit, etc. The system only charges //the upgrade price and keeps the transactions on the last invoice. This means that if you have a plan for $2, $3, $4, and $5, then //the user can simply upgrade until they're on the highest plan and and pay only a couple bucks more than the plan they started on, //all the while receiving free months of service. Then they downgrade to the lowest plan the next month and it starts over again. //So we need to know if the user paid last month's bill along with the other bills before it so they can upgrade only if they did. $cant_upgrade = $owes_money; } $not_first_pull = 1; } switch ($pack_type) { case "free": if ($owes_money && !$admin) { //Total paid is less than $0, so that means they've been charged for something. We can't let then leave the paid plan system so the invoice isn't lost. return "owe"; } else { //Next month they become a free member $upgrade_today = self::upgrade_today($utype, $userid); if ($upgrade_today) { return "now"; } else { return "next"; } } break; case "paid": if ($monthly > $umonthly && $owes_money || !$owes_money && !$cant_upgrade) { if ($monthly < $umonthly) { //Next month they will be downgraded. $upgrade_today = self::upgrade_today($utype, $userid); if ($upgrade_today) { return "now"; } else { return "next"; } } else { //Amount they owe for their account. //See comment above. if ($cant_upgrade && !$admin) { return "owe"; } else { if ($admin) { return "now"; } else { return $amt_owed; } } } } else { //Total paid is less than $0, so that means they've been charged for something. We can't let then leave the paid plan system so the invoice isn't lost. //They need to choose a higher paid package so they don't ignore the bill and use a higher plan until its payment time, then downgrade, pay that bill, //then upgrade after cron sees its paid, and repeat that. If they have a fully paid bill, they can downgrade. If they want to upgrade, they can. return "owe"; } break; case "p2h": if ($upackinfo['uadditional']['fuser']) { $total_posts = coupons::totalposts($userid, $pid); if ($total_posts < $signup) { $inelegible = 1; } } else { $check = 1; } if ($owes_money && !$admin) { //Total paid is less than $0, so that means they've been charged for something. We can't let then leave the paid plan system so the invoice isn't lost. return "owe"; } elseif ($inelegible && !$admin) { //They don't have the required number of posts made to be allowed to switch to this plan. return "inelegible"; } elseif ($check) { //We need to check if they have enough posts to be allowed to change the plan. This means the user has to enter their credentials for the forum since we don't have it yet. $upgrade_today = self::upgrade_today($utype, $userid); if ($upgrade_today) { return "check now"; } else { return "check next"; } } elseif ($prorate) { //Next month they become a p2h member $upgrade_today = self::upgrade_today($utype, $userid); if ($upgrade_today) { return "now"; } else { return "next"; } } break; } break; case "p2h": $total_posts = coupons::totalposts($userid, $pid); if ($total_posts < $signup) { $inelegible = 1; } if ($umonthly_discount > $total_posts) { //Loophole prevention. ;) I doubt anyone would mind that I let them upgrade to paid packages if they don't have enough posts. Besides, //it has its own loophole prevention anyway. $oweposts = 1; } switch ($pack_type) { case "free": if ($oweposts && !$admin) { return "oweposts"; } else { return "now"; } break; case "paid": //No need to prorate it. return "now"; break; case "p2h": if ($inelegible && !$admin) { //They don't have the required number of posts made to be allowed to switch to this plan. return "inelegible"; } else { if ($oweposts && !$admin) { return "oweposts"; } else { //They qualify, so they can upgrade. return "now"; } } break; } break; } }
public function content() { global $dbh, $postvar, $getvar, $instance; if (is_numeric($getvar['view'])) { //Show the invoice unset($where); $where[] = array("uid", "=", $_SESSION['cuser'], "AND"); $where[] = array("id", "=", $getvar['view']); $invoice_info_top = $dbh->select("invoices", $where); $pack_data_top = main::uidtopack(); if (!$invoice_info_top['pid']) { $dbh->update("invoices", array("pid" => $pack_data_top['user_data']['pid']), array("id", "=", $invoice_info_top['id'])); $invoice_info_top['pid'] = $pack_data_top['user_data']['pid']; } if ($_POST['submitaddcoupon']) { if (!$postvar['addcoupon']) { main::errors("Please enter a coupon code or click the checkout button."); } else { $coupcode = $postvar['addcoupon']; $user = main::uname($_SESSION['cuser']); $pack_data = main::uidtopack(); if ($invoice_info_top['pid'] != $pack_data['user_data']['pid']) { $pack_data = upgrade::pidtobak($invoice_info_top['pid']); } $packid = $pack_data['packages']['id']; $multi_coupons = $dbh->config("multicoupons"); $coupon_info = coupons::coupon_data($coupcode); $coupid = $coupon_info['id']; $use_coupon = coupons::use_coupon($coupid, $packid, $getvar['view']); if (!$use_coupon) { if (!$multi_coupons) { main::errors("Coupon code entered was invalid or you're already using a coupon."); } else { main::errors("Coupon code entered was invalid."); } } else { main::redirect("?page=invoices&view=" . $getvar['view']); } } } unset($where); $where[] = array("uid", "=", $_SESSION['cuser'], "AND"); $where[] = array("id", "=", $getvar['view']); $invoice_info = $dbh->select("invoices", $where); if (empty($invoice_info)) { main::redirect("?page=invoices"); exit; } $package = $dbh->select("packages", array("id", "=", $invoice_info['pid'])); $monthly = type::additional($package['id']); $subtotal = $monthly['monthly']; if (is_numeric($getvar['remove'])) { $remove_id = $getvar['remove']; $remove = coupons::remove_coupon($remove_id, $package['id'], $invoice_info['id'], $_SESSION['cuser']); main::redirect("?page=invoices&view=" . $invoice_info['id']); exit; } $total_paid_real = coupons::totalpaid($getvar['view']); if ($total_paid_real < 0) { $total_paid = "0.00"; } else { $total_paid = $total_paid_real; } $acct_balance = coupons::get_discount("paid", $subtotal) - $total_paid_real; if ($acct_balance < 0) { $acct_balance = "0.00"; } $acct_balance = main::addzeros($acct_balance); if ($acct_balance == 0 && $invoice_info['is_paid'] == '0') { $dbh->update("invoices", array("is_paid" => "1"), array("id", "=", $invoice_info['id']), "1"); main::redirect("?page=invoices&view=" . $invoice_info['id']); } if ($acct_balance > 0 && $invoice_info['is_paid'] == '1') { $dbh->update("invoices", array("is_paid" => "0"), array("id", "=", $invoice_info['id']), "1"); main::redirect("?page=invoices&view=" . $invoice_info['id']); } if ($_POST['checkout']) { $postvar['paythis'] = str_replace(array(" ", ","), array("", "."), $postvar['paythis']); if (!is_numeric($postvar['paythis'])) { main::errors("Please enter the amount you wish to pay today."); } else { if ($postvar['paythis'] > $acct_balance || $acct_balance <= 0) { main::errors("You can't pay more than you owe. =)"); } else { $dbh->update("invoices", array("pay_now" => $postvar['paythis']), array("id", "=", $getvar['view'])); main::redirect("?page=invoices&iid=" . $getvar['view']); exit; } } } $created = $invoice_info['created']; $thirty_days = 30 * 24 * 60 * 60; $orig_due = $created + $thirty_days; if (main::convertdate("n/d/Y", $invoice_info['due']) != main::convertdate("n/d/Y", $created + $thirty_days)) { $due_text = " (Originally " . main::convertdate("n/d/Y", $orig_due) . ")"; } $due = main::convertdate("n/d/Y", $invoice_info['due']); $client = $dbh->client($_SESSION['cuser']); $invoice_transactions_array['TOTALAMOUNT'] = main::money($acct_balance); $invoice_transactions_array['TOTALPAID'] = main::money($total_paid); $pay_invoice_array['TOTALAMT'] = main::money($acct_balance); $pay_invoice_array['PAYBALANCE'] = $acct_balance; $pay_invoice_array['CURRSYMBOL'] = main::money($acct_balance, "", 1); $pay_invoice_array['PACKID'] = $invoice_info['pid']; $pay_invoice_array['USER'] = $client['user']; $view_invoice_array['ID'] = $invoice_info['id']; $view_invoice_array['DUE'] = $due . $due_text; $view_invoice_array['PACKDUE'] = $due; $view_invoice_array['CREATED'] = main::convertdate("n/d/Y", $created); $view_invoice_array['BASEAMOUNT'] = $invoice_info['amount'] != $subtotal ? main::money($invoice_info['amount']) . " (Package price: " . main::money($subtotal) . ")" : main::money($invoice_info['amount']); $view_invoice_array['BALANCE'] = main::money($acct_balance); $view_invoice_array['COUPONTOTAL'] = main::money($subtotal - coupons::get_discount("paid", $subtotal)); $view_invoice_array['UNAME'] = $client['user']; $view_invoice_array['FNAME'] = $client['firstname']; $view_invoice_array['LNAME'] = $client['lastname']; $view_invoice_array['ADDRESS'] = $client['address']; $view_invoice_array['CITY'] = $client['city']; $view_invoice_array['STATE'] = $client['state']; $view_invoice_array['ZIP'] = $client['zip']; $view_invoice_array['COUNTRY'] = strtoupper($client['country']); $view_invoice_array['DOMAIN'] = $client['domain']; $view_invoice_array['PACKAGE'] = $package['name']; $view_invoice_array['STATUS'] = $invoice_info["is_paid"] == 1 ? "<font color = '#779500'>Paid</font>" : "<font color = '#FF7800'>Unpaid</font>"; if ($invoice_info['changed_plan'] && $invoice_info['hadcoupons']) { $coupon_list = explode(",", $invoice_info['hadcoupons']); $coupon_values = explode(",", $invoice_info['couponvals']); if ($coupon_list) { for ($i = 0; $i < count($coupon_list); $i++) { $coupons_list_array['COUPONAMOUNT'] = main::money($coupon_values[$i]); $coupons_list_array['COUPCODE'] = $coupon_list[$i]; $coupons_list_array['REMOVE'] = ""; $view_invoice_array['COUPONSLIST'] .= style::replaceVar("tpl/invoices/coupons-list.tpl", $coupons_list_array); $coup_total = $coup_total + $coupon_values[$i]; } $view_invoice_array['COUPONTOTAL'] = main::money(min($subtotal, $coup_total)); } } else { unset($where); $where[] = array("user", "=", $client['id'], "AND"); $where[] = array("disabled", "=", "0"); $coupons_query = $dbh->select("coupons_used", $where, array("id", "ASC"), 0, 1); while ($coupons_used_fetch = $dbh->fetch_array($coupons_query)) { $valid_coupon = coupons::check_expire($coupons_used_fetch['coupcode'], $client['id']); if ($valid_coupon) { $coupons_list_array['COUPONAMOUNT'] = main::money($coupons_used_fetch['paiddisc']); $coupons_list_array['COUPCODE'] = $coupons_used_fetch['coupcode']; $coupons_list_array['REMOVE'] = $invoice_info['is_paid'] == 1 ? "" : '(<a href = "?page=invoices&view=' . $invoice_info['id'] . '&remove=' . $coupons_used_fetch['id'] . '">Remove</a>)'; $view_invoice_array['COUPONSLIST'] .= style::replaceVar("tpl/invoices/coupons-list.tpl", $coupons_list_array); } } if (!$view_invoice_array['COUPONSLIST']) { $view_invoice_array['COUPONSLIST'] = "<tr><td></td><td align = 'center'>None</td></tr>"; } } $amt_paid = $invoice_info['amt_paid']; $txn = $invoice_info['txn']; $datepaid = $invoice_info['datepaid']; $gateway = $invoice_info['gateway']; $amt_paid = explode(",", $amt_paid); $txn = explode(",", $txn); $datepaid = explode(",", $datepaid); $gateway = explode(",", $gateway); $view_invoice_array['TRANSACTIONS'] = ""; for ($i = 0; $i < count($amt_paid); $i++) { $paid_this = $paid_this + $amt_paid[$i]; $transaction_list_array['PAIDAMOUNT'] = main::money($amt_paid[$i]); $transaction_list_array['TXN'] = $txn[$i]; $transaction_list_array['PAIDDATE'] = main::convertdate("n/d/Y", $datepaid[$i]); $transaction_list_array['GATEWAY'] = $gateway[$i]; $invoice_transactions_array['TXNS'] .= style::replaceVar("tpl/invoices/transaction-list.tpl", $transaction_list_array); } if ($invoice_info["is_paid"]) { if (!$invoice_info['amt_paid']) { $invoice_transactions_array['TXNS'] = "<tr><td colspan = '4' align = 'center'><b>--- None ---</b></td></tr>"; } $view_invoice_array['TRANSACTIONS'] = style::replaceVar("tpl/invoices/invoice-transactions.tpl", $invoice_transactions_array); } else { if ($invoice_info['amt_paid']) { $view_invoice_array['TRANSACTIONS'] = style::replaceVar("tpl/invoices/invoice-transactions.tpl", $invoice_transactions_array); } $view_invoice_array['TRANSACTIONS'] .= style::replaceVar("tpl/client/invoices/pay-invoice.tpl", $pay_invoice_array); } echo style::replaceVar("tpl/invoices/view-invoice.tpl", $view_invoice_array); } else { //Show the list of invoices $pack_info = main::uidtopack(); $invoices_query = $dbh->select("invoices", array("uid", "=", $_SESSION['cuser']), array("id", "DESC"), 0, 1); $client_page_array['LIST'] = ""; while ($invoices_data = $dbh->fetch_array($invoices_query)) { if (!$invoices_data['pid']) { $dbh->update("invoices", array("pid" => $pack_info['user_data']['pid']), array("id", "=", $invoices_data['id'])); $invoices_data['pid'] = $pack_info['user_data']['pid']; } if ($invoices_data['pid'] != $pack_info['user_data']['pid']) { $pack_info = upgrade::pidtobak($invoices_data['pid']); } $monthly = $pack_info['additional']['monthly']; $invoice_list_item_array['ID'] = $invoices_data['id']; $invoice_list_item_array['USERFIELD'] = ""; $invoice_list_item_array['DUE'] = main::convertdate("n/d/Y", $invoices_data['due']); $invoice_list_item_array['CREATED'] = main::convertdate("n/d/Y", $invoices_data['created']); $invoice_list_item_array["PAID"] = $invoices_data["is_paid"] == 1 ? "<font color = '#779500'>Paid</font>" : "<font color = '#FF7800'>Unpaid</font>"; $invoice_list_item_array['AMOUNT'] = main::money($invoices_data['amount']); $invoice_list_item_array['AMTPAID'] = main::money(coupons::totalpaid($invoices_data['id'])); $client_page_array['LIST'] .= style::replaceVar("tpl/invoices/invoice-list-item.tpl", $invoice_list_item_array); } $client_page_array['NUM'] = $dbh->num_rows($invoices_query); if ($client_page_array['NUM'] == 0) { $client_page_array['LIST'] = "<tr>\n<td colspan = '6' align = 'center'>You currently do not have any invoices.</td>\n</tr>"; } echo style::replaceVar("tpl/client/invoices/client-page.tpl", $client_page_array); } }