Updated the migration routine, started on data tables.

This commit is contained in:
James Cole
2014-09-21 08:25:30 +02:00
parent 6a26408552
commit ba4bddf756
36 changed files with 937 additions and 305 deletions

View File

@@ -11,23 +11,61 @@ use Illuminate\Support\MessageBag;
*/
class Transaction implements TransactionInterface
{
protected $_user = null;
/**
*
*/
public function __construct()
{
$this->_user = \Auth::user();
}
/**
* @param \User $user
*
* @return mixed|void
*/
public function overruleUser(\User $user)
{
$this->_user = $user;
return true;
}
/**
* Store a full transaction journal and associated stuff
*
* @param array $data
*
* @return MessageBag
* @return MessageBag|\TransactionJournal
*
* @SuppressWarnings(PHPMD.ShortVariable)
*/
public function store(array $data)
{
/*
* save journal using repository
* All the repositories we need:
*/
/** @var \Firefly\Storage\TransactionJournal\TransactionJournalRepositoryInterface $journals */
$journals = \App::make('Firefly\Storage\TransactionJournal\TransactionJournalRepositoryInterface');
$journals->overruleUser($this->_user);
/** @var \Firefly\Storage\Category\CategoryRepositoryInterface $categories */
$categories = \App::make('Firefly\Storage\Category\CategoryRepositoryInterface');
$categories->overruleUser($this->_user);
/** @var \Firefly\Storage\Budget\BudgetRepositoryInterface $budgets */
$budgets = \App::make('Firefly\Storage\Budget\BudgetRepositoryInterface');
$budgets->overruleUser($this->_user);
/** @var \Firefly\Storage\Piggybank\PiggybankRepositoryInterface $piggybanks */
$piggybanks = \App::make('Firefly\Storage\Piggybank\PiggybankRepositoryInterface');
$piggybanks->overruleUser($this->_user);
/*
* save journal using repository
*/
$journal = $journals->store($data);
/*
@@ -41,18 +79,22 @@ class Transaction implements TransactionInterface
* save budget using repository
*/
if (isset($data['budget_id'])) {
/** @var \Firefly\Storage\Budget\BudgetRepositoryInterface $budgets */
$budgets = \App::make('Firefly\Storage\Budget\BudgetRepositoryInterface');
$budget = $budgets->find($data['budget_id']);
}
/*
* save category using repository
*/
/** @var \Firefly\Storage\Category\CategoryRepositoryInterface $categories */
$categories = \App::make('Firefly\Storage\Category\CategoryRepositoryInterface');
$category = $categories->firstOrCreate($data['category']);
/*
* Find piggy bank using repository:
*/
$piggybank = null;
if(isset($data['piggybank_id'])) {
$piggybank = $piggybanks->find($data['piggybank_id']);
}
/*
* save accounts using repositories
* this depends on the kind of transaction and i've yet to fix this.
@@ -76,6 +118,8 @@ class Transaction implements TransactionInterface
if (isset($data['account_to_id'])) {
$to = $accounts->findAssetAccountById($data['account_to_id']);
}
/*
* Add a custom error when they are the same.
*/
@@ -86,10 +130,14 @@ class Transaction implements TransactionInterface
}
/*
* save transactions using repository.
* Save transactions using repository. We try to connect the (possibly existing)
* piggy bank to either transaction, knowing it will only work with one of them.
*/
/** @var \Transaction $one */
$one = $journals->saveTransaction($journal, $from, floatval($data['amount']) * -1);
$one->connectPiggybank($piggybank);
$two = $journals->saveTransaction($journal, $to, floatval($data['amount']));
$two->connectPiggybank($piggybank);
/*
* Count for $journal is zero? Then there were errors!
*/
@@ -103,7 +151,7 @@ class Transaction implements TransactionInterface
}
/*
* Connect budget and category:
* Connect budget, category and piggy bank:
*/
if (isset($budget) && !is_null($budget)) {
$journal->budgets()->save($budget);
@@ -111,8 +159,16 @@ class Transaction implements TransactionInterface
if (!is_null($category)) {
$journal->categories()->save($category);
}
if(isset($piggybank) && !is_null($piggybank)) {
// some trigger?
//$journal->piggybanks()->save($piggybank);
}
$journal->completed = true;
$journal->save();
if(isset($data['return_journal']) && $data['return_journal'] == true) {
return $journal;
}
return $journal->errors();
}

