Revize 356
Přidáno uživatelem Tomáš Dulík před asi 15 roky(ů)
freenetis/trunk/kohana/application/models/bank_transfer.php | ||
---|---|---|
|
||
/**
|
||
* @author Jiri Svitak, Tomas Dulik
|
||
* It gets all unidentified bank transfers from db. Unidentified transfer is that with bank info only
|
||
* and no other transfer has set previous_transfer_id to this transfer.
|
||
* It gets unidentified member fees transfers from db.
|
||
* Unidentified transfer is that with member_id=0.
|
||
* We could also find unidentified transfer using previous_transfer_id by this condition:
|
||
WHERE srct.id NOT
|
||
IN (
|
||
SELECT previous_transfer_id
|
||
FROM transfers asst
|
||
JOIN accounts ac ON ac.id = asst.destination_id
|
||
AND ac.account_attribute_id =".Account_attribute_Model::$credit."
|
||
)
|
||
* @return unknown_type
|
||
* @todo this function is very slow and gets slower as the payments database grows.
|
||
* quick fix = make a new boolean column "unasigned" into transfers,
|
||
* this query would then serve only for database consistency check purposes
|
||
*/
|
||
public function get_unidentified_transfers($limit_from = 0, $limit_results = 500, $order_by = 'id', $order_by_direction = 'asc')
|
||
{
|
||
... | ... | |
// srct contains all source transactions, asst contains all transfers assigned to credit accounts
|
||
$q="SELECT srct.id, srct.datetime, srct.amount, srct.text, bt.variable_symbol, CONCAT( ba.account_nr, '/', ba.bank_nr ) AS account_number
|
||
FROM transfers srct
|
||
JOIN accounts na ON na.id = srct.origin_id
|
||
AND na.account_attribute_id =".Account_attribute_Model::$member_fees."
|
||
JOIN accounts a ON a.id = srct.origin_id
|
||
AND srct.member_id = 0
|
||
AND a.account_attribute_id =".Account_attribute_Model::$member_fees."
|
||
JOIN bank_transfers bt ON bt.transfer_id = srct.id
|
||
JOIN bank_accounts ba ON ba.id = bt.origin_id
|
||
WHERE srct.id NOT
|
||
IN (
|
||
|
||
SELECT previous_transfer_id
|
||
FROM transfers asst
|
||
JOIN accounts ac ON ac.id = asst.destination_id
|
||
AND ac.account_attribute_id =".Account_attribute_Model::$credit."
|
||
)
|
||
LEFT JOIN bank_accounts ba ON ba.id = bt.origin_id
|
||
ORDER BY ".$order_by." ".$order_by_direction."
|
||
LIMIT ".$limit_from." , ".$limit_results;
|
||
return self::$db->query($q);
|
||
|
||
}
|
||
/**
|
||
* Function gets count of unidentified transfers
|
||
... | ... | |
{
|
||
return self::$db->query("SELECT COUNT(*) AS total
|
||
FROM transfers t
|
||
JOIN bank_transfers bt ON bt.transfer_id = t.id
|
||
LEFT JOIN bank_accounts ba ON ba.id = bt.origin_id
|
||
LEFT JOIN accounts a ON a.id = t.origin_id
|
||
WHERE t.id NOT IN
|
||
(SELECT previous_transfer_id
|
||
FROM transfers t
|
||
WHERE t.previous_transfer_id IS NOT NULL)
|
||
JOIN accounts a ON a.id = t.origin_id AND t.member_id=0
|
||
AND a.account_attribute_id = ".Account_attribute_Model::$member_fees
|
||
)->current()->total;
|
||
}
|
||
... | ... | |
* @param $trans_id
|
||
* @return unknown_type
|
||
*/
|
||
public function get_unidentified_transfer($trans_id = null)
|
||
public function get_unidentified_transfer($trans_id)
|
||
{
|
||
return self::$db->query("SELECT
|
||
oba.name AS oba_name,
|
freenetis/trunk/kohana/application/controllers/bank_transfers.php | ||
---|---|---|
$view->render(TRUE);
|
||
} // end of unidentified_transfers function
|
||
|
||
/**
|
||
* @author Jiri Svitak, Tomas Dulik
|
||
* @param $trans_id - id of a transfer from table transfers
|
||
* @return unknown_type
|
||
*/
|
||
function assign_transfer($trans_id = NULL)
|
||
{
|
||
// to do - access rights
|
||
... | ... | |
}
|
||
asort($arr_accounts, SORT_LOCALE_STRING);
|
||
|
||
$mt_model = new Bank_transfer_Model();
|
||
$mt = $mt_model->get_unidentified_transfer($trans_id);
|
||
$bt_model = new Bank_transfer_Model();
|
||
$bt = $bt_model->get_unidentified_transfer($trans_id);
|
||
|
||
$form = new Forge(url_lang::base().'bank_transfers/assign_transfer/'.$trans_id, '', 'POST', array('id' => 'article_form'));
|
||
$form->set_attr('class', 'form_class')->set_attr('method', 'post');
|
||
... | ... | |
{
|
||
$form_data[$key] = htmlspecialchars($value);
|
||
}
|
||
$new_mt = new Transfer_Model();
|
||
$new_mt->origin_id = $mt->destination_id;
|
||
$new_mt->destination_id = $form_data['name'];
|
||
$new_mt->previous_transfer_id = $mt->id;
|
||
$new_mt->datetime = date("Y-m-d H:i:s", time());
|
||
$new_mt->text = $form_data['text'];
|
||
$new_mt->amount = $mt->amount;
|
||
$new_save = $new_mt->save();
|
||
$dst_acc = new Account_Model($form_data['name']);
|
||
$member_id = $dst_acc->member_id;
|
||
// first we assign the first transfer to the selected member
|
||
$t = new Transfer_Model($trans_id);
|
||
$t->member_id = $member_id;
|
||
$t->save();
|
||
|
||
// then we create a new transfer to the selected member's account:
|
||
$t->clear();
|
||
$time_now = date("Y-m-d H:i:s", time());
|
||
$t->member_id = $member_id;
|
||
$t->origin_id = $bt->destination_id;
|
||
$t->destination_id = $form_data['name'];
|
||
$t->previous_transfer_id = $bt->id;
|
||
$t->datetime = $time_now;
|
||
$t->creation_datetime = $time_now;
|
||
$t->text = $form_data['text'];
|
||
$t->amount = $bt->amount;
|
||
$new_save = $t->save();
|
||
|
||
// assign also all subsequent transfers to the selected member
|
||
$next_ts=ORM::factory('transfer')->find_all_by_previous_transfer_id($trans_id);
|
||
foreach ($next_ts as $transfer) {
|
||
$transfer->member_id=$member_id;
|
||
$transfer->save();
|
||
}
|
||
// also penalty should be generated
|
||
$pen_save = true;
|
||
if ($form_data['penalty'] > 0)
|
||
{
|
||
$pen = new Transfer_Model();
|
||
$pen->origin_id = $form_data['name'];
|
||
$pen->destination_id = $account_model->get_operating_account();
|
||
$pen->previous_transfer_id = $mt->id;
|
||
$pen->datetime = date("Y-m-d H:i:s", time());
|
||
$pen->destination_id = $account_model->get_operating_account()->id;
|
||
$pen->previous_transfer_id = $bt->id;
|
||
$pen->datetime = $time_now;
|
||
$pen->creation_datetime = $time_now;
|
||
$pen->text = $form_data['penalty_text'];
|
||
$pen->amount = $form_data['penalty'];
|
||
$pen_save = $pen->save();
|
||
}
|
||
if ($new_mt->save() && $pen_save)
|
||
if ($t->save() && $pen_save)
|
||
{
|
||
$this->session->set_flash('message', url_lang::lang('texts.Payment has been successfully assigned.'));
|
||
url::redirect(url_lang::base().'bank_transfers/unidentified_transfers');
|
||
... | ... | |
$view->header->menu = Controller::render_menu();
|
||
$view->header->title = url_lang::lang('texts.Assign transfer');
|
||
$view->content = new View('bank_transfers/assign_transfer');
|
||
$view->content->mt = $mt;
|
||
$view->content->mt = $bt;
|
||
$view->content->form = $form->html();
|
||
$view->footer = new View('base/footer');
|
||
$view->render(TRUE);
|
freenetis/trunk/kohana/application/controllers/accounts.php | ||
---|---|---|
$fee_model=new Fee_Model();
|
||
$ebank_nrs=array("2400", "5500");
|
||
if (!isset($this->parsed_bank_acc)) { // mame jiz parsovany ucet v DB? (tato promenna bude nastavena pouze pokud se parsuje ucet zvoleny v gridu uzivatelem)
|
||
// parsovany ucet dopredu nezname. Je v parsovanem vypisu? (je, pokud neni vypis transparentni)
|
||
// parsovany ucet dopredu nezname. Je v parsovanem vypisu? (je, pokud to neni transparentni vypis ebanky)
|
||
if (isset($data->parsed_acc_nr) && isset($data->parsed_acc_bank_nr)) {
|
||
if (in_array($data->parsed_acc_bank_nr, $ebank_nrs))
|
||
$bank_nr="5500 (2400)"; // u ebanky probehla zmena kodu banky...
|
||
... | ... | |
in_array($data->parsed_acc_bank_nr, $ebank_nrs) && // jsou obe 2400 nebo 5500
|
||
in_array($this->parsed_bank_acc->bank_nr, $ebank_nrs)
|
||
))) throw new Kohana_User_Exception('Chyba', 'Importovaný výpis není z vybraného účtu!');
|
||
|
||
// @todo tato chyba nema byt Exception, ale normalni hlášení
|
||
if (!isset($parsed_acc)) {
|
||
$parsed_acc = $this->parsed_bank_acc->get_related_account_by_attribute_id(
|
||
Account_attribute_Model::$bank);
|
||
... | ... | |
if (empty($data->amount)) {
|
||
// ****** Bankovní poplatky: ebanka má v řádku výpisu pouze poplatek, ale castka==0
|
||
// vytvoříme transakci "bankovní poplatek z 221000 (bank. účty) na 549001 (bank. poplatky)
|
||
//a bankovní transakci z parsovaného účtu na null
|
||
//a bankovní transakci z parsovaného účtu na null. Přiřadíme ji sdružení (member_id=1).
|
||
if (empty($data->comment)) $data->comment=$data->type;
|
||
$fee=abs($data->fee);
|
||
$this->create_transfers($parsed_acc, $bank_fees, $fee,
|
||
$this->parsed_bank_acc, null, $data);
|
||
$this->parsed_bank_acc, null, $data, 1);
|
||
$this->stats->bank_fees+=$fee;
|
||
$this->stats->bank_fees_nr++;
|
||
}
|
||
... | ... | |
if (!empty($data->amount) && empty($data->fee)) {
|
||
// ***** úroky u ebanky: částka!=0 a poplatek==0
|
||
// Vytvoříme transakci z 644000 (uroky) na 221000
|
||
// a bankovní transakci z null na parsovaný účet
|
||
// a bankovní transakci z null na parsovaný účet. Přiřadíme ji sdružení (member_id=1)
|
||
$this->create_transfers($bank_interests, $parsed_acc, $data->amount,
|
||
null, $this->parsed_bank_acc, $data);
|
||
null, $this->parsed_bank_acc, $data, 1);
|
||
$this->stats->interests += $data->amount;
|
||
$this->stats->interests_nr++;
|
||
} else {
|
||
... | ... | |
// úhrada faktury - z 221000 (bank. účet) na 321000 (dodavatelé)
|
||
$amount=abs($data->amount);
|
||
$id=$this->create_transfers($parsed_acc, $suppliers, $amount,
|
||
$this->parsed_bank_acc, $bank_acc, $data);
|
||
$this->parsed_bank_acc, $bank_acc, $data, $member->id);
|
||
// a ještě vytvoříme transakce (podvojné+bankovní) bank. poplatku
|
||
// vytvoříme transakci "bankovní poplatek z 221000 (bank. účty) na 549001 (bank. poplatky)
|
||
//a bankovní transakci z parsovaného účtu na null
|
||
$data->comment = "Bank. poplatek". (!empty($data->comment) ? " ($data->comment)":"");
|
||
$fee=abs($data->fee);
|
||
$this->create_transfers($parsed_acc, $bank_fees, $fee,
|
||
$this->parsed_bank_acc, null, $data, $id);
|
||
$this->parsed_bank_acc, null, $data, $member->id, $id);
|
||
$this->stats->invoices+=$amount;
|
||
$this->stats->invoices_nr++;
|
||
$this->stats->bank_fees+=$fee;
|
||
... | ... | |
// - podvojnou transakci z 684000 na 221000
|
||
// - bankovní transakci z bank. účtu člena na bank. účet sdružení
|
||
$id=$this->create_transfers($member_fees, $parsed_acc, $data->amount,
|
||
$bank_acc, $this->parsed_bank_acc, $data);
|
||
$bank_acc, $this->parsed_bank_acc, $data, $member->id);
|
||
// bankovní poplatek - vytvoříme:
|
||
// - podvojnou transakci z 221000 (bank. účty) na 549001 (bank. poplatky)
|
||
// - bankovní transakci z parsovaného účtu na null
|
||
... | ... | |
$this->stats->bank_fees+=$fee;
|
||
$this->stats->bank_fees_nr++;
|
||
$this->create_transfers($parsed_acc, $bank_fees, $fee,
|
||
$this->parsed_bank_acc, null, $data, $id);
|
||
$this->parsed_bank_acc, null, $data, $member->id, $id);
|
||
// naše správní rada si vymyslela, že poplatek budeme dotovat z operačního účtu
|
||
// (pokud máte ve správní radě rozumnější lidi, tak tento řádek zakomentujte :-)
|
||
$this->create_transfer($operating, $parsed_acc,
|
||
abs($data->fee), $data->date_time, "Bank. poplatek hrazený sdružením", $id);
|
||
abs($data->fee), $data->date_time, "Bank. poplatek hrazený sdružením",
|
||
$member->id, $id);
|
||
if ($member->id) { // našli jsme plátce?
|
||
// **** převedeme peníze členovi na jeho účet s kreditem
|
||
// ten účet ale musíme najít nebo vytvořit:
|
||
... | ... | |
$credit_acc->save();
|
||
}
|
||
$this->create_transfer($parsed_acc, $acc_model,
|
||
$data->amount, $data->date_time, "Přiřazení platby", $id);
|
||
$data->amount, $data->date_time, "Přiřazení platby",
|
||
$member->id, $id);
|
||
// **** teď se podíváme, jestli v té době sdružení účtovalo poplatek za zpracování platby:
|
||
$fee=$fee_model->get_by_date_type($data->date_time, 'transfer fee');
|
||
if (is_object($fee) && $fee->id) // ano? Pak poplatek strhneme z účtu
|
||
$this->create_transfer($credit_acc, $operating,
|
||
$fee->fee, $data->date_time, "Transakční poplatek", $id);
|
||
$fee->fee, $data->date_time, "Transakční poplatek",
|
||
$member->id, $id);
|
||
} // if (is_object($member) && $member->id)
|
||
$this->stats->member_fees_nr++;
|
||
$this->stats->member_fees+=$data->amount;
|
||
... | ... | |
}
|
||
|
||
|
||
private function create_transfer($src, $dst, $amount, $datetime, $text, $prev_id=null) {
|
||
private function create_transfer($src, $dst, $amount, $datetime, $text,
|
||
$member_id=null, $prev_id=null) {
|
||
static $transfer; // static variable saves a little bit of memory & time
|
||
if (!isset($transfer)) $transfer=new Transfer_Model();
|
||
$transfer->clear();
|
||
... | ... | |
$transfer->origin_id = $src->id;
|
||
$transfer->destination_id = $dst->id;
|
||
$transfer->text= $text;
|
||
$transfer->previous_transfer_id = $prev_id;
|
||
$transfer->previous_transfer_id = $prev_id;
|
||
$transfer->member_id = $member_id;
|
||
$transfer->save();
|
||
return $transfer->id;
|
||
}
|
||
|
||
private function create_transfers($src_acc, $dst_acc, $amount,
|
||
$src_bank_acc, $dst_bank_acc, $data, $prev_id=null) {
|
||
$src_bank_acc, $dst_bank_acc, $data,
|
||
$member_id=null, $prev_id=null) {
|
||
static $transfer; // static variable saves a little bit of memory & time
|
||
static $bank_transfer;
|
||
if (!isset($transfer)) {
|
||
... | ... | |
$transfer->destination_id = $dst_acc->id;
|
||
$transfer->text= $data->comment;
|
||
$transfer->previous_transfer_id=$prev_id;
|
||
$transfer->member_id = $member_id;
|
||
$transfer->save();
|
||
|
||
$bank_transfer->clear();
|
Také k dispozici: Unified diff
Opraveno prirazovani plateb - misto previous_transfer_id pouzivame novy atribut member_id v tabulce transfers