如何记录为人工付款支付的发票的概念或方法


Concepts or methods of how to record invoices paid for manual payments

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

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

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

我今天来决定要付款,所以我从发票表中提取发票。我收到一份需要支付的清单。

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

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

我希望我输入的支票付款已经完成,此时付款入到付款表中,系统将自动分配一个新的 PAYID,以及使用新的 PAYID 更新发票表以显示 INVNO>PAYID。

问题,因此输入支票,分配新的 PAYID"1",然后转到发票表并使用新的 PAYID 更新第 1、3、6 行。

迷路的地方是,当我输入付款并获得新身份证时,我如何识别付款所指的INVNO?还是我这样做完全走错了路。

我很困惑如何链接所有 2 个进程。获取发票列表,确认已支付哪些发票,而无需手动指定 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 = ?