firefly-iii/app/models/Piggybank.php

188 lines
8.1 KiB
PHP
Raw Normal View History

2014-07-31 15:01:52 -05:00
<?php
use Carbon\Carbon;
2014-07-31 15:01:52 -05:00
use LaravelBook\Ardent\Ardent as Ardent;
/**
* Piggybank
*
2014-11-12 15:37:44 -06:00
* @property integer $id
* @property \Carbon\Carbon $created_at
* @property \Carbon\Carbon $updated_at
* @property integer $account_id
* @property string $name
* @property float $targetamount
* @property \Carbon\Carbon $startdate
* @property \Carbon\Carbon $targetdate
* @property boolean $repeats
* @property string $rep_length
* @property integer $rep_every
* @property integer $rep_times
* @property string $reminder
* @property integer $reminder_skip
* @property boolean $remind_me
* @property integer $order
* @property-read \Account $account
* @property-read \Illuminate\Database\Eloquent\Collection|\PiggybankRepetition[] $piggybankrepetitions
2014-11-12 15:37:44 -06:00
* @property-read \Illuminate\Database\Eloquent\Collection|\PiggybankEvent[] $piggybankevents
* @property-read \Illuminate\Database\Eloquent\Collection|\Transaction[] $transactions
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereId($value)
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereCreatedAt($value)
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereUpdatedAt($value)
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereAccountId($value)
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereName($value)
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereTargetamount($value)
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereStartdate($value)
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereTargetdate($value)
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereRepeats($value)
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereRepLength($value)
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereRepEvery($value)
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereRepTimes($value)
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereReminder($value)
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereReminderSkip($value)
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereRemindMe($value)
* @method static \Illuminate\Database\Query\Builder|\Piggybank whereOrder($value)
*/
2014-07-31 15:01:52 -05:00
class Piggybank extends Ardent
{
public static $rules
2014-11-12 15:37:44 -06:00
= ['account_id' => 'required|exists:accounts,id', // link to Account
'name' => 'required|between:1,255', // name
'targetamount' => 'required|min:0', // amount you want to save
'startdate' => 'date', // when you started
'targetdate' => 'date', // when its due
'repeats' => 'required|boolean', // does it repeat?
'rep_length' => 'in:day,week,month,year', // how long is the period?
'rep_every' => 'required|min:1|max:100', // how often does it repeat? every 3 years.
'rep_times' => 'min:1|max:100', // how many times do you want to save this amount? eg. 3 times
'reminder' => 'in:day,week,month,year', // want a reminder to put money in this?
'reminder_skip' => 'required|min:0|max:100', // every week? every 2 months?
'remind_me' => 'required|boolean', 'order' => 'required:min:1', // not yet used.
2014-07-31 15:01:52 -05:00
];
2014-11-12 15:37:44 -06:00
public $fillable
= ['account_id', 'name', 'targetamount', 'startdate', 'targetdate', 'repeats', 'rep_length', 'rep_every', 'rep_times', 'reminder', 'reminder_skip',
'remind_me', 'order'];
2014-07-31 15:01:52 -05:00
2014-08-10 11:22:42 -05:00
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
2014-07-31 15:01:52 -05:00
public function account()
{
return $this->belongsTo('Account');
}
public function createRepetition(Carbon $start = null, Carbon $target = null)
{
$rep = new \PiggybankRepetition;
$rep->piggybank()->associate($this);
2014-11-12 15:37:44 -06:00
$rep->startdate = $start;
$rep->targetdate = $target;
$rep->currentamount = 0;
$rep->save();
\Event::fire('piggybanks.repetition', [$rep]);
return $rep;
}
/**
* Grabs the PiggyBankRepetition that's currently relevant / active
*
* @returns \PiggybankRepetition
*/
public function currentRelevantRep()
{
2014-11-12 15:37:44 -06:00
$query = $this->piggybankrepetitions()->where(
function ($q) {
$q->where(
function ($q) {
$today = new Carbon;
$q->whereNull('startdate');
$q->orWhere('startdate', '<=', $today->format('Y-m-d'));
}
2014-11-12 15:37:44 -06:00
)->where(
function ($q) {
$today = new Carbon;
$q->whereNull('targetdate');
$q->orWhere('targetdate', '>=', $today->format('Y-m-d'));
}
);
}
)->orWhere(
function ($q) {
$today = new Carbon;
$q->where('startdate', '>=', $today->format('Y-m-d'));
$q->where('targetdate', '>=', $today->format('Y-m-d'));
}
)->orderBy('startdate', 'ASC');
$result = $query->first();
return $result;
}
/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function piggybankrepetitions()
{
return $this->hasMany('PiggybankRepetition');
}
2014-11-12 15:37:44 -06:00
/**
* @return array
*/
public function getDates()
{
return ['created_at', 'updated_at', 'targetdate', 'startdate'];
}
/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function piggybankevents()
{
return $this->hasMany('PiggybankEvent');
}
/**
* Same but for specific date.
*
* @param Carbon $date
*
* @returns \PiggybankRepetition
*/
public function repetitionForDate(Carbon $date)
{
2014-11-12 15:37:44 -06:00
$query = $this->piggybankrepetitions()->where(
function ($q) use ($date) {
2014-08-19 08:30:19 -05:00
$q->where(
function ($q) use ($date) {
$q->whereNull('startdate');
$q->orWhere('startdate', '<=', $date->format('Y-m-d'));
}
2014-11-12 15:37:44 -06:00
)->where(
2014-08-19 08:30:19 -05:00
function ($q) use ($date) {
$q->whereNull('targetdate');
$q->orWhere('targetdate', '>=', $date->format('Y-m-d'));
}
);
}
2014-08-19 08:30:19 -05:00
)->orWhere(
function ($q) use ($date) {
2014-08-19 08:30:19 -05:00
$q->where('startdate', '>=', $date->format('Y-m-d'));
$q->where('targetdate', '>=', $date->format('Y-m-d'));
}
2014-08-19 08:30:19 -05:00
)->orderBy('startdate', 'ASC');
$result = $query->first();
return $result;
}
public function transactions()
{
return $this->hasMany('Transaction');
}
2014-07-31 15:01:52 -05:00
}