Proyectos de Subversion LeadersLinked - Services

Rev

Rev 373 | Rev 379 | Ir a la última revisión | | 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
 
42
    /**
364 ariadna 43
     * Valida y ajusta las fechas de un rango de búsqueda.
352 ariadna 44
     *
364 ariadna 45
     * - Si alguna fecha es `null`, se asigna la fecha actual en formato `YYYY-MM-DD`.
46
     * - Si la fecha inicial es mayor que la final, se intercambian.
47
     *
48
     * @param string|null $initialDate Fecha inicial en formato `YYYY-MM-DD` o `null`.
49
     * @param string|null $finalDate Fecha final en formato `YYYY-MM-DD` o `null`.
50
     * @return array Arreglo con las fechas validadas [initialDate, finalDate].
51
     */
52
    function validateAndAdjustDates($initialDate, $finalDate)
53
    {
54
        $currentDate = date('Y-m-d'); // Fecha actual en formato YYYY-MM-DD
370 ariadna 55
        $yesterdayDate = date('Y-m-d', strtotime('-1 day')); // Fecha del día anterior
364 ariadna 56
 
370 ariadna 57
        // Asignar la fecha del día anterior si initialDate es nula
364 ariadna 58
        if (empty($initialDate)) {
370 ariadna 59
            $initialDate = $yesterdayDate;
364 ariadna 60
        }
370 ariadna 61
 
62
        // Asignar la fecha actual si finalDate es nula
364 ariadna 63
        if (empty($finalDate)) {
64
            $finalDate = $currentDate;
65
        }
66
 
67
        // Convertir las fechas a objetos DateTime para compararlas
68
        $initialDateObj = new DateTime($initialDate);
69
        $finalDateObj = new DateTime($finalDate);
70
 
71
        // Si la fecha inicial es mayor a la final, intercambiarlas
72
        if ($initialDateObj > $finalDateObj) {
73
            list($initialDate, $finalDate) = [$finalDate, $initialDate];
74
        }
75
 
76
        return [$initialDate, $finalDate];
77
    }
78
 
79
 
80
    /**
81
     *
352 ariadna 82
     * @param AdapterInterface $adapter
83
     * @return HabitReportMapper
84
     */
85
    public static function getInstance($adapter)
86
    {
87
        if (self::$_instance == null) {
88
            self::$_instance = new HabitReportMapper($adapter);
89
        }
90
        return self::$_instance;
91
    }
92
 
93
    /**
94
     *
95
     * @param int $id
358 ariadna 96
     * @return array
352 ariadna 97
     */
363 ariadna 98
    public function fetchDaysIntervalsRegisterList($id, $dateInitial, $dateFinal)
352 ariadna 99
    {
358 ariadna 100
        // Crear el objeto de selección
367 ariadna 101
        $select = $this->sql->select(self::_TABLE_B);
363 ariadna 102
 
374 ariadna 103
        // Usar DISTINCT con Expression y convertir added_on a solo fecha
373 ariadna 104
        $select->columns([
374 ariadna 105
            'added_on' => new Expression('DISTINCT DATE(added_on)')
373 ariadna 106
        ]);
107
 
374 ariadna 108
        // Agregar las condiciones de filtrado con solo la parte de la fecha
372 ariadna 109
        $select->where
110
            ->equalTo('user_id', $id)
374 ariadna 111
            ->greaterThanOrEqualTo(new Expression('DATE(added_on)'), $dateInitial)
112
            ->lessThanOrEqualTo(new Expression('DATE(added_on)'), $dateFinal);
363 ariadna 113
 
114
        // Ordenar por fecha de forma descendente
359 ariadna 115
        $select->order('added_on DESC');
352 ariadna 116
 
358 ariadna 117
        // Ejecutar la consulta
118
        $statement = $this->sql->prepareStatementForSqlObject($select);
119
        $results = $statement->execute();
120
 
121
        // Convertir los resultados en un array
122
        $records = [];
123
        foreach ($results as $row) {
124
            $records[] = $row;
125
        }
126
 
127
        return $records;
352 ariadna 128
    }
129
 
130
    /**
131
     *
132
     * @param string $uuid
133
     */
134
    public function fetchFiveteenByUuid($uuid)
135
    {
136
        $select = $this->sql->select(self::_TABLE_C);
137
        $select->where->equalTo('uuid', $uuid);
138
        $select->order('created_at DESC');
358 ariadna 139
        $select->limit(15);
352 ariadna 140
 
141
        return $select;
142
    }
143
 
144
    /**
145
     *
146
     * @param string $uuid
147
     * @param string $network_id
148
     * @return HabitSkill
149
     */
150
    public function fetchOneByUuidAndNetworkId($uuid, $network_id)
