作业成本法复式记账关系模型的设计

How to design a relational model for double-entry accounting with job costing

我想向读者推荐 and 的答案,因为其中的深度和思想。我在为我正在从事的项目搜索一些无关紧要的东西时偶然发现了它们,然后我就开始从头到尾阅读它们。

我正在尝试使用这些原则(即复式记账)构建一个利基市场应用程序,并加入工作成本核算。以上答案对重塑我对会计和会计的概念非常有帮助并且数据库应该看起来和工作一样。但是,我很难将等式的工作成本计算部分整合到所提供的优秀图形示例中。

有几个使用房屋、账户持有人、费用等的交易示例。我还有一些其他特定用例,我希望获得一些意见:

  1. 我没有客户。我买了一个 属性(通常是现金支出,产生了负债(贷款),产生了资产(属性)),花了一大笔钱来修理它(要么在商店,商店的信用卡收费,或写给供应商的支票,借记 属性 资产并借记或贷记资金来源),然后出售(现金进来,贷款还清) ,并希望剩下的现金比我在该项目上花费的更多)。这可能会创建比我上面列出的更多的分类帐条目,但我不是会计师。我想我明白我所有的成本都在 属性 中用于我的基础,如果我的净收益大于我的基础,那么我就赚钱了,如果没有,那就没有。

  2. 所以我需要记录的是 a) 来自特定账户(即公司支票账户或所有者的 Best Buy 卡等),b) 通常与特定工作相关的费用(但并非总是如此——我确实偶尔会有间接费用,如办公用品),并且 c) 总是与成本代码相关联(即“100.12 - Window 材料”、“100.13 - Window 人工”,等)。

  3. 我经常收到来自供应商的账单,这些账单在未来的某个时间到期。我想跟踪已收到但尚未支付给定工作的账单(承诺成本)。我认为这笔交易看起来像这样,但我不太确定:

  4. 正如您从我上面关于“所有者的百思买卡”的俏皮话中推测的那样,我有时(比我应该更频繁地)将我的个人资金用于与公司和工作相关的费用。我认为(再次提醒我是一个外行)所有这些支出都记入“所有者权益”,并根据需要 debit/credit 其他账户。

我一直在一个又大又丑的电子表格中跟踪所有这些,这就是为什么我试图构建一个应用程序来替换它——电子表格方法效果不佳,但它肯定会成功't 比例。

初步

对于阅读此答案的人,请注意上下文如下,递增:

如果您没有利用它,这个答案可能没有意义。

我会按照规范化的顺序进行回复,这当然与您提出问题的方式不同。

原理与修正

在你陈述的问题中有一些你没有意识到的错误,所以第一步是意识;理解。一旦问题被正确准确地声明,解决起来就很容易了。这些是开发人员经常犯的错误,因此需要在考虑应用程序之前就这样理解它们。

1 第一原则

I've been keeping track of all of this in a big, ugly spreadsheet [the spreadsheet method doesn't work very well and it certainly won't scale], which is why I'm trying to build an app to replace it

  • 如果手动(或以前的计算机化)系统坏了,并且您实现了一个新的或基于它的替代应用程序,您保证将 broken-ness 带入应用

    • 更糟糕的是,如果不理解这一点,可以编写第三个应用程序,承诺修复第二个应用程序中的问题,但它也保证迁移第一个和第二个应用程序中未修复的问题.
  • 因此,您必须识别并纠正您要更换的系统中的每一个问题,包括测试,然后才能设计一个应用程序和数据库有成功的机会。

  • 缩放是我们最不担心的事情。问题是任何特定事物如何与其他事物一起工作。

  • 你有一个又大又丑的电子表格这一事实意味着你有一个全局视角:人类可以做到这一点,我们可以凭感觉飞,但计算机不能,它们需要明确的说明。

2 第二原则

