Заинтересовался темой, готовых ответов под свою сборку не нашёл. В итоге на основе старого решения под Opencart 2.3 сделал сам - работает.
Моя сборка - OcStore 3.0.2.0, Simple 4.11.4.
В модели (catalog/model/checkout/order.php) создаём функцию (например, сразу после функции создания нового заказа addOrder и перед editOrder) для генерации номера (UPDATE) созданного заказа:
public function createInvoiceNo($order_id) {
$order_info = $this->getOrder($order_id);
if ($order_info && !$order_info['invoice_no']) {
$query = $this->db->query("SELECT MAX(invoice_no) AS invoice_no FROM `" . DB_PREFIX . "order` WHERE invoice_prefix = '" . $this->db->escape($order_info['invoice_prefix']) . "'");
if ($query->row['invoice_no']) {
$invoice_no = $query->row['invoice_no'] + 1;
} else {
$invoice_no = 1;
}
// у заказа обновляется invoice_prefix на тот же - зачем? пока оставляю так
$this->db->query("UPDATE `" . DB_PREFIX . "order` SET invoice_no = '" . (int)$invoice_no . "', invoice_prefix = '" . $this->db->escape($order_info['invoice_prefix']) . "' WHERE order_id = '" . (int)$order_id . "'");
}
}
Теперь в контроллере симпла (catalog/controller/checkout/simplecheckout.php) прописываем вызывать то, что выше, в самом конце функции order() перед return $order_id:
$this->model_checkout_order->createInvoiceNo($order_id);
Готово. При необходимости отключить автогенерацию - закомментить строчку выше.