Projekt

Obecné

Profil

<?php
/**
*
* Saves Fio bank listing items into Freenetis database structure.
*
* @author Jiri Svitak
*
*/
class FioSaver
{
public static function save($data, $bank_account_id, $bank_statement_id, $user_id)
{
// preparation of system double-entry accounts
$suppliers = ORM::factory('account')
->where('account_attribute_id', Account_attribute_Model::$suppliers)
->find();
$member_fees = ORM::factory('account')
->where('account_attribute_id', Account_attribute_Model::$member_fees)
->find();
$operating = ORM::factory('account')
->where('account_attribute_id', Account_attribute_Model::$operating)
->find();
$cash = ORM::factory('account')
->where('account_attribute_id', Account_attribute_Model::$cash)
->find();
$ba = new Bank_account_Model($bank_account_id);
$account = $ba->get_related_account_by_attribute_id(Account_attribute_Model::$bank);

// model preparation
$transfer = new Transfer_Model();
$bt = new Bank_transfer_Model();
$member_model = new Member_Model();
$fee_model = new Fee_Model();

// statistics preparation
$stats["unidentified_nr"] = 0;
$stats["invoices"] = 0;
$stats["invoices_nr"] = 0;
$stats["member_fees"] = 0;
$stats["member_fees_nr"] = 0;

// miscellaneous preparation
$now = date("Y-m-d H:i:s");
$number = 0;

// saving each bank listing item
foreach ($data as $item)
{
// convert date of transfer to international format
$date_arr = explode(".", $item["datum"]);
$timestamp = mktime(0, 0, 0, $date_arr[1], $date_arr[0], $date_arr[2]);
$datetime = date("Y-m-d", $timestamp);

// try to find counter bank account in database
$counter_ba = ORM::factory('bank_account')
->where(array
(
'account_nr' => $item["protiucet"],
'bank_nr' => $item["kod_banky"]
))
->find();

// counter bank account does not exist? let's create new one
if (!$counter_ba->id)
{
$counter_ba->clear();
$counter_ba->set_logger(FALSE);
$counter_ba->name = $item["nazev_protiuctu"];
$counter_ba->account_nr = $item["protiucet"];
$counter_ba->bank_nr = $item["kod_banky"];
$counter_ba->member_id = 0;
$counter_ba->save_throwable();
}

// determining in/out type of transfer
if ($item['castka'] < 0)
{
// outbound transfer
// -----------------

// by default we assume, it is "invoice" (this includes all expenses)

// double-entry transfer
$transfer_id = Transfer_Model::insert_transfer(
$account->id,
$suppliers->id,
null,
$counter_ba->member_id,
$user_id,
null,
$datetime,
$now,
$item["zprava"],
abs($item["castka"])
);
// bank transfer
$bt->clear();
$bt->set_logger(false);
$bt->origin_id = $ba->id;
$bt->destination_id = $counter_ba->id;
$bt->transfer_id = $transfer_id;
$bt->bank_statement_id = $bank_statement_id;
$bt->number = $number;
$bt->constant_symbol = $item["ks"];
$bt->variable_symbol = $item["vs"];
$bt->specific_symbol = $item["ss"];
$bt->save();

// stats
$stats["invoices"] += abs($item["castka"]);
$stats["invoices_nr"]++;
}

else

{
// inbound transfer
// ----------------

// by default we assume that it is member fee

// let's identify member
$member = $member_model->where('variable_symbol', $item["vs"])->find();
if (!$member->id)
{
$member_id = null;
$stats["unidentified_nr"]++;
}
else
{
$member_id = $member->id;
}


// double-entry incoming transfer
$transfer_id = Transfer_Model::insert_transfer(
$member_fees->id,
$account->id,
null,
$member_id,
$user_id,
null,
$datetime,
$now,
$item["zprava"],
abs($item["castka"])
);

// incoming bank transfer
$bt->clear();
$bt->set_logger(false);
$bt->origin_id = $counter_ba->id;
$bt->destination_id = $ba->id;
$bt->transfer_id = $transfer_id;
$bt->bank_statement_id = $bank_statement_id;
$bt->number = $number;
$bt->constant_symbol = $item["ks"];
$bt->variable_symbol = $item["vs"];
$bt->specific_symbol = $item["ss"];
$bt->save();

// assign transfer? (0 - invalid id, 1 - assoc id, other are ordinary members)
if ($member_id > 1)
{
$ca = ORM::factory("account")
->where('member_id', $member_id)
->find();

// assigning transfer
$a_transfer_id = Transfer_Model::insert_transfer(
$account->id,
$ca->id,
$transfer_id,
$member_id,
$user_id,
null,
$datetime,
$now,
__("Assigning of transfer"),
abs($item["castka"])
);

// transaction fee
$fee = $fee_model->get_by_date_type(
$datetime, 'transfer fee'
);
if ($fee->fee > 0)
{
$tf_transfer_id = Transfer_Model::insert_transfer(
$ca->id,
$operating->id,
$transfer_id,
$member_id,
$user_id,
null,
$datetime,
$now,
__("Transfer fee"),
abs($item["castka"])
);
}

}

// member fee stats
$stats["member_fees"] += abs($item["castka"]);
$stats["member_fees_nr"]++;
}
// line number increase
$number++;
}

return $stats;
}
}
?>
(5-5/5)