Revize 848
Přidáno uživatelem Jiří Sviták před více než 13 roky(ů)
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
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.