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/TT2987.php
<?php
  class TT2987
  {
      public $query;
      
      public $result;
        
      public $new_transactions=array();
      
      private $last_id;
        
      function __construct()
      {
          include_once('../Bin/constants.php');
          include_once('../Bin/init.php');
          require_once(ROOT_FOLDER.'Bin/Security.php');
          
          $this->query = new Bin_Query();
          include_once(ROOT_FOLDER.'admin/classes/Model/MCEtr.php');
      }
      
      function fixOriginatorFee()
      {
          $this->query->executeQuery("SELECT * FROM site_settings LIMIT 1");
          $site_settings  = count($this->query->records) > 0 ? $this->query->records[0] : null;
          
          $MCetr = new Model_MCEtr(NULL,NULL,$site_settings);
          
          $this->query->executeQuery('SELECT c.close_id as ids, "invoice" as item_type, m.actual_date as item_date, m.manual_transaction_id,m.trade_reference_id as trade_reference_id, main_trans.transaction_type as transaction_type,  NULL as specific_deductible, m.invoice_no as item_reference, m.reserve_on, main_trans.status as transaction_status, m.face_value as face_value,date(m.logapprove_date) as paid_on, m.face_value*(100-m.payment_discount)/100 as paid, ROUND(m.payment_discount,2) as payment_discount, 
        
        DATEDIFF(IF(main_trans.transaction_type='.RECONCILE_CREDITOR_ACCOUNT.',payment_trans.transaction_date, CURDATE()), date(m.logapprove_date)) as rdso, 
        
        IF(main_trans.transaction_type='.RECONCILE_CREDITOR_ACCOUNT.',date(main_trans.transaction_date),"") as receipt_date, m.expected_date as expected_date, IFNULL(DATEDIFF(DATE(m.expected_date), DATE(m.logapprove_date)),0) AS edso,  invoice_closed_attributes.processing_fee AS processing_fee, deb.sell_rate AS creditor_sell_rate, organisation_details.agreed_rate AS originator_sell_rate, c.max_thirty_reserve AS invoice_sell_rate, (SELECT currency_rate FROM currency_rates WHERE currency_date = date(m.logapprove_date) AND currency_id = deb.currency_id LIMIT 1) AS currency_rate, deb.currency_id AS currency_id, m.user_id AS user_id,
        "" AS payment_transaction_type, "" AS payment_reconcile_credit, "" AS payment_status, "" AS payment_id, m.c_etr_commission AS c_etr_commission, NULL as originator_fee, m.invoice_id,
        m.face_value_charge_applied, m.face_value_charge, deb.face_value_charge as creditor_face_value_charge, organisation_details.creditor_face_value_charge as originator_face_value_charge,
        m.ldc_premium, m.agent_commission
                                FROM invoice_master m 
                                LEFT JOIN organisation_details ON m.user_id = organisation_details.user_id
                                LEFT JOIN invoice_closed c ON c.invoice_id = m.invoice_id
                                LEFT JOIN invoice_closed_attributes ON invoice_closed_attributes.invoice_id = m.invoice_id
                                LEFT JOIN debtors_detail deb ON m.debtor_id = deb.debtor_id
                                LEFT JOIN manual_transactions as main_trans ON main_trans.manual_transaction_id = m.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
                                WHERE deb.type = "creditor" AND m.root_invoice_id > 0 AND m.invoice_status = 3 AND main_trans.transaction_type='.RECONCILE_CREDITOR_ACCOUNT);
        
            $invocies=$this->query->records;
            
            foreach($invocies as $invoice)
            {
                $MCetr->setData($invoice);
                $invoice['originator_fee']=NULL;
                $this->query->updateQuery('UPDATE invoice_master SET 
                                            reserve = '.$MCetr->getOriginatorFee().' 
                                          WHERE invoice_id = '.$invoice['invoice_id']. ' 
                                          LIMIT 1');
            }
      }
      
      function returnCommissions()
      {
        $invoices=array(
                        //RCA, ICP, diff, ICP/RCA amount
                        array(42278,42277,-9.38401101145064,5977.47),
                        array(42280,42279,-2.40000000000009,3821),
                        array(42288,42287,-44.5999999999995,4374.03),
                        array(42442,42441,-77.7600000000002,7087.47),
                        array(42461,42460,-157.209999999999,11392.5),
                        array(42465,42464,-8.4067,968.38),
                        array(42472,42471,-44.79000000001,2282.88),
                        array(42476,42475,-36.4700000000003,2282.88),
                        array(42483,42482,-17.7399999999998,2260.52),
                        array(42502,42501,-16.0400000000009,11397.5),
                        array(42504,42503,-0.43,62.41),
                        array(42506,42505,-4.66999999999996,639.49),
                        array(42508,42507,-2.33999999999999,105.02),
                        array(42513,42512,-3.89999999999998,663.56),
                        array(42515,42514,-2.21999999999997,282.84),
                        array(42519,42518,-2.09000000000003,575.47),
                        array(43252,43251,-324.580000000002,28420.02),
                        array(44467,44466,-5.68000000000029,20245.68),
                        array(44478,44477,-120.900000000001,21104.33),
                        array(45033,45032,-30.1100000000006,24259.32),
                        array(45358,45357,-42.1994974519002,15022.04),
                        array(46424,46421,-17.5817830725,5193.79),
                        array(46439,46437,-0.539999999999964,485.77),
                        array(46451,46449,-3.80230000000006,1116.77),
                        array(46618,46613,-41.7099999999991,11387.5),
                        array(46619,46616,-8.78000000000975,4463.21),
                        array(46623,46621,-17.5,5187.5),
                        array(46688,46676,-1.50999999999999,1871.94),
                        array(46689,46678,-6.05000000000018,7493.26),
                        array(46692,46680,-3.81999999999971,4735.95),
                        array(46759,46754,-31.3699999999999,6188.69),
                        array(46808,46806,-133.330000000002,82412.5),
                        array(46816,46814,-346.669999999998,84679.17),
                        array(46837,46835,-679.159900000006,63131.37),
                        array(47123,47122,-526.926627971499,10641),
                        array(47125,47124,-1093.3622479284,29299.75),
                        array(47127,47126,-702.8966869041,21615.97),
                        array(47133,47132,-2883.724386905,104078.8),
                        array(47137,47136,-1124.7566869041,46685.91),
                        array(47139,47138,-537.790167296298,22324.92),
                        array(47144,47143,-1114.3066869041,47846.72),
                        array(47146,47145,-235.892247928401,15074.61),
                        array(47148,47147,-114.49224792833,8398.32),
                        array(47150,47149,-1077.7066279714,44005.86),
                        array(47156,47155,-673.098867296307,62089.16),
                        array(47158,47157,-274.5017456186,13158.01),
                        array(47160,47159,-63.9566869040973,22756.6),
                        array(47162,47161,-110.232247928401,27460.15),
                        array(47168,47167,-202.9066869042,84214.14),
                        array(47170,47169,-148.246686904102,61529.15),
                        array(47174,47173,-147.083742921899,21860.46),
                        array(47176,47175,-186.703742921905,33439.94),
                        array(47178,47177,-6.45016729630152,16074.78),
                        array(47184,47183,-22.5501672963001,56143.72),
                        array(47186,47185,-47.0702504618966,58613.63),
                        array(47193,47192,-146.261716211298,18217.91),
                        array(47202,47201,-67.9002504620003,169092.86),
                        array(47206,47205,-62.2037429219017,22355.5),
                        array(47208,47207,-78.9137429218972,28357.03),
                        array(47210,47209,-115.496627971499,11517.4),
                        array(47212,47211,-14.3917162112994,5129.78),
                        array(47214,47213,-71.02161555052,2451.61),
                        array(47220,47219,-292.090000000102,26942.33),
                        array(47224,47223,-595.549999999996,54927.81),
                        array(47226,47225,-50.7196162112959,42117.14),
                        array(47228,47227,-53.3197665847001,11071.76),
                        array(47230,47229,-88.3291917756997,10284.05),
                        array(47238,47237,-1627.6633,46226.11),
                        array(47242,47241,-53.1366279715003,12042.12),
                        array(47244,47243,-1161.6836363072,37629.25),
                        array(47246,47245,-18.9072562417005,15706.11),
                        array(47248,47247,-50.7297665846999,42111.27),
                        array(47250,47249,-465.613300000099,13995.14),
                        array(47254,47253,-199.159999999996,45089.02),
                        array(47256,47255,-177.508715550601,12808.1),
                        array(47258,47257,-1.8356323692999,1539.03),
                        array(47260,47259,-48.4632155505201,3716.19),
                        array(47262,47261,-35.8500000000004,11164.7),
                        array(47264,47263,-10.6933781545399,2436.04),
                        array(47266,47265,-22.0003562416987,10961.22),
                        array(47268,47267,-27.8387155505202,2528.69),
                        array(47270,47269,-28.3403562417006,35292.44),
                        array(47276,47275,-36.4496168976002,15140.6),
                        array(47284,47283,-40.9416155505196,5267.82),
                        array(47286,47285,-394.4933,16184.83),
                        array(47288,47287,-224.443300000001,9100.02),
                        array(47292,47291,-1.17689525002902,579.66),
                        array(47298,47297,-0.760000000000019,161.02),
                        array(47310,47309,-3.93161555051097,983.27),
                        array(47312,47311,-0.205011235955965,272.45),
                        array(47384,47382,-65.0300000000007,11268.11),
                        array(48233,48230,-400,246107.5),
                        array(48272,48271,-415.150000000001,48227),
                        array(48608,48605,-178.34,11506.05),
                        array(48841,48839,-29.6171999999999,1427.29),
                        array(48846,48844,-36.5036,1676.89),
                        array(48865,48863,-25.4037429218597,3773.14),
                        array(48878,48876,-21.8637429218602,3250.23),
                        array(48963,48962,-57.9210425019501,8471.07),
                        array(49443,49442,-4.26000000000022,2592.78),
                        array(49972,49971,-51.9300000000003,32099.21),
                        array(50926,50924,-541.529999999999,22516),
                        array(50938,50936,-97.5299999999997,4394.17),
                        array(50942,50940,-16.3199999999997,4432.61),
                        array(50947,50945,-10.96,467.56),
                        array(50952,50950,-28.2400000000002,4022.34),
                        array(50956,50954,-267.121934562199,12795.23),
                        array(50961,50959,-448.411925804998,44133.86),
                        array(50965,50963,-18.02525885413,1316.91),
                        array(50969,50967,-37.0917404255397,3387.24),
                        array(50975,50972,-9.30187132229003,1076.8),
                        array(50979,50977,-109.93027500616,8077.83),
                        array(50984,50981,-34.3083177082499,2551.64),
                        array(50990,50987,-19.3893737563799,3634.99),
                        array(51001,50999,-112.076368048281,4909.35),
                        array(51005,51003,-54.8031181015499,3458.91),
                        array(51012,51009,-53.9692489168301,5603.08),
                        array(51070,51064,-25.9400000000005,12944.08),
                        array(51075,51072,-62.5879623854998,4353.76),
                        array(51385,51383,-9.06823624909975,6700.11),
                        array(51540,51538,-74.25,142905.34),
                        array(51727,51725,-0.343887082369974,1191.25),
                        array(51735,51733,-61.7560634093597,5843.42),
                        array(52005,52003,-2.75913228692002,1934.65),
                        array(52018,52017,-39.8199999999997,23126.64),
                        array(52164,51015,-2.27199177561988,4044.56),
                        array(52167,52165,-0.844370123290105,601.69),
                        array(52304,52302,-96.6800000000003,12378.48),
                        array(52308,52306,-68.5300000000097,2969.54),
                        array(52312,52310,-52.54,6004.85),
                        array(52317,52315,-23.3300000000017,20730),
                        array(52321,52319,-6.75487716354019,5129.37),
                        array(52349,52348,-105.209999999999,55493.25),
                        array(52901,52899,-7.34399770026994,7407.21),
                        array(52916,52907,-40.6200000000026,49363.61));
        
        $transactions=array();
        foreach($invoices as $invoice)
        {
            $diff=abs($invoice[2]);
            
            if (!isset($transactions[$invoice[1]]))
            {
                $transactions[$invoice[1]]=array(
                    'value'=>0,
                    'invoices'=>array(),
                    'rca'=>$invoice[0],
                    'transaction'=>$invoice
                );
            }
            
            $transactions[$invoice[1]]['value']+=$diff;
        }
         
        $this->query->executeQuery('SELECT MAX(manual_transactions.manual_transaction_id) as last_id
                                    FROM manual_transactions');
        
        $this->last_id=$this->query->records[0]['last_id'];
        
        foreach($transactions as $icp_id=>$icp_details)
        {
            $parent_id=$this->findParentTransaction($icp_details['transaction'][1]);
            $previous=$this->findParentTransaction($icp_details['transaction'][1],TRUE);
            
            switch($previous['result'])
            {
                case 'splitted':{
                    
                    //change amount of icp
                    $this->query->updateQuery('UPDATE manual_transactions SET 
                                                    amount = amount - '.abs($icp_details['value']).' 
                                               WHERE manual_transaction_id='.$icp_details['transaction'][1]);
                    
                    //change amount of rca, if exists
                    $this->query->updateQuery('UPDATE manual_transactions SET 
                                                    amount = amount - '.abs($icp_details['value']).' 
                                               WHERE manual_transaction_id='.$icp_details['transaction'][0]);
                    
                    //add new 19
                    $this->query->updateQuery('INSERT INTO `manual_transactions` (`manual_transaction_id`, `transaction_type`, `debtor_id`, `originator_id`, `currency_id`, `amount`, `reference_to`, `specific_allocation`, `notes`, `transaction_file`, `specific_deductible`, `deductible_amount`, `trailing_balance`, `trailing_balance_amt`, `transref_list`, `reconcile_payment`, `reconcile_ref`, `payment_return`, `false_payment`, `amendment_id`, `status`, `reconcile_status`, `reconcile_credit`, `multiple_payments`, `multiple_status`, `interface`, `paid_status`, `transaction_date`, `notification_title`, `transaction_name`, `issue_date`, `created_at`, `created_by`, `modified_at`, `modified_by`, `authorised_at`, `authorised_by`, `reserve_on`, `rerouted`, `spooled`, `orpa_id`, `fees_commissions`) 
                                            SELECT NULL, `transaction_type`, `debtor_id`, `originator_id`, `currency_id`, '.abs($icp_details['value']).', "", 0, "", "", 0, 0, 0, 0, "", 0, 0, 0, 0, 0, `status`, 0, 0, 0, 0, `interface`, 0, `transaction_date`, "", "", `issue_date`, NOW(), -1, `modified_at`, `modified_by`, NOW(), -1, 0, `rerouted`, `spooled`, `orpa_id`, `fees_commissions`
                                              FROM manual_transactions
                                              WHERE manual_transaction_id='.$icp_details['transaction'][1]);
                    
                    //link new 19 to same as linked icp
                    $new_icp = $this->query->insertid;
                    $this->query->updateQuery('INSERT INTO `transaction_relations` (`parent_transaction_id`, `transaction_id`) VALUES ('.$previous['trans_id'].', '.$new_icp.');');
                    
                    //check for currency against parent, if not same convert value of new transaction to currency and date of parent
                    $this->query->executeQuery('SELECT IF(manual_transactions_rejected.transaction_type='.ORIGINATOR_PAYMENT_ON_ACCOUNT.', manual_transactions_rejected.currency_id, debtors_detail.currency_id) as parent_currency, manual_transactions_rejected.transaction_date, manual_transactions.currency_id, d2.currency_id as d2_currency_id
                                                FROM manual_transactions
                                                LEFT JOIN manual_transactions_rejected ON manual_transactions_rejected.manual_transaction_id='.$parent_id['trans_id'].'
                                                LEFT JOIN debtors_detail ON debtors_detail.debtor_id = manual_transactions_rejected.debtor_id
                                                LEFT JOIN debtors_detail as d2 ON d2.debtor_id = manual_transactions.debtor_id
                                                WHERE manual_transactions.manual_transaction_id = '.$new_icp.' AND d2.currency_id <> IF(manual_transactions_rejected.transaction_type='.ORIGINATOR_PAYMENT_ON_ACCOUNT.', manual_transactions_rejected.currency_id, debtors_detail.currency_id)');
                    if (count($this->query->records)>0)
                    {
                        $details=$this->query->records[0];
                        if (in_array('1',array($details['parent_currency'],$details['d2_currency_id'])))
                        {
                            $currency_id = ($details['parent_currency']=='1')?$details['d2_currency_id']:$details['parent_currency'];
                            
                            $this->query->executeQuery('SELECT currency_rates.currency_rate
                                                        FROM currency_rates
                                                        WHERE currency_rates.currency_date=DATE("'.$details['transaction_date'].'") AND currency_rates.currency_id='.$currency_id);
                            
                            $rate=$this->query->records[0]['currency_rate'];
                              
                            $change_amount='IF('.$details['d2_currency_id'].'='.$currency_id.',manual_transactions.amount/'.$rate.',manual_transactions.amount*'.$rate.')';
                          }
                          else
                          {
                              $this->query->executeQuery('SELECT *
                                                          FROM currency_rates
                                                          WHERE currency_rates.currency_date=DATE("'.$details['transaction_date'].'")');
                              $rates=array();
                              
                              foreach($this->query->records as $rate)
                              {
                                  $rates[$rate['currency_id']]=$rate['currency_rate'];
                              }
                              
                              
                              $change_amount='(manual_transactions.amount/'.$rates[$details['d2_currency_id']].') * '.$rates[$details['parent_currency']];
                          }
                        
                        $this->query->updateQuery('UPDATE manual_transactions SET 
                                                manual_transactions.amount= '.$change_amount.',
                                                manual_transactions.currency_id='.$details['parent_currency'].'
                                                WHERE manual_transactions.manual_transaction_id='.$new_icp);
                    }
                    
                    //change type from 19 to 7
                    $this->query->updateQuery('UPDATE manual_transactions
                                               LEFT JOIN debtors_detail ON debtors_detail.debtor_id = manual_transactions.debtor_id
                                               SET manual_transactions.transaction_type='.ORIGINATOR_PAYMENT_ON_ACCOUNT.', manual_transactions.currency_id = debtors_detail.currency_id, manual_transactions.debtor_id=0
                                               WHERE manual_transactions.manual_transaction_id='.$new_icp);
                    //update notes for simples
                    $this->query->updateQuery('UPDATE manual_transactions
                                               LEFT JOIN transaction_relations ON transaction_relations.transaction_id = manual_transactions.manual_transaction_id
                                               SET manual_transactions.notes=CONCAT("Splitted from #",transaction_relations.parent_transaction_id," with amount ",manual_transactions.amount," and authorised at ",manual_transactions.authorised_at)
                                               WHERE transaction_relations.parent_transaction_id = '.$parent_id['trans_id']);
                    
                    
                    break;
                }
                
                case FALSE;
                case 'grouped':{
                    //change amount of rca
                    $this->query->updateQuery('UPDATE manual_transactions SET 
                                                  amount = amount - '.abs($icp_details['value']).', 
                                                  manual_transactions.modified_at = NOW() 
                                               WHERE manual_transaction_id='.$icp_details['transaction'][0]);
                    
                    //split payment for original value and new
                    $ids=array();
                    
                    $this->query->updateQuery('INSERT INTO `manual_transactions` (`manual_transaction_id`, `transaction_type`, `debtor_id`, `originator_id`, `currency_id`, `amount`, `reference_to`, `specific_allocation`, `notes`, `transaction_file`, `specific_deductible`, `deductible_amount`, `trailing_balance`, `trailing_balance_amt`, `transref_list`, `reconcile_payment`, `reconcile_ref`, `payment_return`, `false_payment`, `amendment_id`, `status`, `reconcile_status`, `reconcile_credit`, `multiple_payments`, `multiple_status`, `interface`, `paid_status`, `transaction_date`, `notification_title`, `transaction_name`, `issue_date`, `created_at`, `created_by`, `modified_at`, `modified_by`, `authorised_at`, `authorised_by`, `reserve_on`, `rerouted`, `spooled`, `orpa_id`, `fees_commissions`) 
                                            SELECT NULL, `transaction_type`, `debtor_id`, `originator_id`, `currency_id`,'.($icp_details['transaction'][3]-abs($icp_details['value'])).', `reference_to`, `specific_allocation`, `notes`, `transaction_file`, `specific_deductible`, `deductible_amount`, `trailing_balance`, `trailing_balance_amt`, `transref_list`, `reconcile_payment`, `reconcile_ref`, `payment_return`, `false_payment`, `amendment_id`, `status`, `reconcile_status`, `reconcile_credit`, `multiple_payments`, `multiple_status`, `interface`, `paid_status`, `transaction_date`, `notification_title`, `transaction_name`, `issue_date`, `created_at`, `created_by`, `modified_at`, `modified_by`, `authorised_at`, `authorised_by`, `reserve_on`, `rerouted`, `spooled`, `orpa_id`, `fees_commissions`
                                            FROM manual_transactions
                                            WHERE manual_transaction_id='.$icp_details['transaction'][1]);
                $ids['new_icp']=$this->query->insertid;
                
                $this->query->updateQuery('INSERT INTO `transaction_relations` (`parent_transaction_id`, `transaction_id`) VALUES ('.$icp_details['transaction'][1].', '.$ids['new_icp'].');');
                
                $this->query->updateQuery('INSERT INTO `manual_transactions` (`manual_transaction_id`, `transaction_type`, `debtor_id`, `originator_id`, `currency_id`, `amount`, `reference_to`, `specific_allocation`, `notes`, `transaction_file`, `specific_deductible`, `deductible_amount`, `trailing_balance`, `trailing_balance_amt`, `transref_list`, `reconcile_payment`, `reconcile_ref`, `payment_return`, `false_payment`, `amendment_id`, `status`, `reconcile_status`, `reconcile_credit`, `multiple_payments`, `multiple_status`, `interface`, `paid_status`, `transaction_date`, `notification_title`, `transaction_name`, `issue_date`, `created_at`, `created_by`, `modified_at`, `modified_by`, `authorised_at`, `authorised_by`, `reserve_on`, `rerouted`, `spooled`, `orpa_id`, `fees_commissions`) 
                                            SELECT NULL, `transaction_type`, `debtor_id`, `originator_id`, `currency_id`, '.abs($icp_details['value']).', "", 0, "", "", 0, 0, 0, 0, "", 0, 0, 0, 0, 0, `status`, 0, 0, 0, 0, `interface`, 0, `transaction_date`, "", "", `issue_date`, NOW(), -1, `modified_at`, `modified_by`, NOW(), -1, 0, `rerouted`, `spooled`, `orpa_id`, `fees_commissions`
                                            FROM manual_transactions
                                            WHERE manual_transaction_id='.$icp_details['transaction'][1]);
                    $ids['diff_icp']=$this->query->insertid;
                    
                    $this->query->updateQuery('INSERT INTO `transaction_relations` (`parent_transaction_id`, `transaction_id`) VALUES ('.$icp_details['transaction'][1].', '.$ids['diff_icp'].');');
                    
                    //update notes for simples
                    $this->query->updateQuery('UPDATE manual_transactions
                                               LEFT JOIN transaction_relations ON transaction_relations.transaction_id = manual_transactions.manual_transaction_id
                                               SET manual_transactions.notes=CONCAT("Splitted from #",transaction_relations.parent_transaction_id," with amount ",manual_transactions.amount," and authorised at ",manual_transactions.authorised_at), manual_transactions.modified_at = NOW()
                                               WHERE transaction_relations.parent_transaction_id = '.$icp_details['transaction'][1]);
                    
                    
                    //remove original icp
                    $this->query->updateQuery("INSERT INTO `manual_transactions_rejected`(manual_transaction_id,transaction_type,debtor_id,originator_id,currency_id,amount,reference_to,specific_allocation,notes,transaction_file,specific_deductible,deductible_amount,trailing_balance,trailing_balance_amt,transref_list,reconcile_payment,reconcile_ref,payment_return,false_payment,amendment_id,status,reconcile_status,reconcile_credit,multiple_payments,multiple_status,interface,paid_status,transaction_date,notification_title,transaction_name,issue_date,reject_status,created_at,created_by,delete_notes,authorised_at,authorised_by,reserve_on,rerouted,spooled, orpa_id)
                    (
                        SELECT manual_transaction_id,transaction_type,debtor_id,originator_id,currency_id,amount,reference_to,specific_allocation,notes,transaction_file,specific_deductible,deductible_amount,trailing_balance,trailing_balance_amt,transref_list,reconcile_payment,reconcile_ref,payment_return,false_payment,amendment_id,status,reconcile_status,reconcile_credit,multiple_payments,multiple_status,interface,paid_status,transaction_date,notification_title,transaction_name,issue_date,0,NOW(),-1,'".json_encode(array_values($ids))."',authorised_at,authorised_by,reserve_on,rerouted,spooled,orpa_id
                            FROM manual_transactions
                            WHERE manual_transaction_id = '".$icp_details['transaction'][1]."'
                      )");
                            
                    $this->query->updateQuery('DELETE FROM manual_transactions WHERE manual_transaction_id = '.$icp_details['transaction'][1].' LIMIT 1');
                    
                    //change links between new icp and rca
                    
                    $this->query->updateQuery('UPDATE manual_transactions SET 
                                                reconcile_payment='.$ids['new_icp'].',
                                                manual_transactions.modified_at = NOW()
                                               WHERE manual_transaction_id='.$icp_details['transaction'][0]);
            
                    $this->query->updateQuery('UPDATE manual_transactions SET  
                                                reconcile_ref = '.$icp_details['transaction'][0].', 
                                                manual_transactions.modified_at = NOW()
                                              WHERE manual_transaction_id='.$ids['new_icp']);
                    
                    
                    
                    //change type from 19 to 7
                    $this->query->updateQuery('UPDATE manual_transactions
                                               LEFT JOIN debtors_detail ON debtors_detail.debtor_id = manual_transactions.debtor_id
                                               SET manual_transactions.transaction_type='.ORIGINATOR_PAYMENT_ON_ACCOUNT.', manual_transactions.currency_id = debtors_detail.currency_id, manual_transactions.debtor_id=0, manual_transactions.modified_at = NOW()
                                               WHERE manual_transactions.manual_transaction_id='.$ids['diff_icp']);
                    break;
                }
                default:{
                    var_dump($parent_id,$previous,$icp_details['transaction'][1],'--------');
                    break;
                }
            }
        }
      }
      
      function getResult($transactions)
      {
          $parent=$simple=array();
              
          foreach($transactions as $item)
          {
              $parent[$item['parent_transaction_id']]=TRUE;
              $simple[$item['transaction_id']]=TRUE;
          }
          
          $result=NULL;
          if (count(array_keys($parent))==1 AND count(array_keys($simple))>1)
          {
              $result='splitted';
          }
          elseif(count(array_keys($parent))>1 AND count(array_keys($simple))==1)
          {
              $result='grouped';
          }
          elseif(count(array_keys($parent))==1 AND count(array_keys($simple))==1)
          {
              $result='converted';
          }
          
          return $result;
      }
      
      function findParentTransaction($transaction_id,$previous=FALSE)
      {
          $this->query->executeQuery('SELECT *
                                      FROM transaction_relations
                                      WHERE transaction_relations.transaction_id='.$transaction_id);
            
          if (is_null($this->query->records[0]['parent_transaction_id']))
          {
              return array('trans_id'=>$transaction_id,'result'=>FALSE);
          }
          
          if (count($this->query->records)>1 AND $previous)
          {
              return array('trans_id'=>0,'result'=>$this->getResult($this->query->records));
          }
          
          $this->query->executeQuery('SELECT *
                                      FROM transaction_relations
                                      WHERE transaction_relations.parent_transaction_id='.$this->query->records[0]['parent_transaction_id']);
          
          if ($previous)
          {
              return array('trans_id'=>$this->query->records[0]['parent_transaction_id'],'result'=>$this->getResult($this->query->records));
          }
          
          return $this->findParentTransaction($this->query->records[0]['parent_transaction_id']);
      }
      
      function groupOCPA()
      {
          $this->query->updateQuery('SET SESSION group_concat_max_len = 1000000;');
          
          $this->query->executeQuery('SELECT GROUP_CONCAT(manual_transactions.manual_transaction_id) as ids
                                       FROM manual_transactions
                                       WHERE manual_transactions.manual_transaction_id>'.$this->last_id.' AND manual_transactions.transaction_type='.ORIGINATOR_PAYMENT_ON_ACCOUNT.'
                                       GROUP BY manual_transactions.originator_id, manual_transactions.currency_id');
          
          $transactions=$this->query->records;
          
          foreach($transactions as $transaction)
          {
              $this->query->updateQuery('INSERT INTO `manual_transactions` (`manual_transaction_id`, `transaction_type`, `debtor_id`, `originator_id`, `currency_id`, `amount`, `reference_to`, `specific_allocation`, `notes`, `transaction_file`, `specific_deductible`, `deductible_amount`, `trailing_balance`, `trailing_balance_amt`, `transref_list`, `reconcile_payment`, `reconcile_ref`, `payment_return`, `false_payment`, `amendment_id`, `status`, `reconcile_status`, `reconcile_credit`, `multiple_payments`, `multiple_status`, `interface`, `paid_status`, `transaction_date`, `notification_title`, `transaction_name`, `issue_date`, `created_at`, `created_by`, `modified_at`, `modified_by`, `authorised_at`, `authorised_by`, `reserve_on`, `rerouted`, `spooled`, `orpa_id`, `fees_commissions`) 
                                        SELECT NULL, `transaction_type`, `debtor_id`, `originator_id`, `currency_id`, SUM(amount), `reference_to`, `specific_allocation`, CONCAT("Merged from ", GROUP_CONCAT(CONCAT("ID : ",manual_transactions.manual_transaction_id,", Value : ",FORMAT(manual_transactions.amount,2)) SEPARATOR "; ")), `transaction_file`, `specific_deductible`, `deductible_amount`, `trailing_balance`, `trailing_balance_amt`, `transref_list`, `reconcile_payment`, `reconcile_ref`, `payment_return`, `false_payment`, `amendment_id`, `status`, `reconcile_status`, `reconcile_credit`, `multiple_payments`, `multiple_status`, `interface`, `paid_status`, NOW(), `notification_title`, `transaction_name`, `issue_date`, NOW(), -1, `modified_at`, `modified_by`, NOW(), -1, `reserve_on`, `rerouted`, `spooled`, `orpa_id`, `fees_commissions`
                                        FROM manual_transactions
                                        WHERE manual_transactions.manual_transaction_id IN ('.$transaction['ids'].')');
              
              $final_ocpa_id = $this->query->insertid;
              
              $this->query->updateQuery('INSERT INTO transaction_relations (parent_transaction_id,transaction_id)
                                         SELECT `manual_transaction_id`,'.$final_ocpa_id.'
                                         FROM manual_transactions
                                         WHERE manual_transactions.manual_transaction_id IN ('.$transaction['ids'].')');
              
              foreach(explode(',',$transaction['ids']) as $old_id)
              {
                  $this->query->updateQuery("INSERT INTO `manual_transactions_rejected`(manual_transaction_id,transaction_type,debtor_id,originator_id,currency_id,amount,reference_to,specific_allocation,notes,transaction_file,specific_deductible,deductible_amount,trailing_balance,trailing_balance_amt,transref_list,reconcile_payment,reconcile_ref,payment_return,false_payment,amendment_id,status,reconcile_status,reconcile_credit,multiple_payments,multiple_status,interface,paid_status,transaction_date,notification_title,transaction_name,issue_date,reject_status,created_at,created_by,delete_notes,authorised_at,authorised_by,reserve_on,rerouted,spooled, orpa_id)
                    (
                        SELECT manual_transaction_id,transaction_type,debtor_id,originator_id,currency_id,amount,reference_to,specific_allocation,notes,transaction_file,specific_deductible,deductible_amount,trailing_balance,trailing_balance_amt,transref_list,reconcile_payment,reconcile_ref,payment_return,false_payment,amendment_id,status,reconcile_status,reconcile_credit,multiple_payments,multiple_status,interface,paid_status,transaction_date,notification_title,transaction_name,issue_date,0,NOW(),-1,'',authorised_at,authorised_by,reserve_on,rerouted,spooled,orpa_id
                            FROM manual_transactions
                            WHERE manual_transaction_id = '".$old_id."'
                    )");
                            
                    $this->query->updateQuery('DELETE FROM manual_transactions WHERE manual_transaction_id = '.$old_id.' LIMIT 1');
              }
          }
      }
  }
  
  $TT2987 = new TT2987();
  $TT2987->fixOriginatorFee();
  
  $TT2987->returnCommissions();
  $TT2987->groupOCPA();
?>