Passed
Push — master ( 2254d8...1402e3 )
by Vinicius Lourenço
02:58
created
src/Scheduler/SchedulerServiceProvider.php 1 patch
Indentation   +46 added lines, -46 removed lines patch added patch discarded remove patch
@@ -12,50 +12,50 @@
 block discarded – undo
12 12
 
13 13
 class SchedulerServiceProvider extends ServiceProvider
14 14
 {
15
-    /**
16
-     * Perform post-registration booting of services.
17
-     *
18
-     * @return void
19
-     */
20
-    public function boot()
21
-    {
22
-        $this->publishes([
23
-            __DIR__.'/../config/config.php' => config_path('scheduler.php'),
24
-        ]);
25
-
26
-        $this->loadMigrationsFrom(__DIR__.'/Migrations');
27
-        $this->loadTranslationsFrom(__DIR__.'/Translations', 'scheduler');
28
-
29
-        $this->publishes([
30
-            __DIR__.'/Translations' => resource_path('lang/vendor/scheduler'),
31
-        ]);
32
-    }
33
-
34
-    /**
35
-     * Register the application services.
36
-     *
37
-     * @return void
38
-     */
39
-    public function register()
40
-    {
41
-        $this->app->singleton(Scheduler::class, function ($app) {
42
-            return new Scheduler($app);
43
-        });
44
-
45
-        $this->app->alias(Scheduler::class, 'scheduler');
46
-
47
-        $this->mergeConfig();
48
-    }
49
-
50
-    /**
51
-     * Mescla configurações do usuário com as configurações do Scheduler.
52
-     *
53
-     * @return void
54
-     */
55
-    private function mergeConfig()
56
-    {
57
-        $this->mergeConfigFrom(
58
-            __DIR__.'/../config/config.php', 'scheduler'
59
-        );
60
-    }
15
+	/**
16
+	 * Perform post-registration booting of services.
17
+	 *
18
+	 * @return void
19
+	 */
20
+	public function boot()
21
+	{
22
+		$this->publishes([
23
+			__DIR__.'/../config/config.php' => config_path('scheduler.php'),
24
+		]);
25
+
26
+		$this->loadMigrationsFrom(__DIR__.'/Migrations');
27
+		$this->loadTranslationsFrom(__DIR__.'/Translations', 'scheduler');
28
+
29
+		$this->publishes([
30
+			__DIR__.'/Translations' => resource_path('lang/vendor/scheduler'),
31
+		]);
32
+	}
33
+
34
+	/**
35
+	 * Register the application services.
36
+	 *
37
+	 * @return void
38
+	 */
39
+	public function register()
40
+	{
41
+		$this->app->singleton(Scheduler::class, function ($app) {
42
+			return new Scheduler($app);
43
+		});
44
+
45
+		$this->app->alias(Scheduler::class, 'scheduler');
46
+
47
+		$this->mergeConfig();
48
+	}
49
+
50
+	/**
51
+	 * Mescla configurações do usuário com as configurações do Scheduler.
52
+	 *
53
+	 * @return void
54
+	 */
55
+	private function mergeConfig()
56
+	{
57
+		$this->mergeConfigFrom(
58
+			__DIR__.'/../config/config.php', 'scheduler'
59
+		);
60
+	}
61 61
 }
62 62
\ No newline at end of file
Please login to merge, or discard this patch.
src/Scheduler/Models/ScheduleStatus.php 1 patch
Indentation   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -14,33 +14,33 @@
 block discarded – undo
14 14
 
15 15
 class ScheduleStatus extends Model
16 16
 {
17
-    use SoftDeletes;
17
+	use SoftDeletes;
18 18
 
19 19
 	/**
20
-     * Os atributos que podem ser atribuíveis em massa.
21
-     *
22
-     * @var array
23
-     */
24
-    protected $fillable = [
25
-    	'name', 'description'
26
-    ];
20
+	 * Os atributos que podem ser atribuíveis em massa.
21
+	 *
22
+	 * @var array
23
+	 */
24
+	protected $fillable = [
25
+		'name', 'description'
26
+	];
27 27
 
28
-    /**
29
-     * Os atributos que devem ser transformados para data.
30
-     *
31
-     * @var array
32
-     */
33
-    protected $dates = [
34
-    	'deleted_at'
35
-    ];
28
+	/**
29
+	 * Os atributos que devem ser transformados para data.
30
+	 *
31
+	 * @var array
32
+	 */
33
+	protected $dates = [
34
+		'deleted_at'
35
+	];
36 36
 
37
-    /**
38
-     * Construtor para inicilizar a váriavel table.
39
-     */
40
-    public function __construct(array $attributes = [])
41
-    {
42
-        parent::__construct($attributes);
37
+	/**
38
+	 * Construtor para inicilizar a váriavel table.
39
+	 */
40
+	public function __construct(array $attributes = [])
41
+	{
42
+		parent::__construct($attributes);
43 43
 
44
-        $this->table = Config::get('scheduler.schedule_status_table');
45
-    }
44
+		$this->table = Config::get('scheduler.schedule_status_table');
45
+	}
46 46
 }
