0

公司将在每个月的 1 日和 16 日收到发票。(它将每 2 周通过 Cron Job 运行一次。它扫描订单表,然后添加到“发票”表中。还有其他选择吗?)

表中有客户订单列表,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)Invoice Sent, (2)Cancelled, (3)Completed

我需要在表格中添加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');

随意您想在此处更新/添加表格以回答。

谢谢

4

1 回答 1

0

看看我的Gemini - SimplyFi 插件。它将允许您相应地标记您的发票,可以在生成发票时自动通过电子邮件将其发送给客户,可以记录付款并发送未收到付款的提醒(报表),并且具有完整的基于 REST 的 API,您可以使用它来集成到您的系统中。还可以从它的定期计费功能中受益。

在您提到负发票金额的地方,这些实际上是“信用票据”(根据我从您的帖子中了解到的)。通常,您不应在向客户开具发票后自行更改发票 - 如果您需要修改金额(即:增加或减去),那么您应该开具新发票(用于增加的金额) ,或贷方票据,用于减去金额。

另外,我建议您不要在几周后收到新发票的客户退款,只需跟踪他们的帐户余额,仅在必要时开具发票或贷记单。转移资金需要花钱,如果没有必要,您不需要这样做。只是我的 2 美分

于 2012-02-16T16:22:37.053 回答