firefly-iii/app/models/LimitRepetition.php

154 lines
4.8 KiB
PHP
Raw Normal View History

<?php
use LaravelBook\Ardent\Ardent as Ardent;
/**
* LimitRepetition
*
* @property integer $id
* @property \Carbon\Carbon $created_at
* @property \Carbon\Carbon $updated_at
* @property integer $limit_id
* @property \Carbon\Carbon $startdate
* @property \Carbon\Carbon $enddate
* @property float $amount
* @property-read \Limit $limit
* @method static \Illuminate\Database\Query\Builder|\LimitRepetition whereId($value)
* @method static \Illuminate\Database\Query\Builder|\LimitRepetition whereCreatedAt($value)
* @method static \Illuminate\Database\Query\Builder|\LimitRepetition whereUpdatedAt($value)
* @method static \Illuminate\Database\Query\Builder|\LimitRepetition whereLimitId($value)
* @method static \Illuminate\Database\Query\Builder|\LimitRepetition whereStartdate($value)
* @method static \Illuminate\Database\Query\Builder|\LimitRepetition whereEnddate($value)
* @method static \Illuminate\Database\Query\Builder|\LimitRepetition whereAmount($value)
*/
class LimitRepetition extends Ardent
{
public static $rules
= [
'limit_id' => 'required|exists:limits,id',
'startdate' => 'required|date',
'enddate' => 'required|date',
'amount' => 'numeric|required|min:0.01',
];
2014-07-22 23:57:51 -05:00
public static function factory()
{
$start = new \Carbon\Carbon;
$start->startOfMonth();
$end = clone $start;
$end->endOfMonth();
2014-07-27 13:29:58 -05:00
2014-07-22 23:57:51 -05:00
return [
'limit_id' => 'factory|Limit',
2014-07-22 23:57:51 -05:00
'startdate' => $start,
'enddate' => $end,
'amount' => 100
];
2014-07-22 23:57:51 -05:00
}
public function getDates()
{
return ['created_at', 'updated_at', 'startdate', 'enddate'];
}
/**
* How much money is left in this?
*/
public function left()
{
$left = floatval($this->amount);
// budget:
$budget = $this->limit->budget;
/** @var \Firefly\Storage\Limit\EloquentLimitRepository $limits */
$limits = App::make('Firefly\Storage\Limit\EloquentLimitRepository');
$set = $limits->getTJByBudgetAndDateRange($budget, $this->startdate, $this->enddate);
foreach ($set as $journal) {
foreach ($journal->transactions as $t) {
if ($t->amount < 0) {
$left += floatval($t->amount);
}
}
}
return $left;
}
2014-07-27 13:29:58 -05:00
public function limit()
{
return $this->belongsTo('Limit');
}
2014-07-28 14:33:32 -05:00
/**
* Returns a string used to sort this particular repetition
* based on the date and period it falls into. Ie. the limit
* repeats monthly and the start date is 12 dec 2012, this will
* return 2012-12.
*/
public function periodOrder()
{
if (is_null($this->repeat_freq)) {
$this->repeat_freq = $this->limit->repeat_freq;
}
switch ($this->repeat_freq) {
default:
throw new \Firefly\Exception\FireflyException('No date formats for frequency "' . $this->repeat_freq
. '"!');
break;
case 'daily':
2014-07-30 00:14:00 -05:00
return $this->startdate->format('Ymd') . '-5';
2014-07-28 14:33:32 -05:00
break;
case 'weekly':
2014-07-30 15:31:35 -05:00
return $this->startdate->format('Ymd') . '-4';
2014-07-28 14:33:32 -05:00
break;
case 'monthly':
return $this->startdate->format('Ymd') . '-3';
break;
case 'quarterly':
return $this->startdate->format('Ymd') . '-2';
break;
case 'half-year':
return $this->startdate->format('Ymd') . '-1';
break;
case 'yearly':
2014-07-30 00:14:00 -05:00
return $this->startdate->format('Ymd') . '-0';
2014-07-28 14:33:32 -05:00
break;
}
}
/**
* Same as above, just with a more natural view. So "March 2012".
*/
public function periodShow()
{
if (is_null($this->repeat_freq)) {
$this->repeat_freq = $this->limit->repeat_freq;
}
switch ($this->repeat_freq) {
default:
throw new \Firefly\Exception\FireflyException('No date formats for frequency "' . $this->repeat_freq
. '"!');
break;
case 'daily':
return $this->startdate->format('j F Y');
break;
case 'weekly':
return $this->startdate->format('\W\e\e\k W, Y');
break;
case 'monthly':
return $this->startdate->format('F Y');
break;
case 'half-year':
case 'quarterly':
return $this->startdate->format('M Y') . ' - ' . $this->enddate->format('M Y');
break;
case 'yearly':
return $this->startdate->format('Y');
break;
}
}
}