Passed
Push — master ( 41336b...272761 )
by Angel Fernando Quiroz
08:09
created

getByHandlerAndFieldId()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 12
nc 1
nop 4
dl 0
loc 16
rs 9.8666
c 1
b 0
f 0
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 Chamilo\CourseBundle\Entity\CLp;
13
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
14
use Doctrine\ORM\NonUniqueResultException;
15
use Doctrine\ORM\Query\Expr\Join;
16
use Doctrine\Persistence\ManagerRegistry;
17
18
/**
19
 * @author Angel Fernando Quiroz Campos <[email protected]>
20
 * @author Julio Montoya
21
 */
22
class ExtraFieldValuesRepository extends ServiceEntityRepository
23
{
24
    public function __construct(ManagerRegistry $registry)
25
    {
26
        parent::__construct($registry, ExtraFieldValues::class);
27
    }
28
29
    /**
30
     * Get the extra field values for visible extra fields.
31
     *
32
     * @param int $extraFieldType The type of extra field
33
     * @param int $itemId         The item ID
34
     *
35
     * @return ExtraFieldValues[]
36
     */
37
    public function getVisibleValues(int $extraFieldType, int $itemId)
38
    {
39
        $qb = $this->createQueryBuilder('fv');
40
41
        $qb
42
            ->innerJoin(
43
                ExtraField::class,
44
                'f',
45
                Join::WITH,
46
                'fv.field = f.id'
47
            )
48
            ->where(
49
                $qb->expr()->andX(
50
                    $qb->expr()->eq('f.itemType', $extraFieldType),
51
                    $qb->expr()->eq('fv.itemId', $itemId),
52
                    $qb->expr()->eq('f.visibleToSelf', true)
53
                )
54
            )
55
        ;
56
57
        return $qb->getQuery()->getResult();
58
    }
59
60
    /**
61
     * @param ExtraFieldItemInterface $item can be a User|Course|Any Entity that implements ExtraFieldItemInterface
62
     *
63
     * @return ExtraFieldValues[]
64
     */
65
    public function getExtraFieldValuesFromItem(ExtraFieldItemInterface $item, int $type)
66
    {
67
        $qb = $this->createQueryBuilder('v');
68
        $qb
69
            ->innerJoin('v.field', 'f')
70
            ->andWhere('v.itemId = :id')
71
            ->andWhere(
72
                $qb->expr()->eq('f.visibleToSelf', true),
73
                $qb->expr()->eq('f.itemType', $type)
74
            )
75
            ->setParameter(
76
                'id',
77
                $item->getResourceIdentifier()
78
            )
79
        ;
80
81
        return $qb->getQuery()->getResult();
82
    }
83
84
    public function updateItemData(ExtraField $extraField, ExtraFieldItemInterface $item, ?string $data): ?ExtraFieldValues
85
    {
86
        $itemId = $item->getResourceIdentifier();
87
        $qb = $this->createQueryBuilder('v');
88
        $qb
89
            ->innerJoin('v.field', 'f')
90
            ->andWhere('v.itemId = :id ')
91
            ->andWhere('f = :field ')
92
            ->setParameter('id', $itemId)
93
            ->setParameter('field', $extraField)
94
        ;
95
96
        /** @var ?ExtraFieldValues $extraFieldValues */
97
        $extraFieldValues = $qb->getQuery()->getOneOrNullResult();
98
        $em = $this->getEntityManager();
99
100
        if (null === $extraFieldValues) {
101
            $extraFieldValues = (new ExtraFieldValues())
102
                ->setItemId($itemId)
103
                ->setField($extraField)
104
                ->setFieldValue($data)
105
            ;
106
            $em->persist($extraFieldValues);
107
        } else {
108
            $extraFieldValues->setFieldValue($data);
109
            $em->persist($extraFieldValues);
110
        }
111
112
        $em->flush();
113
114
        return $extraFieldValues;
115
    }
116
117
    public function findLegalAcceptByItemId($itemId)
118
    {
119
        $qb = $this->createQueryBuilder('s')
120
            ->innerJoin('s.field', 'sf')
121
            ->where('s.itemId = :itemId')
122
            ->andWhere('sf.variable = :variable')
123
            ->andWhere('sf.itemType = :itemType')
124
            ->andWhere('s.fieldValue IS NOT NULL')
125
            ->andWhere('s.fieldValue != :emptyString')
126
            ->orderBy('s.id', 'ASC')
127
            ->setMaxResults(1)
128
            ->setParameter('itemId', $itemId)
129
            ->setParameter('variable', 'legal_accept')
130
            ->setParameter('itemType', 1)
131
            ->setParameter('emptyString', '')
132
        ;
133
134
        $result = $qb->getQuery()->getOneOrNullResult();
135
136
        if (null === $result) {
137
            return null;
138
        }
139
140
        return [
141
            'id' => $result->getId(),
142
            'itemId' => $result->getItemId(),
143
            'value' => $result->getFieldValue(),
144
        ];
145
    }
146
147
    /**
148
     * @return ExtraFieldValues|array<ExtraFieldValues>|null
149
     *
150
     * @throws NonUniqueResultException
151
     */
152
    public function findByVariableAndValue(
153
        ExtraField $extraField,
154
        string|int $value,
155
        bool $last = false,
156
        bool $all = false,
157
        bool $useLike = false,
158
    ): ExtraFieldValues|array|null {
159
        $qb = $this->createQueryBuilder('s');
160
161
        if ($useLike) {
162
            $qb->andWhere($qb->expr()->like('s.fieldValue', ':value'));
163
            $value = "%$value%";
164
        } else {
165
            $qb->andWhere($qb->expr()->eq('s.fieldValue', ':value'));
166
        }
167
168
        $query = $qb
169
            ->andWhere(
170
                $qb->expr()->eq('s.field', ':f')
171
            )
172
            ->orderBy('s.itemId', $last ? 'DESC' : 'ASC')
173
            ->setParameter('value', "$value")
174
            ->setParameter('f', $extraField)
175
            ->getQuery()
176
        ;
177
178
        if ($all) {
179
            return $query->getResult();
180
        }
181
182
        return $query->getOneOrNullResult();
183
    }
184
185
    /**
186
     * Retrieves the LP IDs that have a value for 'number_of_days_for_completion'.
187
     */
188
    public function getLpIdWithDaysForCompletion(): array
189
    {
190
        $qb = $this->createQueryBuilder('efv')
191
            ->select('efv.itemId as lp_id, efv.fieldValue as ndays')
192
            ->innerJoin('efv.field', 'ef')
193
            ->innerJoin(CLp::class, 'lp', 'WITH', 'lp.iid = efv.itemId')
194
            ->where('ef.variable = :variable')
195
            ->andWhere('efv.fieldValue > 0')
196
            ->setParameter('variable', 'number_of_days_for_completion')
197
        ;
198
199
        return $qb->getQuery()->getResult();
200
    }
201
202
    public function getByHandlerAndFieldId(int $itemId, int $fieldId, int $itemType, bool $transform = false): array
203
    {
204
        $qb = $this->createQueryBuilder('efv');
205
206
        return $qb
207
            ->innerJoin('efv.field', 'ef')
208
            ->where($qb->expr()->eq('efv.itemId', ':item_id'))
209
            ->andWhere($qb->expr()->eq('efv.field', ':field_id'))
210
            ->andWhere($qb->expr()->eq('ef.itemType', ':item_type'))
211
            ->setParameters([
212
                'item_id' => $itemId,
213
                'field_id' => $fieldId,
214
                'item_type' => $itemType,
215
            ])
216
            ->getQuery()
217
            ->getResult()
218
        ;
219
    }
220
}
221