Создать счет и отслеживание - PullRequest
0 голосов
/ 16 февраля 2012

Компания будет получать счета 1 и 16 числа каждого месяца.(Он будет запускаться через Cron Job каждые 2 недели. Он просматривает таблицу заказов и затем добавляет в таблицу 'invoice'. Есть ли альтернатива?)

В таблице orders есть список заказов клиентов ион также указывает, к какой компании он принадлежит (orders.company_id)

. В таблице invoice рассчитывается общая стоимость заказов из таблицы orders.

Я пытаюсь понять, как разработать разумное отслеживание счетов.Когда-нибудь компании придется отправить мне комиссионные, или когда-нибудь я отправлю им комиссионные (invoice.amount)

Мне нужно отследить счета-фактуры со следующими данными:

  • когда компания прислала мне сумму
  • когда я отправил сумму в компанию
  • сколько было получено суммы от компании
  • сколько было сделаноЯ отправил в компанию
  • получил ли я полную сумму (если нет, что мне нужно обновить на БД?)
  • статус счета (Счет отправлен, отменен, сумма получена, суммаОтправлено)

Вот дизайн базы данных, который я придумал:

таблица компании

mysql> select * from company;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Company A |
|  2 | Company B |
+----+-----------+

Клиенты могут выбрать компаниюс моего сайта.

стол заказов

mysql> select * from orders;
+----+---------+------------+------------+---------------------+-----------+
| id | user_id | company_id | total_cost | order_date          | status_id |
+----+---------+------------+------------+---------------------+-----------+
|  1 |       5 |          2 |      25.00 | 2012-02-03 23:30:24 |         1 |
|  2 |       7 |          2 |      30.00 | 2012-02-13 18:06:12 |         1 |
+----+---------+------------+------------+---------------------+-----------+

два клиента заказали продукцию у Компания B (orders.company_id = 2).Я знаю, что полей заказов недостаточно, просто для вас это упрощено.

таблица orders_products

mysql> select * from orders_products;
+----+----------+------------+--------------+-------+
| id | order_id | product_id | product_name | cost  |
+----+----------+------------+--------------+-------+
|  1 |        1 |         34 | Chair        | 10.00 |
|  2 |        1 |         25 | TV           | 10.00 |
|  3 |        1 |         27 | Desk         |  2.50 |
|  4 |        1 |         36 | Laptop       |  2.50 |
|  5 |        2 |         75 | PHP Book     | 25.00 |
|  6 |        2 |         74 | MySQL Book   |  5.00 |
+----+----------+------------+--------------+-------+

Список продуктов, которые заказали клиенты.

таблица счетов

mysql> select * from invoice;
+----+------------+------------+---------------------+--------+-----------+
| id | company_id | invoice_no | invoice_date        | amount | status_id |
+----+------------+------------+---------------------+--------+-----------+
|  7 |          2 |        123 | 2012-02-16 23:59:59 |  55.00 |         1 |
+----+------------+------------+---------------------+--------+-----------+

Это то, где я застрял в дизайне таблиц счетов.Я не уверен, как это должно быть сделано.Счета будут генерироваться каждые 2 недели.В приведенном примере invoice.amount равно 55,00, поскольку оно было рассчитано из orders.company_id = 2 таблицы

Если invoice.amount равно -50,00 (минус), это означает, что компании потребуется отправить мне сумму вознаграждения.

Если invoice.amount - 50,00, это означает, что мне нужно отправить компании пошлины.

Status_id может быть: (1) Счет отправлен, (2) Отменен, (3) Завершен.

Нужно ли добавлять поле invoice_id в таблицу orders?Обновите поле orders.invoice_id, когда строка будет вставлена ​​в таблицу счетов-фактур.

таблица invoice_payment

mysql> select * from invoice_payment;
+----+------------+-----------------+-------------+---------------------+---------------------+
| id | invoice_id | amount_received | amount_sent | date_received       | date_sent           |
+----+------------+-----------------+-------------+---------------------+---------------------+
|  1 |          1 |            0.00 |       55.00 | 0000-00-00 00:00:00 | 2012-02-18 22:20:53 |
+----+------------+-----------------+-------------+---------------------+---------------------+