47 47
\ No newline at end of file
Please login to merge, or discard this patch.
src/Scheduler/Facades/Scheduler.php 1 patch
Indentation   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -19,13 +19,13 @@
 block discarded – undo
19 19
  */
20 20
 class Scheduler extends Facade
21 21
 {
22
-    /**
23
-     * Get the registered name of the component.
24
-     *
25
-     * @return string
26
-     */
27
-    protected static function getFacadeAccessor()
28
-    {
29
-        return 'scheduler';
30
-    }
22
+	/**
23
+	 * Get the registered name of the component.
24
+	 *
25
+	 * @return string
26
+	 */
27
+	protected static function getFacadeAccessor()
28
+	{
29
+		return 'scheduler';
30
+	}
31 31
 }
32 32
\ No newline at end of file
Please login to merge, or discard this patch.
src/Scheduler/Exceptions/CustomException.php 1 patch
Indentation   +120 added lines, -120 removed lines patch added patch discarded remove patch
@@ -10,124 +10,124 @@
 block discarded – undo
10 10
 
11 11
 class CustomException extends \Exception
12 12
 {
13
-    /**
14
-     * Model que não pertence ao usuário
15
-     *
16
-     * @var mixed
17
-     */
18
-    protected $model;
19
-
20
-    /**
21
-     * Key para o arquivo de tradução de exceções.
22
-     *
23
-     * @var string
24
-     */
25
-    protected $trans;
26
-
27
-    /**
28
-     * HTTP Status Code
29
-     *
30
-     * @var int
31
-     */
32
-    protected $statusCode;
33
-
34
-    /**
35
-     * Atributo usado como key para substituir por um texto.
36
-     *
37
-     * @var array|string
38
-     */
39
-    protected $attributes = 'model';
40
-
41
-    /**
42
-     * Diz se o alias será no singular ou no plural.
43
-     *
44
-     * @var string
45
-     */
46
-    protected $aliastype = 'singular';
47
-
48
-    /**
49
-     * Valor passado para o atributo
50
-     *
51
-     * @var array|string|null
52
-     */
53
-    protected $values = null;
54
-
55
-    /**
56
-     * Indica se a model será printada com lower case.
57
-     *
58
-     * @var boolean
59
-     */
60
-    protected $lowercase = false;
61
-
62
-    /**
63
-     * Construtor da exceção
64
-     *
65
-     * @param mixed $model
66
-     */
67
-    public function __construct($model = 'foo')
68
-    {
69
-        $this->model = $model;
70
-    }
71
-
72
-    /**
73
-     * Render the exception as an HTTP response.
74
-     *
75
-     * @return \Illuminate\Http\JsonResponse
76
-     */
77
-    public function render()
78
-    {
79
-        return response()->
80
-            /** @scrutinizer ignore-call */
81
-            json([
82
-            'messages' => trans('scheduler::exceptions.'. $this->trans, $this->parseValues())
83
-        ], $this->statusCode);
84
-    }
85
-
86
-    /**
87
-     * Dá parse nos valores para a string de tradução.
88
-     *
89
-     * @return array
90
-     */
91
-    protected function parseValues()
92
-    {
93
-        if(is_array($this->attributes) && is_array($this->values))
94
-            return collect($this->attributes)->combine($this->values)->all();
95
-
96
-        return [ $this->attributes => $this->values ?? $this->isLower() ];
97
-    }
98
-
99
-    /**
100
-     * Verifica se é lowercase e retorna de acordo.
101
-     *
102
-     * @return string
103
-     */
104
-    protected function isLower()
105
-    {
106
-        return $this->lowercase ? strtolower($this->getAlias()) : $this->getAlias();
107
-    }
108
-
109
-    /**
110
-     * Retorna o alias da model.
111
-     *
112
-     * @return string
113
-     */
114
-    protected function getAlias()
115
-    {
116
-        if(is_object($this->model))
117
-            $this->model = get_class($this->model);
118
-
119
-        return collect(trans('scheduler::exceptions.aliases.'. $this->aliastype))->search($this->model) ?: 'Recurso';
120
-    }
121
-
122
-    /**
123
-     * Seta os valores.
124
-     *
125
-     * @param mixed $values
126
-     */
127
-    public function setValues($values)
128
-    {
129
-        $this->values = $values;
130
-
131
-        return $this;
132
-    }
13
+	/**
14
+	 * Model que não pertence ao usuário
15
+	 *
16
+	 * @var mixed
17
+	 */
18
+	protected $model;
19
+
20
+	/**
21
+	 * Key para o arquivo de tradução de exceções.
22
+	 *
23
+	 * @var string
24
+	 */
25
+	protected $trans;
26
+
27
+	/**
28
+	 * HTTP Status Code
29
+	 *
30
+	 * @var int
31
+	 */
32
+	protected $statusCode;
33
+
34
+	/**
35
+	 * Atributo usado como key para substituir por um texto.
36
+	 *
37
+	 * @var array|string
38
+	 */
39
+	protected $attributes = 'model';
40
+
41
+	/**
42
+	 * Diz se o alias será no singular ou no plural.
43
+	 *
44
+	 * @var string
45
+	 */
46
+	protected $aliastype = 'singular';
47
+
48
+	/**
49
+	 * Valor passado para o atributo
50
+	 *
51
+	 * @var array|string|null
52
+	 */
53
+	protected $values = null;
54
+
55
+	/**
56
+	 * Indica se a model será printada com lower case.
57
+	 *
58
+	 * @var boolean
59
+	 */
60
+	protected $lowercase = false;
61
+
62
+	/**
63
+	 * Construtor da exceção
64
+	 *
65
+	 * @param mixed $model
66
+	 */
67
+	public function __construct($model = 'foo')
68
+	{
69
+		$this->model = $model;
70
+	}
71
+
72
+	/**
73
+	 * Render the exception as an HTTP response.
74
+	 *
75
+	 * @return \Illuminate\Http\JsonResponse
76
+	 */
77
+	public function render()
78
+	{
79
+		return response()->
80
+			/** @scrutinizer ignore-call */
81
+			json([
82
+			'messages' => trans('scheduler::exceptions.'. $this->trans, $this->parseValues())
83
+		], $this->statusCode);
84
+	}
85
+
86
+	/**
87
+	 * Dá parse nos valores para a string de tradução.
88
+	 *
89
+	 * @return array
90
+	 */
91
+	protected function parseValues()
92
+	{
93
+		if(is_array($this->attributes) && is_array($this->values))
94
+			return collect($this->attributes)->combine($this->values)->all();
95
+
96
+		return [ $this->attributes => $this->values ?? $this->isLower() ];
97
+	}
98
+
99
+	/**
100
+	 * Verifica se é lowercase e retorna de acordo.
101
+	 *
102
+	 * @return string
103
+	 */
104
+	protected function isLower()
105
+	{
106
+		return $this->lowercase ? strtolower($this->getAlias()) : $this->getAlias();
107
+	}
108
+
109
+	/**
110
+	 * Retorna o alias da model.
111
+	 *
112
+	 * @return string
113
+	 */
114
+	protected function getAlias()
115
+	{
116
+		if(is_object($this->model))
117
+			$this->model = get_class($this->model);
118
+
119
+		return collect(trans('scheduler::exceptions.aliases.'. $this->aliastype))->search($this->model) ?: 'Recurso';
120
+	}
121
+
122
+	/**
123
+	 * Seta os valores.
124
+	 *
125
+	 * @param mixed $values
126
+	 */
127
+	public function setValues($values)
128
+	{
129
+		$this->values = $values;
130
+
131
+		return $this;
132
+	}
133 133
 }
