Building a chart for the recurring transactions.

This commit is contained in:
Sander Dorigo 2014-10-13 17:54:20 +02:00
parent 65a2e07d24
commit 36d8dee853
13 changed files with 373 additions and 121 deletions

View File

@ -1,8 +1,10 @@
<?php
use Carbon\Carbon;
use Firefly\Exception\FireflyException;
use Firefly\Helper\Controllers\ChartInterface;
use Firefly\Storage\Account\AccountRepositoryInterface;
use Illuminate\Support\Collection;
/**
* Class ChartController
@ -18,7 +20,7 @@ class ChartController extends BaseController
/**
* @param ChartInterface $chart
* @param ChartInterface $chart
* @param AccountRepositoryInterface $accounts
*/
public function __construct(ChartInterface $chart, AccountRepositoryInterface $accounts)
@ -57,13 +59,13 @@ class ChartController extends BaseController
$return = [
'chart_title' => 'Overview for budget ' . $budget->name,
'subtitle' => 'All envelopes',
'series' => [
'subtitle' => 'All envelopes',
'series' => [
[
'type' => 'line',
'type' => 'line',
'yAxis' => 1,
'name' => 'Amount in envelope',
'data' => $envelope
'name' => 'Amount in envelope',
'data' => $envelope
],
[
'type' => 'column',
@ -71,10 +73,10 @@ class ChartController extends BaseController
'data' => $expense
],
[
'type' => 'line',
'type' => 'line',
'yAxis' => 1,
'name' => 'Spent percentage for envelope',
'data' => $left
'name' => 'Spent percentage for envelope',
'data' => $left
]
@ -111,14 +113,14 @@ class ChartController extends BaseController
$return = [
'chart_title' => 'Overview for budget ' . $budget->name,
'subtitle' =>
'subtitle' =>
'Between ' . $rep->startdate->format('M jS, Y') . ' and ' . $rep->enddate->format('M jS, Y'),
'series' => [
'series' => [
[
'type' => 'column',
'name' => 'Expenses per day',
'type' => 'column',
'name' => 'Expenses per day',
'yAxis' => 1,
'data' => $expense
'data' => $expense
],
[
'type' => 'line',
@ -175,8 +177,8 @@ class ChartController extends BaseController
}
$return = [
'chart_title' => 'Overview for ' . $budget->name,
'subtitle' => 'Not organized by an envelope',
'series' => [
'subtitle' => 'Not organized by an envelope',
'series' => [
[
'type' => 'column',
'name' => 'Expenses per day',
@ -245,11 +247,11 @@ class ChartController extends BaseController
// create a serie for the repetition.
$currentSerie = [
'type' => 'spline',
'id' => 'rep-' . $repetition->id,
'type' => 'spline',
'id' => 'rep-' . $repetition->id,
'yAxis' => 1,
'name' => 'Envelope #' . $repetition->id . ' in ' . $repetition->periodShow(),
'data' => []
'name' => 'Envelope #' . $repetition->id . ' in ' . $repetition->periodShow(),
'data' => []
];
$current = clone $repetition->startdate;
while ($current <= $repetition->enddate) {
@ -271,11 +273,11 @@ class ChartController extends BaseController
$return = [
'chart_title' => 'Overview for budget ' . $budget->name,
'subtitle' =>
'subtitle' =>
'Between ' . Session::get('start')->format('M jS, Y') . ' and ' . Session::get('end')->format(
'M jS, Y'
),
'series' => $series
'series' => $series
];
return Response::json($return);
@ -296,8 +298,8 @@ class ChartController extends BaseController
$serie = $this->_chart->categoryShowChart($category, $range, $start, $end);
$data = [
'chart_title' => $category->name,
'subtitle' => '<a href="' . route('categories.show', [$category->id]) . '">View more</a>',
'series' => $serie
'subtitle' => '<a href="' . route('categories.show', [$category->id]) . '">View more</a>',
'series' => $serie
];
return Response::json($data);
@ -336,8 +338,8 @@ class ChartController extends BaseController
'<a href="' . route('accounts.index') . '">View more</a>';
$data = [
'chart_title' => count($accounts) == 1 ? $accounts[0]->name : 'All accounts',
'subtitle' => $url,
'series' => []
'subtitle' => $url,
'series' => []
];
foreach ($accounts as $account) {
@ -431,11 +433,11 @@ class ChartController extends BaseController
if ($limit > 0 || $expenses > 0) {
$data['labels'][] = $budget->name;
$data['series'][0]['data'][] = [
'y' => $limit,
'y' => $limit,
'url' => route('budgets.show', [$budget->id, $id]) . '?' . $parameter
];
$data['series'][1]['data'][] = [
'y' => $expenses,
'y' => $expenses,
'url' => route('budgets.show', [$budget->id, $id]) . '?' . $parameter
];
}
@ -444,26 +446,26 @@ class ChartController extends BaseController
$set = \Auth::user()->transactionjournals()->whereNotIn(
'transaction_journals.id', function ($query) use ($start, $end) {
$query->select('transaction_journals.id')->from('transaction_journals')
->leftJoin(
'component_transaction_journal', 'component_transaction_journal.transaction_journal_id', '=',
'transaction_journals.id'
)
->leftJoin('components', 'components.id', '=', 'component_transaction_journal.component_id')
->where('transaction_journals.date', '>=', $start->format('Y-m-d'))
->where('transaction_journals.date', '<=', $end->format('Y-m-d'))
->where('components.class', 'Budget');
->leftJoin(
'component_transaction_journal', 'component_transaction_journal.transaction_journal_id', '=',
'transaction_journals.id'
)
->leftJoin('components', 'components.id', '=', 'component_transaction_journal.component_id')
->where('transaction_journals.date', '>=', $start->format('Y-m-d'))
->where('transaction_journals.date', '<=', $end->format('Y-m-d'))
->where('components.class', 'Budget');
}
)->before($end)->after($start)->lessThan(0)->transactionTypes(['Withdrawal'])->sum('amount');
// This can be debugged by using get(['transaction_journals.*','transactions.amount']);
$data['labels'][] = 'No budget';
$data['series'][0]['data'][] = [
'y' => 0,
'url' => route('budgets.nobudget','session')
'y' => 0,
'url' => route('budgets.nobudget', 'session')
];
$data['series'][1]['data'][] = [
'y' => floatval($set) * -1,
'url' => route('budgets.nobudget','session')
'y' => floatval($set) * -1,
'url' => route('budgets.nobudget', 'session')
];
return Response::json($data);
@ -482,4 +484,111 @@ class ChartController extends BaseController
}
/**
* This method checks all recurring transactions, calculates the current "moment" and returns
* a list of yet to be paid (and paid) recurring transactions. This list can be used to show a beautiful chart
* to the end user who will love it and cherish it.
*
* @throws FireflyException
*/
public function homeRecurring()
{
/** @var \Firefly\Helper\Toolkit\ToolkitInterface $toolkit */
$toolkit = App::make('Firefly\Helper\Toolkit\ToolkitInterface');
$recurringTransactions = \Auth::user()->recurringtransactions()->get();
$sessionStart = \Session::get('start');
$sessionEnd = \Session::get('end');
$paid = [];
$unpaid = [];
/** @var \RecurringTransaction $recurring */
foreach ($recurringTransactions as $recurring) {
/*
* Start a loop starting at the $date.
*/
$start = clone $recurring->date;
$end = Carbon::now();
/*
* The jump we make depends on the $repeat_freq
*/
$current = clone $start;
\Log::debug('Now looping recurring transaction #' . $recurring->id . ': ' . $recurring->name);
while ($current <= $end) {
/*
* Get end of period for $current:
*/
$currentEnd = clone $current;
$toolkit->endOfPeriod($currentEnd, $recurring->repeat_freq);
\Log::debug('Now at $current: ' . $current->format('D d F Y') . ' - ' . $currentEnd->format('D d F Y'));
/*
* In the current session range?
*/
if ($sessionEnd >= $current and $currentEnd >= $sessionStart) {
/*
* Lets see if we've already spent money on this recurring transaction (it hath recurred).
*/
/** @var Collection $set */
$set = \Auth::user()->transactionjournals()->where('recurring_transaction_id', $recurring->id)
->after($current)->before($currentEnd)->get();
if (count($set) > 1) {
\Log::error('Recurring #' . $recurring->id . ', dates [' . $current . ',' . $currentEnd . ']. Found multiple hits. Cannot handle this!');
throw new FireflyException('Cannot handle multiple transactions. See logs.');
} else if (count($set) == 0) {
$unpaid[] = $recurring;
} else {
$paid[] = $set->get(0);
}
}
/*
* Add some time for the next loop!
*/
$toolkit->addPeriod($current, $recurring->repeat_freq, intval($recurring->skip));
}
}
/*
* Loop paid and unpaid to make two haves for a pie chart.
*/
$unPaidColours = $toolkit->colorRange('AA4643', 'FFFFFF', count($unpaid) == 0 ? 1 : count($unpaid));
$paidColours = $toolkit->colorRange('4572A7', 'FFFFFF', count($paid) == 0 ? 1 : count($paid));
$serie = [
'type' => 'pie',
'name' => 'Amount',
'data' => []
];
/** @var TransactionJournal $entry */
foreach ($paid as $index => $entry) {
$transactions = $entry->transactions()->get();
$amount = max(floatval($transactions[0]->amount), floatval($transactions[1]->amount));
$serie['data'][] = [
'name' => $entry->description,
'y' => $amount,
'color' => $paidColours[$index]
];
}
/** @var RecurringTransaction $entry */
foreach ($unpaid as $index => $entry) {
$amount = (floatval($entry->amount_max) + floatval($entry->amount_min)) / 2;
$serie['data'][] = [
'name' => $entry->name,
'y' => $amount,
'color' => $unPaidColours[$index]
];
}
return Response::json([$serie]);
}
}

View File

@ -108,6 +108,10 @@ class RecurringController extends BaseController
*/
public function rescan(RecurringTransaction $recurringTransaction)
{
if (intval($recurringTransaction->active) == 0) {
Session::flash('warning', 'Inactive recurring transactions cannot be scanned.');
return Redirect::back();
}
// do something!
/** @var \Firefly\Storage\TransactionJournal\TransactionJournalRepositoryInterface $repo */
$repo = App::make('Firefly\Storage\TransactionJournal\TransactionJournalRepositoryInterface');
@ -117,7 +121,7 @@ class RecurringController extends BaseController
foreach ($set as $journal) {
Event::fire('recurring.rescan', [$recurringTransaction, $journal]);
}
Session::flash('success','Rescanned everything.');
Session::flash('success', 'Rescanned everything.');
return Redirect::back();

View File

@ -27,7 +27,6 @@ class CreateRemindersTable extends Migration
'reminders', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->string('class', 40);
$table->integer('user_id')->unsigned();
$table->date('startdate');
$table->date('enddate')->nullable();

View File

@ -10,6 +10,7 @@ App::before(
$toolkit = App::make('Firefly\Helper\Toolkit\ToolkitInterface');
$toolkit->getDateRange();
$toolkit->checkImportJobs();
Event::fire('recurring.verify');
}
}

View File

@ -355,7 +355,7 @@ class Json implements JsonInterface
* Loop set and create entries to return.
*/
foreach ($set as $entry) {
$data['data'][] = [
$set = [
'name' => ['name' => $entry->name, 'url' => route('recurring.show', $entry->id)],
'match' => explode(' ', $entry->match),
@ -370,6 +370,11 @@ class Json implements JsonInterface
'delete' => route('recurring.delete', $entry->id)
]
];
if (intval($entry->skip) > 0) {
$set['repeat_freq'] = $entry->repeat_freq . ' (skip ' . $entry->skip . ')';
}
$data['data'][] = $set;
}
return $data;

View File

@ -381,4 +381,127 @@ class Toolkit implements ToolkitInterface
}
return $selectList;
}
/**
* @param string $start
* @param string $end
* @param int $steps
*/
public function colorRange($start, $end, $steps = 5)
{
if (strlen($start) != 6) {
throw new FireflyException('Start, ' . e($start) . ' should be a six character HTML colour.');
}
if (strlen($end) != 6) {
throw new FireflyException('End, ' . e($end) . ' should be a six character HTML colour.');
}
if ($steps < 1) {
throw new FireflyException('Steps must be > 1');
}
$start = '#' . $start;
$end = '#' . $end;
/*
* Split html colours.
*/
list($rs, $gs, $bs) = sscanf($start, "#%02x%02x%02x");
list($re, $ge, $be) = sscanf($end, "#%02x%02x%02x");
$stepr = ($re - $rs) / $steps;
$stepg = ($ge - $gs) / $steps;
$stepb = ($be - $bs) / $steps;
$return = [];
for ($i = 0; $i <= $steps; $i++) {
$cr = $rs + ($stepr * $i);
$cg = $gs + ($stepg * $i);
$cb = $bs + ($stepb * $i);
$return[] = $this->rgb2html($cr, $cg, $cb);
}
return $return;
}
protected function rgb2html($r, $g = -1, $b = -1)
{
$r = dechex($r < 0 ? 0 : ($r > 255 ? 255 : $r));
$g = dechex($g < 0 ? 0 : ($g > 255 ? 255 : $g));
$b = dechex($b < 0 ? 0 : ($b > 255 ? 255 : $b));
$color = (strlen($r) < 2 ? '0' : '') . $r;
$color .= (strlen($g) < 2 ? '0' : '') . $g;
$color .= (strlen($b) < 2 ? '0' : '') . $b;
return '#' . $color;
}
/**
* @param Carbon $currentEnd
* @param $repeatFreq
* @throws FireflyException
*/
public function endOfPeriod(Carbon $currentEnd, $repeatFreq)
{
switch ($repeatFreq) {
default:
throw new FireflyException('Cannot do getFunctionForRepeatFreq for $repeat_freq ' . $repeatFreq);
break;
case 'daily':
$currentEnd->addDay();
break;
case 'weekly':
$currentEnd->addWeek()->subDay();
break;
case 'monthly':
$currentEnd->addMonth()->subDay();
break;
case 'quarterly':
$currentEnd->addMonths(3)->subDay();
break;
case 'half-year':
$currentEnd->addMonths(6)->subDay();
break;
case 'yearly':
$currentEnd->addYear()->subDay();
break;
}
}
/**
* @param Carbon $date
* @param $repeatFreq
* @param $skip
* @return Carbon
* @throws FireflyException
*/
public function addPeriod(Carbon $date, $repeatFreq, $skip)
{
$add = ($skip + 1);
switch ($repeatFreq) {
default:
throw new FireflyException('Cannot do getFunctionForRepeatFreq for $repeat_freq ' . $repeatFreq);
break;
case 'daily':
$date->addDays($add);
break;
case 'weekly':
$date->addWeeks($add);
break;
case 'monthly':
$date->addMonths($add);
break;
case 'quarterly':
$months = $add * 3;
$date->addMonths($months);
break;
case 'half-year':
$months = $add * 6;
$date->addMonths($months);
break;
case 'yearly':
$date->addYears($add);
break;
}
return $date;
}
}

View File

@ -21,7 +21,7 @@ interface ToolkitInterface
* Takes any collection and tries to make a sensible select list compatible array of it.
*
* @param Collection $set
* @param null $titleField
* @param null $titleField
*
* @return mixed
*/
@ -33,4 +33,11 @@ interface ToolkitInterface
public function checkImportJobs();
/**
* @param string $start
* @param string $end
* @param int $steps
*/
public function colorRange($start, $end, $steps = 5);
}

View File

@ -3,6 +3,7 @@
namespace Firefly\Trigger\Recurring;
use Carbon\Carbon;
use Firefly\Exception\FireflyException;
use Illuminate\Events\Dispatcher;
/**
@ -81,11 +82,7 @@ class EloquentRecurringTrigger
*/
public function subscribe(Dispatcher $events)
{
//Event::fire('recurring.rematch', [$recurringTransaction, $journal]);
$events->listen('recurring.rescan', 'Firefly\Trigger\Recurring\EloquentRecurringTrigger@rescan');
// $events->listen('recurring.destroy', 'Firefly\Trigger\Recurring\EloquentRecurringTrigger@destroy');
// $events->listen('recurring.store', 'Firefly\Trigger\Recurring\EloquentRecurringTrigger@store');
// $events->listen('recurring.update', 'Firefly\Trigger\Recurring\EloquentRecurringTrigger@update');
}
/**

View File

@ -2,6 +2,8 @@
use Carbon\Carbon;
use Firefly\Database\SingleTableInheritanceEntity;
use LaravelBook\Ardent\Ardent;
/**
* Reminder
@ -10,33 +12,24 @@ use Firefly\Database\SingleTableInheritanceEntity;
* @property \Carbon\Carbon $created_at
* @property \Carbon\Carbon $updated_at
* @property string $class
* @property integer $piggybank_id
* @property integer $recurring_transaction_id
* @property integer $user_id
* @property \Carbon\Carbon $startdate
* @property \Carbon\Carbon $enddate
* @property boolean $active
* @property-read \Piggybank $piggybank
* @property-read \RecurringTransaction $recurringTransaction
* @property-read \User $user
* @method static \Illuminate\Database\Query\Builder|\Reminder whereId($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereCreatedAt($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereUpdatedAt($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereClass($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder wherePiggybankId($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereRecurringTransactionId($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereUserId($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereStartdate($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereEnddate($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereActive($value)
* @method static \Reminder validOn($date)
* @method static \Reminder validOnOrAfter($date)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereId($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereCreatedAt($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereUpdatedAt($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereClass($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereUserId($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereStartdate($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereEnddate($value)
* @method static \Illuminate\Database\Query\Builder|\Reminder whereActive($value)
*/
class Reminder extends SingleTableInheritanceEntity
class Reminder extends Ardent
{
protected $table = 'reminders';
protected $subclassField = 'class';
/**
@ -47,49 +40,6 @@ class Reminder extends SingleTableInheritanceEntity
return ['created_at', 'updated_at', 'startdate', 'enddate'];
}
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function piggybank()
{
return $this->belongsTo('Piggybank');
}
public function recurringTransaction()
{
return $this->belongsTo('RecurringTransaction');
}
public function render()
{
return '';
}
public function scopeValidOn($query, Carbon $date)
{
return $query->where('startdate', '<=', $date->format('Y-m-d'))->where('enddate', '>=', $date->format('Y-m-d'))
->where('active', 1);
}
public function scopeValidOnOrAfter($query, Carbon $date)
{
return $query->where(
function ($q) use ($date) {
$q->where('startdate', '<=', $date->format('Y-m-d'))->where(
'enddate', '>=', $date->format('Y-m-d')
);
$q->orWhere(
function ($q) use ($date) {
$q->where('startdate', '>=', $date);
$q->where('enddate', '>=', $date);
}
);
}
)->where('active', 1);
}
/**
* User
*

View File

@ -223,6 +223,22 @@ use LaravelBook\Ardent\Builder;
* 'Budget[] $budgets
* @property-read \Illuminate\Database\Eloquent\Collection|\
* 'Category[] $categories
* @property-read \Illuminate\Database\Eloquent\Collection|\
* 'Budget[] $budgets
* @property-read \Illuminate\Database\Eloquent\Collection|\
* 'Category[] $categories
* @property-read \Illuminate\Database\Eloquent\Collection|\
* 'Budget[] $budgets
* @property-read \Illuminate\Database\Eloquent\Collection|\
* 'Category[] $categories
* @property-read \Illuminate\Database\Eloquent\Collection|\
* 'Budget[] $budgets
* @property-read \Illuminate\Database\Eloquent\Collection|\
* 'Category[] $categories
* @property-read \Illuminate\Database\Eloquent\Collection|\
* 'Budget[] $budgets
* @property-read \Illuminate\Database\Eloquent\Collection|\
* 'Category[] $categories
*/
class TransactionJournal extends Ardent
{

View File

@ -170,6 +170,7 @@ Route::group(['before' => 'auth'], function () {
Route::get('/chart/home/budgets', ['uses' => 'ChartController@homeBudgets', 'as' => 'chart.budgets']);
Route::get('/chart/home/info/{accountnameA}/{day}/{month}/{year}', ['uses' => 'ChartController@homeAccountInfo', 'as' => 'chart.info']);
Route::get('/chart/categories/show/{category}', ['uses' => 'ChartController@categoryShowChart','as' => 'chart.showcategory']);
Route::get('/chart/home/recurring', ['uses' => 'ChartController@homeRecurring', 'as' => 'chart.recurring']);
// (new charts for budgets)
Route::get('/chart/budget/{budget}/default', ['uses' => 'ChartController@budgetDefault', 'as' => 'chart.budget.default']);
Route::get('chart/budget/{budget}/no_envelope', ['uses' => 'ChartController@budgetNoLimits', 'as' => 'chart.budget.nolimit']);

View File

@ -20,7 +20,7 @@
</p>
</div>
<div class="col-lg-6 col-md-6 col-sm-12">
<h2><a href="{{route('accounts.create')}}">Start from scratch</a></h2>
<h2><a href="{{route('accounts.create','asset')}}">Start from scratch</a></h2>
<p>
Use this option if you are new to Firefly (III).
@ -29,9 +29,10 @@
@else
<!-- ACCOUNTS -->
<div class="row">
<div class="col-lg-8 col-md-12 col-sm-12">
<!-- ACCOUNTS -->
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-credit-card fa-fw"></i> <a href="#">Your accounts</a>
@ -40,6 +41,7 @@
<div id="accounts-chart" style="height:300px;"></div>
</div>
</div>
<!-- BUDGETS -->
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-tasks fa-fw"></i> <a href="{{route('budgets.index.date')}}">Budgets and spending</a>
@ -48,6 +50,7 @@
<div id="budgets"></div>
</div>
</div>
<!-- CATEGORIES -->
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-bar-chart fa-fw"></i> <a href="{{route('categories.index')}}">Categories</a>
@ -55,8 +58,15 @@
<div class="panel-body">
<div id="categories"></div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-line-chart"></i> Savings
</div>
<div class="panel-body">
Bla bla
</div>
</div>
@ -65,6 +75,16 @@
<!-- time based navigation -->
@include('partials.date_nav')
<!-- REMINDERS -->
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-line-chart"></i> Recurring transactions
</div>
<div class="panel-body">
<div id="recurring"></div>
</div>
</div>
<!-- TRANSACTIONS -->
@foreach($transactions as $data)
<div class="panel panel-default">

View File

@ -17,7 +17,7 @@ $(function () {
allowDecimals: false,
labels: {
formatter: function () {
if(this.value >= 1000 || this.value <= -1000) {
if (this.value >= 1000 || this.value <= -1000) {
return '\u20AC ' + (this.value / 1000) + 'k';
}
return '\u20AC ' + this.value;
@ -36,10 +36,10 @@ $(function () {
text: null
}
},
legend: {enabled:false},
legend: {enabled: false},
tooltip: {
formatter: function () {
return this.series.name + ': \u20AC ' + Highcharts.numberFormat(this.y,2);
return this.series.name + ': \u20AC ' + Highcharts.numberFormat(this.y, 2);
}
},
plotOptions: {
@ -101,7 +101,7 @@ $(function () {
},
labels: {
formatter: function () {
if(this.value >= 1000 || this.value <= -1000) {
if (this.value >= 1000 || this.value <= -1000) {
return '\u20AC ' + (this.value / 1000) + 'k';
}
return '\u20AC ' + this.value;
@ -165,17 +165,17 @@ $(function () {
},
tooltip: {
formatter: function () {
return this.series.name + ': \u20AC ' + Highcharts.numberFormat(this.y,2);
return this.series.name + ': \u20AC ' + Highcharts.numberFormat(this.y, 2);
}
},
yAxis: {
min: 0,
title: {text:null},
title: {text: null},
labels: {
overflow: 'justify',
formatter: function () {
if(this.value >= 1000 || this.value <= -1000) {
if (this.value >= 1000 || this.value <= -1000) {
return '\u20AC ' + (this.value / 1000) + 'k';
}
return '\u20AC ' + this.value;
@ -188,7 +188,7 @@ $(function () {
cursor: 'pointer',
events: {
click: function (e) {
if(e.point.url != null) {
if (e.point.url != null) {
window.location = e.point.url;
}
}
@ -202,7 +202,7 @@ $(function () {
}
},
legend: {
enabled: false,
enabled: false
},
credits: {
enabled: false
@ -211,5 +211,25 @@ $(function () {
});
});
$.getJSON('chart/home/recurring').success(function (data) {
$('#recurring').highcharts({
title: {
text: null
},
credits: {
enabled: false
},
plotOptions: {
pie: {
allowPointSelect: true,
cursor: 'pointer',
dataLabels: {
enabled: false
}
}
},
series: data
});
});
});