【问题标题】:Basic SQL double-entry accounting ledger - how to split journal entries基本 SQL 复式记帐分类帐 - 如何拆分日记帐分录
【发布时间】:2020-06-13 12:02:58
【问题描述】:

使用此 Gist 中的基本 SQL 模式:https://gist.github.com/NYKevin/9433376,如何创建拆分日记帐分录?

我理解为什么entries 表只有一个金额,其中包含指向贷记/借记账户的指针——这迫使复式记账保持一致并便于余额计算。

但这似乎使得拆分日记帐分录成为不可能。一个简单的例子是为 1200 英镑的购买计算增值税:

1. Credit "Creditors control" account with £1200
2. Debit "VAT" account with £200
3. Debit "Purchases" account with £1000

一个更复杂的例子是工资单,其中借记工资费用,借记工资税费用,贷记现金和各种扣除账户。

这个 SQL 模式是否不足以满足这些目的,或者有没有办法使用 Gist 中的 SQL 来做到这一点?

【问题讨论】:

  • 我认为架构就足够了,只要每个条目都有贷方和借方。您能否提供一个复杂场景的示例,并指定贷方和借方,如果架构可以容纳它,我可以进一步评论。
  • @SteveSpringer 我已经发布的简单示例怎么样?应该在entries 表中插入哪些行来表示那个简单的采购日记帐(它是平衡的,就像所有日记帐一样,但借方部分被分成两部分)?

标签: sql postgresql accounting


【解决方案1】:

您是对的,您的要点中的示例架构使得无法拆分日记帐条目。

您需要的是一个架构,每个日志条目都有一行。这是一种更灵活的设计,可以适应您正在寻找的复杂场景。

示例

架构

我建议至少三个表来满足您的要求:

CREATE TABLE account(
    account_id serial PRIMARY KEY,
    account_name text NOT NULL
);

CREATE TABLE financial_transaction (
    financial_transaction_id serial PRIMARY KEY,
    datetimestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    description text NOT NULL
);

CREATE TABLE journal(
    journal_id serial PRIMARY KEY,
    financial_transaction_id INTEGER REFERENCES financial_transaction(financial_transaction_id),
    account_id INTEGER REFERENCES account(account_id),
    amount NUMERIC(20, 2) NOT NULL,
    is_credit boolean NOT NULL
);

帐户设置

我们将为您的示例创建三个帐户。尽管您可能不会对 id 进行硬编码,但我们在这里这样做是为了演示

INSERT INTO account (account_id, account_name) VALUES (1, 'Creditors control');
INSERT INTO account (account_id, account_name) VALUES (2, 'VAT');
INSERT INTO account (account_id, account_name) VALUES (3, 'Purchases');

购买交易示例

每笔金融交易仅涉及在financial_transaction 表中插入一行,在journal表中至少插入两行,并且这些行的贷方和借方之和必须平衡。

INSERT INTO financial_transaction (financial_transaction_id, description)
VALUES (1, 'Purchase of widget');

INSERT INTO journal (financial_transaction_id, account_id, amount, is_credit)
VALUES (1, 1, 1200, TRUE);

INSERT INTO journal (financial_transaction_id, account_id, amount, is_credit)
VALUES (1, 2, 200, FALSE);

INSERT INTO journal (financial_transaction_id, account_id, amount, is_credit)
VALUES (1, 3, 1000, FALSE);

注意事项

您可以看到这种结构如何轻松容纳拆分日记帐。结构可以轻松查询,交易或账户可以汇总用于不同目的。

如果我正在构建它,我可能会创建一个触发器,以在任何交易结束时强制执行它,它的贷方和借方 journal 条目的总和是平衡的。 我可能还想定义某些类型的交易以及可以为这些交易类型记录哪些类型的帐户,具体取决于我的系统的复杂程度或严格程度。

最后,我将创建一个规则、触发器或配置权限,以确保这些表中的行不被删除或更新。在这样的系统中,所有的更正都应该通过额外的交易来进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2021-06-08
    相关资源
    最近更新 更多