- $js = "\n<script type=\"text/javascript\">\n"
- . "<!--\n"
- . "function recalcAccounts()\n"
- . "{\n"
- . " var myForm = document.forms[0];\n"
- . " var len = myForm.$sel_name.length;\n"
- . " var txt;\n"
- . " var ac = myForm.$edit_name.value;\n"
- . " var i;\n"
- . " myForm.$sel_name.options[myForm.$sel_name.selectedIndex].selected = false;\n"
- . " for (i = 0; i < len; i++)\n"
- . " {\n"
- . " txt = myForm.$sel_name.options[i].text;\n"
- . " if (txt.indexOf(ac) == 0)\n"
- . " {\n"
- . " myForm.$sel_name.options[i].selected = true;\n"
- . " break;\n"
- . " }\n"
- . " }\n"
- . "}\n"
- . "function setAccount(p, s)\n"
- . "{\n"
- . " var myForm = document.forms[0];\n"
- . " if (p == 0 && myForm.$edit_name.value == \"\")\n"
- . " return true;\n"
- . " myForm.$edit_name.value = myForm.$sel_name.options[myForm.$sel_name.selectedIndex].value;\n"
- . " if (s)\n"
- . " myForm.submit();\n"
- . " myForm.$next_name.focus();\n"
- . " return true;\n"
- . "}\n"
- . "-->\n"
- . "</script>\n";
- cache_js_file($fpath, $js);
+ if ($monthly) // marked as monthly
+ $begin = begin_month($date);
+ else
+ {
+ if (is_account_balancesheet($gl_code)) // total
+ $begin = "";
+ else
+ $begin = begin_fiscalyear(); // from fiscalyear begin
+ }
+ $base = get_gl_trans_from_to($begin, $date, $gl_code);
+
+ }
+
+ $result = get_quick_entry_lines($id);
+ if (db_num_rows($result) == 0)
+ {
+ return 0;
+ }
+
+ // first calculate total rate in case more than one tax is used
+ $totrate = 0;
+ while ($row = db_fetch($result))
+ {
+ $qe_lines[] = $row;
+
+ switch (strtolower($row['action'])) {
+ case "t": // post taxes calculated on base amount
+ case "t+": // ditto & increase base amount
+ case "t-": // ditto & reduce base amount
+ if (substr($row['action'], 0, 1) != 'T')
+ $totrate += get_tax_type_rate($row['dest_id']);
+ }
+ }
+ $first = true;
+ $taxbase = 0;
+ foreach($qe_lines as $qe_line)
+ {
+ $gl_code = $qe_line['dest_id'];
+ switch (strtolower($qe_line['action'])) {
+ case "=": // post current base amount to GL account
+ $part = $base;
+ break;
+ case "a": // post amount to GL account and reduce base
+ $part = $qe_line['amount'];
+ break;
+ case "a+": // post amount to GL account and increase base
+ $part = $qe_line['amount']; $base += $part;
+ break;
+ case "a-": // post amount to GL account and reduce base
+ $part = $qe_line['amount']; $base -= $part;
+ break;
+ case "%": // store acc*amount% to GL account
+ $part = round2($base * $qe_line['amount'] / 100, user_price_dec());
+ break;
+ case "%+": // ditto & increase base amount
+ $part = round2($base * $qe_line['amount'] / 100, user_price_dec());
+ $base += $part;
+ break;
+ case "%-": // ditto & reduce base amount
+ $part = round2($base * $qe_line['amount'] / 100, user_price_dec());
+ $base -= $part;
+ break;
+ case "t": // post taxes calculated on base amount
+ case "t+": // ditto & increase base amount
+ case "t-": // ditto & reduce base amount
+ if ($first)
+ {
+ $taxbase = $base/($totrate+100);
+ $first = false;
+ }
+
+ if (substr($qe_line['action'],0,1) != 'T')
+ $part = $taxbase;
+ else
+ $part = $base/100;
+
+ $item_tax = get_tax_type($qe_line['dest_id']);
+ //if ($type == QE_SUPPINV && substr($qe_line['action'],0,1) != 'T')
+ if ($type == QE_SUPPINV)
+ {
+ $rates = 0;
+ $res = get_tax_group_rates($taxgroup);
+ while ($row = db_fetch($res))
+ $rates += $row['rate'];
+ if ($rates == 0)
+ continue 2;
+ }
+ $tax = round2($part * $item_tax['rate'], user_price_dec());
+ if ($tax == 0) continue 2;
+ $gl_code = ($type == QE_DEPOSIT || ($type == QE_JOURNAL && $base < 0))
+ ? $item_tax['sales_gl_code'] : $item_tax['purchasing_gl_code'];
+ if (!is_tax_gl_unique($gl_code)) {
+ return -1; // more than one taxtype used with this GL account
+ }
+
+ $part = $tax;
+ if (strpos($qe_line['action'], '+'))
+ $base += $tax;
+ elseif (strpos($qe_line['action'], '-'))
+ $base -= $tax;
+ }
+ $gl_entries[] = array(
+ 'code' => $gl_code,
+ 'name' => get_gl_account_name($gl_code),
+ 'dim1' => $qe_line['dimension_id'],
+ 'dim2' => $qe_line['dimension2_id'],
+ 'amount' => $part,
+ 'descr' => $qe_line['memo']
+ );
+ }
+ return $gl_entries;
+}
+
+
+//--------------------------------------------------------------------------------------
+//
+// Simple English version of number to words conversion.
+//
+function _number_to_words($number)
+{
+ $Bn = floor($number / 1000000000); /* Billions (giga) */
+ $number -= $Bn * 1000000000;
+ $Gn = floor($number / 1000000); /* Millions (mega) */
+ $number -= $Gn * 1000000;
+ $kn = floor($number / 1000); /* Thousands (kilo) */
+ $number -= $kn * 1000;
+ $Hn = floor($number / 100); /* Hundreds (hecto) */
+ $number -= $Hn * 100;
+ $Dn = floor($number / 10); /* Tens (deca) */
+ $n = $number % 10; /* Ones */
+
+ $res = "";
+
+ if ($Bn)
+ $res .= _number_to_words($Bn) . " Billion";
+ if ($Gn)
+ $res .= (empty($res) ? "" : " ") . _number_to_words($Gn) . " Million";
+ if ($kn)
+ $res .= (empty($res) ? "" : " ") . _number_to_words($kn) . " Thousand";
+ if ($Hn)
+ $res .= (empty($res) ? "" : " ") . _number_to_words($Hn) . " Hundred";
+
+ $ones = array("", "One", "Two", "Three", "Four", "Five", "Six",
+ "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen",
+ "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen",
+ "Nineteen");
+ $tens = array("", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty",
+ "Seventy", "Eighty", "Ninety");
+
+ if ($Dn || $n)
+ {
+ if (!empty($res))
+ $res .= " and ";
+ if ($Dn < 2)
+ $res .= $ones[$Dn * 10 + $n];
+ else
+ {
+ $res .= $tens[$Dn];
+ if ($n)
+ $res .= "-" . $ones[$n];
+ }