Кожні 2 тижні система генерує рахунки для компаній.
Компанія отримуватиме рахунок 1-го та 16-го щомісяця. (Він працюватиме через Cron Job кожні 2 тижні. Він сканує таблицю замовлень, а потім додає до таблиці "рахунок-фактура". Чи є альтернатива?)
У orders
таблиці є список замовлень клієнтів, а також вказується, якій компанії належить ( orders.company_id
)
У invoice
таблиці обчислюють загальну вартість замовлень з orders
табл.
Я намагаюся зрозуміти, як розробити розумне відстеження рахунків. Колись компанія повинна надіслати мені гонорари або колись я надішлю їм збори ( invoice.amount
)
Мені потрібно відстежувати рахунки-фактури з наступним:
- коли компанія надіслала мені суму
- коли я надіслав цю суму компанії
- скільки сума надійшла від компанії
- скільки я надіслав компанії
- я отримав повну суму (якщо ні, що мені потрібно оновити на Db?)
- стан рахунка-фактури (рахунок-фактура надіслано, скасовано, отримана сума, надіслана сума)
Ось дизайн бази даних, який я придумав:
стіл компанії
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
). Я знаю, що полів замовлень недостатньо, просто спрощено для вас.
таблиця замовлень_продуктів
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
поле, коли рядок було вставлено у таблицю "рахунок-фактура".
рахунок-оплата таблиці
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');
Сміливо бажаєте оновити / додати таблиці до відповіді тут.
Спасибі