Back to PhocacartOrder class

Method storeOrderReceiptInvoiceId

public static
storeOrderReceiptInvoiceId
(mixed $id, mixed $date, mixed $statusId, mixed $docs = array())

Method storeOrderReceiptInvoiceId - Source code

/*
 * This method is used  when storing order but even when chaning status
 * Because invoice number can be set by status. E.g. invoice number will be set only when status is set to "completed"
 * When storing order and the status is pending, invoice number will be not set
 * This only applies to when invoice number is created based on month or year basis
 * Invoice number can be then created by chaning status - model phocacarteditstatus, model phocacartorder, or payment methods which call: PhocacartOrderStatus::changeStatusInOrderTable()
 *
 */
public static function storeOrderReceiptInvoiceId($id, $date, $statusId, $docs = array())
{
    $app = Factory::getApplication();
    $db = Factory::getDbo();
    $d = array();
    $d['id'] = $id;
    // if we create the data by order status changes, we don't use new date but the one which exists in order yet
    // so when using this function from order statuses, the date is false to get the right date here
    $date = !$date ? self::getOrderDate($id) : $date;
    $d['date'] = $date;
    // Don't change the date of order but change date for oder, receipt or delivery note number
    $dateNow = Factory::getDate()->toSql();
    // Will we create an invoice?
    $paramsC = PhocacartUtils::getComponentParameters();
    $invoice_creating_numbers = $paramsC->get('invoice_creating_numbers', 'A');
    $invoice_creating_status_based = $paramsC->get('invoice_creating_status_based', 0);
    // Invoice is created by year or month basis - we can create invoice id by status
    if ($invoice_creating_numbers == 'Y' || $invoice_creating_numbers == 'M') {
        // It is enabled in parameters that invoice is made by status
        if ((int) $invoice_creating_status_based > 0) {
            // Check the status
            if ((int) $statusId > 0 && (int) $invoice_creating_status_based == (int) $statusId) {
                // we can create invoice
            } else {
                // don't create the invoice because it should be only created when
                // specific status is set but it is not set yet
                if (($key = array_search('I', $docs)) !== false) {
                    unset($docs[$key]);
                }
            }
        }
    }
    if (!in_array('O', $docs) && !in_array('R', $docs) && !in_array('I', $docs)) {
        // This can happen when we changed the status and we need to check if invoice
        // should be created. By chaning status we are only asking to create invoice
        // number. But in case the order status does not fit the status set in options
        // invoice will be not created. And because we didn't ask for receipt number
        // and order number, nothing will be changed.
        return false;
    }
    $orderNumberId = 0;
    $receiptNumberId = 0;
    $invoiceNumberId = 0;
    $queueNumberId = 0;
    // Which numbers will be active, set by auto increment or by year or by month
    // Example: auto increment can be 1250 but it is new year so based on year the number will be 1 (even autoincrement will be 1251)
    if (in_array('O', $docs)) {
        // Order Number
        $d['date'] = $date;
        $d['order_number_id'] = PhocaCartOrder::getNumberId('order', $id, $dateNow);
        // Human readable numbers inclusive all prefixes, suffixes, etc.
        $d['order_number'] = PhocacartOrder::getOrderNumber($id, $dateNow, false, $d['order_number_id']);
        $orderNumberId = $d['order_number_id'];
        // Queue Number
        $d['queue_number_id'] = PhocaCartOrder::getNumberId('queue', $id, $dateNow);
        $d['queue_number'] = PhocacartOrder::getQueueNumber($id, $dateNow, false, $d['queue_number_id']);
        $queueNumberId = $d['queue_number_id'];
    }
    if (in_array('R', $docs)) {
        $d['date'] = $date;
        $d['receipt_number_id'] = PhocaCartOrder::getNumberId('receipt', $id, $dateNow);
        $d['receipt_number'] = PhocacartOrder::getReceiptNumber($id, $dateNow, false, $d['receipt_number_id']);
        $receiptNumberId = $d['receipt_number_id'];
    }
    // If there are data yet, don't overwrite them
    // Order and Receipt are not changed by status, so this can be checked before invoice
    // and PRN
    $query = ' SELECT date, invoice_number_id, invoice_number, invoice_prn, invoice_date, invoice_due_date, invoice_time_of_supply FROM #__phocacart_orders WHERE id = ' . (int) $id . ' ORDER BY id LIMIT 1';
    $db->setQuery($query);
    $orderData = $db->loadAssoc();
    if (in_array('I', $docs)) {
        if (!isset($orderData['date']) || isset($orderData['date']) && !PhocacartDate::activeDatabaseDate($orderData['date'])) {
            $d['date'] = $date;
        }
        if ((!isset($orderData['invoice_number_id']) || isset($orderData['invoice_number_id']) && (int) $orderData['invoice_number_id'] == 0) && (!isset($orderData['invoice_number']) || isset($orderData['invoice_number']) && $orderData['invoice_number'] == '')) {
            $d['invoice_number_id'] = PhocaCartOrder::getNumberId('invoice', $id, $dateNow);
            $invoiceNumberId = $d['invoice_number_id'];
            $d['invoice_number'] = PhocacartOrder::getInvoiceNumber($id, $dateNow, false, $d['invoice_number_id']);
        }
        if (!isset($orderData['invoice_date']) || isset($orderData['invoice_date']) && !PhocacartDate::activeDatabaseDate($orderData['invoice_date'])) {
            $d['invoice_date'] = $dateNow;
        }
        if (!isset($orderData['invoice_due_date']) || isset($orderData['invoice_due_date']) && !PhocacartDate::activeDatabaseDate($orderData['invoice_due_date'])) {
            $d['invoice_due_date'] = PhocacartOrder::getInvoiceDueDate($id, $dateNow);
        }
        if (!isset($orderData['invoice_time_of_supply']) || isset($orderData['invoice_time_of_supply']) && !PhocacartDate::activeDatabaseDate($orderData['invoice_time_of_supply'])) {
            $d['invoice_time_of_supply'] = $dateNow;
        }
    }
    // Create Payment Reference Number based on different numbers - parameter is used in getPaymentReferenceNumber function
    // So it even be created if there is no invoice number
    // Don't create it if it is created yet. E.g. status wants to create invoice
    // but PRN was created previously by order or receipt ID
    if (!isset($orderData['invoice_prn']) || isset($orderData['invoice_prn']) && $orderData['invoice_prn'] == '') {
        $idNumberA = array('order' => $orderNumberId, 'receipt' => $receiptNumberId, 'invoice' => $invoiceNumberId);
        $prn = PhocacartOrder::getPaymentReferenceNumber($id, $dateNow, false, $idNumberA);
        if ($prn != '') {
            // PRN is not included in database and it exits
            $d['invoice_prn'] = $prn;
        }
    }
    // Store the items
    // This method can be called by storing order or by chaning statuses, so
    // add only the variables which really should be added and don't
    // overwrite existing variables with empty values
    // This is why dome $d array keys are not defined
    // E.g. if this method is called by chaning status, order and receipt keys are inactive
    $row = Table::getInstance('PhocacartOrder', 'Table', array());
    if (!$row->bind($d)) {
        //throw new Exception($row->getError());
        $msg = Text::_($row->getError());
        $app->enqueueMessage($msg, 'error');
        return false;
    }
    if (!$row->check()) {
        //throw new Exception($row->getError());
        $msg = Text::_($row->getErrorMsg());
        $app->enqueueMessage($msg, 'error');
        return false;
    }
    if (!$row->store()) {
        //throw new Exception($row->getError());
        $msg = Text::_($row->getErrorMsg());
        $app->enqueueMessage($msg, 'error');
        return false;
    }
    if (!isset($d['order_number_id'])) {
        $d['order_number_id'] = 0;
    }
    if (!isset($d['receipt_number_id'])) {
        $d['receipt_number_id'] = 0;
    }
    if (!isset($d['invoice_number_id'])) {
        $d['invoice_number_id'] = 0;
    }
    if (!isset($d['queue_number_id'])) {
        $d['queue_number_id'] = 0;
    }
    if (!isset($d['order_number'])) {
        $d['order_number'] = '';
    }
    if (!isset($d['receipt_number'])) {
        $d['receipt_number'] = '';
    }
    if (!isset($d['invoice_number'])) {
        $d['invoice_number'] = '';
    }
    if (!isset($d['queue_number'])) {
        $d['queue_number'] = '';
    }
    return $d;
}