Proyectos de Subversion LeadersLinked - Services

Rev

Rev 386 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
352 ariadna 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Mapper;
6
 
7
 
8
use Laminas\Db\Adapter\AdapterInterface;
9
use Laminas\Db\ResultSet\HydratingResultSet;
10
use Laminas\Paginator\Adapter\DbSelect;
11
use Laminas\Paginator\Paginator;
367 ariadna 12
use Laminas\Db\Sql\Expression;
352 ariadna 13
 
14
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
15
 
16
use LeadersLinked\Model\HabitSkill;
17
use LeadersLinked\Mapper\Common\MapperCommon;
364 ariadna 18
use DateTime;
352 ariadna 19
 
20
 
21
class HabitReportMapper extends MapperCommon
22
{
23
    const _TABLE_A = 'tbl_habits_skills';
363 ariadna 24
    const _TABLE_B = 'tbl_habits_skills_registers';
352 ariadna 25
 
26
 
27
    /**
28
     *
29
     * @var HabitReportMapper
30
     */
31
    private static $_instance;
32
 
33
    /**
34
     *
35
     * @param AdapterInterface $adapter
36
     */
37
    private function __construct($adapter)
38
    {
39
        parent::__construct($adapter);
40
    }
41
 
364 ariadna 42
 
381 ariadna 43
    /**
44
     *
352 ariadna 45
     * @param AdapterInterface $adapter
46
     * @return HabitReportMapper
47
     */
48
    public static function getInstance($adapter)
49
    {
50
        if (self::$_instance == null) {
51
            self::$_instance = new HabitReportMapper($adapter);
52
        }
53
        return self::$_instance;
54
    }
55
 
56
    /**
57
     *
58
     * @param int $id
358 ariadna 59
     * @return array
352 ariadna 60
     */
386 ariadna 61
    public function fetchAccessDayRecordsByDayIntervals($id, $dateInitial, $dateFinal)
352 ariadna 62
    {
358 ariadna 63
        // Crear el objeto de selección
367 ariadna 64
        $select = $this->sql->select(self::_TABLE_B);
363 ariadna 65
 
374 ariadna 66
        // Usar DISTINCT con Expression y convertir added_on a solo fecha
373 ariadna 67
        $select->columns([
379 ariadna 68
            'date' => new Expression('DISTINCT DATE(date)')
373 ariadna 69
        ]);
70
 
374 ariadna 71
        // Agregar las condiciones de filtrado con solo la parte de la fecha
372 ariadna 72
        $select->where
73
            ->equalTo('user_id', $id)
379 ariadna 74
            ->greaterThanOrEqualTo(new Expression('DATE(date)'), $dateInitial)
75
            ->lessThanOrEqualTo(new Expression('DATE(date)'), $dateFinal);
363 ariadna 76
 
77
        // Ordenar por fecha de forma descendente
379 ariadna 78
        $select->order('date DESC');
352 ariadna 79
 
358 ariadna 80
        // Ejecutar la consulta
81
        $statement = $this->sql->prepareStatementForSqlObject($select);
82
        $results = $statement->execute();
83
 
84
        // Convertir los resultados en un array
85
        $records = [];
86
        foreach ($results as $row) {
87
            $records[] = $row;
88
        }
89
 
90
        return $records;
352 ariadna 91
    }
92
 
93
    /**
94
     *
95
     * @param string $uuid
96
     */
97
    public function fetchFiveteenByUuid($uuid)
98
    {
99
        $select = $this->sql->select(self::_TABLE_C);
100
        $select->where->equalTo('uuid', $uuid);
101
        $select->order('created_at DESC');
358 ariadna 102
        $select->limit(15);
352 ariadna 103
 
104
        return $select;
105
    }
106
 
107
    /**
108
     *
109
     * @param string $uuid
110
     * @param string $network_id
111
     * @return HabitSkill
112
     */
113
    public function fetchOneByUuidAndNetworkId($uuid, $network_id)
114
    {
115
        $select = $this->sql->select(self::_TABLE);
116
        $select->where->equalTo('uuid', $uuid);
117
        $select->where->equalTo('network_id', $network_id);
118
        $select->limit(1);
119
 
120
 
121
 
122
        $prototype = new HabitSkill();
123
        return $this->executeFetchOneObject($select, $prototype);
124
    }
125
 
126
    /**
127
     *
128
     * @param int $user_id
129
     * @return HabitSkill[]
130
     */
131
    public function fetchAllByUserId($user_id)
132
    {
133
 
134
        $prototype = new HabitSkill();
135
 
136
 
137
        $select = $this->sql->select(self::_TABLE);
138
        $select->where->equalTo('user_id', $user_id);
139
        $select->order('name');
140
 
141
        return $this->executeFetchAllObject($select, $prototype);
142
    }
143
 
144
    /**
145
     *
146
     * @param int[] $company_ids
147
     * @param string $search
148
     * @return HabitSkill[]
149
     */
150
    public function searchAllTemplateByCompayIds($company_ids, $search)
151
    {
152
        $prototype = new HabitSkill();
153
 
154
 
155
        $select = $this->sql->select(self::_TABLE);
156
        $select->where->in('company_id', $company_ids);
157
        $select->where->like('name', '%' . $search . '%');
158
        $select->where->equalTo('template', HabitSkill::TEMPLATE_YES);
159
 
160
        return $this->executeFetchAllObject($select, $prototype);
161
    }
162
 
163
 
164
 
165
    /**
386 ariadna 166
     * Valida y ajusta las fechas de un rango de búsqueda.
352 ariadna 167
     *
386 ariadna 168
     * - Si alguna fecha es `null`, se asigna la fecha actual en formato `YYYY-MM-DD`.
169
     * - Si la fecha inicial es mayor que la final, se intercambian.
352 ariadna 170
     *
386 ariadna 171
     * @param string|null $initialDate Fecha inicial en formato `YYYY-MM-DD` o `null`.
172
     * @param string|null $finalDate Fecha final en formato `YYYY-MM-DD` o `null`.
173
     * @return array Arreglo con las fechas validadas [initialDate, finalDate].
352 ariadna 174
     */
386 ariadna 175
    function validateAndAdjustDates($filter, $initialDate, $finalDate)
352 ariadna 176
    {
386 ariadna 177
        $currentDate = date('Y-m-d'); // Fecha actual en formato YYYY-MM-DD
178
        $yesterdayDate = date('Y-m-d', strtotime('-1 day')); // Fecha del día anterior
352 ariadna 179
 
386 ariadna 180
        // Asignar la fecha del día anterior si initialDate es nula
181
        if (empty($initialDate)) {
182
            $initialDate = $yesterdayDate;
352 ariadna 183
        }
184
 
386 ariadna 185
        // Asignar la fecha actual si finalDate es nula
186
        if (empty($finalDate)) {
187
            $finalDate = $currentDate;
188
        }
352 ariadna 189
 
386 ariadna 190
        // Convertir las fechas a objetos DateTime para compararlas
191
        $initialDateObj = new DateTime($initialDate);
192
        $finalDateObj = new DateTime($finalDate);
352 ariadna 193
 
386 ariadna 194
        // Si la fecha inicial es mayor a la final, intercambiarlas
195
        if ($initialDateObj > $finalDateObj) {
196
            list($initialDate, $finalDate) = [$finalDate, $initialDate];
197
        }
352 ariadna 198
 
386 ariadna 199
        return [$initialDate, $finalDate];
352 ariadna 200
    }
201
 
202
    /**
386 ariadna 203
     * Generates a list of dates within a given range and marks whether they exist in a provided list.
204
     *
205
     * @param array $datesList An array of dates to check against.
206
     * @param string $startDate The start date of the range (YYYY-MM-DD).
207
     * @param string $endDate The end date of the range (YYYY-MM-DD).
208
     * @return array A list of dictionaries with each date and a flag indicating its presence in the given list.
352 ariadna 209
     */
386 ariadna 210
    function generateDateList($datesList, $startDate, $endDate)
352 ariadna 211
    {
386 ariadna 212
        $result = [];
213
        $start = new DateTime($startDate);
214
        $end = new DateTime($endDate);
215
        $datesLookup = array_flip($datesList); // Convert list to keys for quick lookup
352 ariadna 216
 
386 ariadna 217
        while ($start <= $end) {
218
            $dateStr = $start->format('Y-m-d');
219
            $result[] = [
220
                'date' => $dateStr,
221
                'flag' => isset($datesLookup[$dateStr]) ? 1 : 0
222
            ];
223
            $start->modify('+1 day');
352 ariadna 224
        }
225
 
386 ariadna 226
        return $result;
392 ariadna 227
    }
228
}