我需要在c#中开发一个程序,用户必须每月支付一张发票(固定金额)。有些用户可能不会在发票发送给他们的同一个月付款,从而产生逾期费用。用户还应该能够通过某种ID在线检查发票。我该怎么做呢?
我想到了两种方法,但我发现它们并不令人满意。
我创建了一个表格,用于存储所有发票,如此
+----+------+-----------+--------+--------+------------+
| Id | Code | CreatedOn | UserId | Amount | PaidOn? |
+----+------+-----------+--------+--------+------------+
| 1 | 1234 | 2018-04-1 | 1 | 100 | null |
| 2 | 1235 | 2018-05-1 | 1 | 210* | 2018-05-25 |
+----+------+-----------+--------+--------+------------+
*包括之前的金额,当前金额和逾期费用。
在这种情况下,我正在缓存用户必须支付的金额并每月生成一张新发票。这种方法的好处是,当用户输入1234时,我可以检查月份和年份不匹配,并将它们指向他们必须支付的最新发票。
另外:我是否需要某种每月生成这些服务的服务?或者,只要管理员点击生成按钮,我会检查用户是否已存在发票,如果不是,我会插入吗?
我只存储付款发票。我可以查看上次支付发票的时间,并计算应付款项。但问题是,我不确定应该如何处理代码。由于发票仍然会在每个月的第一天打印并发送给用户,因此他们需要某种参考代码。
我认为一个解决方案是在users表上有一个GUID列,并使用该guid来加密这种格式MMyyyy的日期时间。生成的值将始终是唯一的,我不必将其存储在任何地方。因此,当用户输入参考代码时,我会解密日期并为其重新生成发票。
基本上就是这样,但由于某些原因,这两种方法都感觉不对。
答案 0 :(得分:0)
我认为将以前的未付款发票中的金额添加到新发票中是不正确的,而不是应付帐款的运作方式。您为新项目发出新发票,然后如果有未付发票,您可以发出一份显示该发票的声明。
方法2更好,但我不喜欢加密日期的想法。老板曾经告诉过我,税务机关希望发票编号有顺序编号(以及Quick Books的软件工作方式)。加密的字符串也会很长而且很麻烦。
使用方法2,但使用顺序发票编号并存储所有发票,无论是否付款,我都看不到缺点。
编辑:
关于逾期费用(顺便说一下,QB网站适用于一般簿记Q& A,例如https://community.intuit.com/articles/1145979-can-i-enter-finance-charges-service-charges-or-late-fees-on-customer-invoices)
+----+------+-----------+--------+------------+------------+---------------+
| Id | Code | CreatedOn | UserId | LineAmount | PaidOn? | OtherCharges
+----+------+-----------+--------+------------+------------+---------------+
| 1 | 1234 | 2018-04-1 | 1 | 100 | null |
| 2 | 1235 | 2018-05-1 | 1 | 100 | 2018-05-25 | 10
+----+------+-----------+--------+------------+------------+---------------+
我认为它应该看起来更像那样(顺便说一下,你应该通过假设在某些时候会有多个LineAmounts进行未来证明,用典型的一对多关系来做,但为简单起见假设这里只有1)
Invoice.Id == 1没有付款,因此10次充值可以使用Invoice.Id == 2(总数为110)。
客户仍必须支付发票1,因为发票2并不能取代发票。
答案 1 :(得分:0)
对待事物:
无论是否付款,都会存在发票。这是其一生中的又一步。因此,您的数据库应该反映这一事实。
为用户消费的每个期间发出一张真实的发票,并且必须按该期间的金额支付。也就是说,在每个月末。
正如已经指出的那样,对发票使用顺序编号,无论是否付款。
还有另一个名为InvoicePayments
的表格,您将存储:InvoiceId | PaymentDate
(如果您要为每个帐单启用部分付款功能,则Amount
)。
每隔一段时间(取决于您要发送提醒的频率),请浏览InvoicePayments
表,检查那些到期时间超过您的政策并发送相应的通知。
答案 2 :(得分:0)
这不是一个软件问题。请 向会计师询问您所在国家/地区的发票是如何处理的。它是不是很好的数据库设计或优秀的软件架构,首先它必须符合您的税务机关规则和法规。
作为一个例子,即使考虑将两张发票合二为一,也会使税务会计师脸色苍白无声地溜到一个没有引渡条约的国家。
如果这是功课,那很好。选择一个选项,让老师对其进行评分并从中学习。如果这是真正的软件,去获得专业并让他们为您提供要求。您是一名软件开发人员,不知道会计是如何运作的并不是一件坏事。那不是我们的工作。但 我们的工作是寻求帮助,而不仅仅是为了帮助它。
从会计专业人员那里收集要求。 然后考虑一下你的软件。