Здесь можно отслеживать и обновлять транзакции.. платеж будет произведен через BACS.

Это хороший дизайн таблиц или что мне нужно улучшить?Какие поля и таблицы я должен добавить?

Если счет был сгенерирован, и позже мне нужно внести изменения в таблицы orders_products или orders - нужно ли пересчитать поле invoice.amount?(Я буду использовать PHP / MySQL).

Дамп SQL :

CREATE TABLE IF NOT EXISTS `company` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(25) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

INSERT INTO `company` (`id`, `name`) VALUES
(1, 'Company A'),
(2, 'Company B');

CREATE TABLE IF NOT EXISTS `invoice` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `company_id` int(11) NOT NULL,
  `invoice_no` int(11) NOT NULL,
  `invoice_date` datetime NOT NULL,
  `amount` decimal(6,2) NOT NULL,
  `status_id` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;


INSERT INTO `invoice` (`id`, `company_id`, `invoice_no`, `invoice_date`, `amount`, `status_id`) VALUES
(7, 2, 123, '2012-02-16 23:59:59', '55.00', 1);


CREATE TABLE IF NOT EXISTS `invoice_payment` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `invoice_id` int(11) NOT NULL,
  `amount_received` decimal(6,2) NOT NULL,
  `amount_sent` decimal(6,2) NOT NULL,
  `date_received` datetime NOT NULL,
  `date_sent` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

INSERT INTO `invoice_payment` (`id`, `invoice_id`, `amount_received`, `amount_sent`, `date_received`, `date_sent`) VALUES
(1, 1, '0.00', '55.00', '0000-00-00 00:00:00', '2012-02-18 22:20:53');


CREATE TABLE IF NOT EXISTS `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `company_id` int(11) NOT NULL,
  `total_cost` decimal(6,2) NOT NULL,
  `order_date` datetime NOT NULL,
  `status_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


INSERT INTO `orders` (`id`, `user_id`, `company_id`, `total_cost`, `order_date`, `status_id`) VALUES
(1, 5, 2, '25.00', '2012-02-03 23:30:24', 1),
(2, 7, 2, '30.00', '2012-02-13 18:06:12', 1);


CREATE TABLE IF NOT EXISTS `orders_products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `product_name` varchar(100) NOT NULL,
  `cost` decimal(6,2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

INSERT INTO `orders_products` (`id`, `order_id`, `product_id`, `product_name`, `cost`) VALUES
(1, 1, 34, 'Chair', '10.00'),
(2, 1, 25, 'TV', '10.00'),
(3, 1, 27, 'Desk', '2.50'),
(4, 1, 36, 'Laptop', '2.50'),
(5, 2, 75, 'PHP Book', '25.00'),
(6, 2, 74, 'MySQL Book', '5.00');

Не стесняйтесь, вы хотите обновить / добавить таблицы для ответа здесь.

Спасибо

1 Ответ

0 голосов
/ 16 февраля 2012

Взгляните на мое дополнение для Gemini - SimplyFi . Это позволит вам соответствующим образом маркировать свои счета-фактуры, может автоматически отправлять их по электронной почте клиентам, когда они генерируются, может регистрировать платежи и отправлять напоминания о платежах, которые не были получены (выписки), и имеет полный API-интерфейс на основе REST, который можно использовать для интеграции в вашу систему. Также может быть в состоянии извлечь выгоду из повторяющихся функций биллинга.

В тех случаях, когда вы упоминаете отрицательные суммы счета-фактуры, это, по сути, «Кредитные ноты» (из того, что я понял из вашего поста). Как правило, вы не должны изменять сами счета после того, как они были выставлены клиенту - если вам нужно внести изменения в сумму (то есть: добавить или вычесть), то вы должны выставить новый счет (для добавленной суммы) или кредит-нота на вычитаемую сумму.

Кроме того, я бы посоветовал вам не возвращать деньги клиентам, если они собираются через несколько недель получить новый счет, просто отслеживать баланс своего счета и выставлять счета или кредитовые авизо только при необходимости. Перемещение денег стоит денег, и вам не нужно это делать, если в этом нет необходимости. Просто мои 2 цента

...