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/exchange0old/cmws/scripts/sync-transactions.php
<?php
// script for syncing existing Originator and Investor transaction data from Exchange 2.0 to Credebt Machine

if (PHP_SAPI !== "cli") {
    echo "The script should be run only from CLI.";
    exit;
}

$memoryLimit = '2048M';
if (ini_set('memory_limit', $memoryLimit) === false) {
    echo "Unable to set the required memory limit: " . $memoryLimit . ".\n";
    exit;
}

if (is_null($argv)) {
    echo "Please enable \$argv variable in PHP configuration.";
    exit;
}

// required includes
require_once("../../exchange/Bin/constants.php");
require_once("../../exchange/Bin/init.php");
require_once(ROOT_FOLDER . "Bin/Security.php");
require_once(ROOT_FOLDER . "admin/classes/Model/base_actions.php");
require_once(ROOT_FOLDER . "admin/classes/Model/CMSync.php");

$cmSync = new CMSync(MYSQL_ENGINE_IMPROVED);
if (!$cmSync->cmSyncTransactionEnable) {
    echo "Transaction Sync is disabled. Please first enable Transaction Sync in Exchange 2.0 Site Settings.\n";
    exit;
}

if (in_array(CM_SYNC_SCRIPT_ARG_CLEANLOG, $argv, true) === true) {
    $cmSync->cleanLogEvents($argv[0]);
    echo "Log Events have been removed from database.\n";
    exit;
}

$entitiesArgArr = $argv;
array_shift($entitiesArgArr);
array_walk($entitiesArgArr, function (&$value) { $value = ucfirst(strtolower($value)); });

// define data entities to sync
$allDataEntitiesArr = array(
    CM_SYNC_ORG_ROLE_ORIGINATOR,
    CM_SYNC_ORG_ROLE_INVESTOR
);

$allDataSubEntitiesArr = array(
    CM_SYNC_ORG_ROLE_DEBTOR,
    CM_SYNC_ORG_ROLE_CREDITOR
);

$entityIdArray = array(
    CM_SYNC_ORG_ROLE_ORIGINATOR => null,
    CM_SYNC_ORG_ROLE_INVESTOR => null
);

$originatorTransactionEntityArr = array(
    "Debtor Trade" => ETR_TYPE_D,
    "Creditor Trade" => array(ETR_TYPE_B, ETR_TYPE_C),
    "Debtor Receipt" => array(INBOUND_DEBTOR_PAYMENT,
        TRANSFER_OF_PAYMENT_BY_ORIGINATOR, PAID_DIRECTLY_TO_ORIGINATOR),
    "Debtor Credit Note" => CREDIT_NOTE,
    "Debtor Specific Deduction" => SPECIFIC_DEDUCTIBLE,
    "Payment on Account Receipt" => ORIGINATOR_PAYMENT_ON_ACCOUNT,
    "Deposit Receipt" => ORIGINATOR_DEPOSIT,
    "Creditor Receipt" => INBOUND_CREDITOR_PAYMENT,
    "Debtor Receipt Returned" => FALSE_PAYMENT_RETURNED,
    "Debtor Reserve Refund" => POSITIVE_RESERVE_ADJUSTMENT,
    "Debtor Reserve Commission / Margin Call" => NEGATIVE_RESERVE_ADJUSTMENT,
    "Payment on Account Returned" => OCPA_RETURN,
    "Creditor Receipt Returned" => ICP_RETURN
);

$investorTransactionEntityArr = array(
    "Investor RPA Receipt" => INVESTMENT_RPA,
    "Investor Addition Receipt" => INVESTMENT_ADDITION,
    "Investor Compound" => INVESTMENT_COMPOUND,
    "Investor Renewal" => INVESTMENT_CONTINUE,
    "Investor Partial Coupon" => INVESTMENT_PARTIAL_COUPON,
    "Investor Coupon" => INVESTMENT_COUPON,
    "Investor Partial Redemption" => INVESTMENT_REDEMPTION,
    "Investor Full Redemption" => INVESTMENT_REDEEMED
);

$subEntityIdArray = array();
$syncDataEntitiesArr = array();
$idListToSync = array();
$mode = 1;

