Passed
Push — master ( 21ce02...52294c )
by Esteban De La Fuente
04:19
created

Date::formatPeriodSpanish()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 17
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 8
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 17
ccs 0
cts 10
cp 0
crap 6
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * Derafu: Biblioteca PHP (Núcleo).
7
 * Copyright (C) Derafu <https://www.derafu.org>
8
 *
9
 * Este programa es software libre: usted puede redistribuirlo y/o modificarlo
10
 * bajo los términos de la Licencia Pública General Affero de GNU publicada por
11
 * la Fundación para el Software Libre, ya sea la versión 3 de la Licencia, o
12
 * (a su elección) cualquier versión posterior de la misma.
13
 *
14
 * Este programa se distribuye con la esperanza de que sea útil, pero SIN
15
 * GARANTÍA ALGUNA; ni siquiera la garantía implícita MERCANTIL o de APTITUD
16
 * PARA UN PROPÓSITO DETERMINADO. Consulte los detalles de la Licencia Pública
17
 * General Affero de GNU para obtener una información más detallada.
18
 *
19
 * Debería haber recibido una copia de la Licencia Pública General Affero de GNU
20
 * junto a este programa.
21
 *
22
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
23
 */
24
25
namespace Derafu\Lib\Core\Helper;
26
27
use Carbon\Carbon;
28
use Carbon\Exceptions\InvalidFormatException;
29
use InvalidArgumentException;
30
31
/**
32
 * Clase para trabajar con fecha en PHP.
33
 *
34
 * Extiende las funcionalidades de Carbon
35
 */
36
class Date extends Carbon
37
{
38
    /**
39
     * Días de la semana en español.
40
     *
41
     * @var array
42
     */
43
    private const DAYS = [
44
        'domingo',
45
        'lunes',
46
        'martes',
47
        'miércoles',
48
        'jueves',
49
        'viernes',
50
        'sábado',
51
    ];
52
53
    /**
54
     * Meses del año en español.
55
     *
56
     * @var array
57
     */
58
    private const MONTHS = [
59
        'enero',
60
        'febrero',
61
        'marzo',
62
        'abril',
63
        'mayo',
64
        'junio',
65
        'julio',
66
        'agosto',
67
        'septiembre',
68
        'octubre',
69
        'noviembre',
70
        'diciembre',
71
    ];
72
73
    /**
74
     * Formatea una fecha en formato YYYY-MM-DD a un string en español.
75
     *
76
     * @param string $date
77
     * @param bool $showDay
78
     * @return string
79
     */
80 1
    public static function formatSpanish(string $date, bool $showDay = true): string
81
    {
82 1
        $unixtime = strtotime($date);
83 1
        $string = date('j \d\e \M\O\N\T\H \d\e\l Y', $unixtime);
84 1
        if ($showDay) {
85 1
            $string = 'DAY ' . $string;
86
        }
87 1
        $day = self::DAYS[date('w', $unixtime)];
88 1
        $month = self::MONTHS[date('n', $unixtime) - 1];
89
90 1
        return str_replace(['DAY', 'MONTH'], [$day, $month], $string);
91
    }
92
93
    /**
94
     * Formatea un periodo pasado en formato YYYYMM a su representación en
95
     * español del mes.
96
     *
97
     * El resultado para 202501 será "Enero de 2025".
98
     *
99
     * @param integer $period
100
     * @return string
101
     */
102
    public static function formatPeriodSpanish(int $period): string
103
    {
104
        // Extraer año y mes.
105
        $year = substr((string) $period, 0, 4);
106
        $month = substr((string) $period, 4, 2);
107
108
        // Validar el mes.
109
        $index = (int) $month - 1;
110
        if (!isset(self::MONTHS[$index])) {
111
            throw new InvalidArgumentException(sprintf(
112
                'Mes inválido: %s.',
113
                $month
114
            ));
115
        }
116
117
        // Retornar el mes y el año formateados.
118
        return ucfirst(self::MONTHS[$index]) . ' de ' . $year;
119
    }
120
121
    /**
122
     * Valida si una fecha está en el formato Y-m-d y la convierte a un nuevo
123
     * formato.
124
     *
125
     * @param string $date
126
     * @return string|null
127
     */
128 4
    public static function validateAndConvert(
129
        string $date,
130
        string $format = 'd/m/Y'
131
    ): ?string {
132
        try {
133
134 4
            $carbonDate = self::createFromFormat('Y-m-d', $date);
135
            if (
136 3
                $carbonDate === null
137 3
                || $carbonDate->format('Y-m-d') !== $date
138 3
                || $carbonDate->getLastErrors()['error_count'] > 0
139
            ) {
140 1
                return null;
141
            }
142 2
            return $carbonDate->format($format);
143 2
        } catch (InvalidFormatException $e) {
144 2
            return null;
145
        }
146
    }
147
}
148