1<?php
2
3declare(strict_types=1);
4
5include_once("./Services/Object/classes/class.ilObjectAccess.php");
6
7/**
8 * Class ilObjLearningSequenceAccess class
9 *
10 */
11class ilObjLearningSequenceAccess extends ilObjectAccess
12{
13    public static $using_code = false;
14
15    public static function _getCommands() : array
16    {
17        $commands = array(
18            [
19                'cmd' => ilObjLearningSequenceGUI::CMD_VIEW,
20                'permission' => 'read',
21                'lang_var' => 'show',
22                'default' => true
23            ],
24            [
25                'cmd' => ilObjLearningSequenceGUI::CMD_LEARNER_VIEW,
26                'permission' => 'read',
27                'lang_var' => 'show',
28            ],
29            [
30                'cmd' => ilObjLearningSequenceGUI::CMD_CONTENT,
31                'permission' => 'write',
32                'lang_var' => 'edit_content'
33            ],
34            [
35                'cmd' => ilObjLearningSequenceGUI::CMD_SETTINGS,
36                'permission' => 'write',
37                'lang_var' => 'settings'
38            ],
39            [
40                'cmd' => ilObjLearningSequenceGUI::CMD_UNPARTICIPATE,
41                'permission' => 'unparticipate',
42                'lang_var' => 'unparticipate'
43            ]
44        );
45        return $commands;
46    }
47
48    public function usingRegistrationCode()
49    {
50        return self::$using_code;
51    }
52
53    public static function isOffline($ref_id)
54    {
55        $obj = ilObjectFactory::getInstanceByRefId($ref_id);
56        $act = $obj->getLSActivation();
57        $online = $act->getIsOnline();
58
59        if (!$online
60            && ($act->getActivationStart() !== null ||
61                $act->getActivationEnd() !== null)
62        ) {
63            $ts_now = time();
64            $activation_start = $act->getActivationStart();
65            if ($activation_start !== null) {
66                $after_activation_start = $ts_now >= $activation_start->getTimestamp();
67            } else {
68                $after_activation_start = true;
69            }
70            $activation_end = $act->getActivationEnd();
71            if ($activation_end !== null) {
72                $before_activation_end = $ts_now <= $activation_end->getTimestamp();
73            } else {
74                $before_activation_end = true;
75            }
76
77            $online = ($after_activation_start && $before_activation_end);
78        }
79
80        if ($act->getEffectiveOnlineStatus() === false && $online === true) {
81            $obj->setEffectiveOnlineStatus(true);
82            $obj->announceLSOOnline();
83        }
84        if ($act->getEffectiveOnlineStatus() === true && $online === false) {
85            $obj->setEffectiveOnlineStatus(false);
86            $obj->announceLSOOffline();
87        }
88
89
90        return !$online;
91    }
92
93    public function _checkAccess($cmd, $permission, $ref_id, $obj_id, $usr_id = "")
94    {
95        list($rbacsystem, $il_access, $lng) = $this->getDICDependencies();
96
97        switch ($permission) {
98            case 'visible':
99                $has_any_administrative_permission = (
100                    $rbacsystem->checkAccessOfUser($usr_id, 'write', $ref_id) ||
101                    $rbacsystem->checkAccessOfUser($usr_id, 'edit_members', $ref_id) ||
102                    $rbacsystem->checkAccessOfUser($usr_id, 'edit_learning_progress', $ref_id)
103                );
104
105                $is_offine = $this->isOffline($ref_id);
106
107                if ($is_offine && !$has_any_administrative_permission) {
108                    $il_access->addInfoItem(IL_NO_OBJECT_ACCESS, $lng->txt("offline"));
109                    return false;
110                }
111                return true;
112
113            default:
114                return $rbacsystem->checkAccessOfUser($usr_id, $permission, $ref_id);
115        }
116    }
117
118    protected function getDICDependencies() : array
119    {
120        global $DIC;
121        $rbacsystem = $DIC['rbacsystem'];
122        $il_access = $DIC['ilAccess'];
123        $lng = $DIC['lng'];
124
125        return [
126            $rbacsystem,
127            $il_access,
128            $lng
129        ];
130    }
131}
132