function applyCredit($invoiceid, $userid, $amount, $noemail = "") { $amount = round($amount, 2); update_query("tblclients", array("credit" => "-=" . $amount), array("id" => (int) $userid)); update_query("tblinvoices", array("credit" => "+=" . $amount), array("id" => (int) $invoiceid)); insert_query("tblcredit", array("clientid" => $userid, "date" => "now()", "description" => "Credit Applied to Invoice #" . $invoiceid, "amount" => $amount * (0 - 1))); logActivity("Credit Applied - Amount: " . $amount . " - Invoice ID: " . $invoiceid, $userid); updateInvoiceTotal($invoiceid); $result = select_query("tblinvoices", "total", array("id" => $invoiceid)); $data = mysql_fetch_array($result); $total = $data['total']; $result = select_query("tblaccounts", "SUM(amountin)-SUM(amountout)", array("invoiceid" => $invoiceid)); $data = mysql_fetch_array($result); $amountpaid = $data[0]; $balance = $total - $amountpaid; if ($balance <= 0) { processPaidInvoice($invoiceid, $noemail); } }
} updateInvoiceTotal($invoiceid); if ($_POST['sendinvoice']) { sendMessage("Invoice Created", $invoiceid); } if ($autoapplycredit) { $result = select_query("tblclients", "credit", array("id" => $userid)); $data = mysql_fetch_array($result); $credit = $data['credit']; $result = select_query("tblinvoices", "total", array("id" => $invoiceid)); $data = mysql_fetch_array($result); $total = $data['total']; if (0 < $credit) { $doprocesspaid = ""; if ($total <= $credit) { $creditleft = $credit - $total; $credit = $total; $doprocesspaid = true; } else { $creditleft = 0; } logActivity("Credit Automatically Applied at Invoice Creation - Invoice ID: " . $invoiceid . " - Amount: " . $credit, $userid); update_query("tblclients", array("credit" => $creditleft), array("id" => $userid)); update_query("tblinvoices", array("credit" => $credit), array("id" => $invoiceid)); updateInvoiceTotal($invoiceid); if ($doprocesspaid) { processPaidInvoice($invoiceid); } } } $apiresults = array("result" => "success", "invoiceid" => $invoiceid);
function createInvoicesProcess($data, $noemails = "", $nocredit = "") { global $whmcs; global $cron; global $CONFIG; global $_LANG; global $invoicecount; global $invoiceid; $itemid = $data['id']; $userid = $data['userid']; $type = $data['type']; $relid = $data['relid']; $duedate = $data['duedate']; $paymentmethod = $invpaymentmethod = $data['paymentmethod']; if (!$invpaymentmethod) { if (!function_exists("getClientsPaymentMethod")) { require ROOTDIR . "/includes/clientfunctions.php"; } $invpaymentmethod = getClientsPaymentMethod($userid); update_query("tblinvoiceitems", array("paymentmethod" => $invpaymentmethod), array("id" => $itemid)); } if ($itemid) { if (get_query_val("tblinvoiceitems", "invoiceid", array("id" => $itemid))) { return false; } } $taxrate = $taxrate2 = 0; if ($CONFIG['TaxEnabled']) { $data = get_query_vals("tblclients", "taxexempt,state,country,separateinvoices", array("id" => $userid)); $taxexempt = $data['taxexempt']; $taxstate = $data['state']; $taxcountry = $data['country']; if (!$taxexempt) { $taxrate = getTaxRate(1, $taxstate, $taxcountry); $taxrate2 = getTaxRate(2, $taxstate, $taxcountry); $taxrate = $taxrate['rate']; $taxrate2 = $taxrate2['rate']; } } $invoiceid = insert_query("tblinvoices", array("date" => "now()", "duedate" => $duedate, "userid" => $userid, "status" => "Unpaid", "taxrate" => $taxrate, "taxrate2" => $taxrate2, "paymentmethod" => $invpaymentmethod, "notes" => $invoicenotes)); if ($itemid) { update_query("tblinvoiceitems", array("invoiceid" => $invoiceid), array("invoiceid" => "0", "userid" => $userid, "type" => "Promo" . $type, "relid" => $relid)); $where = array("id" => $itemid); } else { $where = array("invoiceid" => "", "duedate" => $duedate, "userid" => $userid, "paymentmethod" => $paymentmethod); } update_query("tblinvoiceitems", array("invoiceid" => $invoiceid), $where); logActivity("Created Invoice - Invoice ID: " . $invoiceid, $userid); if (is_object($cron)) { $cron->logActivityDebug("Generated Invoice #" . $invoiceid); } $billableitemstax = $CONFIG['TaxEnabled'] && $CONFIG['TaxCustomInvoices'] ? "1" : "0"; $result2 = select_query("tblbillableitems", "", array("userid" => $userid, "invoiceaction" => "2", "invoicecount" => "0")); while ($data = mysql_fetch_array($result2)) { insert_query("tblinvoiceitems", array("invoiceid" => $invoiceid, "userid" => $userid, "type" => "Item", "relid" => $data['id'], "description" => $data['description'], "amount" => $data['amount'], "taxed" => $billableitemstax)); update_query("tblbillableitems", array("invoicecount" => "+1"), array("id" => $data['id'])); } updateInvoiceTotal($invoiceid); $data2 = get_query_vals("tblclients", "credit,groupid", array("id" => $userid)); $credit = $data2['credit']; $groupid = $data2['groupid']; $data2 = get_query_vals("tblinvoices", "subtotal,total", array("id" => $invoiceid)); $subtotal = $data2['subtotal']; $total = $data2['total']; $isaddfundsinvoice = get_query_val("tblinvoiceitems", "COUNT(id)", "invoiceid='" . $invoiceid . "' AND (type='AddFunds' OR type='Invoice')"); if ($groupid && !$isaddfundsinvoice) { $discountpercent = get_query_val("tblclientgroups", "discountpercent", array("id" => $groupid)); if (0 < $discountpercent) { $discountamount = $subtotal * ($discountpercent / 100) * (0 - 1); insert_query("tblinvoiceitems", array("invoiceid" => $invoiceid, "userid" => $userid, "type" => "GroupDiscount", "description" => $_LANG['clientgroupdiscount'], "amount" => $discountamount, "taxed" => "1")); updateInvoiceTotal($invoiceid); $data2 = get_query_vals("tblclients", "credit,groupid", array("id" => $userid)); $credit = $data2['credit']; $groupid = $data2['groupid']; $data2 = get_query_vals("tblinvoices", "subtotal,total", array("id" => $invoiceid)); $subtotal = $data2['subtotal']; $total = $data2['total']; } } if ($whmcs->get_config("ContinuousInvoiceGeneration")) { $result2 = select_query("tblinvoiceitems", "", array("invoiceid" => $invoiceid)); while ($data = mysql_fetch_array($result2)) { $type = $data['type']; $relid = $data['relid']; $nextinvoicedate = $data['duedate']; $year = substr($nextinvoicedate, 0, 4); $month = substr($nextinvoicedate, 5, 2); $day = substr($nextinvoicedate, 8, 2); $proratabilling = false; if ($type == "Hosting") { $data = get_query_vals("tblhosting", "billingcycle,packageid,regdate,nextduedate", array("id" => $relid)); $billingcycle = $data['billingcycle']; $packageid = $data['packageid']; $regdate = $data['regdate']; $nextduedate = $data['nextduedate']; $data = get_query_vals("tblproducts", "proratabilling,proratadate,proratachargenextmonth", array("id" => $packageid)); $proratabilling = $data['proratabilling']; $proratadate = $data['proratadate']; $proratachargenextmonth = $data['proratachargenextmonth']; $proratamonths = getBillingCycleMonths($billingcycle); $nextinvoicedate = date("Ymd", mktime(0, 0, 0, $month + $proratamonths, $day, $year)); } else { if ($type == "Domain" || $type == "DomainRegister" || $type == "DomainTransfer") { $data = get_query_vals("tbldomains", "registrationperiod,nextduedate", array("id" => $relid)); $registrationperiod = $data['registrationperiod']; $nextduedate = explode("-", $data['nextduedate']); $billingcycle = ""; $nextinvoicedate = date("Ymd", mktime(0, 0, 0, $nextduedate[1], $nextduedate[2], $nextduedate[0] + $registrationperiod)); } else { if ($type == "Addon") { $billingcycle = get_query_val("tblhostingaddons", "billingcycle", array("id" => $relid)); $proratamonths = getBillingCycleMonths($billingcycle); $nextinvoicedate = date("Ymd", mktime(0, 0, 0, $month + $proratamonths, $day, $year)); } } } if ($billingcycle == "One Time") { $nextinvoicedate = "00000000"; } if ($regdate == $nextduedate && $proratabilling) { if ($billingcycle != "Monthly") { $proratachargenextmonth = 0; } $orderyear = substr($regdate, 0, 4); $ordermonth = substr($regdate, 5, 2); $orderday = substr($regdate, 8, 2); if ($orderday < $proratadate) { $proratamonth = $ordermonth; } else { $proratamonth = $ordermonth + 1; } $days = (strtotime(date("Y-m-d", mktime(0, 0, 0, $proratamonth, $proratadate, $orderyear))) - strtotime(date("Y-m-d"))) / (60 * 60 * 24); $totaldays = 30; $nextinvoicedate = date("Y-m-d", mktime(0, 0, 0, $proratamonth, $proratadate, $orderyear)); if ($proratachargenextmonth <= $orderday && $days < 31) { $nextinvoicedate = date("Y-m-d", mktime(0, 0, 0, $proratamonth + $proratamonths, $proratadate, $orderyear)); } } if ($type == "Hosting") { update_query("tblhosting", array("nextinvoicedate" => $nextinvoicedate), array("id" => $relid)); } if ($type == "Domain" || $type == "DomainRegister" || $type == "DomainTransfer") { update_query("tbldomains", array("nextinvoicedate" => $nextinvoicedate), array("id" => $relid)); } if ($type == "Addon") { update_query("tblhostingaddons", array("nextinvoicedate" => $nextinvoicedate), array("id" => $relid)); } } } $doprocesspaid = false; if (!$nocredit && $credit != "0.00" && !$CONFIG['NoAutoApplyCredit']) { if ($total <= $credit) { $creditleft = $credit - $total; $credit = $total; $doprocesspaid = true; } else { $creditleft = 0; } logActivity("Credit Automatically Applied at Invoice Creation - Invoice ID: " . $invoiceid . " - Amount: " . $credit, $userid); insert_query("tblcredit", array("clientid" => $userid, "date" => "now()", "description" => "Credit Applied to Invoice #" . $invoiceid, "amount" => $credit * (0 - 1))); update_query("tblclients", array("credit" => $creditleft), array("id" => $userid)); update_query("tblinvoices", array("credit" => $credit), array("id" => $invoiceid)); updateInvoiceTotal($invoiceid); } run_hook("InvoiceCreationPreEmail", array("invoiceid" => $invoiceid)); if ($doprocesspaid) { processPaidInvoice($invoiceid); } $result2 = select_query("tblpaymentgateways", "value", array("gateway" => $invpaymentmethod, "setting" => "type")); $data2 = mysql_fetch_array($result2); $paymenttype = $data2['value']; if ($noemails != "true") { sendMessage(($paymenttype == "CC" || $paymenttype == "OfflineCC" ? "Credit Card " : "") . "Invoice Created", $invoiceid); } $result2 = select_query("tblinvoices", "total", array("id" => $invoiceid, "status" => "Unpaid")); $data2 = mysql_fetch_array($result2); $total = $data2['total']; if ($total == "0.00") { processPaidInvoice($invoiceid); } run_hook("InvoiceCreated", array("invoiceid" => $invoiceid)); $invoicetotal = 0; ++$invoicecount; if (1 < $CONFIG['InvoiceIncrement']) { $invoiceincrement = $CONFIG['InvoiceIncrement'] - 1; $counter = 1; while ($counter <= $invoiceincrement) { $tempinvoiceid = insert_query("tblinvoices", array("date" => "now()")); delete_query("tblinvoices", array("id" => $tempinvoiceid)); $counter += 1; } } }