我正在尝试设计一个记录手动付款的系统,例如 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/