vladshut / ledger
财务和会计库
v1.3.1
2018-11-23 11:17 UTC
Requires
- bluem/tree: @stable
- pimple/pimple: 3.0.*
- psr/log: 1.1.*
- vladshut/dbal-gateway: ^1.2.0
- vlucas/valitron: ^1.2
Requires (Dev)
- phpunit/dbunit: ^4.0
- phpunit/phpunit: ^7
README
PHP和MySql的通用总账。
总账 是记录公司生命周期内所有财务交易的完整记录。总账包含用于编制财务报表所需的所有账户信息,包括资产、负债、所有者权益、收入和支出账户。
安装
步骤 1. 您可以使用composer安装此库。
icomefromthenet/ledger : 1.0.*
步骤 2. 创建一个名为 'general_ledger' 的新数据库,并在 database/database.sql 下运行数据库构建脚本
mysql general_ledger < database/database.sql
我使用自己的数据库迁移工具 Migrations,但为了方便,我已经包括了一个sql文件。
术语和约定
1. 借方/贷方。
借方是一个正数,贷方是一个负数。
2. 交易
在此库中,交易表示为对总账的单次条目,每个交易有1到多个账户变动。
3. 组织单位(成本中心)
组织单位用于将交易分组,每个单位都与一个相关联,因此应该是相互排斥的。例如,组织中的部门。
4. 总账用户。
每个交易都订阅给一个单一用户,这很可能是您的应用程序用户。
总账条目/账户变动。
每个条目代表对总账账户的分配。
5. 总账账户
每个账户可以包含一个或多个子账户,可以将其视为一个树。
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(贷方)账户。
- 其他账户应从这些顶级账户继承。
- 是的,这是一个树。