Rev 386 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?php
declare(strict_types=1);
namespace LeadersLinked\Mapper;
use Laminas\Db\Adapter\AdapterInterface;
use Laminas\Db\ResultSet\HydratingResultSet;
use Laminas\Paginator\Adapter\DbSelect;
use Laminas\Paginator\Paginator;
use Laminas\Db\Sql\Expression;
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
use LeadersLinked\Model\HabitSkill;
use LeadersLinked\Mapper\Common\MapperCommon;
use DateTime;
class HabitReportMapper extends MapperCommon
{
const _TABLE_A = 'tbl_habits_skills';
const _TABLE_B = 'tbl_habits_skills_registers';
/**
*
* @var HabitReportMapper
*/
private static $_instance;
/**
*
* @param AdapterInterface $adapter
*/
private function __construct($adapter)
{
parent::__construct($adapter);
}
/**
*
* @param AdapterInterface $adapter
* @return HabitReportMapper
*/
public static function getInstance($adapter)
{
if (self::$_instance == null) {
self::$_instance = new HabitReportMapper($adapter);
}
return self::$_instance;
}
/**
*
* @param int $id
* @return array
*/
public function fetchAccessDayRecordsByDayIntervals($id, $dateInitial, $dateFinal)
{
// Crear el objeto de selección
$select = $this->sql->select(self::_TABLE_B);
// Usar DISTINCT con Expression y convertir added_on a solo fecha
$select->columns([
'date' => new Expression('DISTINCT DATE(date)')
]);
// Agregar las condiciones de filtrado con solo la parte de la fecha
$select->where
->equalTo('user_id', $id)
->greaterThanOrEqualTo(new Expression('DATE(date)'), $dateInitial)
->lessThanOrEqualTo(new Expression('DATE(date)'), $dateFinal);
// Ordenar por fecha de forma descendente
$select->order('date DESC');
// Ejecutar la consulta
$statement = $this->sql->prepareStatementForSqlObject($select);
$results = $statement->execute();
// Convertir los resultados en un array
$records = [];
foreach ($results as $row) {
$records[] = $row;
}
return $records;
}
/**
*
* @param string $uuid
*/
public function fetchFiveteenByUuid($uuid)
{
$select = $this->sql->select(self::_TABLE_C);
$select->where->equalTo('uuid', $uuid);
$select->order('created_at DESC');
$select->limit(15);
return $select;
}
/**
*
* @param string $uuid
* @param string $network_id
* @return HabitSkill
*/
public function fetchOneByUuidAndNetworkId($uuid, $network_id)
{
$select = $this->sql->select(self::_TABLE);
$select->where->equalTo('uuid', $uuid);
$select->where->equalTo('network_id', $network_id);
$select->limit(1);
$prototype = new HabitSkill();
return $this->executeFetchOneObject($select, $prototype);
}
/**
*
* @param int $user_id
* @return HabitSkill[]
*/
public function fetchAllByUserId($user_id)
{
$prototype = new HabitSkill();
$select = $this->sql->select(self::_TABLE);
$select->where->equalTo('user_id', $user_id);
$select->order('name');
return $this->executeFetchAllObject($select, $prototype);
}
/**
*
* @param int[] $company_ids
* @param string $search
* @return HabitSkill[]
*/
public function searchAllTemplateByCompayIds($company_ids, $search)
{
$prototype = new HabitSkill();
$select = $this->sql->select(self::_TABLE);
$select->where->in('company_id', $company_ids);
$select->where->like('name', '%' . $search . '%');
$select->where->equalTo('template', HabitSkill::TEMPLATE_YES);
return $this->executeFetchAllObject($select, $prototype);
}
/**
* Valida y ajusta las fechas de un rango de búsqueda.
*
* - Si alguna fecha es `null`, se asigna la fecha actual en formato `YYYY-MM-DD`.
* - Si la fecha inicial es mayor que la final, se intercambian.
*
* @param string|null $initialDate Fecha inicial en formato `YYYY-MM-DD` o `null`.
* @param string|null $finalDate Fecha final en formato `YYYY-MM-DD` o `null`.
* @return array Arreglo con las fechas validadas [initialDate, finalDate].
*/
function validateAndAdjustDates($filter, $initialDate, $finalDate)
{
$currentDate = date('Y-m-d'); // Fecha actual en formato YYYY-MM-DD
$yesterdayDate = date('Y-m-d', strtotime('-1 day')); // Fecha del día anterior
// Asignar la fecha del día anterior si initialDate es nula
if (empty($initialDate)) {
$initialDate = $yesterdayDate;
}
// Asignar la fecha actual si finalDate es nula
if (empty($finalDate)) {
$finalDate = $currentDate;
}
// Convertir las fechas a objetos DateTime para compararlas
$initialDateObj = new DateTime($initialDate);
$finalDateObj = new DateTime($finalDate);
// Si la fecha inicial es mayor a la final, intercambiarlas
if ($initialDateObj > $finalDateObj) {
list($initialDate, $finalDate) = [$finalDate, $initialDate];
}
return [$initialDate, $finalDate];
}
/**
* Generates a list of dates within a given range and marks whether they exist in a provided list.
*
* @param array $datesList An array of dates to check against.
* @param string $startDate The start date of the range (YYYY-MM-DD).
* @param string $endDate The end date of the range (YYYY-MM-DD).
* @return array A list of dictionaries with each date and a flag indicating its presence in the given list.
*/
function generateDateList($datesList, $startDate, $endDate)
{
$result = [];
$start = new DateTime($startDate);
$end = new DateTime($endDate);
$datesLookup = array_flip($datesList); // Convert list to keys for quick lookup
while ($start <= $end) {
$dateStr = $start->format('Y-m-d');
$result[] = [
'date' => $dateStr,
'flag' => isset($datesLookup[$dateStr]) ? 1 : 0
];
$start->modify('+1 day');
}
return $result;
}
}