Stuff for recurring transactions [skip ci]

This commit is contained in:
James Cole
2014-08-07 07:44:37 +02:00
parent 23d69c0dd9
commit cdd5a6c225
19 changed files with 523 additions and 29 deletions

View File

@@ -35,7 +35,7 @@
<td>Out</td>
<td>
{{mf($show['statistics']['period']['out'])}}
<a href="#transactions-thisaccount-this-period-expensesonly"><span class="glyphicon glyphicon-circle-arrow-right"></span></a>
<a href="{{route('accounts.show',$account->id)}}#transactions-thisaccount-this-period-expensesonly"><span class="glyphicon glyphicon-circle-arrow-right"></span></a>
</td>
<td>
{{mf($show['statistics']['period']['t_out'])}}

View File

@@ -74,7 +74,9 @@
</div>
<div class="col-sm-3">
<small>
<a href="{{route('budgets.show',$budget->id)}}?rep={{$rep->id}}">
{{$rep->periodShow()}}
</a>
</small>
</div>
@if($limit->repeats == 1)

View File

@@ -28,7 +28,7 @@
<td>
@foreach($journal->components as $component)
@if($component->class == 'Budget')
<a href="#budget-overview-in-month"><span class="glyphicon glyphicon-tasks" title="Budget: {{{$component->name}}}"></span></a>
<a href="{{route('budgets.show',$component->id)}}#GETTHEREPSOMEHOW_ORLIMITQUERYbudget-overview-in-month"><span class="glyphicon glyphicon-tasks" title="Budget: {{{$component->name}}}"></span></a>
@endif
@if($component->class == 'Category')
<a href="#category-overview-in-month"><span class="glyphicon glyphicon-tag" title="Category: {{{$component->name}}}"></span></a>

View File

@@ -0,0 +1,196 @@
@extends('layouts.default')
@section('content')
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12">
<h1>Firefly
<small>Create a recurring transaction</small>
</h1>
<p class="lead">Use recurring transactions to track repeated expenses</p>
<p class="text-info">
Bla bla.
</p>
</div>
</div>
{{Form::open(['class' => 'form-horizontal','url' => route('recurring.store')])}}
<div class="row">
<div class="col-lg-6 col-md-12 col-sm-6">
<h4>Mandatory fields</h4>
<!-- name -->
<div class="form-group">
<label for="name" class="col-sm-4 control-label">Name</label>
<div class="col-sm-8">
<input type="text" name="name" class="form-control" id="name" value="{{Input::old('name')}}" placeholder="Name">
@if($errors->has('name'))
<p class="text-danger">{{$errors->first('name')}}</p>
@else
<span class="help-block">For example: rent, gas, insurance</span>
@endif
</div>
</div>
<div class="form-group">
<label for="match" class="col-sm-4 control-label">Matches on</label>
<div class="col-sm-8">
<input type="text" name="match" class="form-control" id="match" value="{{Input::old('match')}}" data-role="tagsinput">
@if($errors->has('match'))
<p class="text-danger">{{$errors->first('match')}}</p>
@else
<span class="help-block">For example: rent, [company name]. All matches need to
be present for the recurring transaction to be recognized. This field is not case-sensitive.</span>
@endif
</div>
</div>
<div class="form-group">
{{ Form::label('amount_min', 'Minimum amount', ['class' => 'col-sm-4 control-label'])}}
<div class="col-sm-8">
<div class="input-group">
<span class="input-group-addon">&euro;</span>
{{Form::input('number','amount_min', Input::old('amount_min'), ['step' => 'any', 'class' => 'form-control'])}}
</div>
@if($errors->has('amount_min'))
<p class="text-danger">{{$errors->first('amount_min')}}</p>
@else
<span class="help-block">Firefly will only include transactions with a higher amount than this. If your rent
is usually around &euro; 500,-, enter <code>450</code> to be safe.</span>
@endif
</div>
</div>
<div class="form-group">
{{ Form::label('amount_max', 'Maximum amount', ['class' => 'col-sm-4 control-label'])}}
<div class="col-sm-8">
<div class="input-group">
<span class="input-group-addon">&euro;</span>
{{Form::input('number','amount_max', Input::old('amount_max'), ['step' => 'any', 'class' => 'form-control'])}}
</div>
@if($errors->has('amount_max'))
<p class="text-danger">{{$errors->first('amount_max')}}</p>
@else
<span class="help-block">Firefly will only include transactions with a lower amount than this. If your rent
is usually around &euro; 500,-, enter <code>550</code> to be safe.</span>
@endif
</div>
</div>
<div class="form-group">
{{ Form::label('date', 'Date', ['class' => 'col-sm-4 control-label'])}}
<div class="col-sm-8">
{{ Form::input('date','date', Input::old('date') ?: date('Y-m-d'), ['class'
=> 'form-control']) }}
@if($errors->has('date'))
<p class="text-danger">{{$errors->first('date')}}</p>
@else
<span class="help-block">Select the next date you expect the transaction to occur.</span>
@endif
</div>
</div>
<div class="form-group">
<label for="period" class="col-sm-4 control-label">Recurrence</label>
<div class="col-sm-8">
{{Form::select('repeat_freq',$periods,Input::old('repeat_freq') ?: 'monthly',['class' => 'form-control'])}}
@if($errors->has('repeat_freq'))
<p class="text-danger">{{$errors->first('repeat_freq')}}</p>
@else
<span class="help-block">Select the period over which this transaction repeats</span>
@endif
</div>
</div>
</div>
<div class="col-lg-6 col-md-12 col-sm-6">
<h4>Optional fields</h4>
<div class="form-group">
{{ Form::label('skip', 'Skip', ['class' => 'col-sm-4 control-label'])}}
<div class="col-sm-8">
{{Form::input('number','skip', Input::old('skip') ?: 0, ['class' => 'form-control'])}}
@if($errors->has('skip'))
<p class="text-danger">{{$errors->first('skip')}}</p>
@else
<span class="help-block">Make Firefly skip every <em>n</em> times. Fill in <code>2</code>, and Firefly
will match, skip, skip and match a transaction.</span>
@endif
</div>
</div>
<!-- select budget -->
<!-- select category -->
<!-- select beneficiary -->
<div class="form-group">
<label for="automatch" class="col-sm-4 control-label">Auto-match</label>
<div class="col-sm-8">
<div class="checkbox">
<label>
{{Form::checkbox('automatch',1,Input::old('automatch') == '1' || !Input::old('automatch'))}}
Yes
</label>
</div>
<span class="help-block">Firefly will automatically match transactions.</span>
</div>
</div>
<div class="form-group">
<label for="active" class="col-sm-4 control-label">Active</label>
<div class="col-sm-8">
<div class="checkbox">
<label>
{{Form::checkbox('active',1,Input::old('active') == '1' || !Input::old('active'))}}
Yes
</label>
</div>
<span class="help-block">This recurring transaction is actually active.</span>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6 col-md-12 col-sm-6">
<!-- add another after this one? -->
<div class="form-group">
<label for="create" class="col-sm-4 control-label">&nbsp;</label>
<div class="col-sm-8">
<div class="checkbox">
<label>
{{Form::checkbox('create',1,Input::old('create') == '1')}}
Create another (return to this form)
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-4 col-sm-8">
<button type="submit" class="btn btn-default btn-success">Create the recurring transaction</button>
</div>
</div>
</div>
</div>
{{Form::close()}}
@stop
@section('styles')
<?php echo stylesheet_link_tag('recurring'); ?>
@stop
@section('scripts')
<?php echo javascript_include_tag('recurring'); ?>
@stop

