php - 如何记录手动付款的发票的概念或方法

标签 php mysql sql database

我正在尝试设计一个记录手动付款的系统,例如 Cheque、Chaps、Bacs。

我正在努力解决的是如何在我离开应用程序的时间和我返回点击确认的时间之间连接点

我有一个包含 3 个供应商的发票表。每 3 个都有不同的手动付款方法,并具有唯一的 INVNO。

我今天来并决定要付款,因此我从 INVOICE 表中提取发票。 我得到了需要支付的费用 list 。

1. CHEQUE 170 BT
2. CHAPS 300 VIRGIN
3. BACS 10 ORANGE

因此,我跑到银行进行付款,然后返回我的应用程序以记录哪 3 笔付款涵盖了哪些发票。

我希望输入支票付款已完成,此时付款被插入到PAYMENT表中,系统会自动分配一个新的PAYID,并用新的PAYID更新INVOICE表以显示INVNO>已付款。

出现问题,因此输入 CHECK,分配新的 PAYID“1”,然后转到 INVOICE 表并使用新的 PAYID 更新第 1,3,6 行。

我迷失的地方是,当我输入付款并获得新 ID 时,我如何识别付款所指的是哪个 INVNO?或者我这样做完全是错误的方式吗?

我很困惑如何链接所有两个进程。获取发票列表,确认哪些发票已支付,无需手动指定 INVNO,因为可能有数百张发票需要处理

INVOICE TABLE
INVNO   MERCHANT    T   AMOUNT      METHOD
1       BT              100         CHEQUE
2       VIRGIN          200         CHAPS
3       BT              50          CHEQUE
4       ORANGE          10          BACS
5       VIRGIN          100         CHAPS
6       BT              20          CHEQUE

PAYMENT TABLE
PAYID   MERCHANT    T   AMOUNT
1       CHEQUE          170
2       CHAPS           300
3       BACS            10

INVOICE TABLE
INVNO   MERCHANT    T   AMOUNT      METHOD
1       BT          1   100         CHEQUE
2       VIRGIN      2   200         CHAPS
3       BT          1   50          CHEQUE
4       ORANGE      3   10          BACS
5       VIRGIN      2   100         CHAPS
6       BT          1   20          CHEQUE

最佳答案

另一个表怎么样,我们称之为 INVOICE_PAYMENT,它由 (INVNO, PAYID) 对组成?您可以在将新条目插入 PAYMENT 后立即填充它,这将不再需要 AMOUNT 列(因为可以通过连接表和分组来发现这一点);并且现有表都不需要 T 列(因为可以通过加入 INVOICE_PAYMENT 来发现该列)。

CREATE TABLE INVOICE_PAYMENT (
  INVNO BIGINT UNSIGNED NOT NULL,
  PAYID BIGINT UNSIGNED NOT NULL,
  PRIMARY KEY (INVNO, PAYID),
  FOREIGN KEY (INVNO) REFERENCES INVOICE (INVNO),
  FOREIGN KEY (PAYID) REFERENCES PAYMENT (PAYID)
);

ALTER TABLE INVOICE DROP COLUMN T;
ALTER TABLE PAYMENT DROP COLUMN T, DROP COLUMN AMOUNT;

然后,创建付款:

INSERT INTO PAYMENT (MERCHANT) VALUES ('CHEQUE');
SET @pay_id := LAST_INSERT_ID(); -- or fetch into PHP via your API

INSERT INTO INVOICE_PAYMENT (INVNO, PAYID)
  SELECT INVNO, @pay_id FROM INVOICE WHERE METHOD = 'CHEQUE' AND ... ;

要获取给定付款的详细信息,包括支付的金额:

SELECT PAYMENT.*, SUM(INVOICE.AMOUNT)
FROM   INVOICE
  JOIN INVOICE_PAYMENT USING (INVID)
  JOIN PAYMENT         USING (PAYID)
WHERE  PAYID = ?

要获取给定发票的详细信息,包括付款:

SELECT *
FROM   INVOICE
  JOIN INVOICE_PAYMENT USING (INVID)
  JOIN PAYMENT         USING (PAYID)
WHERE  INVID = ?

关于php - 如何记录手动付款的发票的概念或方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28882887/

相关文章:

javascript - 在按钮单击和选项上添加一个新的 div 以选择一个选项来显示文本框

PHP:获取除当前文件之外的URL

mysql - mysql查询的优化

mysql - 如何使 sql 查询在 mysql 中的日期范围内每天返回一行?

mysql - MySQL 中使用 LIMIT 左连接子选择

php - 在 linux 上用 php 检查服务状态?

php - 在 Moodle 3.5 中添加新用户时出错

mysql - 如何在一个单元格中存储具有相同名称但不同ID的行值?

mysql - 包括 MySQL 中的其余行

mysql - 如何在mySQL表中插入点