Please login to merge, or discard this patch.
src/Scheduler/Models/Schedule.php 1 patch
Indentation   +54 added lines, -54 removed lines patch added patch discarded remove patch
@@ -19,67 +19,67 @@
 block discarded – undo
19 19
  */
20 20
 class Schedule extends Model
21 21
 {
22
-    use SoftDeletes;
22
+	use SoftDeletes;
23 23
 
24 24
 	/**
25
-     * Os atributos que podem ser atribuíveis em massa.
26
-     *
27
-     * @var array
28
-     */
29
-    protected $fillable = [
30
-    	'model_type', 'model_id', 'start_at', 'end_at', 'status'
31
-    ];
25
+	 * Os atributos que podem ser atribuíveis em massa.
26
+	 *
27
+	 * @var array
28
+	 */
29
+	protected $fillable = [
30
+		'model_type', 'model_id', 'start_at', 'end_at', 'status'
31
+	];
32 32
 
33
-    /**
34
-     * Os atributos que devem ser transformados para data.
35
-     *
36
-     * @var array
37
-     */
38
-    protected $dates = [
39
-    	'start_at', 'end_at', 'deleted_at'
40
-    ];
33
+	/**
34
+	 * Os atributos que devem ser transformados para data.
35
+	 *
36
+	 * @var array
37
+	 */
38
+	protected $dates = [
39
+		'start_at', 'end_at', 'deleted_at'
40
+	];
41 41
 
42
-    /**
43
-     * Seta um status para o horário agendado.
44
-     *
45
-     * @param int|string $status Pode ser passado o ID do status ou seu nome para seta-lo no horário.
46
-     */
47
-    public function setStatus($name)
48
-    {
49
-    	$this->fill($this->parseStatusKey($name))->save();
50
-    }
42
+	/**
43
+	 * Seta um status para o horário agendado.
44
+	 *
45
+	 * @param int|string $status Pode ser passado o ID do status ou seu nome para seta-lo no horário.
46
+	 */
47
+	public function setStatus($name)
48
+	{
49
+		$this->fill($this->parseStatusKey($name))->save();
50
+	}
51 51
 
52
-    /**
53
-     * Retorna o ID do status caso passem o nome do status.
54
-     *
55
-     * @param  int|string $status ID ou o nome do status.
56
-     * @return array
57
-     *
58
-     * @throws \H4ad\Scheduler\Exceptions\ModelNotFound
59
-     */
60
-    public function parseStatusKey($status)
61
-    {
62
-    	if(is_int($status))
63
-    		$status =  ScheduleStatus::find($status);
52
+	/**
53
+	 * Retorna o ID do status caso passem o nome do status.
54
+	 *
55
+	 * @param  int|string $status ID ou o nome do status.
56
+	 * @return array
57
+	 *
58
+	 * @throws \H4ad\Scheduler\Exceptions\ModelNotFound
59
+	 */
60
+	public function parseStatusKey($status)
61
+	{
62
+		if(is_int($status))
63
+			$status =  ScheduleStatus::find($status);
64 64
 
65
-        if(is_string($status))
66
-        	$status = ScheduleStatus::where('name', $status)->first();
65
+		if(is_string($status))
66
+			$status = ScheduleStatus::where('name', $status)->first();
67 67
 
68
-    	if(is_null($status))
69
-    		throw (new ModelNotFound)->setValues(ScheduleStatus::class);
68
+		if(is_null($status))
69
+			throw (new ModelNotFound)->setValues(ScheduleStatus::class);
70 70
 
71
-    	return ['status' => $status->id];
72
-    }
71
+		return ['status' => $status->id];
72
+	}
73 73
 
74
-    /**
75
-     * Escopo de uma consulta que busca horarios pela data de início.
76
-     *
77
-     * @param \Illuminate\Database\Eloquent\Builder $query
78
-     * @param \Carbon\Carbon|string $start_at
79
-     * @return \Illuminate\Database\Eloquent\Builder
80
-     */
81
-    public function scopeByStartAt($query, $start_at)
82
-    {
83
-        return $query->where('start_at', $start_at);
84
-    }
74
+	/**
75
+	 * Escopo de uma consulta que busca horarios pela data de início.
76
+	 *
77
+	 * @param \Illuminate\Database\Eloquent\Builder $query
78
+	 * @param \Carbon\Carbon|string $start_at
79
+	 * @return \Illuminate\Database\Eloquent\Builder
80
+	 */
81
+	public function scopeByStartAt($query, $start_at)
82
+	{
83
+		return $query->where('start_at', $start_at);
84
+	}
85 85
 }