I've been keeping track of all of this in a big, ugly spreadsheet [...] - the spreadsheet method doesn't work very well

  • 为什么它不能正常工作 [就目前而言]?
    原因 1,共 2 个。
    你犯了一个开发人员经常犯的错误:你检查和研究物理领域中的事物的零碎部分,并试图弄清楚事物是如何工作的。保证失败,因为事情是如何运作的;它的目的;等等,是在智力领域,而不是物理领域。

    • 这里就不细说了,但是更大的问题一定要注意。此错误是更大错误的特定实例,并且非常常见,即:
      开发人员专注于 GUI 的功能,
      而不是需求,即
      正确定义数据及其关系GUI 的功能依赖于此
  • 一个没有学过内燃机的人,即使把零件仔细摆放,也无法通过拆开的发动机零件来弄清楚如何制造发动机.更不用说带注射器或 turbo-chargers 的了。内燃原理是逻辑的,零件是物理的。

  • 在这里,您查看了其他人用来做会计的电子表格,并且可能复制了它,但不了解他们用这些电子表格做什么。

  • 例子。
    您已经检查了 and linked 答案,并且您认为您可以弄清楚如何将其应用到解决大电子表格问题的新应用程序。

    • 许多开发人员认为,如果他们弄清楚了具体细节,copy-paste-and-substitute,应用程序就会以某种方式运行。请仔细注意 thought-out 但仍然不完整的图形,其中详细说明了可感知的交易。

    • 他们缺少逻辑领域,并且在没有理解他们正在搞乱的东西的情况下搞乱物理领域。

    • 总之,忘掉你我的交易的漂亮图形,并寻求理解逻辑(这个原则)和会计准则[3]。

  • “测试驱动开发”又名“代码最少”又名“试错”是一种完全破产的方法,它没有科学依据(营销,是的,但科学,不是),并且保证会失败。危险,因为成本是持续的,永远是有限的。

    • 并且要继续失败,如果你理解了上面的话。

    • 更准确地说,它是 anti-science,因为它与构建应用程序和数据库的科学相矛盾。

  • 因此,第一步是将庞大的电子表格分解为有目的的逻辑单元。当然,link 每个引用电子表格列到引用电子表格中的正确列......这样任何金额值都不会重复。

3 第三原则

I've been keeping track of all of this in a big, ugly spreadsheet [...] - the spreadsheet method doesn't work very well

  • 为什么它不起作用,无论是按原样还是当电子表格已划分为逻辑单元时?
    原因 2,共 2 个。
    缺乏标准。
    由于主题是会计,我们必须使用会计准则

  • 那个又大又丑的电子表格就可以证明您没有请会计师来设置它。当然,如果不了解会计或不使用合格的会计师,就无法设置一组电子表格来进行会计。

  • 因此,第二步是要么成为一名会计师,要么对会计有很好的了解。再次注意,您经过深思熟虑的交易的现成证据:尽管您是一个非常有能力的人,但您无法弄清楚 and 中的会计逻辑 linked 答案,更不用说您的应用程序(或您的手动系统)所需的会计了。

  • 所以我能给你的最好的建议是,如 中所述,在网上找到一些好的教程,并研究它们。

  • 如果您这样做,或者聘请会计师来设置您的账簿,您将把单一的大型电子表格拆分成标准的会计电子表格:

    • 余额Sheet:
      • 资产或负债
    • 损益:
      • 收入或支出
    • 还有一组(稍后)
  • 这个原则的另一种表述方式是这样的。当一个人不知道存在一项标准时,或者更糟的是,当一个人有意选择不遵守该标准时,就会从头开始处于 re-inventing 车轮 的危险位置.又名“测试驱动开发”,又名“尽可能少地编写代码”,又名“试错法”。这意味着一个人将经历一系列的发展增量,这些增量可以通过遵守标准来消除。

问题与解决方案

现在我们了解了原理,我们可以继续确定具体问题及其解决方案。每一个都是第三原则.

的具体应用

4 Property/Mortgage 治疗

I have no customers. I buy a property (usually cash goes out, a liability (loan) is created, an asset (the property) is created), spend a bunch of money to fix it up (either cash out at a store, credit card charges at a store, or a check written to a vendor, which debits the property asset and debits or credits the funding source), and then sell it

  • 我并不是说您没有听从我在 中给出的建议。我是说您没有意识到建议的重要性;这在会计上下文中意味着什么(在我们进入数据库上下文之前)。

  • 金钱代表价值。钱;价值,不能被创造或毁灭。它只能移动。从一个桶到另一个桶。需求是根据 [3].

    正确定义和安排您的存储桶
  • 属性没有创建,它已经存在了。当您购买 属性 时,您的现金会转移到银行,他们的 属性 也会转移到您。仅在天真的意义上,属性 现在是一种“资产”,抵押现在是一种“负债”。这种天真会在以后被澄清到适当的会计桶中。

  • 实际上,您是一家小型 single-branch 银行;合作社;赌场。 的准确上下文。以下是
    的情况 一组更正的电子表格,
    用于遵循和实施 (如果您直接进入应用程序...而无需测试对单个电子表格的更正)。

    • 这个理解很重要,因为这跟你所在国家的立法有关,你没有提到。该立法将被您称为 Taxation,或您的企业的 Tax Return。即使你一次只持有一个属性。

    • 您的“客户”是为每个 属性 聘用的每家银行。将其命名为 属性.

    • 每个抵押贷款 (属性) 都应设置为外部帐户。这将允许您仅针对它进行那些与它实际相关的交易。贷款支付;银行收费;花费;等等。在 属性 售出之前,不会有收入。

    • 无论如何,外部账户将与银行为您提供的抵押账户银行对帐单相匹配(您没有提到,但这是会计的基本要求)。

    • 中所定义,ExternalAccount 上的每笔交易都将在分类帐中有一个 Double-Entry 分支。更多,稍后。

    • 无论是会计术语中的资产还是负债,都是分类帐分录的功能,而不是E的功能内部帐户。 (无论如何,我们知道它代表 属性,从天真的角度来看,它是一种“资产”,直到它开始亏损,从天真的角度来看,它变成了“负债”。)

  • 定义这一点的另一种方式是,银行贷款代表一种合约,根据合约货币(价值)“易手”(移动)。您聘请的银行是“客户”,即外部账户。您必须保留与合同相关的所有收入和支出,与合同有关。

