ทุก 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
) ฉันรู้ว่าฟิลด์คำสั่งซื้อไม่เพียงพอทำให้คุณง่ายขึ้น
ตาราง 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
ฟิลด์เมื่อแทรกแถวลงในตาราง 'ใบแจ้งหนี้'
ตารางใบแจ้งหนี้ _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 Dump :
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');
อย่าลังเลที่คุณต้องการอัปเดต / เพิ่มตารางในตอบที่นี่
ขอบคุณ