ikidnapmyself / accounting
Requires
- moneyphp/money: ^3.0
Requires (Dev)
- mockery/mockery: ^0.9.5
- orchestra/database: ~3.4.0
- orchestra/testbench: ~3.4.0
- phpunit/phpunit: ^5.2
This package is auto-updated.
Last update: 2020-03-19 12:32:29 UTC
README
我是一个会计师和Laravel开发者。我编写此包是为了提供一个简单的内置特质来管理给定模型的增长余额。它也可以用于创建基于双重录入的项目,其中您可能想要对一项日记账进行贷方记录,对另一项进行借方记录。
** 这确实允许您根据每个模型对象(用户、账户等)保留历史借方和贷方明细
** 这确实允许您跟踪每条明细的摘要,并且可以直接引用外部的类对象。
** 从v0.2.0版本开始,这允许您利用“账本”系统,使其能够对费用、收入等执行查询。
** 这并不强制双重录入簿记,但确实创建了一个可以构建双重录入系统的环境。
** 这并不会替代您可能正在使用的任何类型的财务记录系统(例如,如果您在Stripe中跟踪事物)。
内容
安装
-
composer require "scottlaurent/accounting"
-
将迁移文件夹中的文件复制到您的迁移文件夹并运行它们。这将为您数据库安装3个新表。账本迁移是可选的,您应该查看下面的场景C来确定您是否需要使用它。
-
将特质添加到您想要为其保留日记的任何模型中。
-
** 大多数情况下,您可能希望将 $model->initJournal() 添加到您模型的 static::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 获取更多示例。
工作原理
-
特质包括初始化模型对象的新日记和返回该日记的功能。
-
通常系统将为每个用户或账户有一个日记,如果进行双重录入系统,则有一个公司的一般日记。
-
重要:会计系统使用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的收入日记账。
a. 将模型特性添加到用户类中。如果你没有,为该公司本身创建一个模型(你可能只有一个条目,即公司/应用程序)。也将特性添加到该类中。总结一下,你将有一个每个用户的日记账,然后还有一个额外的模型对象,即公司,它有一个单独的日记账条目。
b. 如果你只进行简单的商品购买,只需在购买时从用户日记账中借记,并从账户日记账中贷记。你可以选择在借记和贷记时引用产品(参见测试类)。
c. 如果你进行更复杂的订单,有发票或订单,你仍然可以在这里做同样的事情:借记用户模型,贷记发票模型。然后借记发票模型,贷记账户模型。这完全取决于你如何构建结构,但这里的关键是你需要同时进行借记和贷记,这可以是一个非常简单和/或手动的方式来构建一个小型会计系统。
-
场景C - 你想要将日记账分配到账簿类型系统中,并强制执行双条目系统
a. 运行迁移。然后查看tests/BaseTest setUpCompanyLedgersAndJournals()代码。注意创建的5个基本账簿。使用这个作为例子,创建你将使用的账簿。你可以坚持这5个,也可以创建一个完整的账户总表,只需确保每个账簿条目都分配给5个枚举之一(收入、支出、资产、负债、权益)即可。
b. 到目前为止,你需要多个公司日记账。如果你查看test migration 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模型对象加起来,这总是与负债/权益/收入类型的总和相等。
f. 注意$transaction_group->addDollarTransaction()允许你将所需数量的交易添加到批次中,但资产/支出类型的账簿条目总和必须等于收入/负债/权益类型的总和。这是会计的基本要求,在这里得到了强制执行。但再次提醒,如果你不想使用账簿,你不必使用账簿。
g. 单元测试实际上模拟了几个复杂场景。它们模拟了大约1000笔交易,每笔交易模拟了1万至1000万美元的购买,分为现金和应收账款,并在所有这些之后检查基本的会计等式。
根据我的经验,在实践中,保持5个基本账簿类型、一些初始公司日记账,然后为用户添加日记账以及有时为费用账簿添加供应商日记账,可以使事情保持相对简单。任何更复杂的事情,通常最终都会迁移到财务系统,或者在某些情况下,只是同步。
许可证
遵循MIT许可协议分发的自由软件。