icomefromthenet / ledger
财务和会计库
v1.1.0
2018-08-17 07:21 UTC
Requires
- bluem/tree: @stable
- icomefromthenet/dbal-gateway: ^1.1.0
- pimple/pimple: 3.0.*
- psr/log: 1.0.*
- vlucas/valitron: ^1.2
Requires (Dev)
- phpunit/dbunit: ^4.0
- phpunit/phpunit: ^7
This package is not auto-updated.
Last update: 2024-09-14 17:59:02 UTC
README
PHP 和 MySQL 的通用总账。
一个 通用总账 是一家公司在其整个生命周期中财务交易的全部记录。总账包含准备财务报表所需的账户信息,包括资产、负债、所有者权益、收入和费用。
安装
步骤 1. 您可以使用 composer 安装此库。
icomefromthenet/ledger : 1.0.*
步骤 2. 创建一个名为 'general_ledger' 的新数据库,并在数据库/database.sql 下运行数据库构建脚本。
mysql general_ledger < database/database.sql
我使用自己的数据库迁移工具 Migrations,但我已经包含了一个 sql 文件以便方便使用。
术语和约定
1. 借方/贷方。
借方是一个正值的数字,贷方是一个负值的数字。
2. 交易
在本库中,交易由总账中的单个条目表示,每个交易可以有 1 到多个账户变动。
3. 组织单位(成本中心)
组织单位用于将交易分组,每个单位都与一个组织单位相关联,因此应该是互斥的。例如,组织中的部门。
4. 总账用户。
每个交易都订阅给单个用户,这最有可能是您的应用程序用户。
5. 总账条目/账户变动。
每个条目代表对总账账户的分配。
6. 总账账户
每个账户可以持有一个到多个子账户,可以将其视为一个树。
6. 试算平衡表
汇总所有条目,然后将其分为借方和贷方。如果借方等于贷方,则称总账为平衡。
7. 调整
要更正错误,必须通过反向和重新发布交易来调整交易,我们不会在总账中删除交易。
创建交易
- 实例化库 DI 容器。
- 实例化交易构建器。
- 从数据库获取当前日期。
- 设置交易详细信息并运行。
use Doctrine\DBAL\Connection; use Monolog\Logger; use Monolog\Handler\TestHandler; use Symfony\Component\EventDispatcher\EventDispatcher; use IComeFromTheNet\GeneralLedger\LedgerContainer; use IComeFromTheNet\GeneralLedger\TransactionBuilder; # instance the Library DI Container. $oAppLog = new new Logger('test-ledger',array(new TestHandler())); $oDatabase = new Connection(array()); $oEvent = new EventDispatcher(); $oLedgerContainer = new LedgerContainer($oEvent, $oDatabase, $oAppLog); $oLedgerContainer->boot(); # fetch processing date from the database $oProcessingDate = $oLedgerContainer->getNow(); # instance the Transaction Builder and configure our builder with transaction. $oTBuilder = new TransactionBuilder($oLedgerContainer); $oTBuilder->setProcessingDate($oProcessingDate); $oTBuilder->setOccuredDate(new DateTime('now - 6 day')); $oTBuilder->setOrgUnit('homeoffice'); $oTBuilder->setVoucherNumber('10004'); $oTBuilder->setJournalType('sales_journal'); $oTBuilder->setUser('586DB7DF-57C3-F7D5-639D-0A9779AF79BD'); # Add Some account movements $oTBuilder->addAccountMovement('2-1120',100); $oTBuilder->addAccountMovement('2-1121',-100); # process the transaction, if no exceptions then we have a sucessful transaction $oTBuilder->processTransaction(); $oTransaction = $oTBuilder->getTransactionHeader(); echo 'Transaction ID' . $oTransaction->iTransactionID;
您真的不应该假设您的 Web 服务器和数据库服务器运行相同的日期设置。
创建调整
- 实例化库 DI 容器。
- 实例化交易构建器。
- 从数据库获取当前日期。
- 获取要撤销的交易。
- 处理调整然后进行替换。
use Doctrine\DBAL\Connection; use Monolog\Logger; use Monolog\Handler\TestHandler; use Symfony\Component\EventDispatcher\EventDispatcher; use IComeFromTheNet\GeneralLedger\LedgerContainer; use IComeFromTheNet\GeneralLedger\TransactionBuilder; $oAppLog = new new Logger('test-ledger',array(new TestHandler())); $oDatabase = new Connection(array()); $oEvent = new EventDispatcher(); $oLedgerContainer = new LedgerContainer($oEvent, $oDatabase, $oAppLog); $oLedgerContainer->boot(); # fetch processing date from the database $oProcessingDate = $oLedgerContainer->getNow(); # instance the Transaction Builder and configure our builder with transaction. $oTBuilder = new TransactionBuilder($oLedgerContainer); $oTBuilder->setProcessingDate($oProcessingDate); $oTBuilder->setOccuredDate(new DateTime('now - 6 day')); $oTBuilder->setOrgUnit('homeoffice'); $oTBuilder->setVoucherNumber('10004'); $oTBuilder->setJournalType('sales_journal'); $oTBuilder->setUser('586DB7DF-57C3-F7D5-639D-0A9779AF79BD'); # process the reversal transaction, if no exceptions then we have # a sucessful transaction. $oGateway = getGatewayCollection()->getGateway('ledger_transaction'); $oTransaction = $oGateway->selectQuery() ->start() ->where('transaction_id = :iTransactionId') ->setParameter(':iTransactionId',1,'integer') ->end() ->findOne(); $oTBuilder->processAdjustment($oTransaction); $oAdjTransaction = $oTBuilder->getTransactionHeader(); echo 'Adjustment Transaction ID' . $oAdjTransaction->iTransactionID; ehco 'Original Transaction references adj'. $oTransaction->iAdjustmentID;
应该给出与原始交易相同的替换交易发生日期,如果在日期顺序列表中,它们将分组在一起。
运行试算平衡表
- 决定您想使用 AGG 表还是条目表。
- 选择您是想为所有人还是单个用户/组织单位获取试算平衡表。
use Doctrine\DBAL\Connection; use Monolog\Logger; use Monolog\Handler\TestHandler; use Symfony\Component\EventDispatcher\EventDispatcher; use IComeFromTheNet\GeneralLedger\LedgerContainer; use IComeFromTheNet\GeneralLedger\TrialBalance; use IComeFromTheNet\GeneralLedger\TrialBalanceOrgUnit; use IComeFromTheNet\GeneralLedger\TrialBalanceUser; $oAppLog = new new Logger('test-ledger',array(new TestHandler())); $oDatabase = new Connection(array()); $oEvent = new EventDispatcher(); $oLedgerContainer = new LedgerContainer($oEvent, $oDatabase, $oAppLog); $oLedgerContainer->boot(); # pick a to date. $oProcessingDate = new DateTime('now - 1 day') $bUseAggSource = true; $iOrgUnit = 1; $iUser = 1; # You need to do a lookup to map human name for User or OrgUnit to database id. $oTrialBal = new TrialBalance($oLedgerContainer, $oProcessingDate,$bUseAggSource); $oUserTrialBal = new TrialBalanceOrgUnit($oLedgerContainer, $oProcessingDate,$iUser,$bUseAggSource); $oOrgUnitTrialBal = new TrialBalanceUser($oLedgerContainer, $oProcessingDate,$iOrgUnit,$bUseAggSource); # execute the balance, will throw and exception if something goes wrong. $oTrialBalance = $oTrialBal->getTrialBalance(); # print the results foreach($oTrialBalance => $oLedgerBalance) { echo $oLedgerBalance->sAccountNumber; echo $oLedgerBalance->sAccountName; echo $oLedgerBalance->fDebit; echo $oLedgerBalance->fCredit; }
账户表
- id 为 1 的第一个账户将是一个根账户。
- 需要一个或多个 is_left = true(借方)账户和一个或多个 is_right = true(贷方)账户。
- 其他账户应从这些顶级账户继承。
- 是的,它是一个树。