foreach ($entitiesArgArr as $entityVal) {
    if (($pos = strpos($entityVal, ":")) !== false) {
        $entityValArr = explode(":", $entityVal);

        if (count($entityValArr) !== 4) {
            array_walk($entityValArr, function (&$value) { $value = trim($value); });
            list($valCheck, $idToSync) = $entityValArr;
            $subValCheck = null;
            $subIdToSync = null;
        } else {
            list($valCheck, $idToSync, $subValCheck, $subIdToSync) = $entityValArr;
            $subValCheck = ucfirst($subValCheck);
        }
    } else {
        $valCheck = $entityVal;
        $idToSync = null;
        $subValCheck = null;
        $subIdToSync = null;
    }

    // default mode to load all transactions for specific or all entities;
    // mode will be automatically set to 2 if used for specific transaction(s)
    $mode = 1;

    if (in_array($valCheck, $allDataEntitiesArr, true) === true) {
        $syncDataEntitiesArr[] = $valCheck;
        if (!is_null($idToSync)) {
            $entityIdArray[$valCheck] = $idToSync;

            if (!is_null($subValCheck) && in_array($subValCheck, $allDataSubEntitiesArr, true) === true) {
                if (!is_null($subIdToSync)) {
                    $subEntityIdArray[$idToSync] = $subIdToSync;
                }
            }
        }
    } elseif (strtolower($valCheck) === CM_SYNC_SCRIPT_ARG_TRANSACTION) {
        $mode = 2;
        if (($pos = strpos($idToSync, ",")) !== false) {
            $idListToSync = explode(",", $idToSync);
            array_walk($idListToSync, function (&$value) { $value = trim($value); });
        } else {
            if ($idToSync === '') {
                echo "Missing the transaction reference number CLI argument value.\n";
                exit;
            }
            $idListToSync[] = $idToSync;
        }
    } elseif (strtolower($valCheck) === 'debug') {
        $cmSync->debugMode = true;
    } elseif (strtolower($valCheck) === 'nooriginator') {
        unset($allDataEntitiesArr[0]);
        $allDataEntitiesArr = array_values($allDataEntitiesArr);
    } elseif (strtolower($valCheck) === 'noinvestor') {
        unset($allDataEntitiesArr[1]);
        $allDataEntitiesArr = array_values($allDataEntitiesArr);
    } elseif (strtolower($valCheck) === 'nodebtor') {
        unset($allDataSubEntitiesArr[0]);
        $allDataSubEntitiesArr = array_values($allDataSubEntitiesArr);
        unset($originatorTransactionEntityArr['Debtor Trade'],
            $originatorTransactionEntityArr['Debtor Receipt'],
            $originatorTransactionEntityArr['Debtor Credit Note'],
            $originatorTransactionEntityArr['Debtor Specific Deduction'],
            $originatorTransactionEntityArr['Debtor Receipt Returned'],
            $originatorTransactionEntityArr['Debtor Reserve Refund'],
            $originatorTransactionEntityArr['Debtor Reserve Commission / Margin Call']);
    } elseif (strtolower($valCheck) === 'nocreditor') {
        unset($allDataSubEntitiesArr[1]);
        $allDataSubEntitiesArr = array_values($allDataSubEntitiesArr);
        unset($originatorTransactionEntityArr['Creditor Trade'],
            $originatorTransactionEntityArr['Payment on Account Receipt'],
            $originatorTransactionEntityArr['Deposit Receipt'],
            $originatorTransactionEntityArr['Creditor Receipt'],
            $originatorTransactionEntityArr['Payment on Account Returned'],
            $originatorTransactionEntityArr['Creditor Receipt Returned']);
    } elseif (strtolower($valCheck) !== CM_SYNC_SCRIPT_ARG_CLEANLOG
        &&  strtolower($valCheck) !== CM_SYNC_SCRIPT_ARG_PRECHECK) {
        echo "Incorrect command argument: " . strtolower($valCheck) . "\n";
        exit;
    }
    // by default all Originator and Investor transactions are synced
}

if (count($syncDataEntitiesArr) === 0) {
    $syncDataEntitiesArr = $allDataEntitiesArr;
}
echo $cmSync->showMemoryUsage();