86 86
\ No newline at end of file
Please login to merge, or discard this patch.
src/Scheduler/Scheduler.php 1 patch
Indentation   +122 added lines, -122 removed lines patch added patch discarded remove patch
@@ -14,126 +14,126 @@
 block discarded – undo
14 14
 
15 15
 class Scheduler
16 16
 {
17
-    /**
18
-     * Laravel application
19
-     *
20
-     * @var \Illuminate\Foundation\Application
21
-     */
22
-    public $app;
23
-
24
-    /**
25
-     * Create a new confide instance.
26
-     *
27
-     * @param \Illuminate\Foundation\Application $app
28
-     *
29
-     * @return void
30
-     */
31
-    public function __construct($app)
32
-    {
33
-        $this->app = $app;
34
-    }
35
-
36
-    /**
37
-     * Escopo de uma consulta que busca horarios pela data de início.
38
-     *
39
-     * @param string $model_type
40
-     * @param string|\Carbon\Carbon $start_at
41
-     * @param string|\Carbon\Carbon $end_at
42
-     * @return bool
43
-     */
44
-    public function hasScheduleBetween($model_type, $start_at, $end_at)
45
-    {
46
-        if(!Config::get('scheduler.enable_schedule_conflict'))
47
-            return false;
48
-
49
-        return !is_null(
50
-            Schedule::latest()
51
-                ->where('model_type', $model_type)
52
-                ->where('start_at', '>=', $start_at)
53
-                ->where('end_at', '<=', $end_at)
54
-                ->first()
55
-        );
56
-    }
57
-
58
-    /**
59
-     * Retorna os horários disponiveis hoje para uma determinada model.
60
-     * .
61
-     * @param  string  $model_type Tipo da model
62
-     * @param  int    $duration Serve para facilitar na hora de buscar horários livres
63
-     *                          que precisem ter uma certa duração.
64
-     * @param \Carbon\Carbon|null $openingTime Serve como referencia para buscar horários livres.
65
-     *                                         Se for nulo, ele busca a referencia da config.
66
-     * @return array
67
-     */
68
-    public function availableToday($model_type, $duration, $openingTime = null)
69
-    {
70
-        return $this->availableOn($model_type, Carbon::now(), $duration, $openingTime);
71
-    }
72
-
73
-    /**
74
-     * Retorna os horários disponiveis em um determinado dia para uma certa model.
75
-     *
76
-     * @param  string  $model_type Tipo da model
77
-     * @param  \Carbon\Carbon $today Data para o qual ele irá fazer a busca.
78
-     * @param  int    $durationMinutes Serve para facilitar na hora de buscar horários livres
79
-     *                          que precisem ter uma certa duração.
80
-     * @param \Carbon\Carbon|null $openingTime Serve como referencia para buscar horários livres.
81
-     *                                         Se for nulo, ele busca a referencia da config.
82
-     * @return array
83
-     */
84
-    public function availableOn($model_type, $today, $durationMinutes, $openingTime = null)
85
-    {
86
-        $openingTime = $openingTime ?? Carbon::parse(Config::get('scheduler.opening_time'))->setDateFrom($today);
87
-        $closingTime = Carbon::parse(Config::get('scheduler.closing_time'))->setDateFrom($today);
88
-
89
-        $livres = [];
90
-        $today = Carbon::parse($today->toDateString());
91
-        while($openingTime <= $closingTime)
92
-        {
93
-            $add = true;
94
-
95
-            $opening = Carbon::parse($openingTime->toDateTimeString());
96
-            $closing = Carbon::parse($openingTime->toDateTimeString())->addMinutes($durationMinutes);
97
-
98
-            foreach (Schedule::where('model_type', $model_type)->orderBy('start_at', 'DESC')->cursor() as $schedule) {
99
-                $start = Carbon::parse($schedule->start_at);
100
-                $begin = Carbon::parse($start->toDateString());
101
-
102
-                if($begin->greaterThan($today))
103
-                    break;
104
-
105
-                if($begin->notEqualTo($today))
106
-                    continue;
107
-
108
-                $end = Carbon::parse($schedule->end_at);
109
-
110
-                if($this->isShouldntAdd($opening, $closing, $start, $end))
111
-                    $add = false;
112
-            }
113
-
114
-            if($add && $closing->lessThanOrEqualTo($closingTime))
115
-                $livres[] = [
116
-                    'start_at' => $opening,
117
-                    'end_at' => $closing
118
-                ];
119
-
120
-            $openingTime->addMinutes($durationMinutes);
121
-        }
122
-
123
-        return $livres;
124
-    }
125
-
126
-    /**
127
-     * Verifica se ele não deve ser adicionado ao array de horários livres.
128
-     *
129
-     * @param  \Carbon\Carbon  $opening
130
-     * @param  \Carbon\Carbon  $closing
131
-     * @param  \Carbon\Carbon  $start
132
-     * @param  \Carbon\Carbon  $end
133
-     * @return boolean
134
-     */
135
-    private function isShouldntAdd($opening, $closing, $start, $end)
136
-    {
137
-        return $start <= $opening && $end >= $closing;
138
-    }
17
+	/**
18
+	 * Laravel application
19
+	 *
20
+	 * @var \Illuminate\Foundation\Application
21
+	 */
22
+	public $app;
23
+
24
+	/**
25
+	 * Create a new confide instance.
26
+	 *
27
+	 * @param \Illuminate\Foundation\Application $app
28
+	 *
29
+	 * @return void
30
+	 */
31
+	public function __construct($app)
32
+	{
33
+		$this->app = $app;
34
+	}
35
+
36
+	/**
37
+	 * Escopo de uma consulta que busca horarios pela data de início.
38
+	 *
39
+	 * @param string $model_type
40
+	 * @param string|\Carbon\Carbon $start_at
41
+	 * @param string|\Carbon\Carbon $end_at
42
+	 * @return bool
43
+	 */
44
+	public function hasScheduleBetween($model_type, $start_at, $end_at)
45
+	{
46
+		if(!Config::get('scheduler.enable_schedule_conflict'))
47
+			return false;
48
+
49
+		return !is_null(
50
+			Schedule::latest()
51
+				->where('model_type', $model_type)
52
+				->where('start_at', '>=', $start_at)
53
+				->where('end_at', '<=', $end_at)
54
+				->first()
55
+		);
56
+	}
57
+
58
+	/**
59
+	 * Retorna os horários disponiveis hoje para uma determinada model.
60
+	 * .
61
+	 * @param  string  $model_type Tipo da model
62
+	 * @param  int    $duration Serve para facilitar na hora de buscar horários livres
63
+	 *                          que precisem ter uma certa duração.
64
+	 * @param \Carbon\Carbon|null $openingTime Serve como referencia para buscar horários livres.
65
+	 *                                         Se for nulo, ele busca a referencia da config.
66
+	 * @return array
67
+	 */
68
+	public function availableToday($model_type, $duration, $openingTime = null)
69
+	{
70
+		return $this->availableOn($model_type, Carbon::now(), $duration, $openingTime);
71
+	}
72
+
73
+	/**
74
+	 * Retorna os horários disponiveis em um determinado dia para uma certa model.
75
+	 *
76
+	 * @param  string  $model_type Tipo da model
77
+	 * @param  \Carbon\Carbon $today Data para o qual ele irá fazer a busca.
78
+	 * @param  int    $durationMinutes Serve para facilitar na hora de buscar horários livres
79
+	 *                          que precisem ter uma certa duração.
80
+	 * @param \Carbon\Carbon|null $openingTime Serve como referencia para buscar horários livres.
81
+	 *                                         Se for nulo, ele busca a referencia da config.
82
+	 * @return array
83
+	 */
84
+	public function availableOn($model_type, $today, $durationMinutes, $openingTime = null)
85
+	{
86
+		$openingTime = $openingTime ?? Carbon::parse(Config::get('scheduler.opening_time'))->setDateFrom($today);
87
+		$closingTime = Carbon::parse(Config::get('scheduler.closing_time'))->setDateFrom($today);
88
+
89
+		$livres = [];
90
+		$today = Carbon::parse($today->toDateString());
91
+		while($openingTime <= $closingTime)
92
+		{
93
+			$add = true;
94
+
95
+			$opening = Carbon::parse($openingTime->toDateTimeString());
96
+			$closing = Carbon::parse($openingTime->toDateTimeString())->addMinutes($durationMinutes);
97
+
98
+			foreach (Schedule::where('model_type', $model_type)->orderBy('start_at', 'DESC')->cursor() as $schedule) {
99
+				$start = Carbon::parse($schedule->start_at);
100
+				$begin = Carbon::parse($start->toDateString());
101
+
102
+				if($begin->greaterThan($today))
103
+					break;
104
+
105
+				if($begin->notEqualTo($today))
106
+					continue;
107
+
108
+				$end = Carbon::parse($schedule->end_at);
109
+
110
+				if($this->isShouldntAdd($opening, $closing, $start, $end))
111
+					$add = false;
112
+			}
113
+
114
+			if($add && $closing->lessThanOrEqualTo($closingTime))
115
+				$livres[] = [
116
+					'start_at' => $opening,
117
+					'end_at' => $closing
118
+				];
119
+
120
+			$openingTime->addMinutes($durationMinutes);
121
+		}
122
+
123
+		return $livres;
124
+	}
125
+
126
+	/**
127
+	 * Verifica se ele não deve ser adicionado ao array de horários livres.
128
+	 *
129
+	 * @param  \Carbon\Carbon  $opening
130
+	 * @param  \Carbon\Carbon  $closing
131
+	 * @param  \Carbon\Carbon  $start
132
+	 * @param  \Carbon\Carbon  $end
133
+	 * @return boolean
134
+	 */
135
+	private function isShouldntAdd($opening, $closing, $start, $end)
136
+	{
137
+		return $start <= $opening && $end >= $closing;
138
+	}
139 139
 }
