Exemplo n.º 1
0
 /**
  * Creats a CTC entry, will automatically validate data set ( data is set using setData( key, value) method ).
  *
  */
 function create()
 {
     if ($this->m_dbLink) {
         mysql_query("LOCK TABLES", $this->m_dbLink);
         $this->computeTax();
         if (($error_num = $this->validateData()) > 0) {
             if ($this->m_ctcType == CTC_TYPE_INDIVIDUAL) {
                 $m_strLastCode = get_next_system_code($this->m_dbLink, CODES_CTC_IND_COL);
             } else {
                 $m_strLastCode = get_next_system_code($this->m_dbLink, CODES_CTC_BUS_COL);
             }
             $this->data_elems[CTC_CODE] = $m_strLastCode;
             $this->data_elems[CTC_DATE_ISSUED] = date("Y-m-d H:i:s");
             $this->data_elems[CTC_ACCT_CODE] = "CTC PAYMENT";
             $strValues = $this->data_elems;
             $ret = ebpls_insert_data($this->m_dbLink, $this->m_strTable, $strValues);
             if ($ret < 0) {
                 $this->debug("CREATE CTC FAILED [error:{$ret},msg=" . get_db_error() . "]");
                 $this->m_arrError["err_code"] = $ret;
                 $this->m_arrError["err_mesg"] = get_db_error();
             } else {
                 $this->debug("CREATE CTC SUCCESSFULL [{$m_strLastCode}]");
                 $this->data_elems[CTC_CODE] = $m_strLastCode;
                 if ($this->m_ctcType == CTC_TYPE_INDIVIDUAL) {
                     $ret_ctc_code = update_system_code($this->m_dbLink, CODES_CTC_IND_COL, $m_strLastCode);
                 } else {
                     $ret_ctc_code = update_system_code($this->m_dbLink, CODES_CTC_BUS_COL, $m_strLastCode);
                 }
             }
         } else {
             $this->debug("CREATE CTC FAILED DUE TO INVALID DATA INPUT");
             $ret = $error_num;
         }
         mysql_query("UNLOCK TABLES", $this->m_dbLink);
         return $ret;
     } else {
         $this->setError(-1, "CREATE CTC FAILED DUE TO INVALID DB LINK");
         $this->debug("CREATE CTC FAILED DUE TO INVALID DB LINK");
         return -1;
     }
 }
 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;
     }
 }
