Каждые 2 недели система будет генерировать счета для компаний.
Компания будет получать счета 1-го и 16-го числа каждого месяца. (Он запускается через Cron Job каждые 2 недели. Он просматривает таблицу заказов, а затем добавляет в таблицу счетов-фактур. Есть ли альтернатива?)
В 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');
Не стесняйтесь, вы хотите обновить / добавить таблицы, чтобы ответить здесь.
Спасибо