140 140
\ No newline at end of file
Please login to merge, or discard this patch.
src/Scheduler/Migrations/2018_08_18_225944_create_schedules_table.php 1 patch
Indentation   +27 added lines, -27 removed lines patch added patch discarded remove patch
@@ -15,32 +15,32 @@
 block discarded – undo
15 15
 
16 16
 class CreateSchedulesTable extends Migration
17 17
 {
18
-    /**
19
-     * Run the migrations.
20
-     *
21
-     * @return void
22
-     */
23
-    public function up()
24
-    {
25
-        Schema::create(Config::get('scheduler.schedules_table'), function (Blueprint $table) {
26
-            $table->increments('id');
27
-            $table->string('model_type');
28
-            $table->integer('model_id');
29
-            $table->timestamp('start_at');
30
-            $table->timestamp('end_at')->nullable();
31
-            $table->integer('status')->nullable();
32
-            $table->timestamps();
33
-            $table->softDeletes();
34
-        });
35
-    }
18
+	/**
19
+	 * Run the migrations.
20
+	 *
21
+	 * @return void
22
+	 */
23
+	public function up()
24
+	{
25
+		Schema::create(Config::get('scheduler.schedules_table'), function (Blueprint $table) {
26
+			$table->increments('id');
27
+			$table->string('model_type');
28
+			$table->integer('model_id');
29
+			$table->timestamp('start_at');
30
+			$table->timestamp('end_at')->nullable();
31
+			$table->integer('status')->nullable();
32
+			$table->timestamps();
33
+			$table->softDeletes();
34
+		});
35
+	}
36 36
 
37
-    /**
38
-     * Reverse the migrations.
39
-     *
40
-     * @return void
41
-     */
42
-    public function down()
43
-    {
44
-        Schema::drop(Config::get('scheduler.schedules_table'));
45
-    }
37
+	/**
38
+	 * Reverse the migrations.
39
+	 *
40
+	 * @return void
41
+	 */
42
+	public function down()
43
+	{
44
+		Schema::drop(Config::get('scheduler.schedules_table'));
45
+	}
46 46
 }
