Example #1
0
function create_bus_enterprise_nature_fee($dbLink, $trans_id, $business_id, $owner_id, $permit_id, $permit_type, $action, $creator, $nature_code = NULL)
{
    // removed bus nature code from tax_fee table instead transfer nature code to business nature code table
    if (is_array($nature_code)) {
        $nature_code_lst = "'" . join("','", $nature_code) . "'";
        $sql = " SELECT a.business_nature_code, c.tax_fee_code, c.tax_fee_desc, c.tax_account_code, c.tax_formula ";
        $sql .= " FROM ebpls_business_nature AS a ";
        $sql .= " INNER JOIN ebpls_tax_fee_table as b ON a.tax_fee_code = b.tax_fee_code WHERE a.business_nature_code IN ('{$nature_code_lst}')";
    } else {
        $sql = " SELECT a.business_nature_code, c.tax_fee_code, c.tax_fee_desc, c.tax_account_code, c.tax_formula ";
        $sql .= " FROM ebpls_business_nature AS a ";
        $sql .= " INNER JOIN ebpls_tax_fee_table as b ON a.tax_fee_code = b.tax_fee_code WHERE a.business_nature_code = '{$nature_code}'";
    }
    ebpls_db_funcs_debug("create_bus_enterprise_nature_fee : {$sql}");
    $result = mysql_query($sql, $dbLink);
    if ($result) {
        $i = 0;
        while ($row = mysql_fetch_array($result)) {
            $clsTaxFee = new EBPLTaxFeeSysRef($dbLink, false);
            $res_tax = $clsTaxFee->select($row["tax_fee_code"]);
            if (is_array($res_tax)) {
                $clsNature = new EBPLSTransactionBusinessNature($dbLink, true);
                $clsNature->setData(TRANS_BUSNATURE_TRANS_ID, $trans_id);
                $clsNature->setData(TRANS_BUSNATURE_BUSINESS_ID, $business_id);
                $clsNature->setData(TRANS_BUSNATURE_OWNER_ID, $owner_id);
                $clsNature->setData(TRANS_BUSNATURE_CAPITAL_INVESTMENT, "0.0");
                $clsNature->setData(TRANS_BUSNATURE_LAST_GROSS, "0.0");
                $clsNature->setData(TRANS_BUSNATURE_BUSINESS_NATURE_CODE, $row["business_nature_code"]);
                if ($clsNature->add() < 0) {
                    ebpls_db_funcs_debug("create_bus_enterprise_nature_fee : error on creation of business nature record");
                    return -5;
                }
                $clsTaxFormula = $res_tax["result"][0]->getData(EBPLS_TAX_FORMULA);
                $sql = "INSERT INTO ebpls_transaction_payables ( trans_id, permit_id,permit_type, tax_fee_type, tax_fee_code, tax_business_nature_code, tax_fee_desc, tax_account_code, tax_total_amount_due, ts_create, last_updated_by )";
                $sql .= " values( {$trans_id}, {$permit_id}, '{$permit_type}', 'BUSTAX','" . $row["tax_fee_code"] . "','" . $row["business_nature_code"] . "','" . $row["tax_fee_desc"] . "','" . $row["tax_account_code"] . "', 0, now(), '{$creator}')";
                ebpls_db_funcs_debug("create_bus_enterprise_nature_fee tax/fee found : {$sql}");
                $rs = mysql_query($sql, $dbLink);
                // add nature to business enterprise nature table
                if (!$rs) {
                    set_db_error($dbLink);
                    return -1;
                }
                $i++;
            } else {
                ebpls_db_funcs_debug("create_bus_enterprise_nature_fee tax/fee code not found : " . $row["tax_fee_code"]);
                set_db_error(NULL, "create_bus_enterprise_nature_fee tax/fee code not found : " . $row["tax_fee_code"]);
                return -3;
            }
        }
        return $i;
    } else {
        set_db_error($dbLink);
        return -2;
    }
}
 /**
  * Updates payments schedules accumulated interest/surcharges.
  *
  *
  **/
 function updatePaymentSchedulesInterestSurcharges(&$trans_obj)
 {
     // retrieve payment schedule list which are not yet fully paid
     //$tps_records = $this->listPaymentSchedule( $trans_obj->getData(TRANS_ID), TPS_PAYMENT_STATE_UNPAID, TPS_PAYMENT_DUE_DATE, false );
     $tps_records = $this->listSynchPaymentSchedule($trans_obj->getData(TRANS_ID), TPS_PAYMENT_STATE_UNPAID, TPS_PAYMENT_DUE_DATE, false);
     if (is_array($tps_records)) {
         $tmp_tps_included_records = NULL;
         mysql_query("LOCK TABLES", $this->m_dbLink);
         $clsAccounts = new EBPLChartOfAccountsSysRef($this->m_dbLink, false);
         $cash_account_code = $clsAccounts->getCashAccountCode();
         if ($cash_account_code < 0) {
             $this->debug(-5, "Unable to load cash account code, return {$cash_account_code}!");
             $this->setError(-5, "Unable to load cash account code, return {$cash_account_code}!");
             return -5;
         }
         for ($i = 0; $i < count($tps_records); $i++) {
             // ---- LOAD TRANSACTOPM RECORD DATA
             $payment_id = $tps_records[$i]->getData(TPS_PAYMENT_ID);
             $fee_id = $tps_records[$i]->getData(TPS_PAYMENT_FEE_ID);
             $tax_fee_code = $tps_records[$i]->getData(TPS_PAYMENT_TAX_FEE_CODE);
             $tps_amount_due = $tps_records[$i]->getData(TPS_PAYMENT_TOTAL_AMOUNT_DUE);
             $tps_amount_paid = $tps_records[$i]->getData(TPS_PAYMENT_AMOUNT_PAID);
             $tps_penalty_amount = $tps_records[$i]->getData(TPS_PAYMENT_PENALTY_AMOUNT);
             $tps_penalty_amount_paid = $tps_records[$i]->getData(TPS_PAYMENT_PENALTY_AMOUNT_PAID);
             $tps_interest_amount = $tps_records[$i]->getData(TPS_PAYMENT_INTEREST_AMOUNT);
             $tps_interest_amount_paid = $tps_records[$i]->getData(TPS_PAYMENT_INTEREST_AMOUNT_PAID);
             $total_amount_paid = $tps_records[$i]->getData(TPS_PAYMENT_TOTAL_AMOUNT_PAID);
             $tps_due_date = $tps_records[$i]->getData(TPS_PAYMENT_DUE_DATE);
             $tps_synch_date = $tps_records[$i]->getData(TPS_PAYMENT_SYNCH_UPDATE);
             if ($tps_synch_date == date("Y-m-d")) {
                 // skip those whose interest/surcharges have been updated...
                 continue;
             }
             $clsTaxFee = new EBPLTaxFeeSysRef($this->m_dbLink, false);
             // ---- RETRIEVE TAX/FEE DATA
             $clsTaxFeePayable = $clsTaxFee->loadTaxFee($tax_fee_code);
             $clsTaxFeeSurcharge = $clsTaxFee->loadTaxFee($clsTaxFeePayable->getData(EBPLS_SURCHARGE_TAX_FEE_CODE));
             $clsTaxFeeInterest = $clsTaxFee->loadTaxFee($clsTaxFeePayable->getData(EBPLS_INTEREST_TAX_FEE_CODE));
             if ($clsTaxFeePayable == -1 || $clsTaxFeeSurcharge == -1 || $clsTaxFeeInterest == -1) {
                 $this->debug("Unable to load tax fee code {$tax_fee_code}," . $clsTaxFeePayable->getData(EBPLS_SURCHARGE_TAX_FEE_CODE) . "," . $clsTaxFeePayable->getData(EBPLS_INTEREST_TAX_FEE_CODE));
                 $this->setError(-1, "Unable to load tax fee code {$tax_fee_code}," . $clsTaxFeePayable->getData(EBPLS_SURCHARGE_TAX_FEE_CODE) . "," . $clsTaxFeePayable->getData(EBPLS_INTEREST_TAX_FEE_CODE));
                 return -1;
             }
             // retrieve account codes
             $tax_fee_account_code = $clsTaxFeePayable->getData(EBPLS_TAX_ACCOUNT_CODE);
             $surcharge_account_code = $clsTaxFeeSurcharge->getData(EBPLS_TAX_ACCOUNT_CODE);
             $interest_account_code = $clsTaxFeeInterest->getData(EBPLS_TAX_ACCOUNT_CODE);
             // ---- LOAD FORMULA
             //$clsTaxFeePayableFormula = $clsTaxFeePayable->getData(EBPLS_TAX_FORMULA); // we dont need this, used on setting of payment mode only
             $clsTaxFeeSurchargeFormula = $clsTaxFeeSurcharge->getData(EBPLS_TAX_FORMULA);
             $clsTaxFeeInterestFormula = $clsTaxFeeInterest->getData(EBPLS_TAX_FORMULA);
             // ---- COMPUTE BALANCE
             // formula = ( Total Amount Due = (Payable Amount - Paid Amount) + ( Surcharge - Surcharge Paid ) + ( Interest - Interest Paid ) - ( Total Paid Amount )
             // compute raw tax mount due less the raw tax amount paid
             $raw_tax_difference = $tps_amount_due - $tps_amount_paid;
             $total_amount_due = $raw_tax_difference;
             $this->debug("COMPUTE BALANCE : {$raw_tax_difference} = ( {$tps_amount_due} - {$tps_amount_paid} )");
             // compute penalty incurred not yet paid on previous payment
             $penalty_tax_difference = $tps_penalty_amount - $tps_penalty_amount_paid;
             $total_amount_due += $penalty_tax_difference;
             $this->debug("COMPUTE PENALTY : {$penalty_tax_difference} = ( {$tps_penalty_amount} - {$tps_penalty_amount_paid} )");
             // compute interest incurred not yet paid on previous payment
             $interest_tax_difference = $tps_interest_amount - $tps_interest_amount_paid;
             $total_amount_due += $interest_tax_difference;
             $this->debug("COMPUTE INTEREST : {$interest_tax_difference} = ( {$tps_interest_amount} - {$tps_interest_amount_paid} )");
             // compute total balance payable
             // this will be used to calculate interest/surcharge, since these items requires balance amount
             $total_amount_payable = $total_amount_due - $total_amount_paid;
             //$this->debug("COMPUTE TOTAL : $total_amount_payable = $total_amount_due - $total_amount_paid");
             // --------------------------------------------------------------------------
             // ---- COMPUTE SURCHARGE / INTEREST
             $surcharge_amount = $clsTaxFeeSurchargeFormula->computeSurcharge($total_amount_payable, $tps_due_date);
             $interest_amount = $clsTaxFeeSurchargeFormula->computeSurcharge($total_amount_payable, $tps_due_date);
             $this->debug("SURCHARGE {$surcharge_amount}, INTEREST {$interest_amount}");
             // add interest / surcharge to current taxes surcharge/interest balance amount
             $tps_penalty_amount += $surcharge_amount;
             $tps_interest_amount += $interest_amount;
             // --------------------------------------------------------------------------
             // ---- UPDATE PAYMENT SCHEDULE RECORD
             unset($tps_records[$i]->data_elems);
             $tps_records[$i]->data_elems[TPS_PAYMENT_AMOUNT_PAID] = $tps_amount_paid;
             $tps_records[$i]->data_elems[TPS_PAYMENT_PENALTY_AMOUNT] = $tps_penalty_amount;
             $tps_records[$i]->data_elems[TPS_PAYMENT_PENALTY_AMOUNT_PAID] = $tps_penalty_amount_paid;
             $tps_records[$i]->data_elems[TPS_PAYMENT_INTEREST_AMOUNT] = $tps_interest_amount;
             $tps_records[$i]->data_elems[TPS_PAYMENT_INTEREST_AMOUNT_PAID] = $tps_interest_amount_paid;
             $tps_records[$i]->data_elems[TPS_PAYMENT_TOTAL_AMOUNT_PAID] = $total_amount_paid;
             $tps_records[$i]->data_elems[TPS_PAYMENT_SYNCH_UPDATE] = date("Y-m-d");
             $retUpdate = $tps_records[$i]->_update($trans_obj, $payment_id, $admin);
             if ($retUpdate <= 0) {
                 // invalid return, do rollback
                 // call rollback
                 $this->debug("Invalid return on _update on updatePaymentSchedules function, return {$retUpdate}!");
                 $this->setError(-1, "Invalid return on _update on updatePaymentSchedules function, return {$retUpdate}!");
                 return -1;
             }
         }
         mysql_query("UNLOCK TABLES", $this->m_dbLink);
         return 1;
     } else {
         //$this->debug("Unable to load transaction payment schedules on updatePaymentSchedules function, return $tps_records!");
         $this->setError(-1, "Unable to load transaction payment schedules on updatePaymentSchedules function, return {$tps_records}!");
         return -1;
     }
 }