View File

@@ -0,0 +1,37 @@
@extends('layouts.default')
@section('content')
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12">
<h1>Firefly
<small>Delete recurring transaction "{{{$recurringTransaction->name}}}"</small>
</h1>
<p class="lead">
Remember that deleting something is permanent.
</p>
</div>
</div>
{{Form::open(['class' => 'form-horizontal','url' => route('recurring.destroy',$recurringTransaction->id)])}}
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12">
<p class="text-danger">
Press "Delete permanently" If you are sure you want to delete "{{{$recurringTransaction->name}}}".
</p>
</div>
</div>
<div class="row">
<div class="col-lg-6">
<div class="form-group">
<div class="col-sm-8">
<button type="submit" class="btn btn-default btn-danger">Delete permanently</button>
<a href="{{route('recurring.index')}}" class="btn-default btn">Cancel</a>
</div>
</div>
</div>
</div>
{{Form::close()}}
@stop

View File

@@ -5,6 +5,7 @@
<h1>Firefly
<small>Recurring transactions</small>
</h1>
<p class="lead">Use recurring transactions to track repeated expenses</p>
<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
@@ -22,10 +23,54 @@
<th>Amount between</th>
<th>Expected every</th>
<th>Next expected match</th>
<th>Automatch</th>
<th>Auto-match</th>
<th>Active</th>
<th></th>
</tr>
@foreach($list as $entry)
<tr>
<td><a href="#">{{{$entry->name}}}</a></td>
<td>
@foreach(explode(' ',$entry->match) as $word)
<span class="label label-default">{{{$word}}}</span>
@endforeach
</td>
<td>
{{mf($entry->amount_min)}} &ndash;
{{mf($entry->amount_max)}}
</td>
<td>
{{$entry->repeat_freq}}
</td>
<td>
{{$entry->next()->format('d-m-Y')}}
</td>
<td>
@if($entry->automatch)
<span class="glyphicon glyphicon-ok"></span>
@else
<span class="glyphicon glyphicon-remove"></span>
@endif
</td>
<td>
@if($entry->active)
<span class="glyphicon glyphicon-ok"></span>
@else
<span class="glyphicon glyphicon-remove"></span>
@endif
</td>
<td>
<div class="btn-group btn-group-xs">
<a href="{{route('recurring.edit',$entry->id)}}" class="btn btn-default"><span class="glyphicon glyphicon-pencil"></span></a>
<a href="{{route('recurring.delete',$entry->id)}}" class="btn btn-danger"><span class="glyphicon glyphicon-trash"></span></a>
</div>
</td>
</tr>
@endforeach
</table>
<p>
<a href="{{route('recurring.create')}}" class="btn btn-success btn-large">Create new recurring transaction</a>
</p>
</div>
</div>
@stop