47 47
\ No newline at end of file
Please login to merge, or discard this patch.
src/Scheduler/Migrations/2018_08_18_225643_create_schedule_status_table.php 1 patch
Indentation   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -15,29 +15,29 @@
 block discarded – undo
15 15
 
16 16
 class CreateScheduleStatusTable extends Migration
17 17
 {
18
-    /**
19
-     * Run the migrations.
20
-     *
21
-     * @return void
22
-     */
23
-    public function up()
24
-    {
25
-        Schema::create(Config::get('scheduler.schedule_status_table'), function (Blueprint $table) {
26
-            $table->increments('id');
27
-            $table->string('name')->unique();
28
-            $table->text('description')->nullable();
29
-            $table->timestamps();
30
-            $table->softDeletes();
31
-        });
32
-    }
18
+	/**
19
+	 * Run the migrations.
20
+	 *
21
+	 * @return void
22
+	 */
23
+	public function up()
24
+	{
25
+		Schema::create(Config::get('scheduler.schedule_status_table'), function (Blueprint $table) {
26
+			$table->increments('id');
27
+			$table->string('name')->unique();
28
+			$table->text('description')->nullable();
29
+			$table->timestamps();
30
+			$table->softDeletes();
31
+		});
32
+	}
33 33
 
34
-    /**
35
-     * Reverse the migrations.
36
-     *
37
-     * @return void
38
-     */
39
-    public function down()
40
-    {
41
-        Schema::drop(Config::get('scheduler.schedule_status_table'));
42
-    }
34
+	/**
35
+	 * Reverse the migrations.
36
+	 *
37
+	 * @return void
38
+	 */
39
+	public function down()
40
+	{
41
+		Schema::drop(Config::get('scheduler.schedule_status_table'));
42
+	}
43 43
 }
