mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-04 02:57:33 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			130 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Models\Traits;
 | 
						|
 | 
						|
use Carbon;
 | 
						|
use DateTime;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class HasRecurrence
 | 
						|
 */
 | 
						|
trait HasRecurrence
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    public function shouldSendToday()
 | 
						|
    {
 | 
						|
        if (! $this->user->confirmed) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        $account = $this->account;
 | 
						|
        $timezone = $account->getTimezone();
 | 
						|
 | 
						|
        if (! $this->start_date || Carbon::parse($this->start_date, $timezone)->isFuture()) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        if ($this->end_date && Carbon::parse($this->end_date, $timezone)->isPast()) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        if (! $this->last_sent_date) {
 | 
						|
            return true;
 | 
						|
        } else {
 | 
						|
            $date1 = new DateTime($this->last_sent_date);
 | 
						|
            $date2 = new DateTime();
 | 
						|
            $diff = $date2->diff($date1);
 | 
						|
            $daysSinceLastSent = $diff->format('%a');
 | 
						|
            $monthsSinceLastSent = ($diff->format('%y') * 12) + $diff->format('%m');
 | 
						|
 | 
						|
            // check we don't send a few hours early due to timezone difference
 | 
						|
            if (Carbon::now()->format('Y-m-d') != Carbon::now($timezone)->format('Y-m-d')) {
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
 | 
						|
            // check we never send twice on one day
 | 
						|
            if ($daysSinceLastSent == 0) {
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        switch ($this->frequency_id) {
 | 
						|
            case FREQUENCY_WEEKLY:
 | 
						|
                return $daysSinceLastSent >= 7;
 | 
						|
            case FREQUENCY_TWO_WEEKS:
 | 
						|
                return $daysSinceLastSent >= 14;
 | 
						|
            case FREQUENCY_FOUR_WEEKS:
 | 
						|
                return $daysSinceLastSent >= 28;
 | 
						|
            case FREQUENCY_MONTHLY:
 | 
						|
                return $monthsSinceLastSent >= 1;
 | 
						|
            case FREQUENCY_TWO_MONTHS:
 | 
						|
                return $monthsSinceLastSent >= 2;
 | 
						|
            case FREQUENCY_THREE_MONTHS:
 | 
						|
                return $monthsSinceLastSent >= 3;
 | 
						|
            case FREQUENCY_SIX_MONTHS:
 | 
						|
                return $monthsSinceLastSent >= 6;
 | 
						|
            case FREQUENCY_ANNUALLY:
 | 
						|
                return $monthsSinceLastSent >= 12;
 | 
						|
            default:
 | 
						|
                return false;
 | 
						|
        }
 | 
						|
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    private function getRecurrenceRule()
 | 
						|
    {
 | 
						|
        $rule = '';
 | 
						|
 | 
						|
        switch ($this->frequency_id) {
 | 
						|
            case FREQUENCY_WEEKLY:
 | 
						|
                $rule = 'FREQ=WEEKLY;';
 | 
						|
                break;
 | 
						|
            case FREQUENCY_TWO_WEEKS:
 | 
						|
                $rule = 'FREQ=WEEKLY;INTERVAL=2;';
 | 
						|
                break;
 | 
						|
            case FREQUENCY_FOUR_WEEKS:
 | 
						|
                $rule = 'FREQ=WEEKLY;INTERVAL=4;';
 | 
						|
                break;
 | 
						|
            case FREQUENCY_MONTHLY:
 | 
						|
                $rule = 'FREQ=MONTHLY;';
 | 
						|
                break;
 | 
						|
            case FREQUENCY_TWO_MONTHS:
 | 
						|
                $rule = 'FREQ=MONTHLY;INTERVAL=2;';
 | 
						|
                break;
 | 
						|
            case FREQUENCY_THREE_MONTHS:
 | 
						|
                $rule = 'FREQ=MONTHLY;INTERVAL=3;';
 | 
						|
                break;
 | 
						|
            case FREQUENCY_SIX_MONTHS:
 | 
						|
                $rule = 'FREQ=MONTHLY;INTERVAL=6;';
 | 
						|
                break;
 | 
						|
            case FREQUENCY_ANNUALLY:
 | 
						|
                $rule = 'FREQ=YEARLY;';
 | 
						|
                break;
 | 
						|
        }
 | 
						|
 | 
						|
        if ($this->end_date) {
 | 
						|
            $rule .= 'UNTIL=' . $this->getOriginal('end_date');
 | 
						|
        }
 | 
						|
 | 
						|
        return $rule;
 | 
						|
    }
 | 
						|
 | 
						|
    /*
 | 
						|
    public function shouldSendToday()
 | 
						|
    {
 | 
						|
        if (!$nextSendDate = $this->getNextSendDate()) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->account->getDateTime() >= $nextSendDate;
 | 
						|
    }
 | 
						|
    */
 | 
						|
 | 
						|
}
 |