niche-market app ...
I have a few other specific use-cases ...

  • 不,你不知道。太阳底下并无新鲜事。如果你正确地设置了你的账簿(使用会计准则 linked 电子表格),这是一个普通的用例。希望我的解释已经证明了这一事实。

5 个分类帐

以上几点涉及到智力领域,对每个问题的理解和解决方案,在物理领域的工作量不大,这一点对智力有同样的要求,是繁重的在物理层面。即击键次数;检查;变化;在正确设置之前检查...。

  • 尽管第一个 linked 答案涉及:
    (高效且audit-able处理重新月末),
    第二个 linked 答案涉及:
    (在现有会计系统中实施了over-arching会计准则,更高级别audit-ability),
    两者都没有详细解释 Ledger。

  • 分类帐是任何会计系统的中心文章。

    • Double-Entry 系统不是 stand-alone 文章,而是该分类帐的 预付款

    • data model 是具体的如何为应用程序和任何报告客户端s/w正确设置数据库使用,平安无事。

  • 您没有真正的分类帐。单个大电子表格不是分类帐。

  • 您必须根据 [3] 设置 Ledger。充其量,该电子表格中的某些项目将成为分类帐中的条目,但请注意,由于 [1][2][3].

    中提出的更正,您对它们的看法会大不相同。
  • 请注意,当我们说“把那个放在账本里”或“那个不在账本里”时,为了简单起见,我们的意思恰恰是对单个 分类帐条目,由分类帐中的特定帐号标识。

  • 同样,当我们说“账户”时,我们指的正是分类帐中的一个帐号。

    • 如果一笔交易不在分类账中(一个特定的账号,一个LedgerNo,DEA的一个分支Credit/Debit),它不在“账户”中,它不是占了。
  • 在这里您将设置真正的资产和负债账户。这是出于内部目的,在分类帐中,如 data model.

    Internal 的边距中声明的那样
  • 我能给你的最好建议是,在网上搜索会计教程;确定哪些是好的;仔细研究它们,以期为您的目的设置合适的分类帐。

  • 简单的答案是,分类帐是帐号的层次结构

    • 其中叶级是可以交易的实际AccountNo
      non-leaf 级别的存在是为了汇总,不允许交易。

    • 每当报告分类帐时(或分类帐的任何衍生产品,例如余额Sheet或损益):
      层次结构通过缩进显示, 交易账户条目显示当月当前余额
      并且聚合帐户条目显示其下树的聚合

[your graphics re transactions]

  • 首先,每笔交易都在账本中。这意味着 Double-Entry 会计交易的一部分在分类帐中。查看,注意每个业务交易至少有一个蓝色条目(不用担心其他细节)。

  • 其次,DEA的另一支腿是:

    • 在分类帐中,这意味着钱在一个分类帐帐户 LedgerNo 和另一个分类帐帐户 LedgerNo 之间移动。注意双方都是蓝色的业务交易。

    • 在一个外部账户中,这意味着资金在一个分类账户LedgerNo和一个外部账户AccountNo之间转移。注意一侧为蓝色的业务交易另一个是绿色的。

  • 当你理解了这一点,并且你已经设置了你的 Ledger 时,就不会有“??”了。在您的图形中,将显示 blue/green。 (不要 re-do 你的图形,我希望这个答案就足够了。)

    • 您的“asset/liab”指定不正确。更准确地说,在分类帐被完全定义和安排之前做出声明还为时过早。首先设置您的分类帐,为每个条目考虑 Asset/Liability。这样您就不必在每笔交易中声明“asset/liab”,因为这是分类帐帐号 LedgerNo 的函数,而不是交易的函数。

