会计分录

一笔款项的分配

2005年1月22日

这是我在2000年代中期进行的进一步的企业应用程序架构开发写作的一部分。遗憾的是,此后太多其他事情吸引了我的注意力,所以我没有时间进一步研究它们,而且在可预见的未来我也没有看到太多时间。因此,这些材料非常草稿形式,我不会进行任何更正或更新,直到我能找到时间再次进行处理。

我在星期二从我的支票账户中提取了100美元。这将是一个会计分录,其金额为100美元,日期为星期二,描述为我的支票账户。

承包商在星期六为我家里的工作花费了300美元购买电气用品。这将是一个会计分录,其日期为星期六,金额为300美元,描述为我家工作的项目,以及电气用品的成本类别。

三桶Old Peculier被送到Square and Compass。这将是一个会计分录,其金额为三桶(数量),其描述为Old Peculier和Square and Compass。

会计围绕着金钱,本质上是关于金钱的分类:它来自哪里,它用于什么,甚至它应该用于什么。从文艺复兴时期开始,记录这种方式是在分类账中进行分录,在那个时代是一本实体书。这些分录记录了进账和出账。它们还记录了实际上没有导致任何资金交割的事情,例如转账。

它是如何工作的

分类账的页面对应于特定类别的资金,如今它们被称为账户,因此账户通常与会计分录一起使用。事实上,在分析模式中,我把它们放在同一个模式中。但这并不总是这样。有些人看到没有账户的分录,有些人将所有分录都视为账户的一部分。我将在账户中讨论它们紧密结合的情况,在此之前,只需将账户视为分录的一种可能的描述符。

将分录视为影响域的有趣事物并不牵强,因此域事件可能适用于会计分录。有时我看到这种情况,有时我看到两者分开。重要的是,在使用会计分录时,你需要问域事件提出的问题。(分录应该是不变的吗?它们应该有哪些日期?)

通常,对于何时可以更改分录有特定的规则。在分录处于打开状态时,可能允许更改它们,但在分录关闭或记账后,不允许更改它们。

在特定模型中,你通常会将描述符建模为单独的类,并与分录建立单独的关系。因此,如果我们正在进行工作成本核算,我们可能希望用项目和成本类型标记每个分录。项目和成本类型是分录的描述符。在我们的模型中,我们将这些显示为单独的关系,如图 1所示。

图 1:项目和成本类型作为描述符。

使用事件溯源

事件溯源会计分录特别有效,因为你可以将所有来自事件的会计更改表示为一组新创建的会计分录。如果你然后将会计分录链接到导致它们的域事件,这将允许你快速形成域事件与其后果之间的链接。这不仅形成了强大的审计跟踪,还允许你轻松地执行追溯事件所需的处理。

图 2:将域事件连接到由于它而创建的所有会计分录有助于审计和后续处理。

何时使用它

无论何时需要记录某些定量值的每次更改,都应该使用分录。最明显的情况是记录货币值的每次更改,事实上,这是最常见的情况,因为货币对于大多数企业来说都足够重要,需要这种级别的跟踪。

该模式建议最常见的情况,即为货币金额创建分录。但是,无论何时想要对某事物的数量进行分类,或者对包含差异的任何事物进行分类,例如源代码控制系统中的差异,你都可以使用此模式。这样做听起来很危险,就像使用一些过于通用的模型来模拟任何事物一样。这种过于通用的模型是一条危险的美人鱼,她的美丽吸引了许多分析师,让他们陷入令人讨厌的,如果不是完全致命的,溺水变体。但抽象的价值在于,建立在会计分录之上的其他模式是否有意义。因此,请将其作为一种可能性,但要确保你首先会游泳。

示例:简单示例(Java)

在简单状态下,会计分录主要是一个简单的数据持有者。

interface Entry {
   Entry newEntry (CostType costType, Project project, Money amount, Date date);
   CostType getCostType();
   Project getProject();
   Money getAmount();
   Date getBookingDate();

描述符通常会作为显式类型出现在模式的任何特定应用中。

分录可能始终是不变的,或者在记账之前可能是可变的。这将导致设置类似于以下内容的方法

    void setCostType (CostType arg) {
       if (isOpen())
        costType = arg
       else
        throw new ImmutableEntryException();
    }