Passed
Push — master ( 3ad356...ec22f8 )
by Julito
34:02
created

Version20190210182615::getDescription()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
/* For licensing terms, see /license.txt */
6
7
namespace Chamilo\CoreBundle\Migrations\Schema\V200;
8
9
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
10
use Doctrine\DBAL\Schema\Schema;
11
12
class Version20190210182615 extends AbstractMigrationChamilo
13
{
14
    public function getDescription(): string
15
    {
16
        return 'Session changes';
17
    }
18
19
    public function up(Schema $schema): void
20
    {
21
        $connection = $this->getEntityManager()->getConnection();
22
23
        $table = $schema->getTable('session');
24
        if (false === $table->hasColumn('position')) {
25
            $this->addSql('ALTER TABLE session ADD COLUMN position INT DEFAULT 0 NOT NULL');
26
        } else {
27
            $this->addSql('ALTER TABLE session CHANGE position position INT DEFAULT 0 NOT NULL');
28
        }
29
30
        $this->addSql('UPDATE session SET promotion_id = NULL WHERE promotion_id = 0');
31
        if (false === $table->hasForeignKey('FK_D044D5D4139DF194')) {
32
            $this->addSql('ALTER TABLE session ADD CONSTRAINT FK_D044D5D4139DF194 FOREIGN KEY (promotion_id) REFERENCES promotion (id) ON DELETE CASCADE');
33
            $this->addSql('CREATE INDEX IDX_D044D5D4139DF194 ON session (promotion_id);');
34
        }
35
36
        if (false === $table->hasColumn('status')) {
37
            $this->addSql('ALTER TABLE session ADD COLUMN status INT NOT NULL');
38
        }
39
40
        if (false === $table->hasForeignKey('FK_D044D5D4EF87E278')) {
41
            $this->addSql('ALTER TABLE session ADD CONSTRAINT FK_D044D5D4EF87E278 FOREIGN KEY(session_admin_id) REFERENCES user(id);');
42
        }
43
44
        $this->addSql('UPDATE session_category SET date_start = NULL WHERE CAST(date_start AS CHAR(11)) = "0000-00-00"');
45
        $this->addSql('UPDATE session_category SET date_end = NULL WHERE CAST(date_end AS CHAR(11)) = "0000-00-00"');
46
47
        $table = $schema->getTable('session_rel_course_rel_user');
48
49
        if (!$table->hasColumn('progress')) {
50
            $this->addSql('ALTER TABLE session_rel_course_rel_user ADD progress INT NOT NULL');
51
        }
52
53
        if ($table->hasForeignKey('FK_720167E91D79BD3')) {
54
            $this->addSql('ALTER TABLE session_rel_course_rel_user DROP FOREIGN KEY FK_720167E91D79BD3');
55
            $this->addSql('ALTER TABLE session_rel_course_rel_user ADD CONSTRAINT FK_720167E91D79BD3 FOREIGN KEY (c_id) REFERENCES course (id) ON DELETE CASCADE');
56
        } else {
57
            $this->addSql('ALTER TABLE session_rel_course_rel_user ADD CONSTRAINT FK_720167E91D79BD3 FOREIGN KEY (c_id) REFERENCES course (id) ON DELETE CASCADE');
58
        }
59
60
        // Remove duplicates.
61
        $sql = 'SELECT max(id) id, session_id, c_id, user_id, status, count(*) as count 
62
                FROM session_rel_course_rel_user 
63
                GROUP BY session_id, c_id, user_id, status
64
                HAVING count > 1';
65
        $result = $connection->executeQuery($sql);
66
        $items = $result->fetchAllAssociative();
67
68
        foreach ($items as $item) {
69
            $userId = $item['user_id'];
70
            $sessionId = $item['session_id'];
71
            $courseId = $item['c_id'];
72
            $status = $item['status'];
73
74
            $sql = "SELECT id 
75
                    FROM session_rel_course_rel_user
76
                    WHERE user_id = $userId AND session_id = $sessionId AND c_id = $courseId AND status = $status";
77
            $result = $connection->executeQuery($sql);
78
            $subItems = $result->fetchAllAssociative();
79
            $counter = 0;
80
            foreach ($subItems as $subItem) {
81
                $id = $subItem['id'];
82
                if (0 === $counter) {
83
                    $counter++;
84
85
                    continue;
86
                }
87
                $sql = "DELETE FROM session_rel_course_rel_user WHERE id = $id";
88
                $this->addSql($sql);
89
                $counter++;
90
            }
91
        }
92
93
        if (!$table->hasIndex('course_session_unique')) {
94
            $this->addSql(' CREATE UNIQUE INDEX course_session_unique ON session_rel_course_rel_user (session_id, c_id, user_id, status);');
95
        }
96
97
        $table = $schema->getTable('session_rel_course');
98
        if (!$table->hasIndex('UNIQ_12D110D391D79BD3')) {
99
            $this->addSql('CREATE UNIQUE INDEX course_session_unique ON session_rel_course (session_id, c_id)');
100
        }
101
102
        $table = $schema->getTable('session_rel_user');
103
        if (!$table->hasIndex('session_user_unique')) {
104
            $this->addSql('CREATE UNIQUE INDEX session_user_unique ON session_rel_user (session_id, user_id, relation_type);');
105
        }
106
    }
107
108
    public function down(Schema $schema): void
109
    {
110
    }
111
}
112