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

时间:2015-03-05 16:32:45

标签: php mysql sql database

我正在尝试设计一个记录人工付款的系统,例如Check,Chaps,Bacs。

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

我有一张包含3家供应商的发票表。每个3都有不同的手动支付方式,具有独特的INVNO。

我今天过来决定付款,所以我从INVOICE表中提取发票。 我得到了需要支付的清单。

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

所以我跑到银行去做这些付款,然后回到我的申请表,记录哪3张付款到哪个发票。

我希望我输入支票付款,此时付款被插入PAYMENT表,系统将自动分配新的PAYID,同时用新的PAYID更新INVOICE表以显示INVNO> PAYID。

问题因此输入CHECK,新的PAYID" 1"如果已分配,则转到INVOICE表并使用新的PAYID更新行1,3,6。

如果我迷路了,当我输入付款并获得新ID时,我如何识别付款所指的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

1 个答案:

答案 0 :(得分:0)

另一张桌子怎么样,我们称之为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 = ?
相关问题