44 44
\ No newline at end of file
Please login to merge, or discard this patch.
src/Scheduler/Traits/SchedulerModelTrait.php 1 patch
Indentation   +20 added lines, -20 removed lines patch added patch discarded remove patch
@@ -28,27 +28,27 @@  discard block
 block discarded – undo
28 28
 trait SchedulerModelTrait
29 29
 {
30 30
 	/**
31
-     * Define a one-to-many relationship.
32
-     *
33
-     * @param  string  $related
34
-     * @param  string  $foreignKey
35
-     * @param  string  $localKey
36
-     * @return \Illuminate\Database\Eloquent\Relations\HasMany
37
-     */
38
-    abstract public function hasMany($related, $foreignKey = null, $localKey = null);
31
+	 * Define a one-to-many relationship.
32
+	 *
33
+	 * @param  string  $related
34
+	 * @param  string  $foreignKey
35
+	 * @param  string  $localKey
36
+	 * @return \Illuminate\Database\Eloquent\Relations\HasMany
37
+	 */
38
+	abstract public function hasMany($related, $foreignKey = null, $localKey = null);
39 39
 
40 40
 	/**
41
-     * Get the value of the model's primary key.
42
-     *
43
-     * @return mixed
44
-     */
41
+	 * Get the value of the model's primary key.
42
+	 *
43
+	 * @return mixed
44
+	 */
45 45
 	abstract public function getKey();
46 46
 
47 47
 	/**
48
-     * Retorna apenas os horários que possuem o mesmo [model_type] do [parent] dessa [trait].
49
-     *
50
-     * @return \Illuminate\Database\Eloquent\Relations\HasMany
51
-     */
48
+	 * Retorna apenas os horários que possuem o mesmo [model_type] do [parent] dessa [trait].
49
+	 *
50
+	 * @return \Illuminate\Database\Eloquent\Relations\HasMany
51
+	 */
52 52
 	public function schedules()
53 53
 	{
54 54
 		return $this->hasMany(Config::get('scheduler.schedules_table'), 'model_id');
@@ -95,8 +95,8 @@  discard block
 block discarded – undo
95 95
 	 *
96 96
 	 * @param  int    $duration Serve para facilitar na hora de buscar horários livres
97 97
 	 *                          que precisem ter uma certa duração.
98
-     * @param \Carbon\Carbon|null $openingTime Serve como referencia para buscar horários livres.
99
-     *                                         Se for nulo, ele busca a referencia da config.
98
+	 * @param \Carbon\Carbon|null $openingTime Serve como referencia para buscar horários livres.
99
+	 *                                         Se for nulo, ele busca a referencia da config.
100 100
 	 * @return array
101 101
 	 */
102 102
 	public function availableToday($duration = 0, $openingTime = null)
@@ -110,8 +110,8 @@  discard block
 block discarded – undo
110 110
 	 * @param  string|\Carbon\Carbon $date Data para o qual ele irá fazer a busca.
111 111
 	 * @param  int    $duration Serve para facilitar na hora de buscar horários livres
112 112
 	 *                          que precisem ter uma certa duração.
113
-     * @param \Carbon\Carbon|null $openingTime Serve como referencia para buscar horários livres.
114
-     *                                         Se for nulo, ele busca a referencia da config.
113
+	 * @param \Carbon\Carbon|null $openingTime Serve como referencia para buscar horários livres.
114
+	 *                                         Se for nulo, ele busca a referencia da config.
115 115
 	 * @return array
116 116
 	 */
117 117
 	public function availableOn($date, $duration = 0, $openingTime = null)
Please login to merge, or discard this patch.