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