151
    {
152
        $select = $this->sql->select(self::_TABLE);
153
        $select->where->equalTo('uuid', $uuid);
154
        $select->where->equalTo('network_id', $network_id);
155
        $select->limit(1);
156
 
157
 
158
 
159
        $prototype = new HabitSkill();
160
        return $this->executeFetchOneObject($select, $prototype);
161
    }
162
 
163
    /**
164
     *
165
     * @param int $user_id
166
     * @return HabitSkill[]
167
     */
168
    public function fetchAllByUserId($user_id)
169
    {
170
 
171
        $prototype = new HabitSkill();
172
 
173
 
174
        $select = $this->sql->select(self::_TABLE);
175
        $select->where->equalTo('user_id', $user_id);
176
        $select->order('name');
177
 
178
        return $this->executeFetchAllObject($select, $prototype);
179
    }
180
 
181
    /**
182
     *
183
     * @param int[] $company_ids
184
     * @param string $search
185
     * @return HabitSkill[]
186
     */
187
    public function searchAllTemplateByCompayIds($company_ids, $search)
188
    {
189
        $prototype = new HabitSkill();
190
 
191
 
192
        $select = $this->sql->select(self::_TABLE);
193
        $select->where->in('company_id', $company_ids);
194
        $select->where->like('name', '%' . $search . '%');
195
        $select->where->equalTo('template', HabitSkill::TEMPLATE_YES);
196
 
197
        return $this->executeFetchAllObject($select, $prototype);
198
    }
199
 
200
 
201
 
202
    /**
203
     *
204
     * @param int[] $company_ids
205
     * @return HabitSkill[]
206
     */
207
    public function fetchAllTemplateByCompayIds($company_ids)
208
    {
209
        $prototype = new HabitSkill();
210
 
211
 
212
        $select = $this->sql->select(self::_TABLE);
213
        $select->where->in('company_id', $company_ids);
214
        $select->where->equalTo('template', HabitSkill::TEMPLATE_YES);
215
 
216
        return $this->executeFetchAllObject($select, $prototype);
217
    }
218
 
219
    /**
220
     *
221
     * @param int $company_id
222
     * @param string $search
223
     * @param int $page
224
     * @param int $records_per_page
225
     * @param string $order_field
226
     * @param string $order_direction
227
     * @return Paginator
228
     */
229
    public function fetchAllDataTableTemplates($company_id, $search, $page = 1, $records_per_page = 10, $order_field = 'name', $order_direction = 'ASC')
230
    {
231
        $prototype = new HabitSkill();
232
        $select = $this->sql->select(self::_TABLE);
233
 
234
        if ($search) {
235
            $select->where->like('name', '%' . $search . '%');
236
        }
237
        $select->where->equalTo('company_id', $company_id);
238
        $select->order($order_field . ' ' . $order_direction);
239
 
240
 
241
 
242
        // echo $select->getSqlString($this->adapter->platform); exit;
243
 
244
        $hydrator   = new ObjectPropertyHydrator();
245
        $resultset  = new HydratingResultSet($hydrator, $prototype);
246
 
247
        $adapter = new DbSelect($select, $this->sql, $resultset);
248
        $paginator = new Paginator($adapter);
249
        $paginator->setItemCountPerPage($records_per_page);
250
        $paginator->setCurrentPageNumber($page);
251
 
252
 
253
        return $paginator;
254
    }
255
 
256
 
257
 
258
    /**
259
     *
260
     * @param int $user_id
261
     * @param string $search
262
     * @param int $page
263
     * @param int $records_per_page
264
     * @param string $order_field
265
     * @param string $order_direction
266
     * @return Paginator
267
     */
268
    public function fetchAllDataTable($user_id, $search, $page = 1, $records_per_page = 10, $order_field = 'name', $order_direction = 'ASC')
269
    {
270
        $prototype = new HabitSkill();
271
        $select = $this->sql->select(self::_TABLE);
272
 
273
        if ($search) {
274
            $select->where->like('name', '%' . $search . '%');
275
        }
276
        $select->where->equalTo('user_id', $user_id);
277
        $select->order($order_field . ' ' . $order_direction);
278
 
279
        // echo $select->getSqlString($this->adapter->platform); exit;
280
 
281
        $hydrator   = new ObjectPropertyHydrator();
282
        $resultset  = new HydratingResultSet($hydrator, $prototype);
283
 
284
        $adapter = new DbSelect($select, $this->sql, $resultset);
285
        $paginator = new Paginator($adapter);
286
        $paginator->setItemCountPerPage($records_per_page);
287
        $paginator->setCurrentPageNumber($page);
288
 
289
 
290
        return $paginator;
291
    }
292
}