vladshut/ledger

财务和会计库

v1.3.1 2018-11-23 11:17 UTC

This package is auto-updated.

Last update: 2024-09-11 18:59:14 UTC


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. 调整

为了进行更正,必须通过冲销和重新发行来调整交易,我们不删除账簿中的交易。

创建交易

  1. 实例化库DI容器。
  2. 实例化交易构建器。
  3. 从数据库获取当前日期。
  4. 设置交易详情并运行。
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服务器和数据库服务器运行相同的日期设置。

创建调整

  1. 实例化库DI容器。
  2. 实例化交易构建器。
  3. 从数据库获取当前日期。
  4. 获取要冲销的交易。
  5. 处理调整并执行替换。
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;

应该给它们替换交易与原始交易相同的发生日期,如果在日期顺序列表中创建,您会看到它们分组在一起。

运行试算平衡表

  1. 决定您是想使用AGG表还是条目表。
  2. 选择您是想为所有人还是单个用户/组织单位创建试算平衡表。
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;
    
}

账户表

  1. 第一个账户id为1的将是根账户。
  2. 需要一个或多个is_left = true(借方)账户和一个或多个is_right = true(贷方)账户。
  3. 其他账户应从这些顶级账户继承。
  4. 是的,这是一个树。