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