File: /www/exchange2/exchange/custom_actions/fix_reserves.php
<?php
class Fix_reserves
{
private $query;
function __construct()
{
include_once('../Bin/constants.php');
include_once('../Bin/init.php');
require_once(ROOT_FOLDER.'Bin/Security.php');
$this->query = new Bin_Query();
}
function fix($trade_ids)
{
$this->query->executeQuery('SELECT getReserve(expected_date, actual_date, payment_trans.transaction_date, payment_trans.transaction_date ,NULL, face_value, max_thirty_day_reserve, purchase_discount, invoice_closed_attributes.processing_fee, invoice_master.override_180_day_rule, IFNULL(invoice_master.face_value_charge, IFNULL(debtors_detail.face_value_charge, od.face_value_charge)), od.credebt_facility_type, invoice_master.face_value_charge_applied, invoice_master.ldc_premium, invoice_master.agent_commission) as real_reserve, invoice_master.reserve,invoice_master.invoice_id,invoice_master.manual_transaction_id,invoice_master.trade_reference_id, invoice_master.drp_id
FROM invoice_master
LEFT JOIN invoice_closed_attributes ON invoice_closed_attributes.invoice_id = invoice_master.invoice_id
LEFT JOIN manual_transactions as main_trans ON main_trans.manual_transaction_id = invoice_master.manual_transaction_id AND main_trans.status=1
LEFT JOIN manual_transactions as payment_trans ON main_trans.reconcile_payment = payment_trans.manual_transaction_id AND payment_trans.status=1
LEFT JOIN debtors_detail ON debtors_detail.debtor_id = invoice_master.debtor_id
LEFT JOIN debtor_relation ON debtors_detail.debtor_id = debtor_relation.debtor_id
LEFT JOIN organisation_details od ON od.user_id = debtor_relation.trader_id
WHERE trade_reference_id IN ('.implode(',',$trade_ids).')
HAVING real_reserve<>invoice_master.reserve');
$invocies=$this->query->records;
foreach($invocies as $invoice)
{
if ($invoice['manual_transaction_id']=='0')
{
continue;
}
$this->query->updateQuery('UPDATE invoice_master SET reserve = ' . $invoice['real_reserve'] . ' WHERE invoice_id =' . $invoice['invoice_id'] . ' LIMIT 1');
echo 'Reserve for '.$invoice['trade_reference_id'].' changed to '.number_format($invoice['real_reserve'],2)."\r\n";
if ($invoice['drp_id']=='0')
{
continue;
}
$this->query->executeQuery('SELECT amount,reference_to, transref_list, debtor_id, transaction_date, originator_id
FROM manual_transactions
WHERE manual_transaction_id='.$invoice['drp_id']);
$current_drp=$this->query->records[0];
$invoices_reserves=0;
if (!empty($current_drp['reference_to']))
{
$this->query->executeQuery('SELECT SUM(reserve) as amount
FROM invoice_master
WHERE invoice_id IN ('.$current_drp['reference_to'].') AND reserve_on=1 AND drp_id='.$invoice['drp_id']);
$invoices_reserves=$this->query->records[0]['amount'];
}
$transactions_reserves=0;
if (!empty($current_drp['transref_list']))
{
//91
$this->query->executeQuery('SELECT IFNULL(SUM(IF(transaction_type='.POSITIVE_RESERVE_ADJUSTMENT.',amount,-1*amount)),0) as amount
FROM manual_transactions
WHERE manual_transaction_id IN ('.$current_drp['transref_list'].')');
$transactions_reserves=$this->query->records[0]['amount'];
}
$new_amount=$invoices_reserves+$transactions_reserves;
$this->query->updateQuery('UPDATE manual_transactions
SET amount='.$new_amount.', modified_at=NOW(), modified_by=-1
WHERE manual_transaction_id='.$invoice['drp_id']);
$ra_type=(($new_amount>$current_drp['amount'])?POSITIVE_RESERVE_ADJUSTMENT:NEGATIVE_RESERVE_ADJUSTMENT);
$this->query->executeQuery('SELECT *
FROM manual_transactions
WHERE transaction_type IN ('.$ra_type.') AND debtor_id='.$current_drp['debtor_id'].' AND originator_id='.$current_drp['originator_id'].' AND transaction_date="'.$current_drp['transaction_date'].'" AND reserve_on=0');
$is_ra_exists=$this->query->records;
if (count($is_ra_exists)>0)
{
$this->query->updateQuery('UPDATE manual_transactions
SET amount=amount+'.abs($current_drp['amount']-$new_amount).', modified_at=NOW(), modified_by=-1
WHERE manual_transaction_id='.$is_ra_exists[0]['manual_transaction_id']);
echo 'DRP for '.$invoice['trade_reference_id'].' changed. Updated reserve adjustment ('.$ra_type.')'."\r\n";
}
else
{
$this->query->updateQuery('INSERT INTO manual_transactions (manual_transaction_id,amount,transaction_type,originator_id,debtor_id,status,interface,transaction_date,created_at,created_by)
VALUES(null,'.abs($current_drp['amount']-$new_amount).','.$ra_type.','.$current_drp['originator_id'].','.$current_drp['debtor_id'].',1,1,"'.$current_drp['transaction_date'].'",NOW(),-1);');
echo 'DRP for '.$invoice['trade_reference_id'].' changed. Added reserve adjustment ('.$ra_type.')'."\r\n";
}
}
}
/**
* Fixing only for 1,3,4
*
*/
function bug_TT2154()
{
$this->query->executeQuery('SELECT trade_reference_id, invoice_id
FROM invoice_master
LEFT JOIN debtors_detail ON debtors_detail.debtor_id = invoice_master.debtor_id
WHERE invoice_master.root_invoice_id>0 AND invoice_master.log_status=1 AND debtors_detail.`type`="debtor" AND
(
(invoice_master.trade_reference_id IN (160719052577, 160719052586, 160719052587, 160719052578, 160719052580, 160719052582, 160719052585)) OR
(invoice_master.trade_reference_id IN (151216036186,160115038138)) OR
(invoice_master.debtor_id=191 AND invoice_master.actual_date>=DATE("2015-09-18"))
)');
$invoices=$this->query->records;
$result=array('ids'=>array(),'trade_ids'=>array());
foreach($invoices as $invoice)
{
$result['trade_ids'][]=$invoice['trade_reference_id'];
$result['ids'][]=$invoice['invoice_id'];
}
$this->query->updateQuery('UPDATE invoice_master SET
invoice_master.max_thirty_day_reserve=0.875
WHERE invoice_master.invoice_id IN ('.implode(',',$result['ids']).')');
return $result['trade_ids'];
}
}
$fix_reserves = new Fix_reserves();
$fix_reserves->fix(array("160406044346","160406044348","160419045303","160419045304","160420045375","160420045394","160602048644","160616049597","160616049598"));
?>