Proyectos de Subversion LeadersLinked - Services

Rev

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;
    }
}