Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 356

Přidáno uživatelem Tomáš Dulík před asi 15 roky(ů)

Opraveno prirazovani plateb - misto previous_transfer_id pouzivame novy atribut member_id v tabulce transfers

Zobrazit rozdíly:

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