Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 848

Přidáno uživatelem Jiří Sviták před více než 13 roky(ů)

Optimalizovana funkce pro prepocitani zustatku na vsech uctech. Pridano strucne informovani o poctu vytvorenych prevodu u vybranych operaci. Nove osetreni duplicit v importu. Odladeno strhavani clenskych prispevku, vstupnich prispevku a prepoctu.

Zobrazit rozdíly:

freenetis/branches/account_transactions/application/i18n/cs_CZ/texts.php
'after you\'ve done that, you can continue' => 'Poté, co tak učiníte, můžete pokračovat.',
'agree' => 'Souhlas',
'all' => 'Všichni',
'all accounts now have correct balances' => 'Všechny účty teď mají správné zůstatky.',
'all accounts now have correct balances, %d accounts had incorrect balances' => 'Všechny účty teď mají správné zůstatky, %d účtů mělo chybné zůstatky.',
'all ip addresses of member' => 'všem IP adresám člena',
'all redirected' => 'Všichni přesměrovaní',
'all transfers' => 'Všechny převody',
......
'bank info' => 'Údaje platby',
'bank interest' => 'Bankovní úrok',
'bank interests' => 'Bankovní úroky',
'bank statement contains items that were already imported' => 'Bankovní výpis obsahuje položky, které již byly importovány.',
'bank statement has been successfully deleted' => 'Bankovní výpis byl úspěšně smazán.',
'bank statement has been successfully updated' => 'Bankovní výpis byl úspěšně upraven.',
'bank statements' => 'Bankovní výpisy',
......
'entrance fee' => 'Vstupní příspěvek',
'entrance fee has been successfully deducted' => 'Vstupní příspěvek byl úspěšně stržen.',
'entrance fee have to be a number' => 'Vstupní příspěvk musí být číslo',
'entrance fees have been successfully deducted' => 'Vstupní příspěvky byly úspěšně strženy.',
'entrance fees have been successfully deducted, %d new transfers created' => 'Vstupní příspěvky byly úspěšně strženy, vytvořeno %d nových převodů.',
'enum type has been successfully added' => 'Výčet byl úspěšně přidán',
'enum type has been successfully deleted' => 'Výčet byl úspěšně smazán',
'enum type has been successfully updated' => 'Výčet byl úspěšně aktualizován',
......
'fee or penalty comment' => 'Komentář k poplatku/pokutě',
'fee type' => 'Typ poplatku',
'fees' => 'Poplatky',
'fees have been successfully deducted' => 'Členské příspěvky byly úspěšně strženy.',
'fees have been successfully deducted, %d new transfers created' => 'Členské příspěvky byly úspěšně strženy, vytvořeno %d nových převodů.',
'fees have been successfully recounted' => 'Členské příspěvky byly úspěšně přepočítány.',
'fees have not been set!' => 'Členské příspěvky nebyly nastaveny!',
'fifth-degree certified engineers' => 'Certifikování technici pátého stupně',
freenetis/branches/account_transactions/application/i18n/cs_CZ/help.php
(
'access_to_system' => 'Určuje, zda-li má uživatel možnost přihlásit se do systému Freenetis a zda má možnost využívat služeb Radius serveru napojeného na Freenetis, tedy například VPN, aktivní prvky sítě, volání z VoIP účtu atd.',
'accounting_system' => 'Účetní osnova je hlavní pomocník pro účetního sdružení. Zobrazuje sumu peněz na účtu z pohledu účetní osnovy. Ve výchozím stavu je to částka za celou dobu fungování sdružení, lze ovšem vyfiltrovat převody za zvolené období, např. od data 2009-01-01 do data 2009-12-31.',
'add_new_bank_transfer' => 'Umožňuje přidat ručně nový bankovní převod, který ma zdrojový i cílový účet. Typicky jde o fakturu nebo členský příspěvek. V běžném provozu využívejte automatický import výpisů. Ruční přidávání je tu pouze z důvodu, že byla potřeba dát do systému staré platby, které již byly jen v textovém formátu a nebylo možné je parsovat.',
'add_new_bank_transfer_without_counteraccount' => 'Umožňuje přidat bankovní převod bez protiúčtu, jde typicky o vklad, úrok bance apod. V běžném provozu využívejte automatický import výpisů. Ruční přidávání je tu pouze z důvodu, že byla potřeba dát do systému staré platby, které již nebylo možné parsovat.',
'add_new_transfer' => 'Zobrazí formulář, který umožňuje hospodáři sdružení přidat libovolný převod mezi dvěma podvojnými účty. Účetní korektnost tohoto zásahu je ovšem v zodpovědnosti účetního.',
'add_from_account' => 'Umožňuje poslat peníze z účtu na jiný účet. Například člen může poslat peníze na projektový účet na podporu nějakého projektu nebo jinému členovi, např. zaplatit rodičům internet, pokud mají samostatnou přípojku.',
'application_password' => 'Aplikační heslo slouží uživateli pro přihlášení ke službám, které jsou závislé na Radius serveru, jako například VPN, aktivní prvky sítě atd. Toto heslo je v databázi uloženo v otevřené podobě.',
......
'password' => 'Uživatelské heslo musí obsahovat alespoň 8 znaků a musí obsahovat alespoň jedno písmeno nebo číslici.',
'payed_to' => 'Datum, do kdy máte zaplaceny členské příspěvky. Včas před tímto datem byste měli zaplatit členské příspěvky. V případě, že jste s kreditem v mínusu, tak zaplaťte co nejdříve, jinak budete zablokováni.',
'project_subaccounts' => 'Projektový účet 221103 pro účetního představuje jeden účet. Zde jsou ovšem rozepsány všechny projektové podúčty z pohledu Freenetisu. Každý člen má právo vytvořit svůj projekt, který je v souladu se stanovami sdružení, může jít například o nějakou akci nebo školení. Cílem takovéhoto projektového podúčtu je, aby ostatní členové měli možnost zakladateli projektu přispět peníze ze svého kreditního účtu na realizaci projektu.',
'recalculate_account_balances' => 'Primárním zdrojem o stavu financí v systému jsou převody. Zůstatky na účtech byly dříve pokaždé počítány na požádání z převodů. Nyní si každý účet ulkádá svůj zůstatek kvůli vyšší rychlosti. Tuto funkci použijete v případě přechodu na verzi systému, která tuto optimalizaci obsahuje.',
'recount_fees' => 'Pro primární strhávání členských příspěvků používejte funkci pro globální strhávání členských příspěvků v Účetním deníku. Tuto funkci používejte opatrně a to jen v případě, že máte správně strženy všechny členské příspěvky pro všechny členy od založení sdružení až po současné datum. Pak můžete tomuto členovi přepočítat stržení členských příspěvků v případě, že u něj došlo k nutnosti je přepočítat, např. chybné datum vstupu, vznikla nutnost přidat přerušení členství apod.',
'recount_entrance_fees' => 'Pro primární strhávání vstupních příspěvků používejte funkci pro globální strhávání v účetním deníku. Tuto funkci používejte jen v případě, že došlo k nějakému omylu, například, že měl zaplatit vstupní a pak se ukázalo, že nemusel.',
'recalculate_account_balances' => 'Primárním zdrojem o stavu financí v systému jsou převody. Zůstatky na účtech byly dříve pokaždé počítány na požádání z převodů. Nyní si každý účet ukládá svůj zůstatek kvůli vyšší rychlosti. Tuto funkci použijete v případě přechodu na verzi systému, která tuto optimalizaci obsahuje.',
'recalculate_fees' => 'Pro primární strhávání členských příspěvků používejte funkci pro globální strhávání členských příspěvků v Účetním deníku. Tuto funkci používejte opatrně a to jen v případě, že máte správně strženy všechny členské příspěvky pro všechny členy od založení sdružení až po současné datum. Pak můžete tomuto členovi přepočítat stržení členských příspěvků v případě, že u něj došlo k nutnosti je přepočítat, např. chybné datum vstupu, vznikla nutnost přidat přerušení členství apod.',
'recalculate_entrance_fees' => 'Pro primární strhávání vstupních příspěvků používejte funkci pro globální strhávání v účetním deníku. Tuto funkci používejte jen v případě, že došlo k nějakému omylu, například, že měl zaplatit vstupní a pak se ukázalo, že nemusel.',
'unidentified_transfers' => 'Neidentifikované platby jsou všechny příchozí bankovní platby, které nebyl náš systém schopen z různých důvodů automaticky rozpoznat. Typicky se jedná o platby s chybným variabilním symbolem. Pokud zde svoji platbu najdete, pak kontaktujte hospodáře sdružení pro její správné přiřazení.',
'variable_symbol' => 'Variabilní symbol slouží k jednoznačnému určení příchozí platby člena.'
);
freenetis/branches/account_transactions/application/models/account.php
IF(mf.fee IS NOT NULL, 1, 0) fee_is_set,
mf.fee,
mf.readonly AS fee_readonly,
mf.name AS fee_name
mf.name AS fee_name,
IF(t.id IS NULL, 0, t.id) AS transfer_id
FROM accounts a
JOIN members m ON a.member_id = m.id
LEFT JOIN enum_types e ON e.id = m.type
......
ORDER BY member_id, priority) q
GROUP BY q.member_id
) mf ON m.id = mf.member_id
LEFT JOIN transfers t ON t.origin_id = a.id AND t.type = ".Transfer_Model::$deduct_member_fee." AND t.datetime = '$date'
WHERE m.id <> 1 AND m.entrance_date < '$date'
AND (m.leaving_date = '0000-00-00'
OR (m.leaving_date <> '0000-00-00' AND m.leaving_date > '$date'))
......
* @author Jiri Svitak
* @param unknown_type $account_id
*/
function get_account_to_recount_entrance_fees($account_id)
function get_account_to_recalculate_entrance_fees($account_id)
{
return $this->db->query("
SELECT a.id, m.entrance_fee, m.debt_payment_rate, m.entrance_date
......
*/
public function delete_deduct_transfers_of_account($account_id)
{
/*
$this->db->query("DELETE FROM transfers WHERE type = ".Transfer_Model::$deduct_member_fee."
AND origin_id = $account_id");
*/
$transfers = ORM::factory('transfer')->where(array('type' => Transfer_Model::$deduct_member_fee,
'origin_id' => $account_id))->find_all();
// array of accounts to recalculate
$accounts = array();
foreach ($transfers as $transfer)
{
$accounts[$transfer->origin_id] = 1;
$accounts[$transfer->destination_id] = 1;
if (!$transfer->delete())
throw ErrorException();
throw new ErrorException();
}
// recalculating account balance
foreach ($accounts as $unique_account_id => $nothing)
{
if (!self::recalculate_account_balance($unique_account_id))
throw ErrorException();
}
// recalculate balance of current credit account
if (!$this->recalculate_account_balance_of_account($account_id))
throw new ErrorException();
// recalculate balance of operating account
$operating = ORM::factory('account')->where(array('account_attribute_id' => Account_attribute_Model::$operating))->find();
if (!$this->recalculate_account_balance_of_account($operating->id))
throw new ErrorException();
}
/**
......
*/
public function delete_entrance_deduct_transfers_of_account($account_id)
{
/*
$this->db->query("DELETE FROM transfers WHERE type = ".Transfer_Model::$deduct_entrance_fee."
AND origin_id = $account_id");
*
*/
$transfers = ORM::factory('transfer')->where(array('type' => Transfer_Model::$deduct_entrance_fee,
'origin_id' => $account_id))->find_all();
foreach ($transfers as $transfer)
{
$accounts[$transfer->origin_id] = 1;
$accounts[$transfer->destination_id] = 1;
if (!$transfer->delete())
throw ErrorException();
throw new ErrorException();
}
// recalculating account balance
foreach ($accounts as $unique_account_id => $nothing)
{
echo $unique_account_id;
if (!self::recalculate_account_balance($unique_account_id))
throw ErrorException();
}
die();
// recalculate balance of current credit account
if (!$this->recalculate_account_balance_of_account($account_id))
throw new ErrorException();
// recalculate balance of operating account
$operating = ORM::factory('account')->where(array('account_attribute_id' => Account_attribute_Model::$infrastructure))->find();
if (!$this->recalculate_account_balance_of_account($operating->id))
throw new ErrorException();
}
......
/**
* Recalculates account balances in case of changing version of system, or when transfers
* are corrupted.
* @return <type>
* Recalculates all account balances.
* @author Jiri Svitak
* @return int count of accounts with corrected balances
*/
public static function recalculate_account_balances()
public function recalculate_account_balances()
{
/*
$db = new Database();
return $db->query("
UPDATE accounts a,
$accounts = $this->db->query("
SELECT q2.*, (inbound - outbound) AS calculated_balance
FROM
(
SELECT IFNULL(SUM(t.amount), 0) AS outbound, q2.inbound, q2.aid
SELECT q1.*, IFNULL(SUM(amount), 0) AS inbound
FROM
(
SELECT IFNULL(SUM(t.amount), 0) AS inbound, q1.aid
FROM
(
SELECT a.id AS aid
FROM accounts a
) q1
LEFT JOIN transfers t ON t.destination_id = q1.aid
GROUP BY q1.aid
) q2
LEFT JOIN transfers t ON t.origin_id = q2.aid
GROUP BY q2.aid
) q3
SET a.balance = (q3.inbound - q3.outbound)
SELECT a.*, IFNULL(SUM(amount), 0) AS outbound
FROM accounts a
LEFT JOIN members m ON m.id = a.member_id
LEFT JOIN transfers t1 ON a.id = t1.origin_id
GROUP BY a.id
) q1
LEFT JOIN transfers t2 ON q1.id = t2.destination_id
GROUP BY q1.id
) q2
");
*
*/
$accounts = ORM::factory('account')->find_all();
// create update sql query
$sql = "UPDATE accounts SET balance = CASE id ";
// incorrect balances
$incorrect_balances = 0;
// array of ids to change
$ids = array();
foreach ($accounts as $account)
{
self::recalculate_account_balance($account->id);
if ($account->balance != $account->calculated_balance)
{
$incorrect_balances++;
$sql .= "WHEN $account->id THEN $account->calculated_balance ";
$ids[] = $account->id;
}
}
// are there some accounts with incorrect balances? save correct balances
if ($incorrect_balances > 0)
{
$ids_with_commas = implode(',', $ids);
$sql .= "END WHERE id IN ($ids_with_commas)";
$db = new Database();
$db->query($sql);
}
return $incorrect_balances;
}
/**
* Recalculates balance of single account.
* Recalculates account balance of single account.
* @author Jiri Svitak
* @param <type> $account_id
* @return <type>
*/
public static function recalculate_account_balance($account_id)
public function recalculate_account_balance_of_account($account_id)
{
$db = new Database();
return $db->query("
UPDATE accounts a,
(
SELECT IFNULL(SUM(t.amount), 0) AS outbound, q2.inbound, q2.aid
FROM
(
SELECT IFNULL(SUM(t.amount), 0) AS inbound, q1.aid
FROM
(
SELECT a.id AS aid
FROM accounts a
WHERE a.id = $account_id
) q1
LEFT JOIN transfers t ON t.destination_id = q1.aid
GROUP BY q1.aid
) q2
LEFT JOIN transfers t ON t.origin_id = q2.aid
GROUP BY q2.aid
) q3
SET a.balance = (q3.inbound - q3.outbound)
WHERE a.id = $account_id
");
$account_model = new Account_Model();
$balance = $account_model->get_account_balance($account_id);
return $this->db->query("UPDATE accounts SET balance = '$balance' WHERE id = $account_id");
}
}
freenetis/branches/account_transactions/application/models/transfer.php
$transfer->text = $text;
$transfer->amount = $amount;
if (!$transfer->save())
throw ErrorException();
throw new ErrorException();
// update balance of origin account
$oa = new Account_Model($transfer->origin_id);
$oa->balance -= $amount;
freenetis/branches/account_transactions/application/controllers/transfers.php
if ($account->account_attribute_id == Account_attribute_Model::$credit)
{
if ($this->acl_check_edit('Accounts_Controller', 'transfers'))
$grid->add_new_button(url_lang::base().'transfers/recount_fees/'.$account->id, url_lang::lang('texts.Recount of member fees'), array('onclick' => 'return potvrd(\''.url_lang::lang('texts.Are you sure you want to recount fees of this member').'\')'), help::hint('recount_fees'));
$grid->add_new_button(url_lang::base().'transfers/recalculate_fees/'.$account->id, url_lang::lang('texts.Recount of member fees'), array('onclick' => 'return potvrd(\''.url_lang::lang('texts.Are you sure you want to recount fees of this member').'\')'), help::hint('recalculate_fees'));
if ($this->acl_check_edit('Accounts_Controller', 'transfers'))
$grid->add_new_button(url_lang::base().'transfers/recount_entrance_fees/'.$account->id, url_lang::lang('texts.Recount of entrance fees'), array('onclick' => 'return potvrd(\''.url_lang::lang('texts.Are you sure you want to recount entrance fees of this member').'\')'), help::hint('recount_entrance_fees'));
$grid->add_new_button(url_lang::base().'transfers/recalculate_entrance_fees/'.$account->id, url_lang::lang('texts.Recount of entrance fees'), array('onclick' => 'return potvrd(\''.url_lang::lang('texts.Are you sure you want to recount entrance fees of this member').'\')'), help::hint('recalculate_entrance_fees'));
}
$grid->order_field('id')->label('ID');
//$grid->order_field('trans_type')->label(url_lang::lang('texts.Type'))->bool(array(url_lang::lang('texts.Inbound'),url_lang::lang('texts.Outbound')));
......
/**
* Deducts fees of all members in one month. Instead of one transfer per year this function deducts
* one transfer per month. It is possible to recount member fees by deleting previous
* member fee transfers and creating new ones.
* Deducts fees of all members in one month. If deduct transfer for one month and
* account is found, then it is ignored and skipped.
* @author Jiri Svitak
* @return unknown_type
*/
......
$form_data = $form->as_array();
foreach($form_data as $key => $value)
$form_data[$key] = htmlspecialchars($value);
// preparation
$created_transfers_count = 0;
$date = date('Y-m-d', mktime(0, 0, 0, $form_data['month'], 15, $arr_years[$form_data['year']]));
$creation_datetime = date('Y-m-d H:i:s');
// finds default fee
......
$this->session->set_flash('message', url_lang::lang('texts.Fees have not been set!'));
url::redirect(url_lang::base().'transfers/show_all');
}
// test if there exist already deduct transfer for given month
$transfer = ORM::factory('transfer')->
like(array('type' => Transfer_Model::$deduct_member_fee, 'datetime' => $date))->find_all();
if (count($transfer) > 0)
{
$this->session->set_flash('message', url_lang::lang('texts.This month has been already deducted!'));
url::redirect(url_lang::base().'transfers/show_all');
}
$operating = ORM::factory('account')->
where('account_attribute_id', Account_attribute_Model::$operating)->find();
$account_model = new Account_Model();
......
$db->transaction_start();
foreach ($accounts as $account)
{
$text = url_lang::lang('texts.Deduction of member fee');
if ($account->fee_is_set)
// no deduct transfer for this date and account generated? then create one
if ($account->transfer_id == 0)
{
$amount = $account->fee;
$text = ($account->fee_readonly) ? $text.' - '.url_lang::lang('texts.'.$account->fee_name) : $text.' - '.$account->fee_name;
$text = url_lang::lang('texts.Deduction of member fee');
if ($account->fee_is_set)
{
$amount = $account->fee;
$text = ($account->fee_readonly) ? $text.' - '.url_lang::lang('texts.'.$account->fee_name) : $text.' - '.$account->fee_name;
}
else
{
$amount = $default_fee;
}
Transfer_Model::insert_transfer($account->id, $operating->id, null, null,
$this->session->get('user_id'), Transfer_Model::$deduct_member_fee, $date, $creation_datetime, $text, $amount);
$created_transfers_count++;
}
else
{
$amount = $default_fee;
}
Transfer_Model::insert_transfer($account->id, $operating->id, null, null,
$this->session->get('user_id'), Transfer_Model::$deduct_member_fee, $date, $creation_datetime, $text, $amount);
}
$db->transaction_commit();
$this->session->set_flash('message', url_lang::lang('texts.Fees have been successfully deducted.'));
$this->session->set_flash('message', url_lang::lang('texts.Fees have been successfully deducted, %d new transfers created.', $created_transfers_count));
}
catch(ErrorException $e)
{
......
}
/**
* Function recounts wrong deducted fees of given account of member.
* Function recalculates wrong deducted fees of given account of member.
* @author Jiri Svitak
* @return unknown_type
*/
function recount_fees($account_id = 0)
function recalculate_fees($account_id = 0)
{
// access control
if (!$this->acl_check_new('Accounts_Controller', 'transfers'))
......
if (!$this->acl_check_new('Accounts_Controller', 'transfers'))
Controller::error(ACCESS);
// preparation
$created_transfers_count = 0;
$creation_datetime = date('Y-m-d H:i:s');
//$current_date = date::get_middle_of_month(date('Y-m-d'));
$current_date = date('Y-m-d');
......
Transfer_Model::insert_transfer($ca->id, $infrastructure->id, null, null,
$this->session->get('user_id'), Transfer_Model::$deduct_entrance_fee,
$date, $creation_datetime, url_lang::lang('texts.Entrance fee'), $amount);
$created_transfers_count++;
}
// iterate to next month
$emonth++;
......
}
}
$db->transaction_commit();
$this->session->set_flash('message', url_lang::lang('texts.Entrance fees have been successfully deducted.'));
$this->session->set_flash('message', url_lang::lang('texts.Entrance fees have been successfully deducted, %d new transfers created.', $created_transfers_count));
}
catch(ErrorException $e)
{
......
}
/**
* Recounts transfer of one member credit account. Used only in special cases, like changing entrance date.
* Recounts transfer of one member credit account.
* Used only in special cases, like changing entrance date.
* @author Jiri Svitak
* @param $account_id
*/
function recount_entrance_fees($account_id)
function recalculate_entrance_fees($account_id)
{
// access rights
if (!$this->acl_check_new('Accounts_Controller', 'transfers'))
......
$infrastructure = ORM::factory('account')->where('account_attribute_id', Account_attribute_Model::$infrastructure)->find();
$account_model = new Account_Model();
// gets credit account including its transfers, tries to find also existing transfer
$credit_account = $account_model->get_account_to_recount_entrance_fees($account_id);
$credit_account = $account_model->get_account_to_recalculate_entrance_fees($account_id);
$ca = $credit_account->current();
// if member's entrance fee is 0, then no transfer is generated
if ($ca->entrance_fee == 0)
freenetis/branches/account_transactions/application/controllers/bank_transfers.php
if ($this->acl_check_new('Accounts_Controller', 'bank_transfers'))
{
// add new bank transfer
$grid->add_new_button(url_lang::base().'bank_transfers/add/'.$bank_account_id, url_lang::lang('texts.Add new bank transfer'));
$grid->add_new_button(url_lang::base().'bank_transfers/add/'.$bank_account_id, url_lang::lang('texts.Add new bank transfer'), array(), help::hint('add_new_bank_transfer'));
// add new bank fee
$grid->add_new_button(url_lang::base().'bank_transfers/add_fee/'.$bank_account_id, url_lang::lang('texts.Add new bank transfer without counteraccount'));
$grid->add_new_button(url_lang::base().'bank_transfers/add_fee/'.$bank_account_id, url_lang::lang('texts.Add new bank transfer without counteraccount'), array(), help::hint('add_new_bank_transfer_without_counteraccount'));
}
if ($this->acl_check_view('Accounts_Controller', 'bank_statements'))
{
freenetis/branches/account_transactions/application/controllers/import.php
<?php
class Duplicity_Exception extends Exception
{
public $duplicity;
public function __construct($duplicity=NULL) {$this->duplicity=$duplicity;}
}
class Statistics
{
......
$this->session->set_flash('message', url_lang::lang('texts.Import has failed.'));
url::redirect(url_lang::base().'bank_accounts/show_all');
}
catch (Duplicity_Exception $e)
{
$db->transaction_rollback();
$this->session->set_flash('message', url_lang::lang('texts.Import has failed.').' '.
url_lang::lang('texts.Bank statement contains items that were already imported.'));
url::redirect(url_lang::base().'bank_accounts/show_all');
}
}
else
{
......
private function create_transfer($src, $dst, $amount, $datetime, $text, $member_id=null,$prev_id=null)
{
// old version, with recalculating account balance and without exception handling
/*
static $transfer; // static variable saves a little bit of memory & time
if (!isset($transfer)) $transfer=new Transfer_Model();
$transfer->clear();
$transfer->amount = $amount;
$transfer->datetime = $datetime;
$transfer->creation_datetime=$this->time_now;
$transfer->origin_id = $src->id;
$transfer->destination_id = $dst->id;
$transfer->text= $text;
$transfer->previous_transfer_id = $prev_id;
$transfer->member_id = $member_id;
$transfer->user_id = $this->session->get('user_id');
$transfer->save();
return $transfer->id;
*
*/
// safe transfer saving
return Transfer_Model::insert_transfer($src->id, $dst->id, $prev_id, $member_id,
$this->session->get('user_id'), null, $datetime, $this->time_now, $text, $amount);
......
$src_bank_acc, $dst_bank_acc, $data,
$member_id=null, $prev_id=null)
{
// static variable saves a little bit of memory & time
/*
static $transfer;
static $bank_transfer;
if (!isset($transfer)) {
$transfer=new Transfer_Model();
$bank_transfer=new Bank_transfer_Model();
}
$dups = $bank_transfer->get_duplicities($data);
if ($dups->count() > 0)
throw new Duplicity_Exception($dups);
*
*/
// duplicity check - in case of duplicity all already imported items are storned
$bank_transfer=new Bank_transfer_Model();
$bank_transfer = new Bank_transfer_Model();
$dups = $bank_transfer->get_duplicities($data);
if ($dups->count() > 0)
throw new ErrorException();
// old version, with recalculating account balance and without exception handling
/*
$transfer->clear();
$transfer->amount = $amount;
$transfer->datetime = $data->date_time;
$transfer->creation_datetime=$this->time_now;
$transfer->origin_id = $src_acc->id;
$transfer->destination_id = $dst_acc->id;
$transfer->text= $data->comment;
$transfer->previous_transfer_id=$prev_id;
$transfer->member_id = $member_id;
$transfer->user_id = $this->session->get('user_id');
$transfer->save();
*/
throw new Duplicity_Exception();
// safe transfer saving
$transfer_id = Transfer_Model::insert_transfer($src_acc->id, $dst_acc->id, $prev_id, $member_id,
$this->session->get('user_id'), null, $data->date_time, $this->time_now, $data->comment, $amount);
......
if (isset($bank_account_id))
$this->parsed_bank_acc=new Bank_account_Model($bank_account_id);
// old version, does not support transactions,
// in case of duplicity part of listing is not imported, which is incorrect behaviour
/*
try
{
$duplicity_err='';
$parser->parse($url);
}
catch (Duplicity_Exception $ex)
{
// v případě duplicity commitujeme vše do výskytu duplicity a hned skončíme
$duplicity=new View('table_n_columns'); // tabulka se všemi nalezenými duplicitami
$duplicity->set('table_data', $ex->duplicity);
$duplicity_err = "Končíme, právě importovaný záznam má již v databázi duplicitní záznam(y):\n"
.$duplicity;
}
*/
// safe import is done by transaction processing started in previous method
// in case of exception, no item is imported due to rollback in level above
// safe import is done by transaction processing started in method which called this one
$parser->parse($url);
$stats=$this->stats;
freenetis/branches/account_transactions/application/controllers/accounts.php
} // end of edit function
/**
* Goes through all double-entry accounts and calculates their balance from their transfers.
* All transfers are primary information about cash flow. Calculating balance of account
......
{
if (!$this->acl_check_edit('Accounts_Controller', 'accounts'))
Controller::error(ACCESS);
Account_Model::recalculate_account_balances();
$this->session->set_flash('message', url_lang::lang('texts.All accounts now have correct balances.'));
// get all accounts with their own and calculated balances
$account_model = new Account_Model();
$incorrect_balances = $account_model->recalculate_account_balances();
$this->session->set_flash('message', url_lang::lang('texts.All accounts now have correct balances, %d accounts had incorrect balances.', $incorrect_balances));
url::redirect(url_lang::base().'accounts/show_all');
}
}
freenetis/branches/account_transactions/application/libraries/Duplicity_Exception.php
<?php
/**
* Duplicity exception is thrown during bank statement import when
* some transfers are already imported in database.
* @author Jiri Svitak
*/
class Duplicity_Exception extends Exception
{
}
?>

Také k dispozici: Unified diff