HEX
Server: Apache/2.2.15 (CentOS)
System: Linux ip-10-0-2-146.eu-west-1.compute.internal 2.6.32-754.35.1.el6.centos.plus.x86_64 #1 SMP Sat Nov 7 11:33:42 UTC 2020 x86_64
User: root (0)
PHP: 5.6.40
Disabled: NONE
Upload Files
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"));
  
?>