Passed
Pull Request — master (#5753)
by Angel Fernando Quiroz
07:49
created

findLegalAcceptByItemId()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 27
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 20
c 0
b 0
f 0
nc 2
nop 1
dl 0
loc 27
rs 9.6
1
<?php
2
3
declare(strict_types=1);
4
5
/* For licensing terms, see /license.txt */
6
7
namespace Chamilo\CoreBundle\Repository;
8
9
use Chamilo\CoreBundle\Entity\ExtraField;
10
use Chamilo\CoreBundle\Entity\ExtraFieldItemInterface;
11
use Chamilo\CoreBundle\Entity\ExtraFieldValues;
12
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
13
use Doctrine\ORM\NonUniqueResultException;
14
use Doctrine\ORM\Query\Expr\Join;
15
use Doctrine\Persistence\ManagerRegistry;
16
17
/**
18
 * @author Angel Fernando Quiroz Campos <[email protected]>
19
 * @author Julio Montoya
20
 */
21
class ExtraFieldValuesRepository extends ServiceEntityRepository
22
{
23
    public function __construct(ManagerRegistry $registry)
24
    {
25
        parent::__construct($registry, ExtraFieldValues::class);
26
    }
27
28
    /**
29
     * Get the extra field values for visible extra fields.
30
     *
31
     * @param int $extraFieldType The type of extra field
32
     * @param int $itemId         The item ID
33
     *
34
     * @return ExtraFieldValues[]
35
     */
36
    public function getVisibleValues(int $extraFieldType, int $itemId)
37
    {
38
        $qb = $this->createQueryBuilder('fv');
39
40
        $qb
41
            ->innerJoin(
42
                'ChamiloCoreBundle:ExtraField',
43
                'f',
44
                Join::WITH,
45
                'fv.field = f.id'
46
            )
47
            ->where(
48
                $qb->expr()->andX(
49
                    $qb->expr()->eq('f.itemType', $extraFieldType),
50
                    $qb->expr()->eq('fv.itemId', $itemId),
51
                    $qb->expr()->eq('f.visibleToSelf', true)
52
                )
53
            )
54
        ;
55
56
        return $qb->getQuery()->getResult();
57
    }
58
59
    /**
60
     * @param ExtraFieldItemInterface $item can be a User|Course|Any Entity that implements ExtraFieldItemInterface
61
     *
62
     * @return ExtraFieldValues[]
63
     */
64
    public function getExtraFieldValuesFromItem(ExtraFieldItemInterface $item, int $type)
65
    {
66
        $qb = $this->createQueryBuilder('v');
67
        $qb
68
            ->innerJoin('v.field', 'f')
69
            ->andWhere('v.itemId = :id')
70
            ->andWhere(
71
                $qb->expr()->eq('f.visibleToSelf', true),
72
                $qb->expr()->eq('f.itemType', $type)
73
            )
74
            ->setParameter(
75
                'id',
76
                $item->getResourceIdentifier()
77
            )
78
        ;
79
80
        return $qb->getQuery()->getResult();
81
    }
82
83
    public function updateItemData(ExtraField $extraField, ExtraFieldItemInterface $item, ?string $data): ?ExtraFieldValues
84
    {
85
        $itemId = $item->getResourceIdentifier();
86
        $qb = $this->createQueryBuilder('v');
87
        $qb
88
            ->innerJoin('v.field', 'f')
89
            ->andWhere('v.itemId = :id ')
90
            ->andWhere('f = :field ')
91
            ->setParameter('id', $itemId)
92
            ->setParameter('field', $extraField)
93
        ;
94
95
        /** @var ?ExtraFieldValues $extraFieldValues */
96
        $extraFieldValues = $qb->getQuery()->getOneOrNullResult();
97
        $em = $this->getEntityManager();
98
99
        if (null === $extraFieldValues) {
100
            $extraFieldValues = (new ExtraFieldValues())
101
                ->setItemId($itemId)
102
                ->setField($extraField)
103
                ->setFieldValue($data)
104
            ;
105
            $em->persist($extraFieldValues);
106
        } else {
107
            $extraFieldValues->setFieldValue($data);
108
            $em->persist($extraFieldValues);
109
        }
110
111
        $em->flush();
112
113
        return $extraFieldValues;
114
    }
115
116
    public function findLegalAcceptByItemId($itemId)
117
    {
118
        $qb = $this->createQueryBuilder('s')
119
            ->innerJoin('s.field', 'sf')
120
            ->where('s.itemId = :itemId')
121
            ->andWhere('sf.variable = :variable')
122
            ->andWhere('sf.itemType = :itemType')
123
            ->andWhere('s.fieldValue IS NOT NULL')
124
            ->andWhere('s.fieldValue != :emptyString')
125
            ->orderBy('s.id', 'ASC')
126
            ->setMaxResults(1)
127
            ->setParameter('itemId', $itemId)
128
            ->setParameter('variable', 'legal_accept')
129
            ->setParameter('itemType', 1)
130
            ->setParameter('emptyString', '')
131
        ;
132
133
        $result = $qb->getQuery()->getOneOrNullResult();
134
135
        if (null === $result) {
136
            return null;
137
        }
138
139
        return [
140
            'id' => $result->getId(),
141
            'itemId' => $result->getItemId(),
142
            'value' => $result->getFieldValue(),
143
        ];
144
    }
145
146
    /**
147
     * @return ExtraFieldValues|array<ExtraFieldValues>|null
148
     *
149
     * @throws NonUniqueResultException
150
     */
151
    public function findByVariableAndValue(
152
        ExtraField $extraField,
153
        string|int $value,
154
        bool $last = false,
155
        bool $all = false,
156
        bool $useLike = false,
157
    ): ExtraFieldValues|array|null {
158
        $qb = $this->createQueryBuilder('s');
159
160
        if ($useLike) {
161
            $qb->andWhere($qb->expr()->like('s.fieldValue', ':value'));
162
            $value = "%$value%";
163
        } else {
164
            $qb->andWhere($qb->expr()->eq('s.fieldValue', ':value'));
165
        }
166
167
        $query = $qb
168
            ->andWhere(
169
                $qb->expr()->eq('s.field', ':f')
170
            )
171
            ->orderBy('s.itemId', $last ? 'DESC' : 'ASC')
172
            ->setParameter('value', "$value")
173
            ->setParameter('f', $extraField)
174
            ->getQuery()
175
        ;
176
177
        if ($all) {
178
            return $query->getResult();
179
        }
180
181
        return $query->getOneOrNullResult();
182
    }
183
}
184