Started work on recurring transactions controller. [skip ci]

This commit is contained in:
James Cole 2014-08-06 17:02:02 +02:00
parent 5e809633e3
commit 23d69c0dd9
12 changed files with 146 additions and 39 deletions

View File

@ -1,7 +1,15 @@
<?php
use Firefly\Storage\RecurringTransaction\RecurringTransactionRepositoryInterface as RTR;
class RecurringController extends BaseController
{
protected $_repository;
public function __construct(RTR $repository)
{
$this->_repository = $repository;
View::share('menu', 'home');
}
public function create()
{
}
@ -20,6 +28,8 @@ class RecurringController extends BaseController
public function index()
{
$list = $this->_repository->get();
return View::make('recurring.index');
}
public function show()

View File

@ -18,10 +18,15 @@ class CreateRecurringTransactionsTable extends Migration {
$table->timestamps();
$table->integer('user_id')->unsigned();
$table->string('name',50);
$table->string('match',255);
$table->decimal('amount_max',10,2);
$table->decimal('amount_min',10,2);
$table->date('date');
$table->boolean('active');
$table->boolean('automatch');
$table->enum('repeat_freq', ['daily', 'weekly','monthly','quarterly','half-year','yearly']);
$table->smallInteger('skip')->unsigned();
$table->unique(['user_id','name']);

View File

@ -17,6 +17,7 @@ class RecurringTransactionsToComponents extends Migration {
$table->increments('id');
$table->integer('component_id')->unsigned();
$table->integer('recurring_transaction_id')->unsigned();
$table->boolean('optional');
// link components with component_id
$table->foreign('component_id')

View File

@ -0,0 +1,15 @@
<?php
namespace Firefly\Storage\RecurringTransaction;
use Carbon\Carbon;
class EloquentRecurringTransactionRepository implements RecurringTransactionRepositoryInterface
{
public function get() {
return \Auth::user()->recurringtransactions()->get();
}
}

View File

@ -0,0 +1,13 @@
<?php
namespace Firefly\Storage\RecurringTransaction;
interface RecurringTransactionRepositoryInterface
{
public function get();
}

View File

@ -31,6 +31,11 @@ class StorageServiceProvider extends ServiceProvider
'Firefly\Storage\Piggybank\EloquentPiggybankRepository'
);
$this->app->bind(
'Firefly\Storage\RecurringTransaction\RecurringTransactionRepositoryInterface',
'Firefly\Storage\RecurringTransaction\EloquentRecurringTransactionRepository'
);
$this->app->bind(
'Firefly\Storage\Account\AccountRepositoryInterface',

View File

@ -0,0 +1,33 @@
<?php
use LaravelBook\Ardent\Ardent;
class RecurringTransaction extends Ardent
{
public static $rules
= [
'user_id' => 'required|exists:users,id',
'name' => 'required|between:1,255',
'match' => 'required',
'amount_max' => 'required|between:0,65536',
'amount_min' => 'required|between:0,65536',
'date' => 'required|date',
'active' => 'required|between:0,1',
'automatch' => 'required|between:0,1',
'repeat_freq' => 'required|in:daily,weekly,monthly,quarterly,half-year,yearly',
'skip' => 'required|between:0,31',
];
public static $factory
= [
'user_id' => 'factory|User',
'name' => 'string',
'data' => 'string'
];
public function user()
{
return $this->belongsTo('User');
}
}

View File

@ -73,6 +73,11 @@ class User extends Ardent implements UserInterface, RemindableInterface
return $this->hasMany('Account');
}
public function recurringtransactions()
{
return $this->hasMany('RecurringTransaction');
}
public function piggybanks()
{
return $this->hasMany('Piggybank');

View File

@ -110,10 +110,14 @@ Route::group(['before' => 'auth'], function () {
Route::get('/', ['uses' => 'HomeController@index', 'as' => 'index']);
Route::get('/flush', ['uses' => 'HomeController@flush', 'as' => 'flush']);
// JSON controller:
Route::get('/json/beneficiaries', ['uses' => 'JsonController@beneficiaries', 'as' => 'json.beneficiaries']);
Route::get('/json/categories', ['uses' => 'JsonController@categories', 'as' => 'json.categories']);
// Categories controller:
// limit controller:
Route::get('/budgets/limits/create/{budget?}',['uses' => 'LimitController@create','as' => 'budgets.limits.create']);
Route::get('/budgets/limits/delete/{limit}',['uses' => 'LimitController@delete','as' => 'budgets.limits.delete']);
Route::get('/budgets/limits/edit/{limit}',['uses' => 'LimitController@edit','as' => 'budgets.limits.edit']);
// piggy bank controller
Route::get('/piggybanks',['uses' => 'PiggybankController@index','as' => 'piggybanks.index']);
@ -126,26 +130,12 @@ Route::group(['before' => 'auth'], function () {
// preferences controller
Route::get('/preferences', ['uses' => 'PreferencesController@index', 'as' => 'preferences']);
// user controller
Route::get('/logout', ['uses' => 'UserController@logout', 'as' => 'logout']);
//profile controller
Route::get('/profile', ['uses' => 'ProfileController@index', 'as' => 'profile']);
Route::get('/profile/change-password',['uses' => 'ProfileController@changePassword', 'as' => 'change-password']);
// limit controller:
Route::get('/budgets/limits/create/{budget?}',['uses' => 'LimitController@create','as' => 'budgets.limits.create']);
Route::get('/budgets/limits/delete/{limit}',['uses' => 'LimitController@delete','as' => 'budgets.limits.delete']);
Route::get('/budgets/limits/edit/{limit}',['uses' => 'LimitController@edit','as' => 'budgets.limits.edit']);
// JSON controller:
Route::get('/json/beneficiaries', ['uses' => 'JsonController@beneficiaries', 'as' => 'json.beneficiaries']);
Route::get('/json/categories', ['uses' => 'JsonController@categories', 'as' => 'json.categories']);
// recurring transactions controller
Route::get('/recurring',['uses' => 'RecurringController@index', 'as' => 'recurring.index']);
// transaction controller:
Route::get('/transactions/create/{what}', ['uses' => 'TransactionController@create', 'as' => 'transactions.create'])->where(['what' => 'withdrawal|deposit|transfer']);
@ -154,6 +144,9 @@ Route::group(['before' => 'auth'], function () {
Route::get('/transaction/delete/{tj}',['uses' => 'TransactionController@delete','as' => 'transactions.delete']);
Route::get('/transactions/index',['uses' => 'TransactionController@index','as' => 'transactions.index']);
// user controller
Route::get('/logout', ['uses' => 'UserController@logout', 'as' => 'logout']);
// migration controller
Route::get('/migrate', ['uses' => 'MigrationController@index', 'as' => 'migrate']);
@ -177,43 +170,39 @@ Route::group(['before' => 'csrf|auth'], function () {
Route::post('/categories/update/{category}', ['uses' => 'CategoryController@update', 'as' => 'categories.update']);
Route::post('/categories/destroy/{category}', ['uses' => 'CategoryController@destroy', 'as' => 'categories.destroy']);
// profile controller
Route::post('/profile/change-password', ['uses' => 'ProfileController@postChangePassword']);
// limit controller:
Route::post('/budgets/limits/store/{budget?}', ['uses' => 'LimitController@store', 'as' => 'budgets.limits.store']);
Route::post('/budgets/limits/destroy/{id?}',['uses' => 'LimitController@destroy','as' => 'budgets.limits.destroy']);
Route::post('/budgets/limits/update/{id?}',['uses' => 'LimitController@update','as' => 'budgets.limits.update']);
// migration controller
Route::post('/migrate', ['uses' => 'MigrationController@postIndex']);
// piggy bank controller
Route::post('/piggybanks/store',['uses' => 'PiggybankController@store','as' => 'piggybanks.store']);
Route::post('/piggybanks/update', ['uses' => 'PiggybankController@update','as' => 'piggybanks.update']);
Route::post('/piggybanks/destroy/{piggybank}', ['uses' => 'PiggybankController@destroy','as' => 'piggybanks.destroy']);
// preferences controller
Route::post('/preferences', ['uses' => 'PreferencesController@postIndex']);
// limit controller:
Route::post('/budgets/limits/store/{budget?}', ['uses' => 'LimitController@store', 'as' => 'budgets.limits.store']);
Route::post('/budgets/limits/destroy/{id?}',['uses' => 'LimitController@destroy','as' => 'budgets.limits.destroy']);
Route::post('/budgets/limits/update/{id?}',['uses' => 'LimitController@update','as' => 'budgets.limits.update']);
// profile controller
Route::post('/profile/change-password', ['uses' => 'ProfileController@postChangePassword']);
// transaction controller:
Route::post('/transactions/store/{what}', ['uses' => 'TransactionController@store', 'as' => 'transactions.store'])
->where(['what' => 'withdrawal|deposit|transfer']);
Route::post('/transactions/store/{what}', ['uses' => 'TransactionController@store', 'as' => 'transactions.store'])->where(['what' => 'withdrawal|deposit|transfer']);
Route::post('/transaction/update/{tj}',['uses' => 'TransactionController@update','as' => 'transactions.update']);
Route::post('/transaction/destroy/{tj}',['uses' => 'TransactionController@destroy','as' => 'transactions.destroy']);
// migration controller
Route::post('/migrate', ['uses' => 'MigrationController@postIndex']);
}
);
// guest routes:
Route::group(['before' => 'guest'], function () {
// dev import route:
Route::get('/dev',['uses' => 'MigrationController@dev']);
// user controller
Route::get('/login', ['uses' => 'UserController@login', 'as' => 'login']);
Route::get('/register', ['uses' => 'UserController@register', 'as' => 'register']);
@ -221,9 +210,7 @@ Route::group(['before' => 'guest'], function () {
Route::get('/reset/{reset}', ['uses' => 'UserController@reset', 'as' => 'reset']);
Route::get('/remindme', ['uses' => 'UserController@remindme', 'as' => 'remindme']);
// dev import route:
Route::get('/dev',['uses' => 'MigrationController@dev']);
Route::get('/limit',['uses' => 'MigrationController@limit']);
}
);

View File

@ -27,6 +27,7 @@ $r = Route::current()->getName();
<li class="divider"></li>
<li><a href="{{route('transactions.index')}}"><span class="glyphicon glyphicon-list-alt"></span> Transactions</a></li>
<li><a href="{{route('recurring.index')}}"><span class="glyphicon glyphicon-refresh"></span> Recurring transactions</a></li>
<li class="divider"></li>
<li><a href="{{route('piggybanks.index')}}"><span class="glyphicon glyphicon-save"></span> Piggy banks</a></li>

View File

@ -0,0 +1,31 @@
@extends('layouts.default')
@section('content')
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12">
<h1>Firefly
<small>Recurring transactions</small>
</h1>
<p class="text-info">We all have bills to pay. Firefly can help you organize those bills into recurring transactions,
which are exactly what the name suggests. Firefly can match new (and existing) transactions to such a recurring transaction
and help you organize these expenses into manageable groups. The front page of Firefly will show you which recurring
transactions you have missed, which are yet to come and which have been paid.</p>
</div>
</div>
<div class="row">
<div class="col-lg-12 col-sm-12 col-md-12">
<table class="table table-striped">
<tr>
<th>Name</th>
<th>Matches on</th>
<th>Amount between</th>
<th>Expected every</th>
<th>Next expected match</th>
<th>Automatch</th>
<th>Active</th>
</tr>
</table>
</div>
</div>
@stop

View File

@ -1,3 +1,4 @@
REM composer self-update
composer update
php artisan clear-compiled --env=local
php artisan ide-helper:generate --env=local