Your IP : 216.73.217.79


Current Path : /var/www/v3.cesa.co.za/src/UserBundle/Util/
Upload File :
Current File : /var/www/v3.cesa.co.za/src/UserBundle/Util/CCEStudentDisplayOrder.php

<?php

namespace App\UserBundle\Util;

use Doctrine\ORM\QueryBuilder;

/**
 * Standard CCEStudent list ordering: KnownAs, else FirstName, then Surname.
 */
final class CCEStudentDisplayOrder
{
    public static function sqlOrderByDisplayName(string $tableAlias = 'CCEStudents'): string
    {
        $alias = preg_replace('/[^A-Za-z0-9_]/', '', $tableAlias);
        if ($alias === '') {
            $alias = 'CCEStudents';
        }

        return 'CASE WHEN ' . $alias . '.KnownAs IS NULL OR TRIM(' . $alias . '.KnownAs) = \'\''
            . ' THEN ' . $alias . '.FirstName ELSE ' . $alias . '.KnownAs END, '
            . $alias . '.Surname';
    }

    public static function applyToQueryBuilder(QueryBuilder $qb, string $alias = 's'): void
    {
        $qb->addSelect(
            'CASE WHEN ' . $alias . '.known_as IS NULL OR TRIM(' . $alias . '.known_as) = \'\''
            . ' THEN ' . $alias . '.first_name ELSE ' . $alias . '.known_as END AS HIDDEN _studentSortPrimary'
        );
        $qb->addOrderBy('_studentSortPrimary', 'ASC');
        $qb->addOrderBy($alias . '.surname', 'ASC');
    }

    /**
     * @param object $left
     * @param object $right
     */
    public static function compareObjects($left, $right): int
    {
        $cmp = strcasecmp(self::getObjectSortPrimaryName($left), self::getObjectSortPrimaryName($right));
        if ($cmp !== 0) {
            return $cmp;
        }

        return strcasecmp(self::getObjectSortSurname($left), self::getObjectSortSurname($right));
    }

    /**
     * @param array<int, array<string, mixed>> $rows
     */
    public static function sortRowsWithStudentObject(array &$rows, string $studentKey = 'student'): void
    {
        if (count($rows) <= 1) {
            return;
        }

        usort(
            $rows,
            static function (array $left, array $right) use ($studentKey): int {
                $studentLeft = $left[$studentKey] ?? null;
                $studentRight = $right[$studentKey] ?? null;
                if (!is_object($studentLeft) || !is_object($studentRight)) {
                    return 0;
                }

                return self::compareObjects($studentLeft, $studentRight);
            }
        );
    }

    /**
     * @param object $object
     */
    public static function getObjectSortPrimaryName($object): string
    {
        if (is_object($object) && method_exists($object, 'getKnownAs')) {
            $knownAs = trim((string) $object->getKnownAs());
            if ($knownAs !== '') {
                return $knownAs;
            }
        }
        if (is_object($object) && method_exists($object, 'getFirstName')) {
            return trim((string) $object->getFirstName());
        }

        return '';
    }

    /**
     * @param object $object
     */
    public static function getObjectSortSurname($object): string
    {
        if (is_object($object) && method_exists($object, 'getSurname')) {
            return trim((string) $object->getSurname());
        }

        return '';
    }
}