Passed
Push — master ( b35c98...707c53 )
by Vojta
05:27
created

ReservationsValidators   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 94
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 10
c 3
b 0
f 0
lcom 1
cbo 2
dl 0
loc 94
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A validateReservation() 0 8 2
A validateDateAttribute() 0 15 4
A replaceReservation() 0 6 1
A isReservationCancelled() 0 6 1
A getDateAsCarbon() 0 4 1
A getFacade() 0 4 1
1
<?php namespace VojtaSvoboda\Reservations\Validators;
2
3
use App;
4
use Carbon\Carbon;
5
use Illuminate\Validation\Validator;
6
use VojtaSvoboda\Reservations\Facades\ReservationsFacade;
7
use VojtaSvoboda\Reservations\Models\Reservation;
8
use VojtaSvoboda\Reservations\Models\Status;
9
10
/**
11
 * Custom Reservations validator.
12
 *
13
 * @package VojtaSvoboda\Reservations\Validators
14
 */
15
class ReservationsValidators extends Validator
16
{
17
    /**
18
     * Validate reservation. Called on date attribute. Validate date availability.
19
     *
20
     * Other available variables: $this->translator, $this->data, $this->rules a $this->messages.
21
     *
22
     * @param string $attribute Name of the validated field.
23
     * @param mixed $value Field value.
24
     *
25
     * @return bool
26
     */
27
	public function validateReservation($attribute, $value)
28
	{
29
	    if ($attribute === 'date') {
30
            return $this->validateDateAttribute($value);
31
        }
32
33
		return false;
34
	}
35
36
    /**
37
     * Validate date attribute.
38
     *
39
     * @param string $value
40
     *
41
     * @return bool
42
     */
43
	protected function validateDateAttribute($value)
44
    {
45
        $date = $this->getDateAsCarbon($value);
46
        $reservationId = isset($this->data['id']) ? $this->data['id'] : null;
47
48
        // disable validation for cancelled reservations
49
        if ($reservationId !== null) {
50
            $reservation = Reservation::findOrFail($reservationId);
51
            if ($this->isReservationCancelled($reservation)) {
52
                return true;
53
            }
54
        }
55
56
        return $this->getFacade()->isDateAvailable($date, $reservationId);
57
    }
58
59
    /**
60
     * Replace placeholder :reservation with custom text.
61
     *
62
     * @param string $message
63
     *
64
     * @return string
65
     */
66
    protected function replaceReservation($message)
67
    {
68
        $date = $this->getDateAsCarbon($this->data['date']);
69
70
        return str_replace(':reservation', $date->format('d.m.Y H:i'), $message);
71
    }
72
73
    /**
74
     * Returns if reservation is cancelled or going to be cancelled.
75
     *
76
     * @param Reservation $reservation
77
     *
78
     * @return bool
79
     */
80
    private function isReservationCancelled($reservation)
81
    {
82
        $futureStatus = Status::findOrFail($this->data['status_id']);
83
84
        return $reservation->isCancelled($futureStatus->ident);
85
    }
86
87
    /**
88
     * Get date as Carbon instance.
89
     *
90
     * @param string $date
91
     *
92
     * @return Carbon
93
     */
94
    private function getDateAsCarbon($date)
95
    {
96
        return Carbon::createFromFormat('Y-m-d H:i:s', $date);
97
    }
98
99
    /**
100
     * Get Reservations facade.
101
     *
102
     * @return ReservationsFacade
103
     */
104
    private function getFacade()
105
    {
106
        return App::make('vojtasvoboda.reservations.facade');
107
    }
108
}
109