Exemplo n.º 3
0
 function setTransactionStatus($trans_id, $status, $creator, $user_level)
 {
     switch ($status) {
         case TRANS_STATUS_ASSESSMENT:
             if ($user_level != TRANS_LEVEL_APPLICATION_OFFICER && $user_level != TRANS_LEVEL_ADMIN_OFFICER && $user_level != TRANS_LEVEL_ROOT_OFFICER) {
                 $this->debug("setTransactionStatus Failed, user level {$user_level} of {$admin} is not allowed.");
                 $this->setError(-1, "setTransactionStatus Failed, user level {$user_level} of {$admin} is not allowed.");
                 return -1;
             }
             if (!is_numeric($this->getData(TRANS_ID))) {
                 $this->debug("setTransactionStatus Failed, transaction not loaded, load by invoking loadTransaction.");
                 $this->setError(-1, "setTransactionStatus Failed, transaction not loaded, load by invoking loadTransaction.");
                 return -1;
             }
             if ($this->getData(TRANS_TRANSACTION_STATUS) != TRANS_STATUS_APPLICATION) {
                 $this->debug("setTransactionStatus Failed, transaction status already " . $this->getData(TRANS_TRANSACTION_STATUS));
                 $this->setError(-1, "setTransactionStatus Failed, transaction status already " . $this->getData(TRANS_TRANSACTION_STATUS));
                 return -1;
             }
             // NOTE : additional checking should be done here if all requirements have been submitted
             $pen_req_list = $this->getRequirementList(REQUIREMENT_STATUS_PENDING);
             //print_r($pen_req_list);
             if ($pen_req_list != -1 && count($pen_req_list) > 0) {
                 $this->debug("setTransactionStatus Failed, pending requirements not yet submitted.");
                 $this->setError(-1, "setTransactionStatus Failed, pending requirements not yet submitted.");
                 return -1;
             }
             ebpls_start_transaction($this->m_dbLink);
             $ass_code = get_next_system_code($this->m_dbLink, CODES_ASS_COL);
             $strWhere[TRANS_ID] = $trans_id;
             $strValue[TRANS_TRANSACTION_STATUS] = TRANS_STATUS_ASSESSMENT;
             $strValue[TRANS_ASSESSMENT_CODE] = $ass_code;
             $strValue[TRANS_ASSESSMENT_DATE] = date("Y-m-d H:i:s");
             $strValue[TRANS_APPLICATION_DATE_PROCESSED] = date("Y-m-d H:i:s");
             $strValue[TRANS_ADMIN_USER] = $creator;
             $ret = ebpls_update_data($this->m_dbLink, EBPLS_TRANSACTION_TABLE, $strValue, $strWhere);
             if ($ret < 0) {
                 $this->debug("Promotion of transaction to ASSESSMENT stage failed.");
                 $this->setError(-1, get_db_error());
                 ebpls_rollback_transaction($this->m_dbLink);
             } else {
                 $this->debug("Promotion of transaction to ASSESSMENT stage ok.");
                 $ret_app_code = update_system_code($this->m_dbLink, CODES_ASS_COL, $ass_code);
             }
             ebpls_commit_transaction($this->m_dbLink);
             break;
         case TRANS_STATUS_PAYMENT:
             if ($user_level != TRANS_LEVEL_ASSESSMENT_OFFICER && $user_level != TRANS_LEVEL_ADMIN_OFFICER && $user_level != TRANS_LEVEL_ROOT_OFFICER) {
                 $this->debug("assessTransaction Failed, user level {$user_level} of {$admin} is not allowed.");
                 $this->setError(-1, "assessTransaction Failed, user level {$user_level} of {$admin} is not allowed.");
                 return -1;
             }
             if (!is_numeric($this->getData(TRANS_ID))) {
                 $this->debug("assessTransaction Failed, transaction not loaded, load by invoking loadTransaction.");
                 $this->setError(-1, "assessTransaction Failed, transaction not loaded, load by invoking loadTransaction.");
                 return -1;
             }
             if ($this->getData(TRANS_TRANSACTION_STATUS) != TRANS_STATUS_ASSESSMENT) {
                 $this->debug("assessTransaction Failed, transaction status already " . $this->getData(TRANS_TRANSACTION_STATUS));
                 $this->setError(-1, "assessTransaction Failed, transaction status already " . $this->getData(TRANS_TRANSACTION_STATUS));
                 return -1;
             }
             // NOTE : check if payment mode have beens set
             if (!$this->isPaymentModeSet()) {
                 $this->setError(-1, "Payment not yet set, please set payment mode before setting transaction for payment status.");
                 return -1;
             }
             ebpls_start_transaction($this->m_dbLink);
             $pay_code = get_next_system_code($this->m_dbLink, CODES_PAY_COL);
             $strWhere[TRANS_ID] = $trans_id;
             $strValue[TRANS_TRANSACTION_STATUS] = TRANS_STATUS_PAYMENT;
             $strValue[TRANS_PAYMENT_CODE] = $pay_code;
             $strValue[TRANS_PAYMENT_DATE] = date("Y-m-d H:i:s");
             $strValue[TRANS_ASSESSMENT_DATE_PROCESSED] = date("Y-m-d H:i:s");
             $strValue[TRANS_ADMIN_USER] = $creator;
             $ret = ebpls_update_data($this->m_dbLink, EBPLS_TRANSACTION_TABLE, $strValue, $strWhere);
             if ($ret < 0) {
                 $this->debug("Promotion of transaction to ASSESSMENT stage failed.");
                 $this->setError(-1, get_db_error());
                 ebpls_rollback_transaction($this->m_dbLink);
             } else {
                 $this->debug("Promotion of transaction to ASSESSMENT stage ok.");
                 $ret_app_code = update_system_code($this->m_dbLink, CODES_PAY_COL, $pay_code);
             }
             ebpls_commit_transaction($this->m_dbLink);
             break;
         case TRANS_STATUS_APPROVAL:
             if ($user_level != TRANS_LEVEL_PAYMENT_OFFICER && $user_level != TRANS_LEVEL_ADMIN_OFFICER && $user_level != TRANS_LEVEL_ROOT_OFFICER) {
                 $this->debug("paymentTransaction Failed, user level {$user_level} of {$admin} is not allowed.");
                 $this->setError(-1, "paymentTransaction Failed, user level {$user_level} of {$admin} is not allowed.");
                 return -1;
             }
             if (!is_numeric($this->getData(TRANS_ID))) {
                 $this->debug("paymentTransaction Failed, transaction not loaded, load by invoking loadTransaction.");
                 $this->setError(-1, "paymentTransaction Failed, transaction not loaded, load by invoking loadTransaction.");
                 return -1;
             }
             if ($this->getData(TRANS_TRANSACTION_STATUS) != TRANS_STATUS_PAYMENT) {
                 $this->debug("paymentTransaction Failed, transaction status already " . $this->getData(TRANS_TRANSACTION_STATUS));
                 $this->setError(-1, "paymentTransaction Failed, transaction status already " . $this->getData(TRANS_TRANSACTION_STATUS));
                 return -1;
             }
             //
             ebpls_start_transaction($this->m_dbLink);
             $apr_code = get_next_system_code($this->m_dbLink, CODES_APR_COL);
             $strWhere[TRANS_ID] = $trans_id;
             $strValue[TRANS_TRANSACTION_STATUS] = TRANS_STATUS_APPROVAL;
             $strValue[TRANS_APPROVAL_CODE] = $apr_code;
             $strValue[TRANS_APPROVAL_DATE] = date("Y-m-d H:i:s");
             $strValue[TRANS_PAYMENT_DATE_PROCESSED] = date("Y-m-d H:i:s");
             $strValue[TRANS_ADMIN_USER] = $creator;
             $ret = ebpls_update_data($this->m_dbLink, EBPLS_TRANSACTION_TABLE, $strValue, $strWhere);
             if ($ret < 0) {
                 $this->debug("Promotion of transaction to ASSESSMENT stage failed.");
                 $this->setError(-1, get_db_error());
                 ebpls_rollback_transaction($this->m_dbLink);
             } else {
                 $this->debug("Promotion of transaction to ASSESSMENT stage ok.");
                 $ret_app_code = update_system_code($this->m_dbLink, CODES_APR_COL, $apr_code);
             }
             ebpls_commit_transaction($this->m_dbLink);
             break;
         case TRANS_STATUS_RELEASING:
             if ($user_level != TRANS_LEVEL_APPROVAL_OFFICER && $user_level != TRANS_LEVEL_ADMIN_OFFICER && $user_level != TRANS_LEVEL_ROOT_OFFICER) {
                 $this->debug("approveTransaction Failed, user level {$user_level} of {$admin} is not allowed.");
                 $this->setError(-1, "approveTransaction Failed, user level {$user_level} of {$admin} is not allowed.");
                 return -1;
             }
             if (!is_numeric($this->getData(TRANS_ID))) {
                 $this->debug("approveTransaction Failed, transaction not loaded, load by invoking loadTransaction.");
                 $this->setError(-1, "approveTransaction Failed, transaction not loaded, load by invoking loadTransaction.");
                 return -1;
             }
             if ($this->getData(TRANS_TRANSACTION_STATUS) != TRANS_STATUS_APPROVAL) {
                 $this->debug("setStatusForReleasing Failed, transaction status already " . $this->getData(TRANS_TRANSACTION_STATUS));
                 $this->setError(-1, "setStatusForReleasing Failed, transaction status already " . $this->getData(TRANS_TRANSACTION_STATUS));
                 return -1;
             }
             ebpls_start_transaction($this->m_dbLink);
             $rel_code = get_next_system_code($this->m_dbLink, CODES_REL_COL);
             $strWhere[TRANS_ID] = $trans_id;
             $strValue[TRANS_TRANSACTION_STATUS] = TRANS_STATUS_RELEASING;
             $strValue[TRANS_RELEASE_CODE] = $rel_code;
             $strValue[TRANS_RELEASE_DATE] = date("Y-m-d H:i:s");
             $strValue[TRANS_APPROVAL_DATE_PROCESSED] = date("Y-m-d H:i:s");
             $strValue[TRANS_ADMIN_USER] = $creator;
             $ret = ebpls_update_data($this->m_dbLink, EBPLS_TRANSACTION_TABLE, $strValue, $strWhere);
             if ($ret < 0) {
                 $this->debug("Promotion of transaction to ASSESSMENT stage failed.");
                 $this->setError(-1, get_db_error());
                 ebpls_rollback_transaction($this->m_dbLink);
             } else {
                 $this->debug("Promotion of transaction to ASSESSMENT stage ok.");
                 $ret_app_code = update_system_code($this->m_dbLink, CODES_REL_COL, $rel_code);
             }
             ebpls_commit_transaction($this->m_dbLink);
             break;
         case TRANS_STATUS_RELEASED:
         case TRANS_STATUS_REJECTED:
             if ($user_level != TRANS_LEVEL_RELEASING_OFFICER && $user_level != TRANS_LEVEL_ADMIN_OFFICER && $user_level != TRANS_LEVEL_ROOT_OFFICER) {
                 $this->debug("releaseTransaction Failed, user level {$user_level} of {$admin} is not allowed.");
                 $this->setError(-1, "releaseTransaction Failed, user level {$user_level} of {$admin} is not allowed.");
                 return -1;
             }
             if (!is_numeric($this->getData(TRANS_ID))) {
                 $this->debug("releaseTransaction Failed, transaction not loaded, load by invoking loadTransaction.");
                 $this->setError(-1, "releaseTransaction Failed, transaction not loaded, load by invoking loadTransaction.");
                 return -1;
             }
             if ($this->getData(TRANS_TRANSACTION_STATUS) != TRANS_STATUS_RELEASING) {
                 $this->debug("releaseTransaction Failed, transaction status already " . $this->getData(TRANS_TRANSACTION_STATUS));
                 $this->setError(-1, "releaseTransaction Failed, transaction status already " . $this->getData(TRANS_TRANSACTION_STATUS));
                 return -1;
             }
             // get permit no
             $permit_type = $this->getPermitType();
             $permit_id = $this->getPermitId();
             switch ($permit_type) {
                 case PERMIT_TYPE_BUSINESS:
                     $key = CODES_PERMIT_BUS_COL;
                     break;
                 case PERMIT_TYPE_OCCUPATIONAL:
                     $key = CODES_PERMIT_OCCUPATIONAL_COL;
                     break;
                 case PERMIT_TYPE_PEDDLER:
                     $key = CODES_PERMIT_PEDDLER_COL;
                     break;
                 case PERMIT_TYPE_FRANCHISE:
                     $key = CODES_PERMIT_FRANCHISE_BUS_COL;
                     break;
                 case PERMIT_TYPE_MOTORIZED:
                     $key = CODES_PERMIT_MOTORIZED_COL;
                     break;
                 case PERMIT_TYPE_FISHERY:
                     $key = CODES_PERMIT_FISHERY_COL;
                     break;
                 default:
                     $this->debug("Invalid Transaction permit type {$permit_type}, can't process release of transaction.");
                     return -1;
                     break;
             }
             ebpls_start_transaction($this->m_dbLink);
             $strWhere[TRANS_ID] = $trans_id;
             $strValue[TRANS_TRANSACTION_STATUS] = $status;
             $strValue[TRANS_RELEASE_DATE_PROCESSED] = date("Y-m-d H:i:s");
             $strValue[TRANS_ADMIN_USER] = $creator;
             if ($status == TRANS_STATUS_RELEASED && ($this->getData(TRANS_TYPE) == TRANS_TYPE_NEW || $this->getData(TRANS_TYPE) == TRANS_TYPE_RENEW)) {
                 $permit_code = get_next_system_code($this->m_dbLink, $key);
                 $strValue[TRANS_PERMIT_CODE] = $permit_code;
             }
             // use ebplsPermit as a factory class to retrieve proper class reference with the right type
             // of EBPLSPermit subclass
             $clsPermit = new EBPLSPermit($this->m_dbLink, false);
             $clsPermitToUpdate = $clsPermit->createPermit($this->m_dbLink, $permit_id, $permit_type, false);
             if ($clsPermitToUpdate != null) {
                 // update transaction with permit code of permit
                 $ret = ebpls_update_data($this->m_dbLink, EBPLS_TRANSACTION_TABLE, $strValue, $strWhere);
                 if ($ret < 0) {
                     $this->debug("Promotion of transaction to {$status} stage failed.");
                     $this->setError(-1, get_db_error());
                     ebpls_rollback_transaction($this->m_dbLink);
                 } else {
                     // update permit of table
                     $clsPermitToUpdate->assignPermitCode($permit_code);
                     if ($status == TRANS_STATUS_RELEASED && ($this->getData(TRANS_TYPE) == TRANS_TYPE_NEW || $this->getData(TRANS_TYPE) == TRANS_TYPE_RENEW)) {
                         $ret_app_code = update_system_code($this->m_dbLink, $key, $permit_code);
                     }
                     $this->debug("Promotion of transaction to {$status} stage ok.");
                 }
                 // set permit status
                 if ($permit_type == PERMIT_TYPE_BUSINESS) {
                     $clsBus = new EBPLSEnterprise($this->m_dbLink);
                     $clsBus->_updateBusinessNatureApplication($nature_code, NULL, NULL, NULL, "PROCESSED");
                 }
                 ebpls_commit_transaction($this->m_dbLink);
             } else {
                 $this->debug("Promotion of transaction to {$status} stage failed, unable to create class permit to assigne permit code.");
                 ebpls_rollback_transaction($this->m_dbLink);
             }
             break;
         default:
             $this->debug("Unrecognized status {$status} value passed.");
             break;
     }
     $this->data_elem[TRANS_TRANSACTION_STATUS] = $status;
     return $ret;
 }