File: /www/exchange2/cmws/classes/Model/MSyncing.php
<?php
/**
* Class MSyncing
*/
class MSyncing
{
const DATA_TYPE_ORIGINATOR = 'originator';
const DATA_TYPE_CREDEBTOR = 'credebtor';
const DATA_TYPE_RSA = 'rsa';
const DATA_TYPE_INVOICE = 'invoice';
const DATA_TYPE_TRANSACTION = 'transaction';
const DATA_TYPE_SYNCING = 'syncing';
private $dataType;
private $limit;
private $originatorReferenceId;
private $syncedDate;
private $db;
private $data;
public $buyOutValues = array(
1 => 'Active',
2 => 'Inactive',
);
public $invoiceStatusValues = array(
0 => 'Inactive',
1 => 'Published',
2 => 'Frozen',
3 => 'Closed',
);
public $invoiceAuthoriseValues = array(
0 => 'New',
1 => 'Contacted',
2 => 'Confirmed',
3 => 'Authorised',
);
public $logStatusValues = array(
1 => 'Approved',
2 => 'Rejected',
);
public $transactionTypes = array(
INBOUND_DEBTOR_PAYMENT => 'Inbound Debtor Payment',
TRANSFER_OF_PAYMENT_BY_ORIGINATOR => 'Transfer of Payment by Originator',
PAID_DIRECTLY_TO_ORIGINATOR => 'Paid Directly to Originator',
BANK_TRANSMISSION_RECEIPT => 'Bank Transmission Receipt',
NOTICE_OF_DEBTOR_REMITTANCE => 'Notice of Debtor Remittance',
CREDIT_NOTE => 'Credit Note',
EXTERNAL_BANK_CHARGES => 'External Bank Charges',
RECONCILE_DEBTOR_ACCOUNT => 'Reconcile Debtor Account',
ORIGINATOR_PAYMENT_ON_ACCOUNT => 'Originator Payment on Account',
SUBMIT_NOTIFICATION => 'Submit Notification',
DATED_RESERVE_PAYMENT => 'Dated Reserve Payment',
VARIANCE_ON_FOREIGN_EXCHANGE => 'Variance on Foreign Exchange',
FALSE_PAYMENT_RETURNED => 'False Payment Returned',
AMENDMENT_TO_INVOICE => 'Amendment to Invoice',
MULTIPLE_PAYMENTS => 'Multiple Payments',
SPECIFIC_DEDUCTIBLE => 'Specific Deductible',
TRAILING_BALANCE => 'Trailing Balance',
CREDITOR_OUTBOUND_PAYMENT => 'Creditor Outbound Payment',
INBOUND_CREDITOR_PAYMENT => 'Inbound Creditor Payment',
RECONCILE_CREDITOR_ACCOUNT => 'Reconcile Creditor Account',
CREDITOR_SPECIFIC_DEDUCTIBLE => 'Creditor Specific Deductible',
CREDITOR_TRAILING_BALANCE => 'Creditor Trailing Balance',
POSITIVE_RESERVE_ADJUSTMENT => 'Positive Reserve Adjustment',
NEGATIVE_RESERVE_ADJUSTMENT => 'Negative Reserve Adjustment',
MERGE_INBOUND_DEBTOR_PAYMENT => 'Merge Inbound Debtor Payment',
SPLIT_INBOUND_DEBTOR_PAYMENT => 'Split Inbound Debtor Payment',
OCPA_TO_ICP => 'OCPA to ICP',
ICP_SPLIT => 'ICP Split',
ICP_MERGE => 'ICP Merge',
C_ETR_COMMISSION => 'c-ETR Commission',
OCPA_MERGE => 'OCPA Merge',
OCPA_RETURN => 'OCPA Return',
ICP_RETURN => 'ICP Return',
CREDITOR_FEES_CHARGES => 'Creditor Fees Charges',
ORIGINATOR_DEPOSIT => 'Originator Deposit',
DEPOSIT_TO_OCPA => 'Deposit to OCPA',
);
public $transactionStatusValues = array(
0 => 'Created',
1 => 'Authorised',
2 => 'Notified',
);
public $status = false;
public $errors = array();
public function __construct($dataType = null, $limit = 100, $data = array())
{
if (!is_int($limit) or $limit > 100 or $limit < 1) {
$limit = 100;
}
if (in_array($dataType, $this->getDataTypes())) {
$this->dataType = $dataType;
$this->limit = $limit;
$this->data = $data;
$this->syncedDate = date('Y-m-d H:i:s');
$this->status = true;
} else {
$this->errors['type'] = 'Wrong type parameter !!!';
}
$this->db = Bin_Db::connect();
}
private function getDataTypes()
{
return array(
self::DATA_TYPE_ORIGINATOR,
self::DATA_TYPE_CREDEBTOR,
self::DATA_TYPE_RSA,
self::DATA_TYPE_INVOICE,
self::DATA_TYPE_TRANSACTION,
self::DATA_TYPE_SYNCING,
);
}
public function getData()
{
switch ($this->dataType) {
case self::DATA_TYPE_ORIGINATOR:
return $this->getOriginatorsData();
case self::DATA_TYPE_CREDEBTOR:
return $this->getCredebtorsData();
case self::DATA_TYPE_RSA:
return $this->getRsaData();
case self::DATA_TYPE_INVOICE:
return $this->getInvoicesData();
case self::DATA_TYPE_TRANSACTION:
return $this->getTransactionsData();
default:
return array();
}
}
private function getOriginatorsData()
{
$selectData = "SELECT
od.organisation_reference_id AS originator_reference_id,
tr.first_name AS first_name,
tr.last_name AS last_name,
cur.currency_code AS currency_code,
od.organisation_name AS organisation_name,
od.organisation_trade_name AS organisation_trade_name,
od.total_employee AS total_employee,
od.website AS website,
od.accounting_software AS accounting_software,
od.vat_number AS vat_number,
od.tax_number AS tax_number,
od.type AS organisation_type,
od.insurance_provider_id AS insurance_provider,
od.discount_provider_id AS discount_provider,
od.number_of_directors AS number_of_directors,
od.nace_group_id AS nace_category,
od.nace_id AS nace_code,
od.formation_year AS formation_year,
od.organisation_jurisdiction AS organisation_jurisdiction,
od.trade_limit AS creditsafe_todays_limit
FROM organisation_details od
JOIN temp_registration tr ON tr.user_id = od.user_id
LEFT JOIN currencies cur ON cur.currency_id = tr.currency_id
WHERE od.is_synced = '0' AND tr.user_type = ':type'
ORDER BY od.organisation_id
LIMIT :limit";
$result = $this->db->query($selectData, array(
':type' => Model_MRegister::TYPE_ORIGINATOR,
':limit' => $this->limit,
));
$data = $result->getResultArray();
return $data;
}
private function getCredebtorsData()
{
return array();
}
private function getRsaData()
{
$selectData = "SELECT
dd.debtor_reference_id,
od.organisation_reference_id AS 'originator_reference_id',
im.trade_reference_id,
im.face_value,
im.revolving,
im.revolving_total,
im.revolving_months,
im.buy_out,
im.description,
im.payment_terms,
im.actual_date,
im.approved_date,
im.expected_date,
im.trading_close_date,
im.min_advance,
im.max_thirty_day_reserve,
im.buy_min_advance,
im.buy_max_thirty_day_reserve,
im.invoice_status,
im.invoice_authorise,
im.yield,
im.buy_yield,
im.bid_yield,
im.`return`,
im.buy_return,
im.bid_return,
im.draft,
im.log_status,
im.logapprove_date,
im.rejected_date,
im.reject_message,
im.payment_discount,
im.processing_fee
FROM invoice_master im
JOIN debtors_detail dd ON dd.debtor_id = im.debtor_id
JOIN debtor_relation dr ON dr.debtor_id = dd.debtor_id
JOIN organisation_details od ON od.organisation_id = dr.organisation_id
WHERE im.is_synced = '0'
AND im.root_invoice_id = 0
AND dd.type = ':type'
ORDER BY im.invoice_id
LIMIT :limit";
$result = $this->db->query($selectData, array(
':type' => TYPE_DEBTOR,
':limit' => $this->limit,
));
$model = $this;
$data = array_map(function ($el) use ($model) {
$el['buy_out'] = array_get($model->buyOutValues, $el['buy_out']);
$el['invoice_status'] = array_get($model->invoiceStatusValues, $el['invoice_status']);
$el['invoice_authorise'] = array_get($model->invoiceAuthoriseValues, $el['invoice_authorise']);
$el['log_status'] = array_get($model->logStatusValues, $el['log_status']);
return $el;
}, $result->getResultArray());
return $data;
}
private function getInvoicesData()
{
$selectData = "SELECT
im.invoice_id,
dd.debtor_reference_id,
od.organisation_reference_id AS 'originator_reference_id',
im.trade_reference_id,
IF(dd.type = ':type',rsa.trade_reference_id,'') AS 'rsa_trade_reference_id',
dd.type,
im.po_id,
im.invoice_no,
im.face_value,
im.revolving,
im.revolving_total,
im.revolving_months,
im.buy_out,
im.description,
im.payment_terms,
im.actual_date,
im.approved_date,
im.expected_date,
im.trading_close_date,
im.min_advance,
im.max_thirty_day_reserve,
im.buy_min_advance,
im.buy_max_thirty_day_reserve,
im.invoice_status,
im.invoice_authorise,
im.yield,
im.buy_yield,
im.bid_yield,
im.`return`,
im.buy_return,
im.bid_return,
im.draft,
im.log_status,
im.logapprove_date,
im.rejected_date,
im.reject_message,
im.payment_discount,
im.c_etr_commission,
ica.trade_commission,
ica.processing_fee,
ica.posting_fee,
im.reserve,
im.reserve_on,
im.rerouted,
mt.manual_transaction_id,
ica.maturity_days,
ica.ex_commission,
ica.agent_commission,
ica.intermed_commission,
ica.cdp_cost,
ica.agreed_buy_rate,
ica.agreed_sell_rate,
ica.purchase_discount,
ic.purchase_payment
FROM invoice_master im
LEFT JOIN invoice_master rsa ON rsa.invoice_id = im.root_invoice_id AND rsa.root_invoice_id = 0
JOIN debtors_detail dd ON dd.debtor_id = im.debtor_id
JOIN debtor_relation dr ON dr.debtor_id = dd.debtor_id
JOIN organisation_details od ON od.organisation_id = dr.organisation_id
LEFT JOIN invoice_closed ic ON ic.invoice_id = im.invoice_id
LEFT JOIN invoice_closed_attributes ica ON ica.invoice_id = im.invoice_id
LEFT JOIN manual_transactions mt ON mt.manual_transaction_id = im.manual_transaction_id
WHERE im.is_synced = '0'
AND im.root_invoice_id > 0
AND im.invoice_status = 3";
if ($this->originatorReferenceId) {
$selectData .= " AND od.organisation_reference_id = ':originator_reference_id'";
}
$selectData .= " ORDER BY im.invoice_id LIMIT :limit";
$result = $this->db->query($selectData, array(
':type' => TYPE_DEBTOR,
':limit' => $this->limit,
':originator_reference_id' => $this->originatorReferenceId,
));
$model = $this;
$data = array_map(function ($el) use ($model) {
$el['buy_out'] = array_get($model->buyOutValues, $el['buy_out']);
$el['invoice_status'] = array_get($model->invoiceStatusValues, $el['invoice_status']);
$el['invoice_authorise'] = array_get($model->invoiceAuthoriseValues, $el['invoice_authorise']);
$el['log_status'] = array_get($model->logStatusValues, $el['log_status']);
return $el;
}, $result->getResultArray());
return $data;
}
private function getTransactionsData()
{
$selectData = "SELECT
mt.manual_transaction_id,
dd.debtor_reference_id,
od.organisation_reference_id AS 'originator_reference_id',
mt.transaction_type,
cur.currency_code,
mt.amount,
mt.reference_to,
mt.specific_allocation,
mt.notes,
'' AS `delete_notes`,
mt.specific_deductible,
mt.deductible_amount,
mt.trailing_balance,
mt.trailing_balance_amt AS 'traling_balance_amount',
mt.reconcile_payment,
mt.reconcile_ref,
mt.payment_return,
mt.false_payment,
mt.amendment_id,
mt.status,
mt.reconcile_status,
mt.reconcile_credit,
mt.multiple_payments,
mt.transref_list,
mt.paid_status,
mt.transaction_name,
IF(mt.notification_title = 1,'Fee Notice',IF(mt.notification_title = 2, 'RSA Offer',IF(mt.notification_title=3,'Other',''))) AS 'notification_title',
mt.transaction_date,
mt.issue_date,
mt.created_at,
mt.authorised_at,
mt.reserve_on,
mt.rerouted,
mt.fees_commissions
FROM manual_transactions mt
LEFT JOIN organisation_details od ON od.user_id = mt.originator_id
LEFT JOIN debtors_detail dd ON dd.debtor_id = mt.debtor_id
LEFT JOIN currencies cur ON cur.currency_id = mt.currency_id
WHERE mt.is_synced = '0'
UNION ALL
SELECT
mt.manual_transaction_id,
dd.debtor_reference_id,
od.organisation_reference_id AS 'originator_reference_id',
mt.transaction_type,
cur.currency_code,
mt.amount,
mt.reference_to,
mt.specific_allocation,
mt.notes,
mt.delete_notes,
mt.specific_deductible,
mt.deductible_amount,
mt.trailing_balance,
mt.trailing_balance_amt AS 'traling_balance_amount',
mt.reconcile_payment,
mt.reconcile_ref,
mt.payment_return,
mt.false_payment,
mt.amendment_id,
'Rejected' AS status,
mt.reconcile_status,
mt.reconcile_credit,
mt.multiple_payments,
mt.transref_list,
mt.paid_status,
mt.transaction_name,
IF(mt.notification_title = 1,'Fee Notice',IF(mt.notification_title = 2, 'RSA Offer',IF(mt.notification_title=3,'Other',''))) AS 'notification_title',
mt.transaction_date,
mt.issue_date,
mt.created_at,
mt.authorised_at,
mt.reserve_on,
mt.rerouted,
mt.fees_commissions
FROM manual_transactions_rejected mt
LEFT JOIN organisation_details od ON od.user_id = mt.originator_id
LEFT JOIN debtors_detail dd ON dd.debtor_id = mt.debtor_id
LEFT JOIN currencies cur ON cur.currency_id = mt.currency_id
WHERE mt.is_synced = '0'
ORDER BY manual_transaction_id
LIMIT :limit";
$result = $this->db->query($selectData, array(
':limit' => $this->limit,
));
$model = $this;
$data = array_map(function ($el) use ($model) {
$el['transaction_type'] = array_get($model->transactionTypes, $el['transaction_type']);
$el['status'] = array_get($model->transactionStatusValues, $el['status'], 'Rejected');
return $el;
}, $result->getResultArray());
return $data;
}
public function markAsSynced()
{
$rsaIds = array_get($this->data, self::DATA_TYPE_RSA);
$invoiceIds = array_get($this->data, self::DATA_TYPE_INVOICE);
$transactionIds = array_get($this->data, self::DATA_TYPE_TRANSACTION);
$message = ' records were marked as synchronized';
$result = array();
if (empty($rsaIds)) {
$result[self::DATA_TYPE_RSA] = '0' . $message;
} else {
// mark records as synced
$res = $this->db->query("UPDATE invoice_master
SET is_synced = '1',
synced_date = ':date'
WHERE trade_reference_id IN (:ids)", array(
':ids' => implode(',', $rsaIds),
':date' => $this->syncedDate,
));
$result[self::DATA_TYPE_RSA] = $res->affectedRows() . $message;
}
if (empty($invoiceIds)) {
$result[self::DATA_TYPE_INVOICE] = '0' . $message;
} else {
// mark records as synced
$res = $this->db->query("UPDATE invoice_master
SET is_synced = '1',
synced_date = ':date'
WHERE trade_reference_id IN (:ids)", array(
':ids' => implode(',', $invoiceIds),
':date' => $this->syncedDate,
));
$result[self::DATA_TYPE_INVOICE] = $res->affectedRows() . $message;
}
if (empty($transactionIds)) {
$result[self::DATA_TYPE_TRANSACTION] = '0' . $message;
} else {
// mark records as synced
$res = $this->db->query(
"UPDATE manual_transactions
SET is_synced = '1',
synced_date = ':date'
WHERE manual_transactions.manual_transaction_id IN (:ids)",
array(
':ids' => implode(',', $transactionIds),
':date' => $this->syncedDate,
)
);
$count = $res->affectedRows();
$res = $this->db->query(
"UPDATE manual_transactions_rejected
SET is_synced = '1',
synced_date = ':date'
WHERE manual_transactions_rejected.manual_transaction_id IN (:ids)",
array(
':ids' => implode(',', $transactionIds),
':date' => $this->syncedDate,
)
);
$count += $res->affectedRows();
$result[self::DATA_TYPE_TRANSACTION] = $count . $message;
}
return $result;
}
public function setOriginatorReferenceId($originatorReferenceId)
{
$this->originatorReferenceId = $originatorReferenceId;
}
public function isOriginatorTraded()
{
$response = array();
if (is_array($this->originatorReferenceId) and !empty($this->originatorReferenceId)) {
$sql = "SELECT od.organisation_reference_id, COUNT(im.invoice_id) AS count
FROM organisation_details od
LEFT JOIN invoice_master im ON im.user_id = od.user_id
AND im.invoice_status = 3 AND im.root_invoice_id > 0
WHERE od.organisation_reference_id IN (':originator_reference_id')
GROUP BY od.organisation_reference_id";
$result = $this->db->query($sql, array(
':originator_reference_id' => implode("','", $this->originatorReferenceId),
))->getResultArray();
foreach ($result as $value) {
$response[$value['organisation_reference_id']] = (bool)$value['count'];
}
} else {
$this->status = false;
$this->errors['originator_reference_id'] = 'The parameter "originator_reference_id" must be an array';
}
return $response;
}
}