Files
firefly-iii/app/models/LimitRepetition.php

105 lines
3.4 KiB
PHP
Raw Normal View History

<?php
use FireflyIII\Exception\FireflyException;
2014-12-06 12:12:55 +01:00
use Watson\Validating\ValidatingTrait;
2014-12-13 21:59:02 +01:00
/**
* Class LimitRepetition
*/
2014-12-06 12:12:55 +01:00
class LimitRepetition extends Eloquent
{
2014-12-06 12:12:55 +01:00
use ValidatingTrait;
public static $rules
2014-11-18 09:47:50 +01:00
= [
2014-12-13 21:59:02 +01:00
'budgetlimit_id' => 'required|exists:budgetlimits,id',
'startdate' => 'required|date',
'enddate' => 'required|date',
'amount' => 'numeric|required|min:0.01',
2014-11-18 09:47:50 +01:00
];
2014-08-10 18:22:42 +02:00
/**
2014-12-13 21:59:02 +01:00
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
2014-08-10 18:22:42 +02:00
*/
2014-12-13 21:59:02 +01:00
public function budgetLimit()
{
2014-12-13 21:59:02 +01:00
return $this->belongsTo('BudgetLimit');
}
2014-12-06 12:12:55 +01:00
/**
2014-12-13 21:59:02 +01:00
* @return array
2014-12-06 12:12:55 +01:00
*/
2014-12-13 21:59:02 +01:00
public function getDates()
2014-12-06 12:12:55 +01:00
{
2014-12-13 21:59:02 +01:00
return ['created_at', 'updated_at', 'startdate', 'enddate'];
2014-12-06 12:12:55 +01:00
}
/**
2014-11-18 09:47:50 +01:00
* TODO see if this scope is still used.
*
* How much money is left in this?
*/
2014-09-27 06:06:31 +02:00
public function leftInRepetition()
{
2014-11-08 19:11:51 +01:00
return floatval($this->amount - $this->spentInRepetition());
}
2014-11-17 20:45:55 +01:00
/**
* TODO remove this method in favour of something in the FireflyIII libraries.
2014-11-18 09:47:50 +01:00
*
2014-11-17 20:45:55 +01:00
* @return float
*/
2014-11-12 22:37:44 +01:00
public function spentInRepetition()
{
$sum = \DB::table('transactions')->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')->leftJoin(
2014-11-17 07:33:18 +01:00
'component_transaction_journal', 'component_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id'
)->leftJoin('components', 'components.id', '=', 'component_transaction_journal.component_id')->leftJoin(
2014-12-13 21:59:02 +01:00
'budgetlimits', 'budgetlimits.component_id', '=', 'components.id'
)->leftJoin('limit_repetitions', 'limit_repetitions.limit_id', '=', 'budgetlimits.id')->where(
2014-11-17 07:33:18 +01:00
'transaction_journals.date', '>=', $this->startdate->format('Y-m-d')
)->where('transaction_journals.date', '<=', $this->enddate->format('Y-m-d'))->where('transactions.amount', '>', 0)->where(
'limit_repetitions.id', '=', $this->id
)->sum('transactions.amount');
2014-11-12 22:37:44 +01:00
return floatval($sum);
}
2014-07-28 21:33:32 +02:00
/**
2014-11-17 20:45:55 +01:00
* TODO remove this method in favour of something in the FireflyIII libraries.
*
2014-07-28 21:33:32 +02: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 FireflyException('No date formats for frequency "' . $this->repeat_freq . '"!');
2014-07-28 21:33:32 +02:00
break;
case 'daily':
2014-07-30 07:14:00 +02:00
return $this->startdate->format('Ymd') . '-5';
2014-07-28 21:33:32 +02:00
break;
case 'weekly':
2014-07-30 22:31:35 +02:00
return $this->startdate->format('Ymd') . '-4';
2014-07-28 21:33:32 +02: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 07:14:00 +02:00
return $this->startdate->format('Ymd') . '-0';
2014-07-28 21:33:32 +02:00
break;
}
}
}