Перейти к содержанию
  • RU
    • Язык

invoice_no был = order_id при оформлении заказа


Рекомендуемые сообщения

Парни, доброго времени суток, подскажите пожалуйста, хочу прописать чтобы invoice_no был = order_id при оформлении заказа, но 

1. правильно ли вписал?

2. не будет ли коллапса при одновременном оформлении заказа?

Сборка ocstore 3.0.2.

Заранее спасибо.


/catalog/model/checkout/order.php  

$order_id = $this->db->getLastId();

//сразу после

$this->db->query("UPDATE `" . DB_PREFIX . "order` SET invoice_no = '" . (int)$order_id . "' WHERE order_id = '" . (int)$order_id . "'");

 

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Если ID заказа получен через тот же запрос к базе сразу после INSERT, конкурентные заказы не должны подменить это значение. Второй UPDATE допустим, но лучше сразу записать invoice_no из известного ID заказа и проверить, не создаёт ли другая модификация собственную нумерацию. Отдельно стоит решить, нужно ли заполнять поле у старых заказов.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Твой код рабочий. getLastId() берёт mysqli->insert_id, а он привязан к соединению, поэтому при одновременном оформлении заказов каждый получит свой ID, путаницы не будет.

Но я бы сделал иначе:

1. Не править ядро, а повесить событие. addOrder правят многие модули через OCMOD (быстрые заказы, CRM, обмен с 1С). Правка в ядре может конфликтовать с ними и слетит при обновлении. В OC 3 / ocStore 3 на это есть событие catalog/model/checkout/order/addOrder/after, и в $output приходит готовый order_id.

catalog/controller/extension/module/invoice_eq_order.php:

<?php
class ControllerExtensionModuleInvoiceEqOrder extends Controller {
    public function setInvoice(&$route, &$args, &$output) {
        $order_id = (int)$output;
        if ($order_id) {
            $this->db->query("UPDATE `" . DB_PREFIX . "order` SET invoice_no = '" . $order_id . "' WHERE order_id = '" . $order_id . "' AND invoice_no = 0");
        }
    }
}

Регистрация (в install() модуля или одним разом):

$this->load->model('setting/event');
$this->model_setting_event->addEvent('invoice_eq_order', 'catalog/model/checkout/order/addOrder/after', 'extension/module/invoice_eq_order/setInvoice');

2. Подумай, в какой момент присваивать номер. addOrder срабатывает уже на шаге подтверждения, когда заказ ещё в статусе 0. Брошенные и неоплаченные заказы тоже получат счёт, и в нумерации счетов появятся дыры. Если счёт нужен только по реальным заказам, вешай событие на catalog/model/checkout/order/addOrderHistory/after. Там order_id лежит в $args[0], а $args[1] — новый статус. Номер ставь, когда статус входит в config_processing_status / config_complete_status.

3. Префикс. В админке счёт выводится как invoice_prefix + invoice_no, по умолчанию получится INV-2026-00123. Если нужен просто номер заказа, очисти префикс в настройках магазина. Он сохраняется в заказ при создании, так что у старых заказов останется прежний.

4. Кнопка «Сгенерировать» в админке. Она показывается только при invoice_no = 0, поэтому у новых заказов её не будет и стандартный createInvoiceNo() (MAX+1) их не перебьёт.

5. Старые заказы, если нужно их выровнять:

UPDATE oc_order SET invoice_no = order_id WHERE invoice_no = 0 AND order_status_id > 0;

 

 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...