if ($cmSync->initLogFile(CM_SYNC_TRANSACTION) === false) {
    echo "Log File write error: Unable to create log file. Please check folder permissions.\n";
    exit;
}

// if script is used for specific transaction(s)
if ($mode === 2) {
    foreach ($idListToSync as $idVal) {
        echo "\nChecking if transaction: ". $idVal . " exists...\n";

        $basicTransactionData = $cmSync->getBasicTransactionData($idVal);
        $transactionSyncList = array();

        if (count($basicTransactionData) > 0) {
            $transactionSyncList = $cmSync->getTransactionListForSync($basicTransactionData[0]['dataEntity'],
                $basicTransactionData[0]['transactionType'], null, null, $idVal);
        }

        $countList = count($transactionSyncList);
        $counter = 0;
        echo "Record(s) to sync: " . $countList . "\n";
        echo $cmSync->showMemoryUsage();

        foreach ($transactionSyncList as $transactionEntry) {
            $transTitle = $cmSync->getBasicTransactionTitle($basicTransactionData[0]['dataEntity'],
                $basicTransactionData[0]['transactionType']);
            echo "\nSyncing " . $transTitle .
                " (type: " . $basicTransactionData[0]['transactionType'] . ") " . "transaction " . ++$counter .
                " out of ". $countList . "; Ref. ID: " . $transactionEntry['exchange_ref_id'] . " \t",
            ($cmSync->syncTransactionRecord($basicTransactionData[0]['dataEntity'],
                $basicTransactionData[0]['transactionType'],
                $transactionEntry) === true ? "Success\n" : "Error\n");
            echo "\n" . $cmSync->showMemoryUsage();
        }
        unset($basicTransactionData, $transactionSyncList);
    }
    exit;
}

foreach ($syncDataEntitiesArr as $dataEntity) {
    echo "\nSyncing Transaction Data for: ". $dataEntity . "\n";

    if ($dataEntity === CM_SYNC_ORG_ROLE_ORIGINATOR) {
        $transactionEntityArr = $originatorTransactionEntityArr;
    } elseif ($dataEntity === CM_SYNC_ORG_ROLE_INVESTOR) {
        $transactionEntityArr = $investorTransactionEntityArr;
    } else {
        echo "Unsupported Data Entity: " . $dataEntity . ", skipping...\n";
        continue;
    }

    foreach ($transactionEntityArr as $transTitle => $transactionTypeListArr) {
        echo "\nSyncing ". $transTitle . " transactions.\n";

        if (!is_array($transactionTypeListArr)) {
            $transactionTypeListArr = array($transactionTypeListArr);
        }

        foreach ($transactionTypeListArr as $transactionType) {
            if (!is_null($entityIdArray[$dataEntity]) && isset($subEntityIdArray[$entityIdArray[$dataEntity]])) {
                $subEntityId = $subEntityIdArray[$entityIdArray[$dataEntity]];
            } else {
                $subEntityId = null;
            }

            $timeStart = microtime(true);
            $transactionSyncList = $cmSync->getTransactionListForSync($dataEntity, $transactionType,
                $entityIdArray[$dataEntity], $subEntityId);
            $timeEnd = microtime(true);

            $countList = count($transactionSyncList);
            $counter = 0;
            echo "Record(s) to sync: " . $countList . ($countList > 0
                ? " (data loaded in: " . round($timeEnd - $timeStart, 0) . " seconds)": "") . "\n";
            echo $cmSync->showMemoryUsage();

            foreach ($transactionSyncList as $transactionEntry) {
                $timeStart = microtime(true);
                echo "Syncing " . $transTitle . " (type: " . $transactionType . ") " . "transaction " . ++$counter .
                    " out of ". $countList . "; Ref. ID: " . $transactionEntry['exchange_ref_id'] . " \t",
                    ($cmSync->syncTransactionRecord($dataEntity, $transactionType,
                        $transactionEntry) === true ? "Success" : "Error");
                $timeEnd = microtime(true);
                echo "\t(processed in: ", round($timeEnd - $timeStart, 4), " seconds)\r";
                // echo "\n" . $cmSync->showMemoryUsage();
            }
            unset($transactionSyncList);
        }
    }
}