财务和会计库

v1.1.0 2018-08-17 07:21 UTC

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

要更正错误,必须通过反向和重新发布交易来调整交易,我们不会在总账中删除交易。

创建交易

  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. 是的,它是一个树。