expenses that a) come from a specific account (i.e. company checking account or owner's Best Buy card etc.),

Ledger-ExternalAccount
(分类帐中的一个 DEA 分支,外部账户中的另一个分支)。注意上面的警告。另一个 DEA 分支将是其中之一(层次结构):

  • Expense/PropertyImprovement/Structure/Material
  • Expense/PropertyImprovement/Structure/Labour
  • Expense/PropertyImprovement/Fitting/Material
  • Expense/PropertyImprovement/Fitting/Labour
  • Expense/PropertyImprovement/Furniture

expenses that c) are always associated with a cost code (i.e. '100.12 - Window Materials', '100.13 - Window Labor', etc.).

您将不再有“费用代码”,它们都是分类帐帐号LedgerNos,因为分类帐是您记账的地方。

分类帐中的一个 DEA 分支,特定 属性 的外部账户中的另一个分支。层次结构将与上一点相同。

expenses that b) are generally associated with a specific job

Ledger-ExternalAccount
(一个 DEA 分支在分类账中,另一个在外部账户中)。

(but not always - I do have the occasional overhead expense like office supplies)

Ledger-Ledger

  • 分类帐中的一个 DEA 分支用于费用或负债 LedgerNo ... 这笔钱已支付给

    • Expense/Regular/Office 补给
  • 收入或资产的分类帐中的另一条腿 LedgerNo ... 钱已从

    支付
  • Revenue/Monthly应付

6 信用卡和其他卡待遇

credit card charge
Best Buy card

您的每张卡都代表一个合同,一个需要进行交易的账户,必须与发卡机构提供的月结单进行平衡。

  • 将每一个都设置为外部账户,一个 DEA 腿在这里,另一个在分类帐中。

  • “所有者的 Best Buy 卡”我不清楚(谁是所有者,你还是 属性 所有者……如果是后者,那么到目前为止的假设是,“你”买卖房产不正确。)

    • 无论如何,我相信我已经提供了足够的细节让你明白。

    • 不要将所有者的 属性 帐户和他们的 Best Buy 卡合并为一个外部帐户:为每个帐户保留单独的外部帐户。

7 作业成本核算

请注意,我在最后解决这个问题,因为一旦解决了大问题,剩下的问题就很小了。您提出的大问题(工作成本计算;profit/loss 每 属性)是,一旦为您的业务正确设置了分类帐,实际上是小问题。

据我所知,作业成本是我唯一没有解决的问题。首先,这里要理解的问题是,Actuals 和 Estimates 之间的区别。到目前为止我讨论的所有内容都是实际值。

  • 对于估计,标准程序是在分类帐中设置单独的帐户结构(层次结构中的树)。这些通常称为暂记帐户,如 暂记的钱

  • 如果处理得当,这些账户将阻止您在所有估算值都转移到实际值(暂记为零)之前关闭或最终确定外部账户。

  • 业务交易与实际情况完全相同。

  • 这将提供对此类数字的精确跟踪,以及项目从估计值变为实际值时的差异。

8 数据模型 • 作业成本核算

注意到 and linked 答案中的数据模型是完整的,其中分类帐 展开:

  • 这个答案涉及分类账的解释,这个数据模型给出了 Ledger

    的完整定义
    • AccountType
    • 整理
    • 一个single-parent层级
      • 只有叶级别 LedgerAccount 可以根据
      • 进行交易
      • 中级LedgerIntermediate用于总结其下的树。
  • 我进一步归一化了Transaction

  • 扩展外部 Account 以显示个人与组织

  • 所有约束都已明确。

[=68=

对于内联图形来说显然太大了。这里有一个PDF分两页:

  • 单独的数据模型(如上)
  • 带有示例数据和注释的数据模型,它包括答案中涵盖的所有示例
  • 注意分类帐中的缩进,它表示帐户层次结构

评论

How do you insert the first ledger (e.g. 100 Asset, no parent)?

分类帐是一个 ,一个单父层次结构(由于奇怪的原因也称为“单向”),根据帐户层次结构.需要 root 行。在数据库构建操作(使用文件中的 DDL)中,我们通常执行所有 CREATE TABLE,然后执行所有 ADD CONSTRAINT FK。将 root 行插入 CREATE TABLE.

  • 之后
    CREATE TABLE Ledger

    INSERT Ledger VALUES ( 0, 0, "I", "AL", "Root", ... ).

  • 之后
    CREATE TABLE LedgerIntermediate

    INSERT LedgerIntermediate VALUES ( 0 ).

鉴于 Comprises 的反向是 belongs to,所有 first-level 分类帐例如。 Fees, House, Interbank 和你的 Assetbelong to 这个 root 行。