View File

@@ -19,4 +19,13 @@ interface TransactionInterface {
*/
public function store(array $data);
/**
* Overrule the user used when the class is created.
*
* @param \User $user
*
* @return mixed
*/
public function overruleUser(\User $user);
}

View File

@@ -336,7 +336,7 @@ class Import
$accountID = intval($payload['data']['value']);
/*
* Is account imported already.
* Is account imported already?
*/
$importEntry = $this->_repository->findImportEntry($importMap, 'Account', $accountID);
@@ -349,11 +349,13 @@ class Import
/*
* Update all piggy banks.
*/
\Log::debug('Updating all piggybanks, found the right setting.');
foreach ($all as $piggy) {
$piggy->account()->associate($account);
unset($piggy->leftInAccount);
$piggy->save();
if (!is_null($account)) {
\Log::debug('Updating all piggybanks, found the right setting.');
foreach ($all as $piggy) {
$piggy->account()->associate($account);
unset($piggy->leftInAccount);
$piggy->save();
}
}
} else {
\Log::notice('Account not yet imported, hold or 5 minutes.');
@@ -587,7 +589,7 @@ class Import
\Queue::push('Firefly\Queue\Import@cleanImportAccount', ['mapID' => $importMap->id]);
$job->delete(); // count fixed
\Log::debug('Done with job "start"');
}
}

View File

