Генерация счета-фактуры

#php #database #e-commerce #shopping-cart #billing

#php #База данных #электронная коммерция #корзина покупок #выставление счетов

Вопрос:

Я хочу создавать счет-фактуру каждые 2 недели. Счет-фактура может содержать 1 или более заказов в диапазоне от 1 до 15 и от 16 до 31 order_date . Каким образом это делается?

Давайте предположим, что дизайн таблицы является:

 order table
- order_id (PK)
- user_id (FK)
- total
- status
- order_date
- invoice_id (FK, default is 0)

invoice table
- invoice_id (PK)
- invoice_date
- total (total of all orders that is linked to order.invoice_id)
- status (Paid, Unpaid, etc)

//order.invoice_id can have multiple same invoice id
  

Первое Решение:

Запускайте задание через Crob каждые 2 недели. Он сканирует таблицу заказов (находит order_date от 1 до 15 или от 16 до 31 и status = 1), а затем добавляет в таблицу invoice, а затем обновляет order.invoice_id

Если сегодняшняя дата — 11 июня 2010 года, то в таблицу счетов-фактур будет вставлена строка, а invoice_date будет 01 июня 2010 года. PHP проверит invoice_date перед добавлением строки, если она уже существует, то вместо этого он обновит order.invoice_id.

Второе решение:

Измените order.status на 1 вручную из серверной части, тогда он будет выполнять ту же функциональность, что и «Первое решение» (кроме задания Cron).

Псевдокод:

 NowDate = Date();

//Invoice Date can be 01 or 16 date current month
InvoiceDate = InvoiceDate(NowDate)

if (there is invoice for InvoiceDate) {
  invoiceNumber = getNumber(invoice)
} else {
  invoiceNumber = new Invoice(InvoiceDate)
}
new Order(invoiceNumber, orderitems)
  

Что будет лучше или у вас есть другое лучшее решение?

Ответ №1:

Мне действительно нравится cron для планирования. Он выполняет одну вещь, и делает это хорошо.

Другой аспект дизайна, который очень желателен для запланированных задач, — быть идемпотентным, что означает, что вы можете запустить его снова без нанесения какого-либо ущерба.

В вашем случае это означает, что ваши обновления / вставки должны обрабатывать то, что они уже были запущены за указанный период времени. Причина, по которой вы хотите это, в первую очередь, защитная (на случай случайного повторного запуска) и надежная (на случай, если вам понадобится его повторно запустить)

Комментарии:

1. Я не понял вашего последнего предложения, не могли бы вы привести пример того, что вы имели в виду? Допустим, я получил несколько заказов в апреле, и сервер не будет работать в течение месяца. Сервер запущен в мае.. Это означает, что я получил недостающие счета в апреле. Чтобы снова запустить cron job для запуска PHP-скрипта — он должен проверять все месяцы, а не текущий месяц?

2. Если сервер вышел из строя, cron не будет запускаться.

3. @hakre — Я знаю, прочитай мой пост еще раз. «Допустим, я получил несколько заказов в апреле, и сервер не будет работать в течение месяца. Сервер запущен в мае ..»

4. Затем вам нужно позаботиться о запуске тех заданий, которые не были запущены cron. Но разве это не очевидно?

5. Действительно, очевидно 😉 Если я повторно запущу скрипт, он должен отсканировать все заказы, а не текущий месяц даты заказа.. это будет медленно? Как бы вы это сделали ..? Разве второе решение, которое я опубликовал, не лучше первого?