scottlaurent / accounting
Laravel Eloquent 模型会计日记账
Requires
- moneyphp/money: ^3.0
- ramsey/uuid: ^4.0
Requires (Dev)
- mockery/mockery: ^1.3
- orchestra/testbench: ^5.2
- phpunit/phpunit: ^9
This package is not auto-updated.
Last update: 2024-09-25 21:34:45 UTC
README
我是一个会计师和 Laravel 开发者。我编写了这个包,以提供一个简单的插入式特质来管理特定模型累计余额。它也可以用来创建基于双重入账的项目,其中一个会计科目借方,另一个会计科目贷方。
** 这确实允许你在每个模型对象(用户、账户等)的基础上保持历史借方和贷方明细
** 这确实允许你跟踪每个项目的备忘录,并且可以直接引用外部的类对象。
** 从 v0.2.0 版本开始,这允许你利用“账簿”系统,使其能够对费用、收入等运行查询。
** 这不强制双重入账记账,但创建了一个可以构建双重入账系统的环境。
** 这不会替换你正在使用的任何类型的财务记录系统(例如,如果你在 Stripe 上跟踪事物)。
内容
安装
-
运行 composer require "scottlaurent/accounting"
-
运行 php artisan vendor:publish 这将在你的数据库中安装3个新表。账簿迁移是可选的,你应该查看下面的场景C以确定你是否需要使用它。
-
将特质添加到任何你想记录日记的模型中。
-
** 大多数情况下,你将想要将 $model->initJournal() 添加到你的模型中静态::created() 方法中,以便在创建模型对象本身时创建日记。
-
如果使用双重入账,将 Scottlaurent\Accounting\Services\Accounting::class 添加到你的服务提供者中
代码示例
// locate a user (or ANY MODEL that implementes the AccountingJournal trait) $user = User::find(1); // locate a product (optional) $product = Product::find(1) // init a journal for this user (do this only once) $user->initJournal(); // credit the user and reference the product $transaction_1 = $user->journal->creditDollars(100); $transaction_1->referencesObject($product); // check our balance (should be 100) $current_balance = $user->journal->getCurrentBalanceInDollars(); // debit the user $transaction_2 = $user->journal->debitDollars(75); // check our balance (should be 25) $current_balance = $user->journal->getCurrentBalanceInDollars(); //get the product referenced in the journal (optional) $product_copy = $transaction_1->getReferencedObject()
查看 /tests 获取更多示例。
工作原理
-
这个特质包括两个功能:a) 为你的模型对象初始化一个新的日记账,b) 返回该日记账。
-
通常系统会有一个日记账用于每个用户或账户,如果进行双重入账系统,还有一个公司的一般日记账。
-
重要:会计系统使用 Money PHP 类来处理不可分割的货币。例如,美元的不可分割货币是分。所以 1 美元实际上是 Money 100 USD。这可以防止由于除法/舍入错误而损失货币。
使用示例
-
场景 A - 非常简单的案例 - 你提供一个 API 服务。每个用户的 API 调用成本为 5 美分。你不需要双重入账会计。
a. 将模型特质添加到你的用户类中。
b. 在每月月底运行一个 cron 脚本来统计 API 调用次数,例如 $user->journal->debitDollars(1500 * 0.05),其中 1500 是用户在该月底的 API 调用次数。
c. 任何时间用户进行支付,都可以发布 $user->journal->creditDollars(25.00)
从这一点开始,你可以通过执行 $balance_due = $user->journal->getBalanceInDollars()(或 getBalance() 用于 Money 对象)来获取此用户的余额;
-
场景 B - 你想要跟踪用户的商品购买,并且也想要为整个应用进行非常基本的仅收入的双重入账记录,其中每个用户都有一个基于收入的日记账(如场景 A)。
将模型特征添加到您的用户类中。如果您还没有,请为该公司本身创建一个模型(您可能只有一个条目,即公司/应用程序)。同样,将特征添加到该类中。所以,总结一下,您将为每个用户有一个期刊,然后为该公司添加一个额外的模型对象,该公司有一个单独的期刊条目。
b. 如果您进行简单的产品采购,只需在购买时借记用户期刊,贷记账户期刊。您可以选择在借记和贷记时引用产品(请参阅测试类)。
c. 如果您执行更复杂的订单,这些订单有发票或订单,您仍然可以在这里做同样的事情:借记用户模型。贷记发票模型。然后借记发票模型,贷记账户模型。这完全取决于您如何构建,但这里的关键点是您负责同时进行借记和贷记,这可以是一个非常简单和/或手动的方式来构建一个小型会计系统。
-
场景C - 您想要将期刊分配给账簿类型系统并强制执行复式记账制度
a. 运行迁移。然后查看测试中的BaseTest setUpCompanyLedgersAndJournals()代码。注意创建了5个基本账簿。以这个为例,创建您将要使用的账簿。您可以坚持使用这5个,或者创建一个完整的账户表,但请确保每个账簿条目都分配给5个枚举之一(收入、支出、资产、负债、所有者权益)
b. 到目前为止,您将需要多个公司期刊。如果您查看测试迁移create_company_journals_table,它是一个简单的表,允许您添加期刊以记录交易。
c. 每个创建的期刊,无论是用户期刊,还是您在期刊表中创建的现金期刊,您都希望将其分配给账簿。$user->journal->assignToLedger($this->company_income_ledger);
d. 要处理复式记账交易,可以这样做
// this represents some kind of sale to a customer for $500 based on an invoiced ammount of 500. $transaction_group = AccountingService::newDoubleEntryTransactionGroup(); $transaction_group->addDollarTransaction($user->journal,'credit',500); // your user journal probably is an income ledger $transaction_group->addDollarTransaction($this->company_accounts_receivable_journal,'debit',500); // this is an asset ledder $transaction_group->commit();
// this represents payment in cash to satisy that AR entry $transaction_group = AccountingService::newDoubleEntryTransactionGroup(); $transaction_group->addDollarTransaction($this->company_accounts_receivable_journal,'debit',500); $transaction_group->addDollarTransaction($this->company_cash_journal,'credit',500); $transaction_group->commit(); // at this point, our assets are 500 still and our income is 500. If you review the code you will notice that assets and expenses are on the 'left' side of a balance sheet rollup and the liabilities and owners equity (and income) are rolled up on the right. In that way, the left and right always stay in sync. You could do an adjustment transaction of course to zero out expenses/income and transfer that to equity or however you do year-end or period-end clearances on your income/expense ledgers.
e. 最后请注意,将所有类型为资产/支出的$ledger模型对象加起来,那么这总是等于类型为负债/所有者权益/收入的$ledger对象总和的100%。
f. 注意,$transaction_group->addDollarTransaction()允许您将任意数量的交易添加到批次中,但资产/支出类型的账簿期刊总额必须等于收入/负债/所有者权益类型。这是会计的基本要求,在这里得到强制执行。但再次提醒,如果您不想使用账簿,您根本不必使用它们。
g. 单元测试实际上模拟了几个复杂场景。它们模拟了大约1000笔交易,每笔交易模拟了1000万至1亿美元之间的采购,分为现金和应收账款,然后检查所有交易结束时的基本会计等式。
我的经验是,在实践中,保持5个基本账簿类型、一些初始公司期刊,然后为用户添加期刊,有时还会添加分配给支出账簿的供应商期刊,可以使事情保持相当简单。任何更复杂的事情,通常最终会迁移到财务系统,或者在某些情况下,只是同步。
许可
在MIT许可条款下分发的免费软件。