@@ -95,6 +95,17 @@ class EloquentAccountRepository implements AccountRepositoryInterface
$type = $this->findAccountType('Expense account');
$account = $this->_user->accounts()->where('name', $name)->where('account_type_id', $type->id)->first();
// create if not found:
if(strlen($name) > 0) {
$set = [
'name' => $name,
'user_id' => $this->_user->id,
'active' => 1,
'account_type_id' => $type->id
];
$account = $this->firstOrCreate($set);
}
// find cash account as fall back:
if (is_null($account)) {
$cashType = $this->findAccountType('Cash account');
@@ -156,7 +167,7 @@ class EloquentAccountRepository implements AccountRepositoryInterface
/**
* @param $type
*
* @return mixed
* @return \AccountType|null
*/
public function findAccountType($type)
{
@@ -498,10 +509,22 @@ class EloquentAccountRepository implements AccountRepositoryInterface
*/
protected function _createInitialBalance(\Account $account, $amount = 0, Carbon $date)
{
// get account type:
$initialBalanceAT = \AccountType::where('type', 'Initial balance account')->first();
/*
* The repositories we need:
*/
/** @var \Firefly\Helper\Controllers\TransactionInterface $transactions */
$transactions = \App::make('Firefly\Helper\Controllers\TransactionInterface');
$transactions->overruleUser($this->_user);
// create new account:
/*
* get account type:
*/
$initialBalanceAT = $this->findAccountType('Initial balance account');
/*
* create new account
*/
$initial = new \Account;
$initial->accountType()->associate($initialBalanceAT);
$initial->user()->associate($this->_user);
@@ -509,16 +532,20 @@ class EloquentAccountRepository implements AccountRepositoryInterface
$initial->active = 0;
if ($initial->validate()) {
$initial->save();
// create new transaction journal (and transactions):
/** @var \Firefly\Storage\TransactionJournal\TransactionJournalRepositoryInterface $transactionJournal */
$transactionJournal = \App::make(
'Firefly\Storage\TransactionJournal\TransactionJournalRepositoryInterface'
);
$transactionJournal->overruleUser($this->_user);
/*
* create new transaction journal (and transactions):
*/
$transactionJournal->createSimpleJournal(
$initial, $account, 'Initial Balance for ' . $account->name, $amount, $date
);
$set =[
'account_from_id' => $initial->id,
'account_to_id' => $account->id,
'description' => 'Initial Balance for ' . $account->name,
'what' => 'Opening balance',
'amount' => $amount,
'category' => '',
'date' => $date->format('Y-m-d')
];
$transactions->store($set);
return true;
}

View File

@@ -128,7 +128,7 @@ class EloquentPiggybankRepository implements PiggybankRepositoryInterface
/*
* Already have a piggy bank with this name, we skip it.
*/
$this->_repository->store($importMap, 'Piggybank', $payload['data']['id'], $piggyBank->id);
$repository->store($importMap, 'Piggybank', $payload['data']['id'], $piggyBank->id);
\Log::debug('Already imported piggy "' . $payload['data']['name'] . '".');
}
// update map:

View File

@@ -56,6 +56,10 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito
$accounts = \App::make('Firefly\Storage\Account\AccountRepositoryInterface');
$accounts->overruleUser($user);
/** @var \Firefly\Helper\Controllers\TransactionInterface $transactions */
$transactions = \App::make('Firefly\Helper\Controllers\TransactionInterface');
$transactions->overruleUser($this->_user);
/*
* Prep some variables from the payload:
*/
@@ -114,9 +118,18 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito
/*
* Import transfer:
*/
$set = [
'account_from_id' => $accountFrom->id,
'account_to_id' => $accountTo->id,
'amount' => $amount,
'description' => $description,
'date' => $date->format('Y-m-d'),
'category' => '',
'what' => 'transfer',
'return_journal' => true
];
$journal = $transactions->store($set);
$journal = $this->createSimpleJournal($accountFrom, $accountTo, $description, $amount, $date);
$repository->store($importMap, 'Transfer', $transferId, $journal->id);
\Log::debug('Imported transfer "' . $description . '" (' . $amount . ') (' . $date->format('Y-m-d') . ')');
@@ -175,7 +188,7 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito
* @param \Account $account
* @param $amount
*
* @return mixed
* @return \Transaction|null
*/
public function saveTransaction(\TransactionJournal $journal, \Account $account, $amount)
{
@@ -217,11 +230,15 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito
return;
}
/** @var \Firefly\Storage\Account\AccountRepositoryInterface $accounts */
$accounts = \App::make('Firefly\Storage\Account\AccountRepositoryInterface');
$accounts->overruleUser($user);
/** @var \Firefly\Helper\Controllers\TransactionInterface $transactions */
$transactions = \App::make('Firefly\Helper\Controllers\TransactionInterface');
$transactions->overruleUser($this->_user);
/*
* Prep some vars coming out of the pay load:
*/
@@ -249,7 +266,6 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito
return;
}
/*
* Find or create the "import account" which is used because at this point, Firefly
* doesn't know which beneficiary (expense account) should be connected to this transaction.
@@ -286,6 +302,16 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito
}
return;
}
/*
* Prep some data for the import routine:
*/
$set = [
'category' => '',
'description' => $description,
'date' => $date->format('Y-m-d'),
'return_journal' => true
];
/*
* If the amount is less than zero, we move money to the $importAccount. Otherwise,
@@ -293,22 +319,27 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito
*/
if ($amount < 0) {
// if amount is less than zero, move to $importAccount
$accountFrom = $assetAccount;
$accountTo = $importAccount;
$accountFrom = $assetAccount;
$accountTo = $importAccount;
$set['what'] = 'withdrawal';
$set['account_id'] = $accountFrom->id;
$set['expense_account'] = $importAccount->name;
} else {
$accountFrom = $importAccount;
$accountTo = $assetAccount;
$accountFrom = $importAccount;
$accountTo = $assetAccount;
$set['what'] = 'deposit';
$set['account_id'] = $accountTo->id;
$set['revenue_account'] = $accountFrom->name;
}
/*
* Modify the amount so it will work with or new transaction journal structure.
*/
$amount = $amount < 0 ? $amount * -1 : $amount;
$set['amount'] = $amount < 0 ? $amount * -1 : $amount;
/*
* Import it:
*/
$journal = $this->createSimpleJournal($accountFrom, $accountTo, $description, $amount, $date);
$journal = $transactions->store($set);
$repository->store($importMap, 'Transaction', $transactionId, $journal->id);
\Log::debug('Imported transaction "' . $description . '" (' . $amount . ') (' . $date->format('Y-m-d') . ')');
@@ -337,14 +368,6 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito
->where('id', $journalId)->first();
}
// /**
// *
// */
// public function get()
// {
//
// }
/**
* @param $type
*

View File

@@ -74,7 +74,7 @@ interface TransactionJournalRepositoryInterface
* @param \TransactionJournal $journal
* @param $data
*
* @return mixed
* @return \Transaction|null
*/
public function update(\TransactionJournal $journal, $data);