Merge branch 'release/3.3.4'
1
.gitignore
vendored
@ -3,6 +3,7 @@
|
||||
composer.phar
|
||||
Thumbs.db
|
||||
.idea/
|
||||
.DS_Store
|
||||
tests/_output/*
|
||||
_ide_helper.php
|
||||
/build/logs/clover.xml
|
||||
|
13
README.md
@ -1,4 +1,4 @@
|
||||
Firefly III (v3.3.3)
|
||||
Firefly III (v3.3.4)
|
||||
===========
|
||||
|
||||
[![Build Status](https://travis-ci.org/JC5/firefly-iii.svg?branch=develop)](https://travis-ci.org/JC5/firefly-iii)
|
||||
@ -18,6 +18,11 @@ Firefly Mark III is a new version of Firefly built upon best practices and lesso
|
||||
from building [Firefly](https://github.com/JC5/Firefly). It's Mark III since the original Firefly never made it outside of my
|
||||
laptop and [Firefly II](https://github.com/JC5/Firefly) is live.
|
||||
|
||||
If you're not sure if this tool is for you, please read the [full description](https://github.com/JC5/firefly-iii/wiki/full-description).
|
||||
|
||||
To install and use Firefly III, please read [the installation guide](https://github.com/JC5/firefly-iii/wiki/Installation),
|
||||
[the upgrade guide](https://github.com/JC5/firefly-iii/wiki/Upgrade-instructions) (if applicable) and the **[first use guide](https://github.com/JC5/firefly-iii/wiki/First-use)**
|
||||
|
||||
## Current features
|
||||
|
||||
- [A double-entry bookkeeping system](http://en.wikipedia.org/wiki/Double-entry_bookkeeping_system);
|
||||
@ -25,9 +30,8 @@ laptop and [Firefly II](https://github.com/JC5/Firefly) is live.
|
||||
- It's possible to create, change and manage money using _budgets_;
|
||||
- Organize transactions using categories;
|
||||
- Save towards a goal using piggy banks;
|
||||
- Predict and anticipate large expenses using "repeated expenses" (ie. yearly taxes);
|
||||
- Predict and anticipate bills using "recurring transactions" (rent for example);
|
||||
- View basic income / expense reports.
|
||||
- Predict and anticipate bills;
|
||||
- View income / expense reports;
|
||||
- Lots of help text in case you don't get it;
|
||||
|
||||
Everything is organised:
|
||||
@ -55,7 +59,6 @@ Firefly III will feature, but does not feature yet:
|
||||
Some stuff has been removed:
|
||||
|
||||
- The nesting of budgets, categories and beneficiaries is removed because it was pretty pointless.
|
||||
- Firefly will not encrypt the content of the (MySQL) tables. Old versions of Firefly had this capability but it sucks when searching, sorting and organizing entries.
|
||||
|
||||
## Screenshots
|
||||
|
||||
|
@ -51,12 +51,12 @@ class ReportHelper implements ReportHelperInterface
|
||||
$end->endOfMonth();
|
||||
// all budgets
|
||||
$set = Auth::user()->budgets()
|
||||
->leftJoin(
|
||||
'budget_limits', function (JoinClause $join) use ($date) {
|
||||
$join->on('budget_limits.budget_id', '=', 'budgets.id')->where('budget_limits.startdate', '=', $date->format('Y-m-d'));
|
||||
}
|
||||
)
|
||||
->get(['budgets.*', 'budget_limits.amount as amount']);
|
||||
->leftJoin(
|
||||
'budget_limits', function (JoinClause $join) use ($date) {
|
||||
$join->on('budget_limits.budget_id', '=', 'budgets.id')->where('budget_limits.startdate', '=', $date->format('Y-m-d'));
|
||||
}
|
||||
)
|
||||
->get(['budgets.*', 'budget_limits.amount as amount']);
|
||||
|
||||
|
||||
$budgets = $this->_helper->makeArray($set);
|
||||
@ -141,23 +141,26 @@ class ReportHelper implements ReportHelperInterface
|
||||
}
|
||||
|
||||
$accounts = Auth::user()->accounts()->accountTypeIn(['Default account', 'Asset account'])->orderBy('accounts.name', 'ASC')->get(['accounts.*'])
|
||||
->filter(
|
||||
function (Account $account) use ($sharedAccounts) {
|
||||
if (!in_array($account->id, $sharedAccounts)) {
|
||||
return $account;
|
||||
}
|
||||
->filter(
|
||||
function (Account $account) use ($sharedAccounts) {
|
||||
if (!in_array($account->id, $sharedAccounts)) {
|
||||
return $account;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
);
|
||||
return null;
|
||||
}
|
||||
);
|
||||
$report = [];
|
||||
$start->startOfYear()->subDay();
|
||||
$end->endOfYear();
|
||||
|
||||
foreach ($accounts as $account) {
|
||||
$report[] = [
|
||||
'start' => Steam::balance($account, $start),
|
||||
'end' => Steam::balance($account, $end),
|
||||
$startBalance = Steam::balance($account, $start);
|
||||
$endBalance = Steam::balance($account, $end);
|
||||
$report[] = [
|
||||
'start' => $startBalance,
|
||||
'end' => $endBalance,
|
||||
'hide' => ($startBalance == 0 && $endBalance == 0),
|
||||
'account' => $account,
|
||||
'shared' => $account->accountRole == 'sharedAsset'
|
||||
];
|
||||
|
@ -37,7 +37,7 @@ class AccountController extends Controller
|
||||
*/
|
||||
public function create($what = 'asset')
|
||||
{
|
||||
$subTitleIcon = Config::get('firefly.subTitlesByIdentifier.' . $what);
|
||||
$subTitleIcon = Config::get('firefly.subIconsByIdentifier.' . $what);
|
||||
$subTitle = 'Create a new ' . e($what) . ' account';
|
||||
|
||||
return view('accounts.create', compact('subTitleIcon', 'what', 'subTitle'));
|
||||
@ -144,7 +144,7 @@ class AccountController extends Controller
|
||||
$account->lastActivityDate = null;
|
||||
}
|
||||
$account->startBalance = Steam::balance($account, $start);
|
||||
$account->endBalance = Steam::balance($account, Session::get('end'));
|
||||
$account->endBalance = Steam::balance($account, clone Session::get('end'));
|
||||
}
|
||||
);
|
||||
|
||||
|
@ -52,9 +52,11 @@ class GoogleChartController extends Controller
|
||||
$start = Session::get('start', Carbon::now()->startOfMonth());
|
||||
$end = Session::get('end', Carbon::now()->endOfMonth());
|
||||
$current = clone $start;
|
||||
$today = new Carbon;
|
||||
|
||||
while ($end >= $current) {
|
||||
$chart->addRow(clone $current, Steam::balance($account, $current), false);
|
||||
$certain = $current < $today;
|
||||
$chart->addRow(clone $current, Steam::balance($account, $current), $certain);
|
||||
$current->addDay();
|
||||
}
|
||||
|
||||
|
@ -1,11 +1,9 @@
|
||||
<?php namespace FireflyIII\Http\Controllers;
|
||||
|
||||
use Cache;
|
||||
use Carbon\Carbon;
|
||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
|
||||
use Input;
|
||||
use Preferences;
|
||||
use Redirect;
|
||||
use Session;
|
||||
|
||||
/**
|
||||
@ -16,13 +14,6 @@ use Session;
|
||||
class HomeController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
public function dateRange()
|
||||
{
|
||||
$start = new Carbon(Input::get('start'));
|
||||
@ -38,16 +29,6 @@ class HomeController extends Controller
|
||||
Session::put('end', $end);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
public function flush()
|
||||
{
|
||||
Cache::flush();
|
||||
|
||||
return Redirect::route('index');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
@ -72,9 +53,7 @@ class HomeController extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
// var_dump($transactions);
|
||||
|
||||
return view('index', compact('count', 'title','savings', 'subTitle', 'mainTitleIcon', 'transactions'));
|
||||
return view('index', compact('count', 'title', 'savings', 'subTitle', 'mainTitleIcon', 'transactions'));
|
||||
}
|
||||
|
||||
|
||||
|
@ -10,7 +10,8 @@ use Input;
|
||||
use Preferences;
|
||||
use Response;
|
||||
use Session;
|
||||
|
||||
use Config;
|
||||
use FireflyIII\Models\TransactionType;
|
||||
/**
|
||||
* Class JsonController
|
||||
*
|
||||
@ -19,7 +20,6 @@ use Session;
|
||||
class JsonController extends Controller
|
||||
{
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@ -156,16 +156,6 @@ class JsonController extends Controller
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Symfony\Component\HttpFoundation\Response
|
||||
*/
|
||||
public function showSharedReports()
|
||||
{
|
||||
$pref = Preferences::get('showSharedReports', false);
|
||||
|
||||
return Response::json(['value' => $pref->data]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Symfony\Component\HttpFoundation\Response
|
||||
*/
|
||||
@ -179,4 +169,32 @@ class JsonController extends Controller
|
||||
return Response::json(['value' => $new]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Symfony\Component\HttpFoundation\Response
|
||||
*/
|
||||
public function showSharedReports()
|
||||
{
|
||||
$pref = Preferences::get('showSharedReports', false);
|
||||
|
||||
return Response::json(['value' => $pref->data]);
|
||||
}
|
||||
|
||||
public function transactionJournals($what)
|
||||
{
|
||||
$descriptions = [];
|
||||
$dbType = TransactionType::whereType($what)->first();
|
||||
$journals = Auth::user()->transactionjournals()->where('transaction_type_id', $dbType->id)
|
||||
->orderBy('id','DESC')->take(50)
|
||||
->get();
|
||||
foreach($journals as $j) {
|
||||
$descriptions[] = $j->description;
|
||||
}
|
||||
|
||||
$descriptions = array_unique($descriptions);
|
||||
sort($descriptions);
|
||||
return Response::json($descriptions);
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,217 +0,0 @@
|
||||
<?php namespace FireflyIII\Http\Controllers;
|
||||
|
||||
use Auth;
|
||||
use Carbon\Carbon;
|
||||
use Config;
|
||||
use ExpandedForm;
|
||||
use FireflyIII\Http\Requests;
|
||||
use FireflyIII\Http\Requests\PiggyBankFormRequest;
|
||||
use FireflyIII\Models\PiggyBank;
|
||||
use FireflyIII\Models\PiggyBankRepetition;
|
||||
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
|
||||
use Redirect;
|
||||
use Session;
|
||||
use View;
|
||||
use Input;
|
||||
|
||||
/**
|
||||
* Class RepeatedExpenseController
|
||||
*
|
||||
* @package FireflyIII\Http\Controllers
|
||||
*/
|
||||
class RepeatedExpenseController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
View::share('title', 'Repeated expenses');
|
||||
View::share('mainTitleIcon', 'fa-rotate-left');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
$periods = Config::get('firefly.piggy_bank_periods');
|
||||
$accounts = ExpandedForm::makeSelectList(
|
||||
Auth::user()->accounts()->orderBy('accounts.name', 'ASC')->accountTypeIn(['Default account', 'Asset account'])->get(['accounts.*'])
|
||||
);
|
||||
|
||||
return view('repeatedExpense.create', compact('accounts', 'periods'))->with('subTitle', 'Create new repeated expense')->with(
|
||||
'subTitleIcon', 'fa-plus'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param PiggyBank $repeatedExpense
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function delete(PiggyBank $repeatedExpense)
|
||||
{
|
||||
$subTitle = 'Delete "' . e($repeatedExpense->name) . '"';
|
||||
|
||||
return view('repeatedExpense.delete', compact('repeatedExpense', 'subTitle'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param PiggyBank $repeatedExpense
|
||||
*
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
public function destroy(PiggyBank $repeatedExpense)
|
||||
{
|
||||
|
||||
Session::flash('success', 'Repeated expense "' . e($repeatedExpense->name) . '" deleted.');
|
||||
|
||||
$repeatedExpense->delete();
|
||||
|
||||
return Redirect::route('repeated.index');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param PiggyBank $repeatedExpense
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function edit(PiggyBank $repeatedExpense)
|
||||
{
|
||||
|
||||
$periods = Config::get('firefly.piggy_bank_periods');
|
||||
$accounts = ExpandedForm::makeSelectList(
|
||||
Auth::user()->accounts()->orderBy('accounts.name', 'ASC')->accountTypeIn(['Default account', 'Asset account'])->get(['accounts.*'])
|
||||
);
|
||||
$subTitle = 'Edit repeated expense "' . e($repeatedExpense->name) . '"';
|
||||
$subTitleIcon = 'fa-pencil';
|
||||
|
||||
/*
|
||||
* Flash some data to fill the form.
|
||||
*/
|
||||
$preFilled = ['name' => $repeatedExpense->name,
|
||||
'account_id' => $repeatedExpense->account_id,
|
||||
'targetamount' => $repeatedExpense->targetamount,
|
||||
'reminder_skip' => $repeatedExpense->reminder_skip,
|
||||
'rep_every' => $repeatedExpense->rep_every,
|
||||
'rep_times' => $repeatedExpense->rep_times,
|
||||
'targetdate' => $repeatedExpense->targetdate->format('Y-m-d'),
|
||||
'reminder' => $repeatedExpense->reminder,
|
||||
'remind_me' => intval($repeatedExpense->remind_me) == 1 || !is_null($repeatedExpense->reminder) ? true : false
|
||||
];
|
||||
Session::flash('preFilled', $preFilled);
|
||||
|
||||
return view('repeatedExpense.edit', compact('subTitle', 'subTitleIcon', 'repeatedExpense', 'accounts', 'periods', 'preFilled'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
|
||||
$subTitle = 'Overview';
|
||||
|
||||
$expenses = Auth::user()->piggyBanks()->where('repeats', 1)->get();
|
||||
$expenses->each(
|
||||
function (PiggyBank $piggyBank) {
|
||||
$piggyBank->currentRelevantRep();
|
||||
}
|
||||
);
|
||||
|
||||
return view('repeatedExpense.index', compact('expenses', 'subTitle'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param PiggyBank $repeatedExpense
|
||||
*
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function show(PiggyBank $repeatedExpense, PiggyBankRepositoryInterface $repository)
|
||||
{
|
||||
$subTitle = $repeatedExpense->name;
|
||||
$today = Carbon::now();
|
||||
$repetitions = $repeatedExpense->piggyBankRepetitions()->get();
|
||||
|
||||
$repetitions->each(
|
||||
function (PiggyBankRepetition $repetition) use ($repository) {
|
||||
$repetition->bars = $repository->calculateParts($repetition);
|
||||
}
|
||||
);
|
||||
|
||||
return view('repeatedExpense.show', compact('repetitions', 'repeatedExpense', 'today', 'subTitle'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param PiggyBankFormRequest $request
|
||||
* @param PiggyBankRepositoryInterface $repository
|
||||
*
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
public function store(PiggyBankFormRequest $request, PiggyBankRepositoryInterface $repository)
|
||||
{
|
||||
|
||||
$piggyBankData = [
|
||||
'repeats' => true,
|
||||
'name' => $request->get('name'),
|
||||
'startdate' => new Carbon,
|
||||
'account_id' => intval($request->get('account_id')),
|
||||
'targetamount' => floatval($request->get('targetamount')),
|
||||
'targetdate' => new Carbon($request->get('targetdate')),
|
||||
'reminder' => $request->get('reminder'),
|
||||
'skip' => intval($request->get('skip')),
|
||||
'rep_every' => intval($request->get('rep_every')),
|
||||
'rep_length' => $request->get('rep_length'),
|
||||
'rep_times' => intval($request->get('rep_times')),
|
||||
];
|
||||
|
||||
$piggyBank = $repository->store($piggyBankData);
|
||||
|
||||
Session::flash('success', 'Stored repeated expense "' . e($piggyBank->name) . '".');
|
||||
|
||||
if (intval(Input::get('create_another')) === 1) {
|
||||
return Redirect::route('repeated.create', $request->input('what'))->withInput();
|
||||
}
|
||||
|
||||
|
||||
return Redirect::route('repeated.index');
|
||||
}
|
||||
|
||||
/**
|
||||
* @SuppressWarnings("CyclomaticComplexity") // It's exactly 5. So I don't mind.
|
||||
*
|
||||
* @param PiggyBank $repeatedExpense
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function update(PiggyBank $repeatedExpense, PiggyBankFormRequest $request, PiggyBankRepositoryInterface $repository)
|
||||
{
|
||||
$piggyBankData = [
|
||||
'repeats' => false,
|
||||
'name' => $request->get('name'),
|
||||
'account_id' => intval($request->get('account_id')),
|
||||
'targetamount' => floatval($request->get('targetamount')),
|
||||
'targetdate' => strlen($request->get('targetdate')) > 0 ? new Carbon($request->get('targetdate')) : null,
|
||||
'rep_length' => $request->get('rep_length'),
|
||||
'rep_every' => intval($request->get('rep_every')),
|
||||
'rep_times' => intval($request->get('rep_times')),
|
||||
'remind_me' => intval($request->get('remind_me')) == 1 ? true : false,
|
||||
'reminder' => $request->get('reminder'),
|
||||
];
|
||||
|
||||
|
||||
$piggyBank = $repository->update($repeatedExpense, $piggyBankData);
|
||||
|
||||
if (intval(Input::get('return_to_edit')) === 1) {
|
||||
return Redirect::route('repeated.edit', $piggyBank->id);
|
||||
}
|
||||
|
||||
Session::flash('success', 'Updated repeated expense "' . e($piggyBank->name) . '".');
|
||||
|
||||
return Redirect::route('repeated.index');
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -13,6 +13,7 @@ use Preferences;
|
||||
use Session;
|
||||
use Steam;
|
||||
use View;
|
||||
use FireflyIII\Models\Preference;
|
||||
|
||||
/**
|
||||
* Class ReportController
|
||||
@ -69,12 +70,16 @@ class ReportController extends Controller
|
||||
$budgets = $query->getBudgetSummary($account, $start, $end);
|
||||
$balancedAmount = $query->balancedTransactionsSum($account, $start, $end);
|
||||
$array = [];
|
||||
$hide = true;
|
||||
foreach ($budgets as $budget) {
|
||||
$id = intval($budget->id);
|
||||
$data = $budget->toArray();
|
||||
$array[$id] = $data;
|
||||
if (floatval($data['amount']) != 0) {
|
||||
$hide = false;
|
||||
}
|
||||
}
|
||||
|
||||
$account->hide = $hide;
|
||||
$account->budgetInformation = $array;
|
||||
$account->balancedAmount = $balancedAmount;
|
||||
|
||||
@ -363,7 +368,7 @@ class ReportController extends Controller
|
||||
} catch (Exception $e) {
|
||||
return view('error')->with('message', 'Invalid date.');
|
||||
}
|
||||
|
||||
/** @var Preference $pref */
|
||||
$pref = Preferences::get('showSharedReports', false);
|
||||
$showSharedReports = $pref->data;
|
||||
$date = new Carbon('01-01-' . $year);
|
||||
|
@ -22,6 +22,7 @@ class Kernel extends HttpKernel
|
||||
'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
|
||||
'Illuminate\Session\Middleware\StartSession',
|
||||
'Illuminate\View\Middleware\ShareErrorsFromSession',
|
||||
'FireflyIII\Http\Middleware\ReplaceTestVars',
|
||||
'FireflyIII\Http\Middleware\VerifyCsrfToken',
|
||||
];
|
||||
|
||||
@ -38,6 +39,7 @@ class Kernel extends HttpKernel
|
||||
'range' => 'FireflyIII\Http\Middleware\Range',
|
||||
'reminders' => 'FireflyIII\Http\Middleware\Reminders',
|
||||
'piggybanks' => 'FireflyIII\Http\Middleware\PiggyBanks',
|
||||
|
||||
];
|
||||
|
||||
}
|
||||
|
56
app/Http/Middleware/ReplaceTestVars.php
Normal file
@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
namespace FireflyIII\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Contracts\Foundation\Application;
|
||||
use Illuminate\Contracts\Routing\Middleware;
|
||||
use Log;
|
||||
|
||||
/**
|
||||
* Class ReplaceTestVars
|
||||
*
|
||||
* @package App\Http\Middleware
|
||||
*/
|
||||
class ReplaceTestVars implements Middleware
|
||||
{
|
||||
/**
|
||||
* The application implementation.
|
||||
*
|
||||
* @var Application
|
||||
*/
|
||||
protected $app;
|
||||
|
||||
/**
|
||||
* Create a new filter instance.
|
||||
*
|
||||
* @param Application $app
|
||||
*
|
||||
*/
|
||||
public function __construct(Application $app)
|
||||
{
|
||||
$this->app = $app;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
if ('testing' === $this->app->environment() && $request->has('_token')) {
|
||||
$input = $request->all();
|
||||
$input['_token'] = $request->session()->token();
|
||||
// we need to update _token value to make sure we get the POST / PUT tests passed.
|
||||
Log::debug('Input token replaced ('.$input['_token'].').');
|
||||
$request->replace($input);
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
}
|
@ -30,7 +30,7 @@ class PiggyBankFormRequest extends Request
|
||||
public function rules()
|
||||
{
|
||||
|
||||
$nameRule = 'required|between:1,255|uniqueForUser:piggy_banks,name';
|
||||
$nameRule = 'required|between:1,255|uniquePiggyBankForUser:piggy_banks,name';
|
||||
$targetDateRule = 'date';
|
||||
if (intval(Input::get('id'))) {
|
||||
$nameRule = 'required|between:1,255';
|
||||
|
@ -256,40 +256,6 @@ Breadcrumbs::register(
|
||||
}
|
||||
);
|
||||
|
||||
// repeated expenses
|
||||
Breadcrumbs::register(
|
||||
'repeated.index', function (Generator $breadcrumbs) {
|
||||
$breadcrumbs->parent('home');
|
||||
$breadcrumbs->push('Repeated expenses', route('repeated.index'));
|
||||
}
|
||||
);
|
||||
Breadcrumbs::register(
|
||||
'repeated.create', function (Generator $breadcrumbs) {
|
||||
$breadcrumbs->parent('repeated.index');
|
||||
$breadcrumbs->push('Create new repeated expense', route('repeated.create'));
|
||||
}
|
||||
);
|
||||
|
||||
Breadcrumbs::register(
|
||||
'repeated.edit', function (Generator $breadcrumbs, PiggyBank $piggyBank) {
|
||||
$breadcrumbs->parent('repeated.show', $piggyBank);
|
||||
$breadcrumbs->push('Edit ' . e($piggyBank->name), route('repeated.edit', $piggyBank->id));
|
||||
}
|
||||
);
|
||||
Breadcrumbs::register(
|
||||
'repeated.delete', function (Generator $breadcrumbs, PiggyBank $piggyBank) {
|
||||
$breadcrumbs->parent('repeated.show', $piggyBank);
|
||||
$breadcrumbs->push('Delete ' . e($piggyBank->name), route('repeated.delete', $piggyBank->id));
|
||||
}
|
||||
);
|
||||
|
||||
Breadcrumbs::register(
|
||||
'repeated.show', function (Generator $breadcrumbs, PiggyBank $piggyBank) {
|
||||
$breadcrumbs->parent('repeated.index');
|
||||
$breadcrumbs->push(e($piggyBank->name), route('repeated.show', $piggyBank->id));
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
// reports
|
||||
Breadcrumbs::register(
|
||||
|
@ -28,20 +28,6 @@ Route::bind(
|
||||
}
|
||||
);
|
||||
|
||||
Route::bind(
|
||||
'repeatedExpense', function ($value, $route) {
|
||||
if (Auth::check()) {
|
||||
return PiggyBank::
|
||||
where('piggy_banks.id', $value)
|
||||
->leftJoin('accounts', 'accounts.id', '=', 'piggy_banks.account_id')
|
||||
->where('accounts.user_id', Auth::user()->id)
|
||||
->where('repeats', 1)->first(['piggy_banks.*']);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
);
|
||||
|
||||
Route::bind(
|
||||
'tjSecond', function ($value, $route) {
|
||||
if (Auth::check()) {
|
||||
@ -261,6 +247,7 @@ Route::group(
|
||||
Route::get('/json/categories', ['uses' => 'JsonController@categories', 'as' => 'json.categories']);
|
||||
Route::get('/json/box', ['uses' => 'JsonController@box', 'as' => 'json.box']);
|
||||
Route::get('/json/show-shared-reports', 'JsonController@showSharedReports');
|
||||
Route::get('/json/transaction-journals/{what}', 'JsonController@transactionJournals');
|
||||
Route::get('/json/show-shared-reports/set', 'JsonController@setSharedReports');
|
||||
|
||||
|
||||
@ -312,19 +299,6 @@ Route::group(
|
||||
Route::get('/reminder/act/{reminder}', ['uses' => 'ReminderController@act', 'as' => 'reminders.act']);
|
||||
Route::get('/reminder/{reminder}', ['uses' => 'ReminderController@show', 'as' => 'reminders.show']);
|
||||
|
||||
|
||||
/**
|
||||
* Repeated Expenses Controller
|
||||
*/
|
||||
Route::get('/repeated-expenses', ['uses' => 'RepeatedExpenseController@index', 'as' => 'repeated.index']);
|
||||
Route::get('/repeated-expenses/create', ['uses' => 'RepeatedExpenseController@create', 'as' => 'repeated.create']);
|
||||
Route::get('/repeated-expenses/edit/{repeatedExpense}', ['uses' => 'RepeatedExpenseController@edit', 'as' => 'repeated.edit']);
|
||||
Route::get('/repeated-expenses/delete/{repeatedExpense}', ['uses' => 'RepeatedExpenseController@delete', 'as' => 'repeated.delete']);
|
||||
Route::get('/repeated-expenses/show/{repeatedExpense}', ['uses' => 'RepeatedExpenseController@show', 'as' => 'repeated.show']);
|
||||
Route::post('/repeated-expense/store', ['uses' => 'RepeatedExpenseController@store', 'as' => 'repeated.store']);
|
||||
Route::post('/repeated-expense/update/{repeatedExpense}', ['uses' => 'RepeatedExpenseController@update', 'as' => 'repeated.update']);
|
||||
Route::post('/repeated-expense/destroy/{repeatedExpense}', ['uses' => 'RepeatedExpenseController@destroy', 'as' => 'repeated.destroy']);
|
||||
|
||||
/**
|
||||
* Report Controller
|
||||
*/
|
||||
|
@ -4,7 +4,8 @@ use Carbon\Carbon;
|
||||
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
use App;
|
||||
use Log;
|
||||
/**
|
||||
* Class PiggyBank
|
||||
*
|
||||
@ -36,46 +37,15 @@ class PiggyBank extends Model
|
||||
if (!is_null($this->currentRep)) {
|
||||
return $this->currentRep;
|
||||
}
|
||||
// repeating piggy banks are no longer supported.
|
||||
if (intval($this->repeats) === 0) {
|
||||
$rep = $this->piggyBankRepetitions()->first(['piggy_bank_repetitions.*']);
|
||||
$this->currentRep = $rep;
|
||||
|
||||
return $rep;
|
||||
} else {
|
||||
$query = $this->piggyBankRepetitions()->where(
|
||||
function (EloquentBuilder $q) {
|
||||
|
||||
$q->where(
|
||||
function (EloquentBuilder $q) {
|
||||
|
||||
$q->where(
|
||||
function (EloquentBuilder $q) {
|
||||
$today = new Carbon;
|
||||
$q->whereNull('startdate');
|
||||
$q->orWhere('startdate', '<=', $today->format('Y-m-d 00:00:00'));
|
||||
}
|
||||
)->where(
|
||||
function (EloquentBuilder $q) {
|
||||
$today = new Carbon;
|
||||
$q->whereNull('targetdate');
|
||||
$q->orWhere('targetdate', '>=', $today->format('Y-m-d 00:00:00'));
|
||||
}
|
||||
);
|
||||
}
|
||||
)->orWhere(
|
||||
function (EloquentBuilder $q) {
|
||||
$today = new Carbon;
|
||||
$q->where('startdate', '>=', $today->format('Y-m-d 00:00:00'));
|
||||
$q->where('targetdate', '>=', $today->format('Y-m-d 00:00:00'));
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
)->orderBy('startdate', 'ASC');
|
||||
$result = $query->first(['piggy_bank_repetitions.*']);
|
||||
$this->currentRep = $result;
|
||||
|
||||
return $result;
|
||||
Log::error('Tried to work with a piggy bank with a repeats=1 value! (id is '.$this->id.')');
|
||||
//App::abort(500);
|
||||
}
|
||||
|
||||
|
||||
|
@ -24,7 +24,24 @@ class Steam
|
||||
*/
|
||||
public function balance(Account $account, Carbon $date = null)
|
||||
{
|
||||
$date = is_null($date) ? Carbon::now() : $date;
|
||||
$date = is_null($date) ? Carbon::now() : $date;
|
||||
|
||||
// find the first known transaction on this account:
|
||||
//
|
||||
$firstDateObject = $account
|
||||
->transactions()
|
||||
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
|
||||
->orderBy('transaction_journals.date', 'ASC')->first(['transaction_journals.date']);
|
||||
|
||||
$firstDate = is_null($firstDateObject) ? clone $date : new Carbon($firstDateObject->date);
|
||||
$date = $date < $firstDate ? $firstDate : $date;
|
||||
|
||||
/**
|
||||
*select * from transactions
|
||||
* left join transaction_journals ON transaction_journals.id = transactions.transaction_journal_id
|
||||
* order by date ASC
|
||||
*/
|
||||
|
||||
$balance = floatval(
|
||||
$account->transactions()->leftJoin(
|
||||
'transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id'
|
||||
@ -34,6 +51,38 @@ class Steam
|
||||
return $balance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Only return the top X entries, group the rest by amount
|
||||
* and described as 'Others'. id = 0 as well
|
||||
*
|
||||
* @param array $array
|
||||
* @param int $limit
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function limitArray(array $array, $limit = 10)
|
||||
{
|
||||
$others = [
|
||||
'name' => 'Others',
|
||||
'amount' => 0
|
||||
];
|
||||
$return = [];
|
||||
$count = 0;
|
||||
foreach ($array as $id => $entry) {
|
||||
if ($count < ($limit - 1)) {
|
||||
$return[$id] = $entry;
|
||||
} else {
|
||||
$others['amount'] += $entry['amount'];
|
||||
}
|
||||
|
||||
$count++;
|
||||
}
|
||||
$return[0] = $others;
|
||||
|
||||
return $return;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns a collection into an array. Needs the field 'id' for the key,
|
||||
* and saves only 'name' and 'amount' as a sub array.
|
||||
@ -86,6 +135,24 @@ class Steam
|
||||
return $one;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param PiggyBank $piggyBank
|
||||
* @param PiggyBankRepetition $repetition
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function percentage(PiggyBank $piggyBank, PiggyBankRepetition $repetition)
|
||||
{
|
||||
$pct = $repetition->currentamount / $piggyBank->targetamount * 100;
|
||||
if ($pct > 100) {
|
||||
// @codeCoverageIgnoreStart
|
||||
return 100;
|
||||
// @codeCoverageIgnoreEnd
|
||||
} else {
|
||||
return floor($pct);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort an array where all 'amount' keys are positive floats.
|
||||
*
|
||||
@ -109,38 +176,6 @@ class Steam
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Only return the top X entries, group the rest by amount
|
||||
* and described as 'Others'. id = 0 as well
|
||||
*
|
||||
* @param array $array
|
||||
* @param int $limit
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function limitArray(array $array, $limit = 10)
|
||||
{
|
||||
$others = [
|
||||
'name' => 'Others',
|
||||
'amount' => 0
|
||||
];
|
||||
$return = [];
|
||||
$count = 0;
|
||||
foreach ($array as $id => $entry) {
|
||||
if ($count < ($limit - 1)) {
|
||||
$return[$id] = $entry;
|
||||
} else {
|
||||
$others['amount'] += $entry['amount'];
|
||||
}
|
||||
|
||||
$count++;
|
||||
}
|
||||
$return[0] = $others;
|
||||
|
||||
return $return;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort an array where all 'amount' keys are negative floats.
|
||||
*
|
||||
@ -163,22 +198,4 @@ class Steam
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param PiggyBank $piggyBank
|
||||
* @param PiggyBankRepetition $repetition
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function percentage(PiggyBank $piggyBank, PiggyBankRepetition $repetition)
|
||||
{
|
||||
$pct = $repetition->currentamount / $piggyBank->targetamount * 100;
|
||||
if ($pct > 100) {
|
||||
// @codeCoverageIgnoreStart
|
||||
return 100;
|
||||
// @codeCoverageIgnoreEnd
|
||||
} else {
|
||||
return floor($pct);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -83,16 +83,16 @@ class FireflyValidator extends Validator
|
||||
$validTypes = array_keys(Config::get('firefly.subTitlesByIdentifier'));
|
||||
|
||||
|
||||
$type = isset($this->data['what']) && in_array($this->data['what'],$validTypes) ? $this->data['what'] : null;
|
||||
$type = isset($this->data['what']) && in_array($this->data['what'], $validTypes) ? $this->data['what'] : null;
|
||||
// some fallback:
|
||||
if(is_null($type)) {
|
||||
$type = in_array(Input::get('what'),$validTypes) ? Input::get('what') : null;
|
||||
if (is_null($type)) {
|
||||
$type = in_array(Input::get('what'), $validTypes) ? Input::get('what') : null;
|
||||
}
|
||||
// still null?
|
||||
if(is_null($type)) {
|
||||
if (is_null($type)) {
|
||||
// find by other field:
|
||||
$type = isset($this->data['account_type_id']) ? $this->data['account_type_id'] : 0;
|
||||
$dbType = AccountType::find($type);
|
||||
$type = isset($this->data['account_type_id']) ? $this->data['account_type_id'] : 0;
|
||||
$dbType = AccountType::find($type);
|
||||
} else {
|
||||
$longType = Config::get('firefly.accountTypeByIdentifier.' . $type);
|
||||
$dbType = AccountType::whereType($longType)->first();
|
||||
@ -142,5 +142,29 @@ class FireflyValidator extends Validator
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $attribute
|
||||
* @param $value
|
||||
* @param $parameters
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function validateUniquePiggyBankForUser($attribute, $value, $parameters)
|
||||
{
|
||||
$query = DB::table($parameters[0])->where('piggy_banks.'.$parameters[1], $value);
|
||||
$query->leftJoin('accounts', 'accounts.id', '=', 'piggy_banks.account_id');
|
||||
$query->where('accounts.user_id', Auth::user()->id);
|
||||
if (isset($paramers[2])) {
|
||||
$query->where('piggy_banks.id', '!=', $parameters[2]);
|
||||
}
|
||||
$count = $query->count();
|
||||
if ($count == 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
284
composer.lock
generated
@ -950,16 +950,16 @@
|
||||
},
|
||||
{
|
||||
"name": "laravel/framework",
|
||||
"version": "v5.0.16",
|
||||
"version": "v5.0.22",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/laravel/framework.git",
|
||||
"reference": "861a1e78c84dca82fe4bd85d00349c52304eea77"
|
||||
"reference": "388289de68ba912746bd1adb20a8b1cd0f846ea1"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/laravel/framework/zipball/861a1e78c84dca82fe4bd85d00349c52304eea77",
|
||||
"reference": "861a1e78c84dca82fe4bd85d00349c52304eea77",
|
||||
"url": "https://api.github.com/repos/laravel/framework/zipball/388289de68ba912746bd1adb20a8b1cd0f846ea1",
|
||||
"reference": "388289de68ba912746bd1adb20a8b1cd0f846ea1",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -1072,7 +1072,7 @@
|
||||
"framework",
|
||||
"laravel"
|
||||
],
|
||||
"time": "2015-03-13 13:27:55"
|
||||
"time": "2015-03-27 14:49:51"
|
||||
},
|
||||
{
|
||||
"name": "league/commonmark",
|
||||
@ -1335,20 +1335,21 @@
|
||||
},
|
||||
{
|
||||
"name": "nesbot/carbon",
|
||||
"version": "1.17.0",
|
||||
"version": "1.18.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/briannesbitt/Carbon.git",
|
||||
"reference": "a1dd1ad9abfc8b3c4d8768068e6c71d293424e86"
|
||||
"reference": "99e2f69f7bdc2cc4334b2d00f1e0ba450623ea36"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/a1dd1ad9abfc8b3c4d8768068e6c71d293424e86",
|
||||
"reference": "a1dd1ad9abfc8b3c4d8768068e6c71d293424e86",
|
||||
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/99e2f69f7bdc2cc4334b2d00f1e0ba450623ea36",
|
||||
"reference": "99e2f69f7bdc2cc4334b2d00f1e0ba450623ea36",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0"
|
||||
"php": ">=5.3.0",
|
||||
"symfony/translation": "2.6.*"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.0"
|
||||
@ -1377,20 +1378,20 @@
|
||||
"datetime",
|
||||
"time"
|
||||
],
|
||||
"time": "2015-03-08 14:05:44"
|
||||
"time": "2015-03-26 03:05:57"
|
||||
},
|
||||
{
|
||||
"name": "nikic/php-parser",
|
||||
"version": "v1.1.0",
|
||||
"version": "v1.2.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nikic/PHP-Parser.git",
|
||||
"reference": "ac05ef6f95bf8361549604b6031c115f92f39528"
|
||||
"reference": "dba7524b3724f25b947cd26a580787c55c8a6f9b"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ac05ef6f95bf8361549604b6031c115f92f39528",
|
||||
"reference": "ac05ef6f95bf8361549604b6031c115f92f39528",
|
||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dba7524b3724f25b947cd26a580787c55c8a6f9b",
|
||||
"reference": "dba7524b3724f25b947cd26a580787c55c8a6f9b",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -1400,7 +1401,7 @@
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0-dev"
|
||||
"dev-master": "1.2-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
@ -1422,7 +1423,7 @@
|
||||
"parser",
|
||||
"php"
|
||||
],
|
||||
"time": "2015-01-18 11:29:59"
|
||||
"time": "2015-03-24 19:10:28"
|
||||
},
|
||||
{
|
||||
"name": "psr/log",
|
||||
@ -1464,16 +1465,16 @@
|
||||
},
|
||||
{
|
||||
"name": "psy/psysh",
|
||||
"version": "v0.4.2",
|
||||
"version": "v0.4.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/bobthecow/psysh.git",
|
||||
"reference": "e50a63b4e4971041fda993b0dd6977fc60bc39d4"
|
||||
"reference": "489816db71649bd95b416e3ed9062d40528ab0ac"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/bobthecow/psysh/zipball/e50a63b4e4971041fda993b0dd6977fc60bc39d4",
|
||||
"reference": "e50a63b4e4971041fda993b0dd6977fc60bc39d4",
|
||||
"url": "https://api.github.com/repos/bobthecow/psysh/zipball/489816db71649bd95b416e3ed9062d40528ab0ac",
|
||||
"reference": "489816db71649bd95b416e3ed9062d40528ab0ac",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -1531,7 +1532,7 @@
|
||||
"interactive",
|
||||
"shell"
|
||||
],
|
||||
"time": "2015-03-14 17:29:14"
|
||||
"time": "2015-03-26 18:43:54"
|
||||
},
|
||||
{
|
||||
"name": "swiftmailer/swiftmailer",
|
||||
@ -1587,17 +1588,17 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/console",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/Console",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/Console.git",
|
||||
"reference": "e44154bfe3e41e8267d7a3794cd9da9a51cfac34"
|
||||
"reference": "53f86497ccd01677e22435cfb7262599450a90d1"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/Console/zipball/e44154bfe3e41e8267d7a3794cd9da9a51cfac34",
|
||||
"reference": "e44154bfe3e41e8267d7a3794cd9da9a51cfac34",
|
||||
"url": "https://api.github.com/repos/symfony/Console/zipball/53f86497ccd01677e22435cfb7262599450a90d1",
|
||||
"reference": "53f86497ccd01677e22435cfb7262599450a90d1",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -1606,6 +1607,7 @@
|
||||
"require-dev": {
|
||||
"psr/log": "~1.0",
|
||||
"symfony/event-dispatcher": "~2.1",
|
||||
"symfony/phpunit-bridge": "~2.7",
|
||||
"symfony/process": "~2.1"
|
||||
},
|
||||
"suggest": {
|
||||
@ -1640,21 +1642,21 @@
|
||||
],
|
||||
"description": "Symfony Console Component",
|
||||
"homepage": "http://symfony.com",
|
||||
"time": "2015-01-25 04:39:26"
|
||||
"time": "2015-03-13 17:37:22"
|
||||
},
|
||||
{
|
||||
"name": "symfony/debug",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/Debug",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/Debug.git",
|
||||
"reference": "150c80059c3ccf68f96a4fceb513eb6b41f23300"
|
||||
"reference": "5c1570dea188ade0c6c5e874c2f0a6570587aa1c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/Debug/zipball/150c80059c3ccf68f96a4fceb513eb6b41f23300",
|
||||
"reference": "150c80059c3ccf68f96a4fceb513eb6b41f23300",
|
||||
"url": "https://api.github.com/repos/symfony/Debug/zipball/5c1570dea188ade0c6c5e874c2f0a6570587aa1c",
|
||||
"reference": "5c1570dea188ade0c6c5e874c2f0a6570587aa1c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -1667,7 +1669,8 @@
|
||||
"require-dev": {
|
||||
"symfony/class-loader": "~2.2",
|
||||
"symfony/http-foundation": "~2.1",
|
||||
"symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2"
|
||||
"symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2",
|
||||
"symfony/phpunit-bridge": "~2.7"
|
||||
},
|
||||
"suggest": {
|
||||
"symfony/http-foundation": "",
|
||||
@ -1700,21 +1703,21 @@
|
||||
],
|
||||
"description": "Symfony Debug Component",
|
||||
"homepage": "http://symfony.com",
|
||||
"time": "2015-01-21 20:57:55"
|
||||
"time": "2015-03-13 17:37:22"
|
||||
},
|
||||
{
|
||||
"name": "symfony/event-dispatcher",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/EventDispatcher",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/EventDispatcher.git",
|
||||
"reference": "f75989f3ab2743a82fe0b03ded2598a2b1546813"
|
||||
"reference": "70f7c8478739ad21e3deef0d977b38c77f1fb284"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/f75989f3ab2743a82fe0b03ded2598a2b1546813",
|
||||
"reference": "f75989f3ab2743a82fe0b03ded2598a2b1546813",
|
||||
"url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/70f7c8478739ad21e3deef0d977b38c77f1fb284",
|
||||
"reference": "70f7c8478739ad21e3deef0d977b38c77f1fb284",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -1725,6 +1728,7 @@
|
||||
"symfony/config": "~2.0,>=2.0.5",
|
||||
"symfony/dependency-injection": "~2.6",
|
||||
"symfony/expression-language": "~2.6",
|
||||
"symfony/phpunit-bridge": "~2.7",
|
||||
"symfony/stopwatch": "~2.3"
|
||||
},
|
||||
"suggest": {
|
||||
@ -1758,26 +1762,29 @@
|
||||
],
|
||||
"description": "Symfony EventDispatcher Component",
|
||||
"homepage": "http://symfony.com",
|
||||
"time": "2015-02-01 16:10:57"
|
||||
"time": "2015-03-13 17:37:22"
|
||||
},
|
||||
{
|
||||
"name": "symfony/filesystem",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/Filesystem",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/Filesystem.git",
|
||||
"reference": "a1f566d1f92e142fa1593f4555d6d89e3044a9b7"
|
||||
"reference": "fdc5f151bc2db066b51870d5bea3773d915ced0b"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/Filesystem/zipball/a1f566d1f92e142fa1593f4555d6d89e3044a9b7",
|
||||
"reference": "a1f566d1f92e142fa1593f4555d6d89e3044a9b7",
|
||||
"url": "https://api.github.com/repos/symfony/Filesystem/zipball/fdc5f151bc2db066b51870d5bea3773d915ced0b",
|
||||
"reference": "fdc5f151bc2db066b51870d5bea3773d915ced0b",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/phpunit-bridge": "~2.7"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
@ -1805,26 +1812,29 @@
|
||||
],
|
||||
"description": "Symfony Filesystem Component",
|
||||
"homepage": "http://symfony.com",
|
||||
"time": "2015-01-03 21:13:09"
|
||||
"time": "2015-03-12 10:28:44"
|
||||
},
|
||||
{
|
||||
"name": "symfony/finder",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/Finder",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/Finder.git",
|
||||
"reference": "16513333bca64186c01609961a2bb1b95b5e1355"
|
||||
"reference": "bebc7479c566fa4f14b9bcef9e32e719eabec74e"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/Finder/zipball/16513333bca64186c01609961a2bb1b95b5e1355",
|
||||
"reference": "16513333bca64186c01609961a2bb1b95b5e1355",
|
||||
"url": "https://api.github.com/repos/symfony/Finder/zipball/bebc7479c566fa4f14b9bcef9e32e719eabec74e",
|
||||
"reference": "bebc7479c566fa4f14b9bcef9e32e719eabec74e",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/phpunit-bridge": "~2.7"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
@ -1852,28 +1862,29 @@
|
||||
],
|
||||
"description": "Symfony Finder Component",
|
||||
"homepage": "http://symfony.com",
|
||||
"time": "2015-01-03 08:01:59"
|
||||
"time": "2015-03-12 10:28:44"
|
||||
},
|
||||
{
|
||||
"name": "symfony/http-foundation",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/HttpFoundation",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/HttpFoundation.git",
|
||||
"reference": "8fa63d614d56ccfe033e30411d90913cfc483ff6"
|
||||
"reference": "d527885e37b55ec0e3dc6f4b70566d0f9b2f2388"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/8fa63d614d56ccfe033e30411d90913cfc483ff6",
|
||||
"reference": "8fa63d614d56ccfe033e30411d90913cfc483ff6",
|
||||
"url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/d527885e37b55ec0e3dc6f4b70566d0f9b2f2388",
|
||||
"reference": "d527885e37b55ec0e3dc6f4b70566d0f9b2f2388",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/expression-language": "~2.4"
|
||||
"symfony/expression-language": "~2.4",
|
||||
"symfony/phpunit-bridge": "~2.7"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
@ -1905,21 +1916,21 @@
|
||||
],
|
||||
"description": "Symfony HttpFoundation Component",
|
||||
"homepage": "http://symfony.com",
|
||||
"time": "2015-02-01 16:10:57"
|
||||
"time": "2015-03-13 17:37:22"
|
||||
},
|
||||
{
|
||||
"name": "symfony/http-kernel",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/HttpKernel",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/HttpKernel.git",
|
||||
"reference": "27abf3106d8bd08562070dd4e2438c279792c434"
|
||||
"reference": "6f7b2d3ba8bf02cf77edb399696e85ef24a888a4"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/HttpKernel/zipball/27abf3106d8bd08562070dd4e2438c279792c434",
|
||||
"reference": "27abf3106d8bd08562070dd4e2438c279792c434",
|
||||
"url": "https://api.github.com/repos/symfony/HttpKernel/zipball/6f7b2d3ba8bf02cf77edb399696e85ef24a888a4",
|
||||
"reference": "6f7b2d3ba8bf02cf77edb399696e85ef24a888a4",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -1939,6 +1950,7 @@
|
||||
"symfony/dom-crawler": "~2.0,>=2.0.5",
|
||||
"symfony/expression-language": "~2.4",
|
||||
"symfony/finder": "~2.0,>=2.0.5",
|
||||
"symfony/phpunit-bridge": "~2.7",
|
||||
"symfony/process": "~2.0,>=2.0.5",
|
||||
"symfony/routing": "~2.2",
|
||||
"symfony/stopwatch": "~2.3",
|
||||
@ -1982,26 +1994,29 @@
|
||||
],
|
||||
"description": "Symfony HttpKernel Component",
|
||||
"homepage": "http://symfony.com",
|
||||
"time": "2015-02-02 18:02:30"
|
||||
"time": "2015-03-17 14:58:46"
|
||||
},
|
||||
{
|
||||
"name": "symfony/process",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/Process",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/Process.git",
|
||||
"reference": "ecfc23e89d9967999fa5f60a1e9af7384396e9ae"
|
||||
"reference": "4d717f34f3d1d6ab30fbe79f7132960a27f4a0dc"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/Process/zipball/ecfc23e89d9967999fa5f60a1e9af7384396e9ae",
|
||||
"reference": "ecfc23e89d9967999fa5f60a1e9af7384396e9ae",
|
||||
"url": "https://api.github.com/repos/symfony/Process/zipball/4d717f34f3d1d6ab30fbe79f7132960a27f4a0dc",
|
||||
"reference": "4d717f34f3d1d6ab30fbe79f7132960a27f4a0dc",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/phpunit-bridge": "~2.7"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
@ -2029,21 +2044,21 @@
|
||||
],
|
||||
"description": "Symfony Process Component",
|
||||
"homepage": "http://symfony.com",
|
||||
"time": "2015-01-25 04:39:26"
|
||||
"time": "2015-03-12 10:28:44"
|
||||
},
|
||||
{
|
||||
"name": "symfony/routing",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/Routing",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/Routing.git",
|
||||
"reference": "bda1c3c67f2a33bbeabb1d321feaf626a0ca5698"
|
||||
"reference": "a7f3eb540e5c553c3c95993c6fc2e7edb2f3b9d2"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/Routing/zipball/bda1c3c67f2a33bbeabb1d321feaf626a0ca5698",
|
||||
"reference": "bda1c3c67f2a33bbeabb1d321feaf626a0ca5698",
|
||||
"url": "https://api.github.com/repos/symfony/Routing/zipball/a7f3eb540e5c553c3c95993c6fc2e7edb2f3b9d2",
|
||||
"reference": "a7f3eb540e5c553c3c95993c6fc2e7edb2f3b9d2",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -2056,6 +2071,7 @@
|
||||
"symfony/config": "~2.2",
|
||||
"symfony/expression-language": "~2.4",
|
||||
"symfony/http-foundation": "~2.3",
|
||||
"symfony/phpunit-bridge": "~2.7",
|
||||
"symfony/yaml": "~2.0,>=2.0.5"
|
||||
},
|
||||
"suggest": {
|
||||
@ -2097,21 +2113,21 @@
|
||||
"uri",
|
||||
"url"
|
||||
],
|
||||
"time": "2015-01-15 12:15:12"
|
||||
"time": "2015-03-13 17:37:22"
|
||||
},
|
||||
{
|
||||
"name": "symfony/security-core",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/Security/Core",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/security-core.git",
|
||||
"reference": "4603bcc66e20e23f018c67f7f9f3f8146a100c11"
|
||||
"reference": "889290a5c00d3f174cc73ce13a11a0a6406939e9"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/security-core/zipball/4603bcc66e20e23f018c67f7f9f3f8146a100c11",
|
||||
"reference": "4603bcc66e20e23f018c67f7f9f3f8146a100c11",
|
||||
"url": "https://api.github.com/repos/symfony/security-core/zipball/889290a5c00d3f174cc73ce13a11a0a6406939e9",
|
||||
"reference": "889290a5c00d3f174cc73ce13a11a0a6406939e9",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -2123,6 +2139,7 @@
|
||||
"symfony/event-dispatcher": "~2.1",
|
||||
"symfony/expression-language": "~2.6",
|
||||
"symfony/http-foundation": "~2.4",
|
||||
"symfony/phpunit-bridge": "~2.7",
|
||||
"symfony/translation": "~2.0,>=2.0.5",
|
||||
"symfony/validator": "~2.5,>=2.5.5"
|
||||
},
|
||||
@ -2160,21 +2177,21 @@
|
||||
],
|
||||
"description": "Symfony Security Component - Core Library",
|
||||
"homepage": "http://symfony.com",
|
||||
"time": "2015-01-25 04:39:26"
|
||||
"time": "2015-03-13 17:37:22"
|
||||
},
|
||||
{
|
||||
"name": "symfony/translation",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/Translation",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/Translation.git",
|
||||
"reference": "f289cdf8179d32058c1e1cbac723106a5ff6fa39"
|
||||
"reference": "043db5f1eef9598d1bc1d75b93304984c003d7d9"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/Translation/zipball/f289cdf8179d32058c1e1cbac723106a5ff6fa39",
|
||||
"reference": "f289cdf8179d32058c1e1cbac723106a5ff6fa39",
|
||||
"url": "https://api.github.com/repos/symfony/Translation/zipball/043db5f1eef9598d1bc1d75b93304984c003d7d9",
|
||||
"reference": "043db5f1eef9598d1bc1d75b93304984c003d7d9",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -2184,6 +2201,7 @@
|
||||
"psr/log": "~1.0",
|
||||
"symfony/config": "~2.3,>=2.3.12",
|
||||
"symfony/intl": "~2.3",
|
||||
"symfony/phpunit-bridge": "~2.7",
|
||||
"symfony/yaml": "~2.2"
|
||||
},
|
||||
"suggest": {
|
||||
@ -2218,26 +2236,29 @@
|
||||
],
|
||||
"description": "Symfony Translation Component",
|
||||
"homepage": "http://symfony.com",
|
||||
"time": "2015-01-03 15:33:07"
|
||||
"time": "2015-03-14 11:42:25"
|
||||
},
|
||||
{
|
||||
"name": "symfony/var-dumper",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/VarDumper",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/var-dumper.git",
|
||||
"reference": "c3d5a36c3e3298bd8b070488fba5537174647353"
|
||||
"reference": "61ee6c848fd2c623e13f59df48833f8b8bad7fda"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/c3d5a36c3e3298bd8b070488fba5537174647353",
|
||||
"reference": "c3d5a36c3e3298bd8b070488fba5537174647353",
|
||||
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/61ee6c848fd2c623e13f59df48833f8b8bad7fda",
|
||||
"reference": "61ee6c848fd2c623e13f59df48833f8b8bad7fda",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/phpunit-bridge": "~2.7"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-symfony_debug": ""
|
||||
},
|
||||
@ -2275,7 +2296,7 @@
|
||||
"debug",
|
||||
"dump"
|
||||
],
|
||||
"time": "2015-02-02 16:32:08"
|
||||
"time": "2015-03-06 16:45:31"
|
||||
},
|
||||
{
|
||||
"name": "vlucas/phpdotenv",
|
||||
@ -2334,12 +2355,12 @@
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/dwightwatson/validating.git",
|
||||
"reference": "b85ca3550a66f31685fad78b3ae085a8cea6fcdf"
|
||||
"reference": "9066ffd9342d1bf8a571d157df047e200a24e64a"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/dwightwatson/validating/zipball/b85ca3550a66f31685fad78b3ae085a8cea6fcdf",
|
||||
"reference": "b85ca3550a66f31685fad78b3ae085a8cea6fcdf",
|
||||
"url": "https://api.github.com/repos/dwightwatson/validating/zipball/9066ffd9342d1bf8a571d157df047e200a24e64a",
|
||||
"reference": "9066ffd9342d1bf8a571d157df047e200a24e64a",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -2381,22 +2402,22 @@
|
||||
"laravel",
|
||||
"validation"
|
||||
],
|
||||
"time": "2015-03-13 05:19:15"
|
||||
"time": "2015-03-17 10:52:36"
|
||||
}
|
||||
],
|
||||
"packages-dev": [
|
||||
{
|
||||
"name": "barryvdh/laravel-debugbar",
|
||||
"version": "v2.0.2",
|
||||
"version": "v2.0.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/barryvdh/laravel-debugbar.git",
|
||||
"reference": "7bdf8acf3b955f4fcf922e74abdfdec370369196"
|
||||
"reference": "77be5170f3777e2e899ec98105ce5686cd4aa63b"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/7bdf8acf3b955f4fcf922e74abdfdec370369196",
|
||||
"reference": "7bdf8acf3b955f4fcf922e74abdfdec370369196",
|
||||
"url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/77be5170f3777e2e899ec98105ce5686cd4aa63b",
|
||||
"reference": "77be5170f3777e2e899ec98105ce5686cd4aa63b",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -2437,20 +2458,20 @@
|
||||
"profiler",
|
||||
"webprofiler"
|
||||
],
|
||||
"time": "2015-02-19 10:26:39"
|
||||
"time": "2015-03-07 15:15:23"
|
||||
},
|
||||
{
|
||||
"name": "barryvdh/laravel-ide-helper",
|
||||
"version": "v2.0.1",
|
||||
"version": "v2.0.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/barryvdh/laravel-ide-helper.git",
|
||||
"reference": "81b7febfc64168ea1af57261aa4dfc9acefd5429"
|
||||
"reference": "d8d5517f2cc55d534a7fc8f50ff62cb55115e1aa"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/81b7febfc64168ea1af57261aa4dfc9acefd5429",
|
||||
"reference": "81b7febfc64168ea1af57261aa4dfc9acefd5429",
|
||||
"url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/d8d5517f2cc55d534a7fc8f50ff62cb55115e1aa",
|
||||
"reference": "d8d5517f2cc55d534a7fc8f50ff62cb55115e1aa",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -2500,7 +2521,7 @@
|
||||
"phpstorm",
|
||||
"sublime"
|
||||
],
|
||||
"time": "2015-02-23 15:55:54"
|
||||
"time": "2015-03-17 08:00:28"
|
||||
},
|
||||
{
|
||||
"name": "doctrine/instantiator",
|
||||
@ -2558,16 +2579,16 @@
|
||||
},
|
||||
{
|
||||
"name": "guzzle/guzzle",
|
||||
"version": "v3.9.2",
|
||||
"version": "v3.9.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/guzzle/guzzle3.git",
|
||||
"reference": "54991459675c1a2924122afbb0e5609ade581155"
|
||||
"reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/guzzle/guzzle3/zipball/54991459675c1a2924122afbb0e5609ade581155",
|
||||
"reference": "54991459675c1a2924122afbb0e5609ade581155",
|
||||
"url": "https://api.github.com/repos/guzzle/guzzle3/zipball/0645b70d953bc1c067bbc8d5bc53194706b628d9",
|
||||
"reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -2608,6 +2629,9 @@
|
||||
"zendframework/zend-cache": "2.*,<2.3",
|
||||
"zendframework/zend-log": "2.*,<2.3"
|
||||
},
|
||||
"suggest": {
|
||||
"guzzlehttp/guzzle": "Guzzle 5 has moved to a new package name. The package you have installed, Guzzle 3, is deprecated."
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
@ -2635,7 +2659,7 @@
|
||||
"homepage": "https://github.com/guzzle/guzzle/contributors"
|
||||
}
|
||||
],
|
||||
"description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients",
|
||||
"description": "PHP HTTP client. This library is deprecated in favor of https://packagist.org/packages/guzzlehttp/guzzle",
|
||||
"homepage": "http://guzzlephp.org/",
|
||||
"keywords": [
|
||||
"client",
|
||||
@ -2646,7 +2670,7 @@
|
||||
"rest",
|
||||
"web service"
|
||||
],
|
||||
"time": "2014-08-11 04:32:36"
|
||||
"time": "2015-03-18 18:23:50"
|
||||
},
|
||||
{
|
||||
"name": "maximebf/debugbar",
|
||||
@ -3734,24 +3758,25 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/class-loader",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/ClassLoader",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/ClassLoader.git",
|
||||
"reference": "deac802f76910708ab50d039806cfd1866895b52"
|
||||
"reference": "56bf6fe551ca013471541d866f73a6cc70ece9c5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/ClassLoader/zipball/deac802f76910708ab50d039806cfd1866895b52",
|
||||
"reference": "deac802f76910708ab50d039806cfd1866895b52",
|
||||
"url": "https://api.github.com/repos/symfony/ClassLoader/zipball/56bf6fe551ca013471541d866f73a6cc70ece9c5",
|
||||
"reference": "56bf6fe551ca013471541d866f73a6cc70ece9c5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/finder": "~2.0,>=2.0.5"
|
||||
"symfony/finder": "~2.0,>=2.0.5",
|
||||
"symfony/phpunit-bridge": "~2.7"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
@ -3780,27 +3805,30 @@
|
||||
],
|
||||
"description": "Symfony ClassLoader Component",
|
||||
"homepage": "http://symfony.com",
|
||||
"time": "2015-01-05 14:28:40"
|
||||
"time": "2015-03-13 17:37:22"
|
||||
},
|
||||
{
|
||||
"name": "symfony/config",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/Config",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/Config.git",
|
||||
"reference": "a9f781ba1221067d1f07c8cec0bc50f81b8d7408"
|
||||
"reference": "7a47189c7667ca69bcaafd19ef8a8941db449a2c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/Config/zipball/a9f781ba1221067d1f07c8cec0bc50f81b8d7408",
|
||||
"reference": "a9f781ba1221067d1f07c8cec0bc50f81b8d7408",
|
||||
"url": "https://api.github.com/repos/symfony/Config/zipball/7a47189c7667ca69bcaafd19ef8a8941db449a2c",
|
||||
"reference": "7a47189c7667ca69bcaafd19ef8a8941db449a2c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3",
|
||||
"symfony/filesystem": "~2.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/phpunit-bridge": "~2.7"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
@ -3828,26 +3856,29 @@
|
||||
],
|
||||
"description": "Symfony Config Component",
|
||||
"homepage": "http://symfony.com",
|
||||
"time": "2015-01-21 20:57:55"
|
||||
"time": "2015-03-12 10:28:44"
|
||||
},
|
||||
{
|
||||
"name": "symfony/stopwatch",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/Stopwatch",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/Stopwatch.git",
|
||||
"reference": "e8da5286132ba75ce4b4275fbf0f4cd369bfd71c"
|
||||
"reference": "ba4e774f71e2ce3e3f65cabac4031b9029972af5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/Stopwatch/zipball/e8da5286132ba75ce4b4275fbf0f4cd369bfd71c",
|
||||
"reference": "e8da5286132ba75ce4b4275fbf0f4cd369bfd71c",
|
||||
"url": "https://api.github.com/repos/symfony/Stopwatch/zipball/ba4e774f71e2ce3e3f65cabac4031b9029972af5",
|
||||
"reference": "ba4e774f71e2ce3e3f65cabac4031b9029972af5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/phpunit-bridge": "~2.7"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
@ -3875,26 +3906,29 @@
|
||||
],
|
||||
"description": "Symfony Stopwatch Component",
|
||||
"homepage": "http://symfony.com",
|
||||
"time": "2015-01-03 08:01:59"
|
||||
"time": "2015-02-24 11:52:21"
|
||||
},
|
||||
{
|
||||
"name": "symfony/yaml",
|
||||
"version": "v2.6.4",
|
||||
"version": "v2.6.5",
|
||||
"target-dir": "Symfony/Component/Yaml",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/Yaml.git",
|
||||
"reference": "60ed7751671113cf1ee7d7778e691642c2e9acd8"
|
||||
"reference": "0cd8e72071e46e15fc072270ae39ea1b66b10a9d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/Yaml/zipball/60ed7751671113cf1ee7d7778e691642c2e9acd8",
|
||||
"reference": "60ed7751671113cf1ee7d7778e691642c2e9acd8",
|
||||
"url": "https://api.github.com/repos/symfony/Yaml/zipball/0cd8e72071e46e15fc072270ae39ea1b66b10a9d",
|
||||
"reference": "0cd8e72071e46e15fc072270ae39ea1b66b10a9d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/phpunit-bridge": "~2.7"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
@ -3922,7 +3956,7 @@
|
||||
],
|
||||
"description": "Symfony Yaml Component",
|
||||
"homepage": "http://symfony.com",
|
||||
"time": "2015-01-25 04:39:26"
|
||||
"time": "2015-03-12 10:28:44"
|
||||
}
|
||||
],
|
||||
"aliases": [],
|
||||
|
@ -73,9 +73,9 @@ return [
|
||||
],
|
||||
'accountTypeByIdentifier' =>
|
||||
[
|
||||
'asset' => 'Asset account',
|
||||
'expense' => 'Expense account',
|
||||
'revenue' => 'Revenue account',
|
||||
'asset' => 'Asset account',
|
||||
'expense' => 'Expense account',
|
||||
'revenue' => 'Revenue account'
|
||||
],
|
||||
'shortNamesByFullName' =>
|
||||
[
|
||||
|
@ -90,7 +90,6 @@ class TestDataSeeder extends Seeder
|
||||
$this->createCategories();
|
||||
$this->createPiggyBanks();
|
||||
$this->createReminders();
|
||||
$this->createRecurringTransactions();
|
||||
$this->createBills();
|
||||
$this->createExpenseAccounts();
|
||||
$this->createRevenueAccounts();
|
||||
@ -357,34 +356,6 @@ class TestDataSeeder extends Seeder
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function createRecurringTransactions()
|
||||
{
|
||||
// account
|
||||
$savings = Account::whereName('Savings account')->orderBy('id', 'DESC')->first();
|
||||
$user = User::whereEmail('thegrumpydictator@gmail.com')->first();
|
||||
|
||||
$recurring = PiggyBank::create(
|
||||
[
|
||||
'account_id' => $savings->id,
|
||||
'name' => 'Nieuwe spullen',
|
||||
'targetamount' => 1000,
|
||||
'startdate' => $this->som,
|
||||
'targetdate' => $this->eom,
|
||||
'repeats' => 1,
|
||||
'rep_length' => 'month',
|
||||
'rep_every' => 0,
|
||||
'rep_times' => 0,
|
||||
'reminder' => 'month',
|
||||
'reminder_skip' => 0,
|
||||
'remind_me' => 1,
|
||||
'order' => 0,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
BIN
favicon.pxm
Normal file
10
pu.sh
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
# create DB if not exists
|
||||
|
||||
if [ ! -f tests/database/db.sqlite ]; then
|
||||
touch tests/database/db.sqlite
|
||||
php artisan migrate --seed
|
||||
fi
|
||||
|
||||
phpunit --verbose
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 904 B After Width: | Height: | Size: 933 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 3.5 KiB |
12
public/browserconfig.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<browserconfig>
|
||||
<msapplication>
|
||||
<tile>
|
||||
<square70x70logo src="/mstile-70x70.png?v=Lb54KlrQnz"/>
|
||||
<square150x150logo src="/mstile-150x150.png?v=Lb54KlrQnz"/>
|
||||
<square310x310logo src="/mstile-310x310.png?v=Lb54KlrQnz"/>
|
||||
<wide310x150logo src="/mstile-310x150.png?v=Lb54KlrQnz"/>
|
||||
<TileColor>#2d89ef</TileColor>
|
||||
</tile>
|
||||
</msapplication>
|
||||
</browserconfig>
|
Before Width: | Height: | Size: 501 B After Width: | Height: | Size: 509 B |
Before Width: | Height: | Size: 815 B After Width: | Height: | Size: 842 B |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@ -4,4 +4,77 @@ $(function () {
|
||||
googleLineChart('chart/account/' + accountID, 'overview-chart');
|
||||
}
|
||||
|
||||
});
|
||||
// sortable!
|
||||
if (typeof $(".sortable-table tbody").sortable != "undefined") {
|
||||
$(".sortable-table tbody").sortable(
|
||||
{
|
||||
helper: fixHelper,
|
||||
items: 'tr:not(.ignore)',
|
||||
stop: sortStop,
|
||||
handle: '.handle'
|
||||
}
|
||||
).disableSelection();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
// Return a helper with preserved width of cells
|
||||
var fixHelper = function (e, ui) {
|
||||
ui.children().each(function () {
|
||||
$(this).width($(this).width());
|
||||
});
|
||||
return ui;
|
||||
};
|
||||
|
||||
function sortStop(event, ui) {
|
||||
var current = $(ui.item);
|
||||
var thisDate = current.data('date');
|
||||
var originalBG = current.css('backgroundColor');
|
||||
|
||||
|
||||
if (current.prev().data('date') != thisDate && current.next().data('date') != thisDate) {
|
||||
//console.log('False!');
|
||||
//console.log('[' + current.prev().data('date') + '] [' + thisDate + '] [' + current.next().data('date') + ']');
|
||||
// animate something with color:
|
||||
current.animate({
|
||||
backgroundColor: "#d9534f"
|
||||
}, 200, function () {
|
||||
$(this).animate({
|
||||
backgroundColor: originalBG
|
||||
}, 200);
|
||||
});
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// do update
|
||||
var list = $('tr[data-date="' + thisDate + '"]');
|
||||
var submit = [];
|
||||
$.each(list, function (i, v) {
|
||||
var row = $(v);
|
||||
var id = row.data('id');
|
||||
submit.push(id);
|
||||
});
|
||||
|
||||
// do extra animation when done?
|
||||
$.post('/transaction/reorder', {items: submit, date: thisDate, _token: token});
|
||||
console.log(submit);
|
||||
|
||||
//console.log('TRUE!');
|
||||
//console.log('[' + current.prev().data('date') + '] [' + thisDate + '] [' + current.next().data('date') + ']');
|
||||
|
||||
current.animate({
|
||||
backgroundColor: "#5cb85c"
|
||||
}, 200, function () {
|
||||
$(this).animate({
|
||||
backgroundColor: originalBG
|
||||
}, 200);
|
||||
});
|
||||
|
||||
|
||||
//else update some order thing bla bla.
|
||||
//check if the item above OR under this one have the same date
|
||||
//if not. return false
|
||||
|
||||
}
|
@ -1,93 +1,29 @@
|
||||
if ($('input[name="expense_account"]').length > 0) {
|
||||
$.getJSON('json/expense-accounts').success(function (data) {
|
||||
$('input[name="expense_account"]').typeahead({source: data});
|
||||
});
|
||||
}
|
||||
if ($('input[name="revenue_account"]').length > 0) {
|
||||
$.getJSON('json/revenue-accounts').success(function (data) {
|
||||
$('input[name="revenue_account"]').typeahead({source: data});
|
||||
});
|
||||
}
|
||||
if ($('input[name="category"]').length > 0) {
|
||||
$.getJSON('json/categories').success(function (data) {
|
||||
$('input[name="category"]').typeahead({source: data});
|
||||
});
|
||||
}
|
||||
|
||||
// Return a helper with preserved width of cells
|
||||
var fixHelper = function (e, ui) {
|
||||
ui.children().each(function () {
|
||||
$(this).width($(this).width());
|
||||
});
|
||||
return ui;
|
||||
};
|
||||
|
||||
$(document).ready(function () {
|
||||
if (typeof googleTablePaged != 'undefined') {
|
||||
googleTablePaged('table/transactions/' + what, 'transaction-table');
|
||||
}
|
||||
|
||||
// sortable!
|
||||
$(".sortable-table tbody").sortable(
|
||||
{
|
||||
helper: fixHelper,
|
||||
items: 'tr:not(.ignore)',
|
||||
stop: sortStop,
|
||||
handle: '.handle'
|
||||
}
|
||||
).disableSelection();
|
||||
});
|
||||
|
||||
function sortStop(event, ui) {
|
||||
var current = $(ui.item);
|
||||
var thisDate = current.data('date');
|
||||
var originalBG = current.css('backgroundColor');
|
||||
|
||||
|
||||
if (current.prev().data('date') != thisDate && current.next().data('date') != thisDate) {
|
||||
//console.log('False!');
|
||||
//console.log('[' + current.prev().data('date') + '] [' + thisDate + '] [' + current.next().data('date') + ']');
|
||||
// animate something with color:
|
||||
current.animate({
|
||||
backgroundColor: "#d9534f"
|
||||
}, 200, function () {
|
||||
$(this).animate({
|
||||
backgroundColor: originalBG
|
||||
}, 200);
|
||||
if ($('input[name="expense_account"]').length > 0) {
|
||||
$.getJSON('json/expense-accounts').success(function (data) {
|
||||
$('input[name="expense_account"]').typeahead({source: data});
|
||||
});
|
||||
}
|
||||
if ($('input[name="revenue_account"]').length > 0) {
|
||||
$.getJSON('json/revenue-accounts').success(function (data) {
|
||||
$('input[name="revenue_account"]').typeahead({source: data});
|
||||
});
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// do update
|
||||
var list = $('tr[data-date="' + thisDate + '"]');
|
||||
var submit = [];
|
||||
$.each(list, function (i, v) {
|
||||
var row = $(v);
|
||||
var id = row.data('id');
|
||||
submit.push(id);
|
||||
});
|
||||
if ($('input[name="description"]').length > 0 && what != undefined) {
|
||||
$.getJSON('json/transaction-journals/' + what).success(function (data) {
|
||||
$('input[name="description"]').typeahead({source: data});
|
||||
});
|
||||
}
|
||||
|
||||
// do extra animation when done?
|
||||
$.post('/transaction/reorder',{items: submit,date: thisDate,_token:token});
|
||||
console.log(submit);
|
||||
if ($('input[name="category"]').length > 0) {
|
||||
$.getJSON('json/categories').success(function (data) {
|
||||
$('input[name="category"]').typeahead({source: data});
|
||||
});
|
||||
}
|
||||
|
||||
//console.log('TRUE!');
|
||||
//console.log('[' + current.prev().data('date') + '] [' + thisDate + '] [' + current.next().data('date') + ']');
|
||||
|
||||
current.animate({
|
||||
backgroundColor: "#5cb85c"
|
||||
}, 200, function () {
|
||||
$(this).animate({
|
||||
backgroundColor: originalBG
|
||||
}, 200);
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
//else update some order thing bla bla.
|
||||
//check if the item above OR under this one have the same date
|
||||
//if not. return false
|
||||
|
||||
}
|
||||
});
|
41
public/manifest.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"name": "geld.nder.be",
|
||||
"icons": [
|
||||
{
|
||||
"src": "\/android-chrome-36x36.png?v=Lb54KlrQnz",
|
||||
"sizes": "36x36",
|
||||
"type": "image\/png",
|
||||
"density": "0.75"
|
||||
},
|
||||
{
|
||||
"src": "\/android-chrome-48x48.png?v=Lb54KlrQnz",
|
||||
"sizes": "48x48",
|
||||
"type": "image\/png",
|
||||
"density": "1.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-chrome-72x72.png?v=Lb54KlrQnz",
|
||||
"sizes": "72x72",
|
||||
"type": "image\/png",
|
||||
"density": "1.5"
|
||||
},
|
||||
{
|
||||
"src": "\/android-chrome-96x96.png?v=Lb54KlrQnz",
|
||||
"sizes": "96x96",
|
||||
"type": "image\/png",
|
||||
"density": "2.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-chrome-144x144.png?v=Lb54KlrQnz",
|
||||
"sizes": "144x144",
|
||||
"type": "image\/png",
|
||||
"density": "3.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-chrome-192x192.png?v=Lb54KlrQnz",
|
||||
"sizes": "192x192",
|
||||
"type": "image\/png",
|
||||
"density": "4.0"
|
||||
}
|
||||
]
|
||||
}
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.8 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.4 KiB |
@ -58,5 +58,5 @@
|
||||
<script type="text/javascript" src="js/accounts.js"></script>
|
||||
|
||||
<script src="js/jquery-ui.min.js" type="text/javascript"></script>
|
||||
<script src="js/transactions.js" type="text/javascript"></script>
|
||||
<script src="js/accounts.js" type="text/javascript"></script>
|
||||
@stop
|
||||
|
@ -28,22 +28,24 @@
|
||||
|
||||
@yield('styles')
|
||||
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="/apple-touch-icon-57x57.png">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="/apple-touch-icon-60x60.png">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="/apple-touch-icon-72x72.png">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="/apple-touch-icon-76x76.png">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="/apple-touch-icon-114x114.png">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="/apple-touch-icon-120x120.png">
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="/apple-touch-icon-144x144.png">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="/apple-touch-icon-152x152.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-180x180.png">
|
||||
<link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
|
||||
<link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
|
||||
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
|
||||
<link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
|
||||
<link rel="manifest" href="/android-chrome-manifest.json">
|
||||
<meta name="msapplication-TileColor" content="#2b5797">
|
||||
<meta name="msapplication-TileImage" content="/mstile-144x144.png">
|
||||
<!-- favicons -->
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="/apple-touch-icon-57x57.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="/apple-touch-icon-60x60.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="/apple-touch-icon-72x72.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="/apple-touch-icon-76x76.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="/apple-touch-icon-114x114.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="/apple-touch-icon-120x120.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="/apple-touch-icon-144x144.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="/apple-touch-icon-152x152.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-180x180.png?v=Lb54KlrQnz">
|
||||
<link rel="icon" type="image/png" href="/favicon-32x32.png?v=Lb54KlrQnz" sizes="32x32">
|
||||
<link rel="icon" type="image/png" href="/android-chrome-192x192.png?v=Lb54KlrQnz" sizes="192x192">
|
||||
<link rel="icon" type="image/png" href="/favicon-96x96.png?v=Lb54KlrQnz" sizes="96x96">
|
||||
<link rel="icon" type="image/png" href="/favicon-16x16.png?v=Lb54KlrQnz" sizes="16x16">
|
||||
<link rel="manifest" href="/manifest.json?v=Lb54KlrQnz">
|
||||
<link rel="shortcut icon" href="/favicon.ico?v=Lb54KlrQnz">
|
||||
<meta name="msapplication-TileColor" content="#2d89ef">
|
||||
<meta name="msapplication-TileImage" content="/mstile-144x144.png?v=Lb54KlrQnz">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<!-- {{App::environment()}} -->
|
||||
|
@ -20,23 +20,28 @@
|
||||
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
|
||||
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="/apple-touch-icon-57x57.png">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="/apple-touch-icon-60x60.png">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="/apple-touch-icon-72x72.png">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="/apple-touch-icon-76x76.png">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="/apple-touch-icon-114x114.png">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="/apple-touch-icon-120x120.png">
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="/apple-touch-icon-144x144.png">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="/apple-touch-icon-152x152.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-180x180.png">
|
||||
<link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
|
||||
<link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
|
||||
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
|
||||
<link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
|
||||
<link rel="manifest" href="/android-chrome-manifest.json">
|
||||
<meta name="msapplication-TileColor" content="#2b5797">
|
||||
<meta name="msapplication-TileImage" content="/mstile-144x144.png">
|
||||
|
||||
<!-- favicons -->
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="/apple-touch-icon-57x57.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="/apple-touch-icon-60x60.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="/apple-touch-icon-72x72.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="/apple-touch-icon-76x76.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="/apple-touch-icon-114x114.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="/apple-touch-icon-120x120.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="/apple-touch-icon-144x144.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="/apple-touch-icon-152x152.png?v=Lb54KlrQnz">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-180x180.png?v=Lb54KlrQnz">
|
||||
<link rel="icon" type="image/png" href="/favicon-32x32.png?v=Lb54KlrQnz" sizes="32x32">
|
||||
<link rel="icon" type="image/png" href="/android-chrome-192x192.png?v=Lb54KlrQnz" sizes="192x192">
|
||||
<link rel="icon" type="image/png" href="/favicon-96x96.png?v=Lb54KlrQnz" sizes="96x96">
|
||||
<link rel="icon" type="image/png" href="/favicon-16x16.png?v=Lb54KlrQnz" sizes="16x16">
|
||||
<link rel="manifest" href="/manifest.json?v=Lb54KlrQnz">
|
||||
<link rel="shortcut icon" href="/favicon.ico?v=Lb54KlrQnz">
|
||||
<meta name="msapplication-TileColor" content="#2d89ef">
|
||||
<meta name="msapplication-TileImage" content="/mstile-144x144.png?v=Lb54KlrQnz">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
<!-- {{App::environment()}} -->
|
||||
</head>
|
||||
<body>
|
||||
|
@ -161,9 +161,6 @@
|
||||
<li>
|
||||
<a @if($isBill)class="active"@endif href="{{route('bills.index')}}"><i class="fa fa-calendar-o fa-fw"></i> Bills</a>
|
||||
</li>
|
||||
<li>
|
||||
<a @if($isRep)class="active"@endif href="{{route('repeated.index')}}"><i class="fa fa-rotate-left fa-fw"></i> Repeated expenses</a>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- /.nav-second-level -->
|
||||
</li>
|
||||
|
@ -1,58 +0,0 @@
|
||||
@extends('layouts.default')
|
||||
@section('content')
|
||||
{!! Breadcrumbs::renderIfExists(Route::getCurrentRoute()->getName()) !!}
|
||||
{!! Form::open(['class' => 'form-horizontal','id' => 'store','url' => route('repeated.store')]) !!}
|
||||
|
||||
<input type="hidden" name="repeats" value="1" />
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-6 col-md-12 col-sm-6">
|
||||
<div class="panel panel-primary">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-fw fa-exclamation"></i> Mandatory fields
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
|
||||
{!! ExpandedForm::text('name') !!}
|
||||
{!! ExpandedForm::select('account_id',$accounts,null,['label' => 'Save on account']) !!}
|
||||
{!! ExpandedForm::amount('targetamount') !!}
|
||||
{!! ExpandedForm::date('targetdate',null,['label' => 'First target date']) !!}
|
||||
{!! ExpandedForm::select('rep_length',$periods,'month',['label' => 'Repeats every']) !!}
|
||||
{!! ExpandedForm::integer('rep_every',0,['label' => 'Skip period']) !!}
|
||||
{!! ExpandedForm::integer('rep_times',0,['label' => 'Repeat times']) !!}
|
||||
</div>
|
||||
</div>
|
||||
<p>
|
||||
<button type="submit" class="btn btn-lg btn-success">
|
||||
<i class="fa fa-plus-circle"></i> Store new repeated expense
|
||||
</button>
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-lg-6 col-md-12 col-sm-12">
|
||||
<!-- panel for optional fields -->
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-smile-o"></i> Optional fields
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
|
||||
{!! ExpandedForm::checkbox('remind_me','1',false,['label' => 'Remind me']) !!}
|
||||
{!! ExpandedForm::select('reminder',$periods,'month',['label' => 'Remind every']) !!}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- panel for options -->
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-bolt"></i> Options
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{!! ExpandedForm::optionsList('create','repeated expense') !!}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{!! Form::close() !!}
|
||||
@stop
|
@ -1,37 +0,0 @@
|
||||
@extends('layouts.default')
|
||||
@section('content')
|
||||
{!! Breadcrumbs::renderIfExists(Route::getCurrentRoute()->getName(), $repeatedExpense) !!}
|
||||
{!! Form::open(['class' => 'form-horizontal','id' => 'destroy','url' => route('repeated.destroy',$repeatedExpense->id)]) !!}
|
||||
<div class="row">
|
||||
<div class="col-lg-6 col-md-12 col-sm-12">
|
||||
<div class="panel panel-red">
|
||||
<div class="panel-heading">
|
||||
Delete repeated expense "{{{$repeatedExpense->name}}}"
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<p>
|
||||
Are you sure?
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<button type="submit" class="btn btn-default btn-danger">Delete permanently</button>
|
||||
<a href="{{URL::previous()}}" class="btn-default btn">Cancel</a >
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-6">
|
||||
<div class="form-group">
|
||||
<div class="col-sm-8">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
{!! Form::close() !!}
|
||||
@stop
|
@ -1,58 +0,0 @@
|
||||
@extends('layouts.default')
|
||||
@section('content')
|
||||
{!! Breadcrumbs::renderIfExists(Route::getCurrentRoute()->getName(), $repeatedExpense) !!}
|
||||
{!! Form::model($repeatedExpense, ['class' => 'form-horizontal','id' => 'update','url' => route('repeated.update',$repeatedExpense->id)]) !!}
|
||||
|
||||
<input type="hidden" name="id" value="{{$repeatedExpense->id}}" />
|
||||
<input type="hidden" name="repeats" value="0" />
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-6 col-md-12 col-sm-6">
|
||||
<div class="panel panel-primary">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-fw fa-exclamation"></i> Mandatory fields
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{!! ExpandedForm::text('name') !!}
|
||||
{!! ExpandedForm::select('account_id',$accounts,null,['label' => 'Save on account']) !!}
|
||||
{!! ExpandedForm::amount('targetamount') !!}
|
||||
{!! ExpandedForm::date('targetdate',null,['label' => 'First target date']) !!}
|
||||
{!! ExpandedForm::select('rep_length',$periods,null,['label' => 'Repeats every']) !!}
|
||||
{!! ExpandedForm::integer('rep_every',null,['label' => 'Skip period']) !!}
|
||||
{!! ExpandedForm::integer('rep_times',null,['label' => 'Repeat times']) !!}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<p>
|
||||
<button type="submit" class="btn btn-lg btn-success">
|
||||
<i class="fa fa-pencil"></i> Update repeated expense
|
||||
</button>
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-lg-6 col-md-12 col-sm-12">
|
||||
<!-- panel for optional fields -->
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-smile-o"></i> Optional fields
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{!! ExpandedForm::checkbox('remind_me','1',$preFilled['remind_me'],['label' => 'Remind me']) !!}
|
||||
{!! ExpandedForm::select('reminder',$periods,$preFilled['reminder'],['label' => 'Remind every']) !!}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- panel for options -->
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<i class="fa fa-bolt"></i> Options
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{!! ExpandedForm::optionsList('update','piggy bank') !!}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{!! Form::close() !!}
|
||||
@stop
|
@ -1,69 +0,0 @@
|
||||
@extends('layouts.default')
|
||||
@section('content')
|
||||
{!! Breadcrumbs::renderIfExists(Route::getCurrentRoute()->getName()) !!}
|
||||
<div class="row">
|
||||
<div class="col-lg-12 col-md-12 col-sm-12">
|
||||
<p>
|
||||
<a class="btn btn-success" href="{{route('repeated.create')}}">Create new repeated expense</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@foreach($expenses as $entry)
|
||||
<div class="row">
|
||||
<div class="col-lg-12 col-md-12 col-sm-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<a href="{{route('repeated.show',$entry->id)}}" title="{{{$entry->name}}}">{{{$entry->name}}}</a>
|
||||
({!! Amount::format($entry->targetamount) !!})
|
||||
|
||||
<!-- ACTIONS MENU -->
|
||||
<div class="pull-right">
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown">
|
||||
Actions
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu pull-right" role="menu">
|
||||
<li><a href="{{route('repeated.edit',$entry->id)}}"><i class="fa fa-pencil fa-fw"></i> Edit</a></li>
|
||||
<li><a href="{{route('repeated.delete',$entry->id)}}"><i class="fa fa-trash fa-fw"></i> Delete</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="progress progress-striped">
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="{{Steam::percentage($entry,$entry->currentRep)}}" aria-valuemin="0" aria-valuemax="100" style="width: {{Steam::percentage($entry,$entry->currentRep)}}%; min-width:15px;">
|
||||
@if(Steam::percentage($entry,$entry->currentRep) > 30)
|
||||
{{Amount::format($entry->currentRep->currentamount,false)}}
|
||||
@endif
|
||||
</div>
|
||||
@if(Steam::percentage($entry,$entry->currentRep) <= 30)
|
||||
<small>{{Amount::format($entry->currentRep->currentamount,false)}}</small>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-footer">
|
||||
<small>{{$entry->currentRep->startdate->format('j F Y')}} to {{$entry->currentRep->targetdate->format('j F Y')}}</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-12 col-md-12 col-sm-12">
|
||||
<p>
|
||||
<a class="btn btn-success" href="{{route('repeated.create')}}">Create new repeated expense</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
@stop
|
||||
@section('scripts')
|
||||
@stop
|
@ -1,61 +0,0 @@
|
||||
@extends('layouts.default')
|
||||
@section('content')
|
||||
{!! Breadcrumbs::renderIfExists(Route::getCurrentRoute()->getName(), $repeatedExpense) !!}
|
||||
<div class="row">
|
||||
<div class="col-lg-12 col-md-12 col-sm-12">
|
||||
@foreach($repetitions as $rep)
|
||||
<?php
|
||||
$barSize = floor(12 / $rep->bars->count()) == 0 ? 1 : floor(12 / $rep->bars->count());
|
||||
?>
|
||||
|
||||
|
||||
<div class="panel
|
||||
@if($today > $rep->startdate && $today < $rep->targetdate)
|
||||
panel-primary
|
||||
@else
|
||||
panel-default
|
||||
@endif
|
||||
">
|
||||
<div class="panel-heading">
|
||||
Repetition from {{$rep->startdate->format('j F Y')}} to {{$rep->targetdate->format('j F Y')}}
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<p>
|
||||
Target amount: {!! Amount::format($repeatedExpense->targetamount) !!}. Currently saved: {!! Amount::format($rep->currentamount) !!}.
|
||||
</p>
|
||||
<div class="row">
|
||||
@foreach($rep->bars as $bar)
|
||||
<div class="col-lg-{{$barSize}} col-md-{{$barSize}} col-sm-{{$barSize}}">
|
||||
<div class="progress">
|
||||
<!-- currentAmount:{{$bar->getCurrentAmount()}} getAmount:{{$bar->getCumulativeAmount()}} -->
|
||||
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="{{$bar->percentage()}}" aria-valuemin="0" aria-valuemax="100" style="width: {{$bar->percentage()}}%;">
|
||||
@if($bar->percentage() > 50 && $bar->percentage() == 100)
|
||||
@if($bar->hasReminder() && $bar->getReminder()->active == 1)
|
||||
<a href="{{route('reminders.show',$bar->getReminder()->id)}}" style="color:#fff;"><i class="fa fa-fw fa-clock-o"></i></a>
|
||||
@endif
|
||||
@if($bar->hasReminder() && $bar->getReminder()->active == 0 && $bar->getReminder()->notnow == 0)
|
||||
<i class="fa fa-fw fa-thumbs-up"></i>
|
||||
@endif
|
||||
@if($bar->hasReminder() && $bar->getReminder()->active == 0 && $bar->getReminder()->notnow == 1)
|
||||
<i class="fa fa-fw fa-thumbs-down"></i>
|
||||
@endif
|
||||
@endif
|
||||
@if($bar->percentage() > 50 && $bar->percentage() < 100)
|
||||
{{Amount::format($rep->currentamount,false)}}
|
||||
@endif
|
||||
</div>
|
||||
<div class="progress-bar progress-bar-info" role="progressbar" aria-valuenow="{{100-$bar->percentage()}}" aria-valuemin="0" aria-valuemax="100" style="width: {{100-$bar->percentage()}}%;"></div>
|
||||
</div>
|
||||
<p class="small">
|
||||
{{$bar->getStartDate()->format('j F Y')}} — {{$bar->getTargetDate()->format('j F Y')}}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
@stop
|
@ -60,10 +60,13 @@
|
||||
$accountSums = [];
|
||||
?>
|
||||
@foreach($accounts as $account)
|
||||
@if($account->hide === false)
|
||||
<th><a href="{{route('accounts.show',$account->id)}}">{{{$account->name}}}</a></th>
|
||||
<?php
|
||||
@endif
|
||||
<?php
|
||||
$accountSums[$account->id] = 0;
|
||||
?>
|
||||
|
||||
@endforeach
|
||||
<th colspan="2">
|
||||
Left in budget
|
||||
@ -75,22 +78,24 @@
|
||||
<td>{!! Amount::format($budget['amount']) !!}</td>
|
||||
<?php $spent = 0;?>
|
||||
@foreach($accounts as $account)
|
||||
@if(isset($account->budgetInformation[$id]))
|
||||
<td>
|
||||
@if($id == 0)
|
||||
<a href="{{route('reports.no-budget',[$account, $year, $month])}}" class="openModal">
|
||||
{!! Amount::format($account->budgetInformation[$id]['amount']) !!}
|
||||
</a>
|
||||
@else
|
||||
{!! Amount::format($account->budgetInformation[$id]['amount']) !!}
|
||||
@endif
|
||||
</td>
|
||||
<?php
|
||||
$spent += floatval($account->budgetInformation[$id]['amount']);
|
||||
$accountSums[$account->id] += floatval($account->budgetInformation[$id]['amount']);
|
||||
?>
|
||||
@else
|
||||
<td>{!! Amount::format(0) !!}</td>
|
||||
@if($account->hide === false)
|
||||
@if(isset($account->budgetInformation[$id]))
|
||||
<td>
|
||||
@if($id == 0)
|
||||
<a href="{{route('reports.no-budget',[$account, $year, $month])}}" class="openModal">
|
||||
{!! Amount::format($account->budgetInformation[$id]['amount']) !!}
|
||||
</a>
|
||||
@else
|
||||
{!! Amount::format($account->budgetInformation[$id]['amount']) !!}
|
||||
@endif
|
||||
</td>
|
||||
<?php
|
||||
$spent += floatval($account->budgetInformation[$id]['amount']);
|
||||
$accountSums[$account->id] += floatval($account->budgetInformation[$id]['amount']);
|
||||
?>
|
||||
@else
|
||||
<td>{!! Amount::format(0) !!}</td>
|
||||
@endif
|
||||
@endif
|
||||
@endforeach
|
||||
<td>{!! Amount::format($budget['amount'] + $budget['spent']) !!}</td>
|
||||
@ -100,9 +105,11 @@
|
||||
<tr>
|
||||
<td colspan="2">Balanced by transfers</td>
|
||||
@foreach($accounts as $account)
|
||||
<td>
|
||||
<a href="{{route('reports.balanced-transfers',[$account, $year, $month])}}" class="openModal">{!! Amount::format($account->balancedAmount) !!}</a>
|
||||
</td>
|
||||
@if($account->hide === false)
|
||||
<td>
|
||||
<a href="{{route('reports.balanced-transfers',[$account, $year, $month])}}" class="openModal">{!! Amount::format($account->balancedAmount) !!}</a>
|
||||
</td>
|
||||
@endif
|
||||
@endforeach
|
||||
<td colspan="2"> </td>
|
||||
</tr>
|
||||
@ -112,16 +119,18 @@
|
||||
<?php
|
||||
$accountSums[$account->id] += $account->balancedAmount;
|
||||
?>
|
||||
@if(isset($account->budgetInformation[0]))
|
||||
<td>
|
||||
@if($account->budgetInformation[0]['amount'] + $account->balancedAmount != 0.0)
|
||||
<a href="{{route('reports.left-unbalanced',[$account, $year, $month])}}" class="openModal">{!! Amount::format($account->budgetInformation[0]['amount'] + $account->balancedAmount) !!}</a>
|
||||
@else
|
||||
{!! Amount::format($account->budgetInformation[0]['amount'] + $account->balancedAmount) !!}
|
||||
@endif
|
||||
</td>
|
||||
@else
|
||||
<td>{!! Amount::format(0) !!}</td>
|
||||
@if($account->hide === false)
|
||||
@if(isset($account->budgetInformation[0]))
|
||||
<td>
|
||||
@if($account->budgetInformation[0]['amount'] + $account->balancedAmount != 0.0)
|
||||
<a href="{{route('reports.left-unbalanced',[$account, $year, $month])}}" class="openModal">{!! Amount::format($account->budgetInformation[0]['amount'] + $account->balancedAmount) !!}</a>
|
||||
@else
|
||||
{!! Amount::format($account->budgetInformation[0]['amount'] + $account->balancedAmount) !!}
|
||||
@endif
|
||||
</td>
|
||||
@else
|
||||
<td>{!! Amount::format(0) !!}</td>
|
||||
@endif
|
||||
@endif
|
||||
@endforeach
|
||||
<td colspan="2"> </td>
|
||||
@ -129,14 +138,18 @@
|
||||
<tr>
|
||||
<td colspan="2"><em>Sum</em></td>
|
||||
@foreach($accounts as $account)
|
||||
<td>{!! Amount::format($accountSums[$account->id]) !!}</td>
|
||||
@if($account->hide === false)
|
||||
<td>{!! Amount::format($accountSums[$account->id]) !!}</td>
|
||||
@endif
|
||||
@endforeach
|
||||
<td colspan="2"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">Expected balance</td>
|
||||
@foreach($accounts as $account)
|
||||
<td>{!! Amount::format($account->startBalance + $accountSums[$account->id]) !!}</td>
|
||||
@if($account->hide === false)
|
||||
<td>{!! Amount::format($account->startBalance + $accountSums[$account->id]) !!}</td>
|
||||
@endif
|
||||
@endforeach
|
||||
<td colspan="2"> </td>
|
||||
</tr>
|
||||
|
@ -138,6 +138,8 @@
|
||||
$sumEnvelope += $budget['amount'];
|
||||
$sumLeft += $budget['amount'] + $budget['spent'];
|
||||
?>
|
||||
<!-- only display when relevant: -->
|
||||
@if($budget['amount'] != 0 || $budget['spent'] != 0)
|
||||
<tr>
|
||||
<td>
|
||||
@if($id > 0)
|
||||
@ -150,6 +152,7 @@
|
||||
<td>{!! Amount::format($budget['spent'],false) !!}</td>
|
||||
<td>{!! Amount::format($budget['amount'] + $budget['spent']) !!}</td>
|
||||
</tr>
|
||||
@endif
|
||||
@endforeach
|
||||
<tr>
|
||||
<td><em>Sum</em></td>
|
||||
|
@ -54,17 +54,19 @@
|
||||
$end += $balance['end'];
|
||||
$diff += ($balance['end']-$balance['start']);
|
||||
?>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{route('accounts.show',$balance['account']->id)}}">{{{$balance['account']->name}}}</a>
|
||||
@if($balance['shared'])
|
||||
<small><em>shared</em></small>
|
||||
@endif
|
||||
</td>
|
||||
<td>{!! Amount::format($balance['start']) !!}</td>
|
||||
<td>{!! Amount::format($balance['end']) !!}</td>
|
||||
<td>{!! Amount::format($balance['end']-$balance['start']) !!}</td>
|
||||
</tr>
|
||||
@if($balance['hide'] === false)
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{route('accounts.show',$balance['account']->id)}}">{{{$balance['account']->name}}}</a>
|
||||
@if($balance['shared'])
|
||||
<small><em>shared</em></small>
|
||||
@endif
|
||||
</td>
|
||||
<td>{!! Amount::format($balance['start']) !!}</td>
|
||||
<td>{!! Amount::format($balance['end']) !!}</td>
|
||||
<td>{!! Amount::format($balance['end']-$balance['start']) !!}</td>
|
||||
</tr>
|
||||
@endif
|
||||
@endforeach
|
||||
<tr>
|
||||
<td><em>Sum of sums</em></td>
|
||||
|
@ -92,6 +92,9 @@
|
||||
|
||||
@stop
|
||||
@section('scripts')
|
||||
<script type="text/javascript">
|
||||
var what = "{{$what}}";
|
||||
</script>
|
||||
<script type="text/javascript" src="js/bootstrap3-typeahead.min.js"></script>
|
||||
<script type="text/javascript" src="js/transactions.js"></script>
|
||||
@stop
|
||||
|
@ -152,9 +152,6 @@
|
||||
|
||||
@stop
|
||||
@section('scripts')
|
||||
<script type="text/javascript">
|
||||
var token = "{{csrf_token()}}";
|
||||
</script>
|
||||
<script type="text/javascript" src="js/transactions.js"></script>
|
||||
<script type="text/javascript" src="js/related-manager.js"></script>
|
||||
@stop
|
||||
|
76
tests/controllers/AccountControllerTest.php
Normal file
@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Generated by PHPUnit_SkeletonGenerator on 2015-03-08 at 20:05:14.
|
||||
*/
|
||||
class AccountControllerTest extends TestCase
|
||||
{
|
||||
|
||||
/**
|
||||
* Sets up the fixture, for example, opens a network connection.
|
||||
* This method is called before a test is executed.
|
||||
*/
|
||||
public function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
$this->be(FireflyIII\User::whereEmail('thegrumpydictator@gmail.com')->first());
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Tears down the fixture, for example, closes a network connection.
|
||||
* This method is called after a test is executed.
|
||||
*/
|
||||
public function tearDown()
|
||||
{
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
|
||||
public function testCreate()
|
||||
{
|
||||
$response = $this->call('GET', '/accounts/create/asset');
|
||||
$this->assertResponseOk();
|
||||
$this->assertViewHas('subTitle', 'Create a new asset account');
|
||||
$this->assertViewHas('subTitleIcon', 'fa-money');
|
||||
$this->assertViewHas('what', 'asset');
|
||||
|
||||
}
|
||||
|
||||
public function testDelete()
|
||||
{
|
||||
$this->markTestIncomplete();
|
||||
}
|
||||
|
||||
public function testDestroy()
|
||||
{
|
||||
$this->markTestIncomplete();
|
||||
}
|
||||
|
||||
public function testEdit()
|
||||
{
|
||||
$this->markTestIncomplete();
|
||||
}
|
||||
|
||||
public function testIndex()
|
||||
{
|
||||
$this->markTestIncomplete();
|
||||
}
|
||||
|
||||
public function testShow()
|
||||
{
|
||||
$this->markTestIncomplete();
|
||||
}
|
||||
|
||||
public function testStore()
|
||||
{
|
||||
$this->markTestIncomplete();
|
||||
}
|
||||
|
||||
public function testUpdate()
|
||||
{
|
||||
$this->markTestIncomplete();
|
||||
}
|
||||
|
||||
}
|
@ -29,19 +29,47 @@ class HomeControllerTest extends TestCase
|
||||
/**
|
||||
* @covers FireflyIII\Http\Controllers\HomeController::dateRange
|
||||
*/
|
||||
public function testDateRange()
|
||||
public function testDateRangeWarning()
|
||||
{
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete('This test has not been implemented yet.');
|
||||
$start = '2014-03-01';
|
||||
$end = '2015-03-31';
|
||||
|
||||
$this->be(FireflyIII\User::whereEmail('thegrumpydictator@gmail.com')->first());
|
||||
$this->call('POST', '/daterange', ['end' => $end, 'start' => $start,'_token' => 'replaceme']);
|
||||
$this->assertResponseOk();
|
||||
|
||||
$this->assertSessionHas('start');
|
||||
$this->assertSessionHas('end');
|
||||
$this->assertSessionHas('warning');
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers FireflyIII\Http\Controllers\HomeController::flush
|
||||
* @covers FireflyIII\Http\Controllers\HomeController::dateRange
|
||||
*/
|
||||
public function testFlush()
|
||||
public function testDateRange()
|
||||
{
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete('This test has not been implemented yet.');
|
||||
$start = '2015-03-01';
|
||||
$end = '2015-03-31';
|
||||
|
||||
$this->be(FireflyIII\User::whereEmail('thegrumpydictator@gmail.com')->first());
|
||||
$this->call('POST', '/daterange', ['end' => $end, 'start' => $start,'_token' => 'replaceme']);
|
||||
$this->assertResponseOk();
|
||||
|
||||
$this->assertSessionHas('start');
|
||||
$this->assertSessionHas('end');
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers FireflyIII\Http\Controllers\HomeController::index
|
||||
*/
|
||||
public function testIndexLoggedIn()
|
||||
{
|
||||
$this->be(FireflyIII\User::whereEmail('thegrumpydictator@gmail.com')->first());
|
||||
$response = $this->call('GET', '/');
|
||||
$this->assertResponseOk();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -54,15 +82,4 @@ class HomeControllerTest extends TestCase
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers FireflyIII\Http\Controllers\HomeController::index
|
||||
*/
|
||||
public function testIndexLoggedIn()
|
||||
{
|
||||
$this->be(new FireflyIII\User);
|
||||
$response = $this->call('GET', '/');
|
||||
$this->assertResponseOk();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|