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);
}
}
}