Example #3
0
 function printIndividualCTCScript($ctc_type, $basic_tax_field, $tax_a1_fields, $tax_a2_fields, $tax_a3_fields, $out_total_amount_due, $out_total_interest_due, $out_total_paid_due)
 {
     if ($ctc_type == CTC_TYPE_INDIVIDUAL) {
         $clsCTC_A_EX = new EBPLTaxFeeSysRef($this->m_dbLink, false);
         $clsCTC_A_EXRet = $clsCTC_A_EX->select("CTC_A_EX");
         $clsCTC_A_NEX = new EBPLTaxFeeSysRef($this->m_dbLink, false);
         $clsCTC_A_NEXRet = $clsCTC_A_NEX->select("CTC_A_NEX");
         $clsCTC_B1 = new EBPLTaxFeeSysRef($this->m_dbLink, false);
         $clsCTC_B1Ret = $clsCTC_B1->select("CTC_B1");
         $clsCTC_B2 = new EBPLTaxFeeSysRef($this->m_dbLink, false);
         $clsCTC_B2Ret = $clsCTC_B2->select("CTC_B2");
         $clsCTC_B3 = new EBPLTaxFeeSysRef($this->m_dbLink, false);
         $clsCTC_B3Ret = $clsCTC_B3->select("CTC_B3");
         $clsCTC_TTL_TAX = new EBPLTaxFeeSysRef($this->m_dbLink, false);
         $clsCTC_TTL_TAXRet = $clsCTC_TTL_TAX->select("CTC_TTL_TAX");
         $clsCTC_TAX_INT = new EBPLTaxFeeSysRef($this->m_dbLink, false);
         $clsCTC_TAX_INTRet = $clsCTC_TAX_INT->select("CTC_TAX_INT");
         $clsCTC_TAX_DUE = new EBPLTaxFeeSysRef($this->m_dbLink, false);
         $clsCTC_TAX_DUERet = $clsCTC_TAX_DUE->select("CTC_TAX_DUE");
         if (!(is_array($clsCTC_A_EXRet) && is_array($clsCTC_A_NEXRet) && is_array($clsCTC_B1Ret) && is_array($clsCTC_B2Ret) && is_array($clsCTC_B3Ret) && is_array($clsCTC_TAX_INTRet) && is_array($clsCTC_TAX_DUERet))) {
             $this->setError(-1, "System Configuration Error : One of the requiered CTC Records is nonexistent, Please check of Fee with code CTC_A_EX, CTC_A_NEX, CTC_B1, CTC_B2, CTC_B3 and CTC_B1 exist on tax/fee manager");
             return -1;
         } else {
             $clsCTC_A_EX_Formula = $clsCTC_A_EXRet["result"][0]->getData(EBPLS_TAX_FORMULA);
             $clsCTC_B1_Formula = $clsCTC_B1Ret["result"][0]->getData(EBPLS_TAX_FORMULA);
             $clsCTC_B2_Formula = $clsCTC_B2Ret["result"][0]->getData(EBPLS_TAX_FORMULA);
             $clsCTC_B3_Formula = $clsCTC_B3Ret["result"][0]->getData(EBPLS_TAX_FORMULA);
             $clsCTC_TTL_TAX_Formula = $clsCTC_TTL_TAXRet["result"][0]->getData(EBPLS_TAX_FORMULA);
             $clsCTC_TAX_INT_Formula = $clsCTC_TAX_INTRet["result"][0]->getData(EBPLS_TAX_FORMULA);
             $clsCTC_TAX_DUE_Formula = $clsCTC_TAX_DUERet["result"][0]->getData(EBPLS_TAX_FORMULA);
             echo "\n" . $clsCTC_A_EX_Formula->createAutocompleteJScript(array("x1" => $basic_tax_field["in"][0]), $basic_tax_field["out"], "checked");
             echo "\n" . $clsCTC_B1_Formula->createAutocompleteJScript(array("x1" => $tax_a1_fields["in"][0]), $tax_a1_fields["out"]);
             echo "\n" . $clsCTC_B2_Formula->createAutocompleteJScript(array("x1" => $tax_a2_fields["in"][0]), $tax_a2_fields["out"]);
             echo "\n" . $clsCTC_B3_Formula->createAutocompleteJScript(array("x1" => $tax_a3_fields["in"][0]), $tax_a3_fields["out"]);
             echo "\n" . $clsCTC_TTL_TAX_Formula->createAutocompleteJScript($out_total_amount_due["in"], $out_total_amount_due["out"]);
             echo "\n" . $clsCTC_TAX_INT_Formula->createAutocompleteJScript($out_total_interest_due["in"], $out_total_interest_due["out"]);
             echo "\n" . $clsCTC_TAX_DUE_Formula->createAutocompleteJScript($out_total_paid_due["in"], $out_total_paid_due["out"]);
         }
     } else {
         $clsCTCB_A_EX = new EBPLTaxFeeSysRef($this->m_dbLink, false);
         $clsCTCB_A_EXRet = $clsCTCB_A_EX->select("CTCB_BASIC_TAX");
         $clsCTCB_B1 = new EBPLTaxFeeSysRef($this->m_dbLink, false);
         $clsCTCB_B1Ret = $clsCTCB_B1->select("CTCB_B1");
         $clsCTCB_B2 = new EBPLTaxFeeSysRef($this->m_dbLink, false);
         $clsCTCB_B2Ret = $clsCTCB_B2->select("CTCB_B2");
         $clsCTC_TTL_TAX = new EBPLTaxFeeSysRef($this->m_dbLink, false);
         $clsCTC_TTL_TAXRet = $clsCTC_TTL_TAX->select("CTCB_TTL_TAX");
         $clsCTC_TAX_INT = new EBPLTaxFeeSysRef($this->m_dbLink, false);
         $clsCTC_TAX_INTRet = $clsCTC_TAX_INT->select("CTCB_TAX_INT");
         $clsCTC_TAX_DUE = new EBPLTaxFeeSysRef($this->m_dbLink, false);
         $clsCTC_TAX_DUERet = $clsCTC_TAX_DUE->select("CTC_TAX_DUE");
         if (!(is_array($clsCTCB_A_EXRet) && is_array($clsCTCB_B1Ret) && is_array($clsCTCB_B2Ret) && is_array($clsCTC_TAX_INTRet) && is_array($clsCTC_TAX_DUERet))) {
             $this->setError(-1, "System Configuration Error : One of the requiered CTC Records is nonexistent, Please check of Fee with code CTCB_A_EX, CTCB_B1, CTCB_B2 exist on tax/fee manager");
             return -1;
         } else {
             $clsCTCB_A_EX_Formula = $clsCTCB_A_EXRet["result"][0]->getData(EBPLS_TAX_FORMULA);
             $clsCTCB_B1_Formula = $clsCTCB_B1Ret["result"][0]->getData(EBPLS_TAX_FORMULA);
             $clsCTCB_B2_Formula = $clsCTCB_B2Ret["result"][0]->getData(EBPLS_TAX_FORMULA);
             $clsCTC_TTL_TAX_Formula = $clsCTC_TTL_TAXRet["result"][0]->getData(EBPLS_TAX_FORMULA);
             $clsCTC_TAX_INT_Formula = $clsCTC_TAX_INTRet["result"][0]->getData(EBPLS_TAX_FORMULA);
             $clsCTC_TAX_DUE_Formula = $clsCTC_TAX_DUERet["result"][0]->getData(EBPLS_TAX_FORMULA);
             //echo "\n" . $clsCTCB_A_EX_Formula->createAutocompleteJScript(Array("x1"=>$basic_tax_field["in"][0]),$basic_tax_field["out"]);
             echo "\n" . $clsCTCB_A_EX_Formula->createAutocompleteJScript(NULL, $basic_tax_field["out"]);
             echo "\n" . $clsCTCB_B1_Formula->createAutocompleteJScript(array("x1" => $tax_a1_fields["in"][0]), $tax_a1_fields["out"]);
             echo "\n" . $clsCTCB_B2_Formula->createAutocompleteJScript(array("x1" => $tax_a2_fields["in"][0]), $tax_a2_fields["out"]);
             echo "\n" . $clsCTC_TTL_TAX_Formula->createAutocompleteJScript($out_total_amount_due["in"], $out_total_amount_due["out"]);
             echo "\n" . $clsCTC_TAX_INT_Formula->createAutocompleteJScript($out_total_interest_due["in"], $out_total_interest_due["out"]);
             echo "\n" . $clsCTC_TAX_DUE_Formula->createAutocompleteJScript($out_total_paid_due["in"], $out_total_paid_due["out"]);
         }
     }
 }
 function addCashPayment($trans_obj, $amount, $admin, $bCommit)
 {
     // retrieve payment schedule list which are not yet fully paid
     $clsTPS = new EBPLSTransactionPaymentSchedule($this->m_dbLink, false);
     $tps_records = $clsTPS->listPaymentSchedule($trans_obj->getData(TRANS_ID), TPS_PAYMENT_STATE_UNPAID, TPS_PAYMENT_DUE_DATE, false);
     if (is_array($tps_records)) {
         // check first if payment exceeds the balance (code assumes that payment schedules are update!)
         $tmp_amount_due = $clsTPS->getTotalAmountDue($trans_obj->getData(TRANS_ID));
         if ($tmp_amount_due <= 0) {
             $this->setError(-2, "All tax/fee payables are paid.");
             return -3;
         }
         $this->debug("The current users balance is P" . number_format($tmp_amount_due, 2) . " < {$amount}!");
         if (round($tmp_amount_due, 2) < round($amount, 2)) {
             // return error if payment amount given exceeds balance
             $this->debug("The current users balance is P" . number_format($tmp_amount_due, 2) . ", please indicate specified amount as cash payment.");
             $this->setError(-2, "The current users balance is P" . number_format($tmp_amount_due, 2) . ", please indicate specified amount as cash payment.");
             return -2;
         }
         $tmp_amount = $amount;
         $tmp_tps_included_records = NULL;
         // ----- START TRANSACTION HERE -----
         $or_code = get_next_system_code($this->m_dbLink, CODES_OR_COL);
         $payment_code = get_next_system_code($this->m_dbLink, CODES_PAY_COL);
         $clsAccounts = new EBPLChartOfAccountsSysRef($this->m_dbLink, false);
         $cash_account_code = $clsAccounts->getCashAccountCode();
         if ($cash_account_code < 0) {
             $this->debug("Unable to load cash account code, return {$cash_account_code}!");
             $this->setError(-5, "Unable to load cash account code, return {$cash_account_code}!");
             // roll back
             return -5;
         }
         $this->debug("OR CODE:{$or_code}, CASH ACCT CODE:{$cash_account_code}, PAYMENT:{$amount}");
         unset($this->or_details);
         for ($i = 0; $i < count($tps_records); $i++) {
             // ---- LOAD TRANSACTION RECORD DATA
             $payment_id = $tps_records[$i]->getData(TPS_PAYMENT_ID);
             $fee_id = $tps_records[$i]->getData(TPS_PAYMENT_FEE_ID);
             $tax_fee_code = $tps_records[$i]->getData(TPS_PAYMENT_TAX_FEE_CODE);
             $tps_amount_due = $tps_records[$i]->getData(TPS_PAYMENT_TOTAL_AMOUNT_DUE);
             $tps_amount_paid = $tps_records[$i]->getData(TPS_PAYMENT_AMOUNT_PAID);
             $tps_penalty_amount = $tps_records[$i]->getData(TPS_PAYMENT_PENALTY_AMOUNT);
             $tps_penalty_amount_paid = $tps_records[$i]->getData(TPS_PAYMENT_PENALTY_AMOUNT_PAID);
             $tps_interest_amount = $tps_records[$i]->getData(TPS_PAYMENT_INTEREST_AMOUNT);
             $tps_interest_amount_paid = $tps_records[$i]->getData(TPS_PAYMENT_INTEREST_AMOUNT_PAID);
             $total_amount_paid = $tps_records[$i]->getData(TPS_PAYMENT_TOTAL_AMOUNT_PAID);
             // ---- RETRIEVE TAX/FEE DATA
             $clsTaxFee = new EBPLTaxFeeSysRef($this->m_dbLink, false);
             $clsTaxFeePayable = $clsTaxFee->loadTaxFee($tax_fee_code);
             $clsTaxFeeSurcharge = $clsTaxFee->loadTaxFee($clsTaxFeePayable->getData(EBPLS_SURCHARGE_TAX_FEE_CODE));
             $clsTaxFeeInterest = $clsTaxFee->loadTaxFee($clsTaxFeePayable->getData(EBPLS_INTEREST_TAX_FEE_CODE));
             if ($clsTaxFeePayable == -1 || $clsTaxFeeSurcharge == -1 || $clsTaxFeeInterest == -1) {
                 $this->debug("Unable to load tax fee code {$tax_fee_code}," . $clsTaxFeePayable->getData(EBPLS_SURCHARGE_TAX_FEE_CODE) . "," . $clsTaxFeePayable->getData(EBPLS_INTEREST_TAX_FEE_CODE));
                 $this->setError(-1, "Unable to load tax fee code {$tax_fee_code}," . $clsTaxFeePayable->getData(EBPLS_SURCHARGE_TAX_FEE_CODE) . "," . $clsTaxFeePayable->getData(EBPLS_INTEREST_TAX_FEE_CODE));
                 // roll back
                 return -1;
             }
             // retrieve account codes
             $tax_fee_account_code = $clsTaxFeePayable->getData(EBPLS_TAX_ACCOUNT_CODE);
             $surcharge_account_code = $clsTaxFeeSurcharge->getData(EBPLS_TAX_ACCOUNT_CODE);
             $interest_account_code = $clsTaxFeeInterest->getData(EBPLS_TAX_ACCOUNT_CODE);
             // ---- COMPUTE BALANCE
             // formula = ( Total Amount Due = (Payable Amount - Paid Amount) + ( Surcharge - Surcharge Paid ) + ( Interest - Interest Paid ) - ( Total Paid Amount )
             // compute raw tax mount due less the raw tax amount paid
             $raw_tax_difference = $tps_amount_due - $tps_amount_paid;
             $total_amount_due = $raw_tax_difference;
             $this->debug("COMPUTE BALANCE : {$raw_tax_difference} = ( {$tps_amount_due} - {$tps_amount_paid} )");
             // compute penalty incurred not yet paid on previous payment
             $penalty_tax_difference = $tps_penalty_amount - $tps_penalty_amount_paid;
             $total_amount_due += $penalty_tax_difference;
             $this->debug("COMPUTE PENALTY : {$penalty_tax_difference} = ( {$tps_penalty_amount} - {$tps_penalty_amount_paid} )");
             // compute interest incurred not yet paid on previous payment
             $interest_tax_difference = $tps_interest_amount - $tps_interest_amount_paid;
             $total_amount_due += $interest_tax_difference;
             $this->debug("COMPUTE INTEREST : {$interest_tax_difference} = ( {$tps_interest_amount} - {$tps_interest_amount_paid} )");
             // compute total balance payable
             // this will be used to calculate interest/surcharge, since these items requires balance amount
             $total_amount_payable = $total_amount_due - $total_amount_paid;
             //$this->debug("COMPUTE TOTAL : $total_amount_payable = $total_amount_due - $total_amount_paid");
             // --------------------------------------------------------------------------
             // ---- PROCESS PAYMENT
             // pay balance on raw tax amount
             if ($raw_tax_difference > 0) {
                 if ($amount > $raw_tax_difference) {
                     // deduct cash in hand with the raw tax amount paid
                     $amount -= $raw_tax_difference;
                     $tax_paid_set = $raw_tax_difference;
                     $tps_amount_paid += $raw_tax_difference;
                 } else {
                     // deduct cash in hand with the raw tax amount paid
                     $tps_amount_paid += $amount;
                     $tax_paid_set = $amount;
                     $amount = 0;
                 }
             }
             // pay surcharge
             if ($penalty_tax_difference > 0 && $amount > 0) {
                 if ($amount > $penalty_tax_difference) {
                     // deduct cash in hand with the penalty tax unpaid
                     $amount -= $penalty_tax_difference;
                     $surcharge_paid_set = $penalty_tax_difference;
                     $tps_penalty_amount_paid += $penalty_tax_difference;
                 } else {
                     // add penalty to tps_penalty_amount
                     $tps_penalty_amount_paid += $amount;
                     $surcharge_paid_set = $amount;
                     $amount = 0;
                 }
                 $tps_penalty_amount_paid += $surcharge_paid_set;
             }
             // pay interest
             if ($interest_tax_difference > 0 && $amount > 0) {
                 if ($amount > $interest_tax_difference) {
                     // deduct cash in hand with the penalty tax unpaid
                     $amount -= $interest_tax_difference;
                     $interest_paid_set = $interest_tax_difference;
                     $tps_interest_amount_paid += $interest_tax_difference;
                 } else {
                     // add interest to tps_interest_amount
                     $tps_interest_amount_paid += $amount;
                     $interest_paid_set = $amount;
                     $amount = 0;
                 }
             }
             // --------------------------------------------------------------------------
             // ---- UPDATE PAYMENT SCHEDULE RECORD
             unset($tps_records[$i]->data_elems);
             $tps_records[$i]->data_elems[TPS_PAYMENT_AMOUNT_PAID] = $tps_amount_paid;
             $tps_records[$i]->data_elems[TPS_PAYMENT_PENALTY_AMOUNT_PAID] = $tps_penalty_amount_paid;
             $tps_records[$i]->data_elems[TPS_PAYMENT_INTEREST_AMOUNT_PAID] = $tps_interest_amount_paid;
             $tps_records[$i]->data_elems[TPS_PAYMENT_TOTAL_AMOUNT_PAID] = $tps_amount_paid + $tps_penalty_amount_paid + $tps_interest_amount_paid;
             $tps_records[$i]->data_elems[TPS_PAYMENT_LAST_UPDATED_BY] = $admin;
             $tps_records[$i]->data_elems[TPS_PAYMENT_LAST_UPDATE_TS] = date("Y-m-d H:i:s");
             $this->debug("{$tps_amount_paid} == {$tps_amount_due} && {$tps_penalty_amount} == {$tps_penalty_amount_paid} && {$tps_interest_amount} == {$tps_interest_amount_paid} ");
             if ($tps_amount_paid == $tps_amount_due && $tps_penalty_amount == $tps_penalty_amount_paid && $tps_interest_amount == $tps_interest_amount_paid) {
                 $tps_records[$i]->data_elems[TPS_PAYMENT_STATUS] = TPS_PAYMENT_STATE_PAID;
                 $tps_records[$i]->data_elems[TPS_PAYMENT_DATE] = date("Y-m-d H:i:s");
             }
             if ($bCommit) {
                 $retUpdate = $tps_records[$i]->_update($trans_obj, $payment_id, $admin);
             } else {
                 $retUpdate = 1;
             }
             if ($retUpdate > 0) {
                 $this->debug("Adding OR Details [tps={$tax_paid_set},sps={$surcharge_paid_set},ips={$interest_paid_set}]");
                 if ($tax_paid_set > 0) {
                     $ret1 = $this->addORDetails($or_code, $trans_obj->getData(TRANS_ID), $payment_id, $fee_id, $tax_fee_code, $cash_account_code, $tax_fee_account_code, $tax_paid_set, "CASH", $bCommit);
                     if ($ret1 < 0) {
                         $this->setError(-1, "error on execute of addORDetails params( {$or_code}, " . $trans_obj->getData(TRANS_ID) . ", {$payment_id}, {$fee_id}, {$tax_fee_code}, {$cash_account_code}, {$tax_fee_account_code}, {$tax_paid_set}, CASH, {$bCommit} )!");
                         // roll back here
                         return -1;
                     }
                 } else {
                     $ret2 = 1;
                 }
                 if ($surcharge_paid_set > 0) {
                     $ret2 = $this->addORDetails($or_code, $trans_obj->getData(TRANS_ID), $payment_id, $fee_id, $tax_fee_code, $cash_account_code, $interest_account_code, $surcharge_paid_set, "SURCHARGE", $bCommit);
                     if ($ret2 < 0) {
                         $this->setError(-2, "error on execute of addORDetails params( {$or_code}, " . $trans_obj->getData(TRANS_ID) . ", {$payment_id}, {$fee_id}, {$tax_fee_code}, {$cash_account_code}, {$interest_account_code}, {$surcharge_paid_set}, SURCHARGE, {$bCommit} )!");
                         // roll back here
                         return -2;
                     }
                 } else {
                     $ret2 = 1;
                 }
                 if ($interest_paid_set > 0) {
                     $ret3 = $this->addORDetails($or_code, $trans_obj->getData(TRANS_ID), $payment_id, $fee_id, $tax_fee_code, $cash_account_code, $surcharge_account_code, $interest_paid_set, "INTEREST", $bCommit);
                     if ($ret3 < 0) {
                         $this->setError(-3, "error on execute of addORDetails params( {$or_code}, " . $trans_obj->getData(TRANS_ID) . ", {$payment_id}, {$fee_id}, {$tax_fee_code}, {$cash_account_code}, {$surcharge_account_code}, {$interest_paid_set}, INTEREST, {$bCommit} )!");
                         // roll back here
                         return -3;
                     }
                 } else {
                     $ret3 = 1;
                 }
                 $this->debug("Adding OR Details [r1={$ret1},r2={$ret2},r3={$ret3}]");
             }
             if ($amount <= 0) {
                 $this->debug("Payment done!");
                 break;
             }
         }
         $this->debug("CREATE OR Payment done LEFT = {$amount}!");
         if ($bCommit) {
             $retCreateOR = $this->create($or_code, $payment_code, $trans_obj->getData(TRANS_ID), $tmp_amount, $bCommit);
             if ($retCreateOR < 0) {
                 // roll back here
                 $this->debug("Error on create of OR header, return {$retCreateOR}!");
                 $this->setError(-6, "Error on create of OR header, return {$retCreateOR}!");
                 return -6;
             }
             $ret_or_code = update_system_code($this->m_dbLink, CODES_OR_COL, $or_code);
             $ret_payment_code = update_system_code($this->m_dbLink, CODES_PAY_COL, $payment_code);
             $tmp_amount_due = $clsTPS->getTotalAmountDue($trans_obj->getData(TRANS_ID));
             if ($tmp_amount_due > 0) {
                 $trans_obj->_setTransPaymentStatusINTERNAL($payment_code, $amount, 'PARTIAL', $admin);
             } else {
                 $trans_obj->_setTransPaymentStatusINTERNAL($payment_code, $amount, 'PAID', $admin);
             }
         }
         // commit here
         return 1;
     } else {
         $this->setError(-1, "All payables have been paid.");
         return -1;
     }
 }
 function computeTaxTotalAmounDue($depth = 0)
 {
     if ($depth == 1) {
         return 0;
     }
     // terminate recursive call on comutetax
     // load the tax/fee record with its attached formula
     $clsTaxFeeRef = new EBPLTaxFeeSysRef($this->m_dbLink, false);
     $res_formula = $clsTaxFeeRef->select($this->getData(TF_TAX_FEE_CODE));
     if (is_array($res_formula)) {
         $clsTaxFormula = $res_formula["result"][0]->getData(EBPLS_TAX_FORMULA);
         if ($clsTaxFormula) {
             // pass paramters to formula before computation
             for ($i = 1; $i <= TF_TAX_MAX_PARAMS; $i++) {
                 $clsTaxFormula->setParameterValue($i, $this->getData(constant("TF_TAX_TAXABLE_AMOUNT{$i}")) + 0.0);
             }
             // process prerequisite tax/fees if there are any
             $arr_parameters = $clsTaxFormula->getParameterDescription(null, true);
             $this->debug("param cnt : " . count($arr_parameters));
             foreach ($arr_parameters as $key => $value) {
                 if (eregi("^\\[TF=(.*)\\]\$", $value, $arrTaxFeeCode) && eregi("^x([0-9]+)\$", $key, $arrIndex)) {
                     $clsTaxFeeTmp = new EBPLSTransactionFee($this->m_dbLink, false);
                     $res_formula = $clsTaxFeeTmp->view($this->getData(TF_TRANS_ID), $arrTaxFeeCode[1]);
                     if ($res_formula) {
                         $clsTaxFeeTmp->computeTaxTotalAmounDue(1);
                         $this->debug("Tax/Fee Amount: " . $clsTaxFeeTmp->getData(TF_TAX_TOTAL_AMOUNT_DUE) . "!");
                         $this->setData(constant("TF_TAX_TAXABLE_AMOUNT" . $arrIndex[1]), $clsTaxFeeTmp->getData(TF_TAX_TOTAL_AMOUNT_DUE));
                         $clsTaxFormula->setParameterValue($arrIndex[1], floatval($clsTaxFeeTmp->getData(TF_TAX_TOTAL_AMOUNT_DUE)));
                     } else {
                         $this->setError(-6, "Unable to load prerequisite tax/fee " . $arrTaxFeeCode[1] . "!");
                         $this->debug("Unable to load prerequisite tax/fee " . $arrTaxFeeCode[1] . "!");
                         return -6;
                     }
                 } else {
                     $this->debug("no match on {$value}");
                 }
             }
             $clsTaxFormula->setParameterTagValue("[CAPITAL]", $this->m_BusTaxCapital);
             $clsTaxFormula->setParameterTagValue("[LAST_GROSS]", $this->m_BusTaxLastGross);
             $index1 = $clsTaxFormula->getParameterTagValueIndex("[CAPITAL]");
             if ($index1) {
                 $this->setData(constant("TF_TAX_TAXABLE_AMOUNT" . $index1), $this->m_BusTaxCapital);
             }
             $index2 = $clsTaxFormula->getParameterTagValueIndex("[LAST_GROSS]");
             if ($index2) {
                 $this->setData(constant("TF_TAX_TAXABLE_AMOUNT" . $index2), $this->m_BusTaxLastGross);
             }
             $this->debug("FORMULA {$index1}=" . $this->m_BusTaxCapital . ",{$index2}=" . $this->m_BusTaxLastGross . "<BR>");
             // compute
             $tax_amount = $clsTaxFormula->computeTax($this->m_BusTaxCapital, $this->m_BusTaxLastGross);
             if ($tax_amount >= 0) {
                 $this->data_elems[TF_TAX_TOTAL_AMOUNT_DUE] = $tax_amount;
                 $this->debug("FORMULA compuation OK<BR>");
                 return 1;
             } else {
                 $this->setError(-1, $clsTaxFormula->getError());
                 return $tax_amount;
             }
         } else {
             $this->setError(-5, "Unable to load formula of tax/fee " . $this->getData(TF_TAX_FEE_CODE) . "!");
             $this->debug("Unable to load formula of tax/fee " . $this->getData(TF_TAX_FEE_CODE) . "!");
             return -5;
         }
     } else {
         $this->data_elems[TF_TAX_TOTAL_AMOUNT_DUE] = 0;
         $this->debug("FORMULA ERROR (cant find tax/fee code : " . $this->getData(TF_TAX_FEE_CODE) . "<BR>");
         return -4;
     }
 }