我制作了一个名为Open Accounting的开源会计包。这就是它的架构部分的样子:
CREATE TABLE account (id BINARY(16) NOT NULL, orgId BINARY(16) NOT NULL, inserted BIGINT UNSIGNED NOT NULL, updated BIGINT UNSIGNED NOT NULL, name VARCHAR(100) NOT NULL, parent BINARY(16) NOT NULL, currency VARCHAR(10) NOT NULL, `precision` INT NOT NULL, debitBalance BOOLEAN NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB;
CREATE TABLE transaction (id BINARY(16) NOT NULL, orgId BINARY(16) NOT NULL, userId BINARY(16) NOT NULL, date BIGINT UNSIGNED NOT NULL, inserted BIGINT UNSIGNED NOT NULL, updated BIGINT UNSIGNED NOT NULL, description VARCHAR(300) NOT NULL, data TEXT NOT NULL, deleted BOOLEAN NOT NULL DEFAULT false, PRIMARY KEY(id)) ENGINE=InnoDB;
CREATE TABLE split (id INT UNSIGNED NOT NULL AUTO_INCREMENT, transactionId BINARY(16) NOT NULL, accountId BINARY(16) NOT NULL, date BIGINT UNSIGNED NOT NULL, inserted BIGINT UNSIGNED NOT NULL, updated BIGINT UNSIGNED NOT NULL, amount BIGINT NOT NULL, nativeAmount BIGINT NOT NULL, deleted BOOLEAN NOT NULL DEFAULT false, PRIMARY KEY(id)) ENGINE=InnoDB;
解释一下:您有一个帐户表。这些将保存您的资产、负债、权益、收入和费用账户。您有一个代表每个会计日记帐分录的交易表。您有一个名为拆分的表,其中包含日记帐分录中的各个借方和贷方。
我将在上面使用您的示例。
1) 赊销给客户:
借方资产:应收账款 100 美元
贷方收入:销售额 100 美元
我们在事务表中插入一行。我们在引用 transactionId 的拆分表中插入两行。第一个拆分将具有 Assets:Accounts Receivable 的 accountId 和 10000(以便士为单位)的金额。第二个拆分将具有收入的 accountId:Sales 和金额 -10000。为了使交易有效,拆分必须加起来为 0。这使基本会计等式保持平衡。(资产 = 负债 + 权益 + 收入 - 费用)。
2) 客户多付:
借方资产:支票账户 $120
贷方资产:应收账款 $120
3) 您现在欠客户 20 美元的多付款项退款。(您也可以将其识别为收入,但这可能违反公认会计惯例)。
借方资产:应收账款 $20
贷方资产:支票账户 $20
如果您将其视为收入,您将执行以下操作:
借方资产:应收账款 20 美元
贷方收入:多付 20 美元