]> _ Git - fluidbook-toolbox.git/commitdiff
wip #5625 @2
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Mon, 5 Dec 2022 14:35:14 +0000 (15:35 +0100)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Mon, 5 Dec 2022 14:35:14 +0000 (15:35 +0100)
app/Fields/CubedesignersTeamMember.php [new file with mode: 0644]
app/Models/Base/ToolboxHRModel.php [new file with mode: 0644]
app/Models/Base/ToolboxModel.php
app/Models/CubedesignersEmails.php [deleted file]
app/Models/CubedesignersTeamMember.php [new file with mode: 0644]
app/Models/Quiz.php
app/Models/TeamEmails.php [new file with mode: 0644]
app/Models/TeamLeave.php [new file with mode: 0644]
app/Models/TeamOvertime.php [new file with mode: 0644]
resources/views/vendor/backpack/base/inc/sidebar_content.blade.php
routes/backpack/custom.php

diff --git a/app/Fields/CubedesignersTeamMember.php b/app/Fields/CubedesignersTeamMember.php
new file mode 100644 (file)
index 0000000..0e4a5e6
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+
+namespace App\Fields;
+
+class CubedesignersTeamMember extends User
+{
+    protected $_optionsmodel = \App\Models\CubedesignersTeamMember::class;
+}
diff --git a/app/Models/Base/ToolboxHRModel.php b/app/Models/Base/ToolboxHRModel.php
new file mode 100644 (file)
index 0000000..c901a7c
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Models\Base;
+
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Support\Facades\Auth;
+
+class ToolboxHRModel extends ToolboxModel
+{
+    public static function addOwnerClause(Builder $builder)
+    {
+        if (null === backpack_user() || null === Auth::id()) {
+            return;
+        }
+        if (Auth::user()->hasPermissionTo(static::$_permissionBase . ':admin')) {
+            return;
+        }
+        if (null === static::$_ownerAttribute) {
+            return;
+        }
+        $builder->where(static::$_ownerAttribute, backpack_user()->id);
+    }
+}
index 2da7996da22e8babac80116074cc5df7e969c57e..e14fc23b870be1514c089b4acc192d2e458a78b3 100644 (file)
@@ -53,7 +53,7 @@ class ToolboxModel extends CubistMagicAbstractModel
         return true;
     }
 
-    public function addOwnerField($tab = null)
+    public function addOwnerField($options = [])
     {
         $fieldSettings = [
             'name' => static::$_ownerAttribute,
@@ -67,10 +67,8 @@ class ToolboxModel extends CubistMagicAbstractModel
             'default' => Auth::id(),
             'non_default_tracking' => false,
         ];
-        if (null !== $tab) {
-            $fieldSettings['tab'] = $tab;
-        }
-        $this->addField($fieldSettings);
+
+        $this->addField(array_merge($fieldSettings, $options));
     }
 
     public function addColumnDateFields($tab = null, $type = HiddenDatetime::class)
diff --git a/app/Models/CubedesignersEmails.php b/app/Models/CubedesignersEmails.php
deleted file mode 100644 (file)
index 6b0726b..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-<?php
-
-namespace App\Models;
-
-use Cubist\Backpack\Magic\Fields\Code;
-use Cubist\Backpack\Magic\Fields\Table;
-use Cubist\Backpack\Magic\Models\CubistMagicAbstractModel;
-use Cubist\Net\Util;
-use Cubist\Util\Files\Files;
-use Cubist\Util\Str;
-
-class CubedesignersEmails extends CubistMagicAbstractModel
-{
-    protected $table = 'cubedesigners_emails';
-
-    protected $_options = ['name' => 'cubemails',
-        'singular' => 'paramètre',
-        'plural' => 'paramètres',
-        'oneinstance' => true];
-
-
-    public function setFields()
-    {
-        parent::setFields();
-
-        $this->addField('domains', Table::class, __('Domaines'), ['entity_singular' => __('un domaine'), 'columns' => ['domaine' => __('Domaine')], 'translatable' => false, 'tab' => __('Comptes et redirections')]);
-        $this->addField('mailboxes', Table::class, __('Boîtes mail'), ['entity_singular' => __('une boîte mail'), 'columns' => ['mailbox' => __('E-mail'), 'password' => __('Mot de passe')], 'translatable' => false, 'hint' => __('Laisser le mot de passe vide pour utiliser celui du compte "Toolbox"'), 'tab' => __('Comptes et redirections')]);
-        $this->addField('aliases', Table::class, __('Redirections'), ['entity_singular' => __('une redirection'), 'columns' => ['from' => __('Alias'), 'dest' => __('Destinations')], 'translatable' => false, 'tab' => __('Comptes et redirections')]);
-        $this->addField('ip_whitelist', Table::class, __('Liste blanche IP'), ['tab' => __('Listes blanches et noires'), 'entity_singular' => __('une IP'), 'columns' => ['ip' => __('IP ou nom d\'hôte')], 'translatable' => false, 'hint' => __('IP qui sont sur la liste blanche (fail2ban, my_networks)')]);
-        $this->addField('postgrey_whitelist', Code::class, __('Liste blanche postgrey'), ['translatable' => false, 'tab' => __('Listes blanches et noires'), 'language' => 'properties', 'hint' => __('Serveurs ignorés par le Grey listing')]);
-        $this->addField('spam_whitelist', Table::class, __('Liste blanche SPAM'), ['tab' => __('Listes blanches et noires'), 'entity_singular' => __('un e-mail'), 'columns' => ['email' => __('E-mail')], 'translatable' => false, 'hint' => __('Les e-mails provenant de ces expéditeurs ne sont jamais considérés comme des spam (expressions régulières possibles)')]);
-        $this->addField('spam_blacklist', Table::class, __('Liste noire SPAM'), ['tab' => __('Listes blanches et noires'), 'entity_singular' => __('un e-mail'), 'columns' => ['email' => __('E-mail')], 'translatable' => false, 'hint' => __('Ces e-mails sont toujours considérés comme des spam (expressions régulières possibles)')]);
-
-    }
-
-    public function preSave()
-    {
-
-        $maindomain = 'cubedesigners.com';
-
-        $mailboxes = json_decode($this->mailboxes, true);
-        $domains = json_decode($this->domains, true);
-        $a = json_decode($this->aliases, true);
-        $ip = json_decode($this->ip_whitelist, true);
-        $spam_whitelist = json_decode($this->spam_whitelist, true);
-        $spam_blacklist = json_decode($this->spam_blacklist, true);
-
-        $spam_bl = [];
-        foreach ($spam_blacklist as $item) {
-            $spam_bl[] = 'blacklist_from ' . $item['email'];
-        }
-        $spam_wl = [];
-        foreach ($spam_whitelist as $item) {
-            $spam_wl[] = 'whitelist_from ' . $item['email'];
-        }
-
-        $accounts = [];
-        foreach ($mailboxes as $k => $m) {
-            if (!isset($m['password'])) {
-                $m['password'] = '';
-            }
-
-            $email = $m['mailbox'] . '@' . $maindomain;
-            $password = $m['password'] = trim($m['password']);
-            if ($m['password'] === '') {
-                $user = User::where('email', $email)->first();
-                if (null === $user) {
-                    $m['password'] = Str::random(12);
-                } else {
-                    $password = '{BLF-CRYPT}' . $user->password;
-                }
-            }
-            if ($m['password'] !== '' && !preg_match('/^\{([A-Z0-9-]+)\}\$\d/', $m['password'])) {
-                $p = $m['password'];
-                $cmd = "export PATH=\$PATH:/usr/bin;echo $(doveadm pw -s SHA512-CRYPT -u $email -p $p 2>/dev/null)";
-                $password = $m['password'] = trim(`$cmd`);
-                if (!$password) {
-                    dd($cmd, $m['password']);
-                }
-            }
-            $accounts[$m['mailbox']] = $password;
-            $mailboxes[$k] = $m;
-        }
-        usort($mailboxes, function ($a, $b) {
-            return strcmp($a['mailbox'], $b['mailbox']);
-        });
-
-        $this->mailboxes = json_encode($mailboxes);
-
-        $accountFile = [];
-        foreach ($accounts as $account => $password) {
-            $accountFile[] = $account . '@' . $maindomain . '|' . $password;
-        }
-        Files::mkdir(storage_path('emailconfig'));
-        file_put_contents(storage_path('emailconfig/postfix-accounts.cf'), implode("\n", $accountFile));
-
-
-        $aliases = [];
-        foreach ($a as $item) {
-            $from = trim($item['from']);
-            if (!isset($aliases[$from])) {
-                $aliases[$from] = [];
-            }
-            $aliases[$from] = array_merge($aliases[$from], explode(',', str_replace('@' . $maindomain, '', $item['dest'])));
-        }
-        ksort($aliases);
-        $savedAliases = [];
-        foreach ($aliases as $from => $dest) {
-            $savedAliases[] = ['from' => $from, 'dest' => $dest];
-        }
-        $this->aliases = json_encode($savedAliases);
-
-        $allAliases = [];
-        foreach ($domains as $d) {
-            $domain = $d['domaine'];
-            foreach ($accounts as $account => $password) {
-                if (!isset($allAliases[$account . '@' . $domain])) {
-                    $allAliases[$account . '@' . $domain] = [];
-                }
-                $allAliases[$account . '@' . $domain][] = $account . '@' . $maindomain;
-            }
-            foreach ($aliases as $from => $dest) {
-                if (!isset($allAliases[$from . '@' . $domain])) {
-                    $allAliases[$from . '@' . $domain] = [];
-                }
-                $allAliases[$from . '@' . $domain] = array_merge($allAliases[$from . '@' . $domain], $dest);
-            }
-            $allAliases['@' . $domain] = ['spam@' . $maindomain];
-        }
-        $aliasesFile = [];
-        foreach ($allAliases as $from => $dest) {
-            $domaineDest = [];
-            foreach ($dest as $d) {
-                if (stristr($d, '@')) {
-                    $domaineDest[] = $d;
-                } else {
-                    $domaineDest[] = $d . '@' . $maindomain;
-                }
-            }
-            $domaineDest = array_unique($domaineDest);
-            $aliasesFile[] = $from . ' ' . implode(',', $domaineDest);
-        }
-
-        file_put_contents(storage_path('emailconfig/postfix-virtual.cf'), implode("\n", $aliasesFile));
-
-        // Postgrey whitelist
-        file_put_contents(storage_path('emailconfig/whitelist_clients.local'), str_replace("\r\n", "\n", $this->postgrey_whitelist));
-
-        // IP Whitelist
-        $my_networks = [];
-        foreach ($ip as $item) {
-            $resolved = Util::resolve($item['ip']);
-            if ($resolved) {
-                $my_networks[] = $resolved;
-            }
-        }
-        $my_networks = array_unique($my_networks);
-
-        $this->_replaceInFile('postfix-main.cf', ['my_networks' => implode(', ', $my_networks)]);
-        $this->_replaceInFile('fail2ban-jail.cf', ['ignoreip' => implode(',', $my_networks)]);
-        $this->_replaceInFile('spamassassin-rules.cf', ['spam_whitelist' => implode("\n", $spam_wl), 'spam_blacklist' => implode("\n", $spam_bl)]);
-
-        touch(storage_path('emailconfig/__UPDATED__'));
-    }
-
-    protected function _replaceInFile($filename, $variables)
-    {
-        $content = file_get_contents(resource_path('emailconfig/' . $filename));
-        foreach ($variables as $k => $v) {
-            $content = str_replace('$' . $k, $v, $content);
-        }
-        $content = str_replace("\r\n", "\n", $content);
-        file_put_contents(storage_path('emailconfig/' . $filename), $content);
-    }
-}
diff --git a/app/Models/CubedesignersTeamMember.php b/app/Models/CubedesignersTeamMember.php
new file mode 100644 (file)
index 0000000..fdf20b9
--- /dev/null
@@ -0,0 +1,24 @@
+<?php
+
+namespace App\Models;
+
+use Cubist\Backpack\Magic\MagicObserver;
+use Illuminate\Database\Eloquent\Builder;
+
+class CubedesignersTeamMember extends User
+{
+    public static function booted()
+    {
+        parent::booted();
+
+//        static::addGlobalScope('team_member', function (Builder $builder) {
+//            $builder->where('company', 7);
+//            $builder->orderBy('enabled', 'ASC');
+//            $builder->orderBy('id', 'ASC');
+//
+//        });
+
+        static::observe(new MagicObserver);
+    }
+
+}
index 25e6f65f922d15f0e504823da6c58098d2c4e79b..f67f4673aedad01c5b6a95e75f64a08392b892ef 100644 (file)
@@ -103,7 +103,7 @@ class Quiz extends ToolboxModel
             'tab' => __('Projet')]);
 
         $this->addColumnDateFields(__('Projet'));
-        $this->addOwnerField(__('Projet'));
+        $this->addOwnerField(['tab' => __('Projet')]);
 
         $this->addField(['name' => 'title',
             'label' => __('Titre du quiz'),
diff --git a/app/Models/TeamEmails.php b/app/Models/TeamEmails.php
new file mode 100644 (file)
index 0000000..c079063
--- /dev/null
@@ -0,0 +1,171 @@
+<?php
+
+namespace App\Models;
+
+use Cubist\Backpack\Magic\Fields\Code;
+use Cubist\Backpack\Magic\Fields\Table;
+use Cubist\Backpack\Magic\Models\CubistMagicAbstractModel;
+use Cubist\Net\Util;
+use Cubist\Util\Files\Files;
+use Cubist\Util\Str;
+
+class TeamEmails extends CubistMagicAbstractModel
+{
+    protected $table = 'team_emails';
+
+    protected $_options = ['name' => 'team-emails',
+        'singular' => 'paramètre',
+        'plural' => 'paramètres',
+        'oneinstance' => true];
+
+
+    public function setFields()
+    {
+        parent::setFields();
+
+        $this->addField('domains', Table::class, __('Domaines'), ['entity_singular' => __('un domaine'), 'columns' => ['domaine' => __('Domaine')], 'translatable' => false, 'tab' => __('Comptes et redirections')]);
+        $this->addField('mailboxes', Table::class, __('Boîtes mail'), ['entity_singular' => __('une boîte mail'), 'columns' => ['mailbox' => __('E-mail'), 'password' => __('Mot de passe')], 'translatable' => false, 'hint' => __('Laisser le mot de passe vide pour utiliser celui du compte "Toolbox"'), 'tab' => __('Comptes et redirections')]);
+        $this->addField('aliases', Table::class, __('Redirections'), ['entity_singular' => __('une redirection'), 'columns' => ['from' => __('Alias'), 'dest' => __('Destinations')], 'translatable' => false, 'tab' => __('Comptes et redirections')]);
+        $this->addField('ip_whitelist', Table::class, __('Liste blanche IP'), ['tab' => __('Listes blanches et noires'), 'entity_singular' => __('une IP'), 'columns' => ['ip' => __('IP ou nom d\'hôte')], 'translatable' => false, 'hint' => __('IP qui sont sur la liste blanche (fail2ban, my_networks)')]);
+        $this->addField('postgrey_whitelist', Code::class, __('Liste blanche postgrey'), ['translatable' => false, 'tab' => __('Listes blanches et noires'), 'language' => 'properties', 'hint' => __('Serveurs ignorés par le Grey listing')]);
+        $this->addField('spam_whitelist', Table::class, __('Liste blanche SPAM'), ['tab' => __('Listes blanches et noires'), 'entity_singular' => __('un e-mail'), 'columns' => ['email' => __('E-mail')], 'translatable' => false, 'hint' => __('Les e-mails provenant de ces expéditeurs ne sont jamais considérés comme des spam (expressions régulières possibles)')]);
+        $this->addField('spam_blacklist', Table::class, __('Liste noire SPAM'), ['tab' => __('Listes blanches et noires'), 'entity_singular' => __('un e-mail'), 'columns' => ['email' => __('E-mail')], 'translatable' => false, 'hint' => __('Ces e-mails sont toujours considérés comme des spam (expressions régulières possibles)')]);
+
+    }
+
+    public function preSave()
+    {
+
+        $maindomain = 'cubedesigners.com';
+
+        $mailboxes = json_decode($this->mailboxes, true);
+        $domains = json_decode($this->domains, true);
+        $a = json_decode($this->aliases, true);
+        $ip = json_decode($this->ip_whitelist, true);
+        $spam_whitelist = json_decode($this->spam_whitelist, true);
+        $spam_blacklist = json_decode($this->spam_blacklist, true);
+
+        $spam_bl = [];
+        foreach ($spam_blacklist as $item) {
+            $spam_bl[] = 'blacklist_from ' . $item['email'];
+        }
+        $spam_wl = [];
+        foreach ($spam_whitelist as $item) {
+            $spam_wl[] = 'whitelist_from ' . $item['email'];
+        }
+
+        $accounts = [];
+        foreach ($mailboxes as $k => $m) {
+            if (!isset($m['password'])) {
+                $m['password'] = '';
+            }
+
+            $email = $m['mailbox'] . '@' . $maindomain;
+            $password = $m['password'] = trim($m['password']);
+            if ($m['password'] === '') {
+                $user = User::where('email', $email)->first();
+                if (null === $user) {
+                    $m['password'] = Str::random(12);
+                } else {
+                    $password = '{BLF-CRYPT}' . $user->password;
+                }
+            }
+            if ($m['password'] !== '' && !preg_match('/^\{([A-Z0-9-]+)\}\$\d/', $m['password'])) {
+                $p = $m['password'];
+                $m['password'] = $password = "{SHA512-CRYPT}" . crypt($p, "$6$" . substr(sha1(rand()), 0, 16));
+            }
+            $accounts[$m['mailbox']] = $password;
+            $mailboxes[$k] = $m;
+        }
+        usort($mailboxes, function ($a, $b) {
+            return strcmp($a['mailbox'], $b['mailbox']);
+        });
+
+        $this->mailboxes = json_encode($mailboxes);
+
+        $accountFile = [];
+        foreach ($accounts as $account => $password) {
+            $accountFile[] = $account . '@' . $maindomain . '|' . $password;
+        }
+        Files::mkdir(storage_path('emailconfig'));
+        file_put_contents(storage_path('emailconfig/postfix-accounts.cf'), implode("\n", $accountFile));
+
+
+        $aliases = [];
+        foreach ($a as $item) {
+            $from = trim($item['from']);
+            if (!isset($aliases[$from])) {
+                $aliases[$from] = [];
+            }
+            $aliases[$from] = array_merge($aliases[$from], explode(',', str_replace('@' . $maindomain, '', $item['dest'])));
+        }
+        ksort($aliases);
+        $savedAliases = [];
+        foreach ($aliases as $from => $dest) {
+            $savedAliases[] = ['from' => $from, 'dest' => $dest];
+        }
+        $this->aliases = json_encode($savedAliases);
+
+        $allAliases = [];
+        foreach ($domains as $d) {
+            $domain = $d['domaine'];
+            foreach ($accounts as $account => $password) {
+                if (!isset($allAliases[$account . '@' . $domain])) {
+                    $allAliases[$account . '@' . $domain] = [];
+                }
+                $allAliases[$account . '@' . $domain][] = $account . '@' . $maindomain;
+            }
+            foreach ($aliases as $from => $dest) {
+                if (!isset($allAliases[$from . '@' . $domain])) {
+                    $allAliases[$from . '@' . $domain] = [];
+                }
+                $allAliases[$from . '@' . $domain] = array_merge($allAliases[$from . '@' . $domain], $dest);
+            }
+            $allAliases['@' . $domain] = ['spam@' . $maindomain];
+        }
+        $aliasesFile = [];
+        foreach ($allAliases as $from => $dest) {
+            $domaineDest = [];
+            foreach ($dest as $d) {
+                if (stristr($d, '@')) {
+                    $domaineDest[] = $d;
+                } else {
+                    $domaineDest[] = $d . '@' . $maindomain;
+                }
+            }
+            $domaineDest = array_unique($domaineDest);
+            $aliasesFile[] = $from . ' ' . implode(',', $domaineDest);
+        }
+
+        file_put_contents(storage_path('emailconfig/postfix-virtual.cf'), implode("\n", $aliasesFile));
+
+        // Postgrey whitelist
+        file_put_contents(storage_path('emailconfig/whitelist_clients.local'), str_replace("\r\n", "\n", $this->postgrey_whitelist));
+
+        // IP Whitelist
+        $my_networks = [];
+        foreach ($ip as $item) {
+            $resolved = Util::resolve($item['ip']);
+            if ($resolved) {
+                $my_networks[] = $resolved;
+            }
+        }
+        $my_networks = array_unique($my_networks);
+
+        $this->_replaceInFile('postfix-main.cf', ['my_networks' => implode(', ', $my_networks)]);
+        $this->_replaceInFile('fail2ban-jail.cf', ['ignoreip' => implode(',', $my_networks)]);
+        $this->_replaceInFile('spamassassin-rules.cf', ['spam_whitelist' => implode("\n", $spam_wl), 'spam_blacklist' => implode("\n", $spam_bl)]);
+
+        touch(storage_path('emailconfig/__UPDATED__'));
+    }
+
+    protected function _replaceInFile($filename, $variables)
+    {
+        $content = file_get_contents(resource_path('emailconfig/' . $filename));
+        foreach ($variables as $k => $v) {
+            $content = str_replace('$' . $k, $v, $content);
+        }
+        $content = str_replace("\r\n", "\n", $content);
+        file_put_contents(storage_path('emailconfig/' . $filename), $content);
+    }
+}
diff --git a/app/Models/TeamLeave.php b/app/Models/TeamLeave.php
new file mode 100644 (file)
index 0000000..3ed6e86
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+
+namespace App\Models;
+
+use App\Models\Base\ToolboxHRModel;
+use Cubist\Backpack\Magic\Fields\Checkbox;
+use Cubist\Backpack\Magic\Fields\Date;
+use Cubist\Backpack\Magic\Fields\Number;
+use Cubist\Backpack\Magic\Fields\SelectFromArray;
+use Cubist\Backpack\Magic\Fields\Text;
+
+class TeamLeave extends ToolboxHRModel
+{
+    protected $table = 'team_leave';
+
+    protected $_options = ['name' => 'team-leave',
+        'singular' => 'absence',
+        'plural' => 'congés et absence',
+        'oneinstance' => false];
+
+    static $_permissionBase = 'team-leave';
+
+    protected $_enableClone = false;
+    protected $_enableDeletion = true;
+
+
+    public function setFields()
+    {
+        parent::setFields();
+
+        try {
+            $bid = backpack_user()->id;
+        } catch (\Exception $e) {
+            $bid = null;
+        }
+        $this->addField('worker', \App\Fields\CubedesignersTeamMember::class, __('Nom'), ['column' => true, 'default' => $bid, 'can_hidden' => self::$_permissionBase . ':admin']);
+        $this->addField('type', SelectFromArray::class, __('Type'), ['options' =>
+            [
+                'paid_leave' => __('Congé payé'),
+                'manager_leave' => __('Congé gérant'),
+                'sick_leave' => __('Arrêt maladie'),
+                'unpaid_leave' => __('Congé sans solde'),
+                'parenthood_leave' => __('Congé parental'),
+                'family_event_leave' => __('Congé pour événement familial'),
+                'sick_child_leave' => __('Congé pour enfant malade'),
+                'recovery_day' => __('Jour de récupération'),
+                'partial_activity' => __('Activité partielle'),
+            ]
+            , 'column' => true, 'default' => 'paid_leave', 'allows_null' => false]);
+        $this->addOwnerField(['label' => __('Ajouté par'), 'column' => false, 'column_attribute' => 'name',]);
+        $this->addField('start_day', Date::class, __('Début'), ['column' => true]);
+        $this->addField('end_day', Date::class, __('Fin'), ['column' => true, 'hint' => __('Inclus')]);
+        $this->addField('nb_days', Number::class, __('Durée'), ['column' => true, 'suffix' => __('jours')]);
+        $this->addField('accepted', Checkbox::class, __('Accepté'), ['column' => true, 'default' => true, 'can' => self::$_permissionBase . ':admin']);
+        $this->addField('public', Checkbox::class, __('Public'), ['column' => true, 'default' => true, 'hint' => __('Si activé, apparaît dans le planning des vacances'), 'can' => self::$_permissionBase . ':admin']);
+        $this->addField('recorded_month', Date::class, __('Comptabilisé'), ['column' => true, 'column_format' => 'YYYY-MM', 'can' => self::$_permissionBase . ':admin']);
+        $this->addField('comment', Text::class, __('Commentaire'), ['column' => true, 'can' => self::$_permissionBase . ':admin']);
+    }
+}
diff --git a/app/Models/TeamOvertime.php b/app/Models/TeamOvertime.php
new file mode 100644 (file)
index 0000000..efe4634
--- /dev/null
@@ -0,0 +1,50 @@
+<?php
+
+namespace App\Models;
+
+use App\Models\Base\ToolboxHRModel;
+use Cubist\Backpack\Magic\Fields\Checkbox;
+use Cubist\Backpack\Magic\Fields\Date;
+use Cubist\Backpack\Magic\Fields\Number;
+use Cubist\Backpack\Magic\Fields\SelectFromArray;
+use Cubist\Backpack\Magic\Fields\Text;
+
+class TeamOvertime extends ToolboxHRModel
+{
+    protected $table = 'team_overtime';
+
+    protected $_options = ['name' => 'team-overtime',
+        'singular' => 'heures supplémentaires',
+        'plural' => 'heures supplémentaires',
+        'oneinstance' => false];
+
+    static $_permissionBase = 'team-overtime';
+
+    protected $_enableClone = false;
+    protected $_enableDeletion = true;
+
+
+    public function setFields()
+    {
+        parent::setFields();
+
+        try {
+            $bid = backpack_user()->id;
+        } catch (\Exception $e) {
+            $bid = null;
+        }
+        $this->addField('worker', \App\Fields\CubedesignersTeamMember::class, __('Nom'), ['column' => true, 'default' => $bid, 'can_hidden' => self::$_permissionBase . ':admin']);
+        $this->addField('type', SelectFromArray::class, __('Type'), ['options' =>
+            [
+                'supplementary_hours' => __('Heures supplémentaires'),
+                'complementary_hours' => __('Heures complémentaires'),
+            ]
+            , 'column' => true, 'default' => 'supplementary_hours', 'allows_null' => false]);
+        $this->addOwnerField(['label' => __('Ajouté par'), 'column' => false, 'column_attribute' => 'name']);
+        $this->addField('day', Date::class, __('Semaine'), ['column' => true]);
+        $this->addField('nb_hours', Number::class, __('Nombre'), ['column' => true, 'suffix' => __('heures')]);
+        $this->addField('accepted', Checkbox::class, __('Accepté'), ['column' => true, 'default' => true, 'can' => self::$_permissionBase . ':admin']);
+        $this->addField('recorded_month', Date::class, __('Comptabilisé'), ['column' => true, 'column_format' => 'YYYY-MM', 'can' => self::$_permissionBase . ':admin']);
+        $this->addField('comment', Text::class, __('Commentaire'), ['column' => true, 'can' => self::$_permissionBase . ':admin']);
+    }
+}
index 89535bd57ea0e07490bab36fca8d7873afe0d4a9..c8e1be1ecb32155258feb244b72cf8f658152f30 100644 (file)
     </li>
 @endcan
 
-@canany(['extranet:manage_team','extranet:manage_emails'])
+@canany(['team-leave:read','team-overtime:read','extranet:manage_emails'])
     <li {!! sidebarState('team') !!}><a class='nav-link nav-dropdown-toggle' href='#'><i
                 class='nav-icon la la-mug-hot'></i>{{__('Équipe')}}</a>
         <ul class='nav-dropdown-items'>
             @can('extranet:manage_emails')
                 <li class="nav-item"><a class="nav-link"
-                                        href='{{ backpack_url('cubemails') }}'><i
+                                        href='{{ backpack_url('team-emails') }}'><i
                             class='la la-mail-bulk'></i>
                         <span>{{__('Emails')}}</span></a>
                 </li>
             @endcan
+            @can('team-leave:read')
+                <li class="nav-item"><a class="nav-link"
+                                        href='{{ backpack_url('team-leave') }}'><i
+                            class="las la-umbrella-beach"></i></i>
+                        <span>{{__('Congés et absences')}}</span></a>
+                </li>
+            @endcan
+            @can('team-overtime:read')
+                <li class="nav-item"><a class="nav-link"
+                                        href='{{ backpack_url('team-overtime') }}'><i class="las la-stopwatch"></i></i>
+                        <span>{{__('Heures supp')}}</span></a>
+                </li>
+            @endcan
         </ul>
     </li>
 @endcan
index a6de6bff7918f241e529a862d18dccb641d6d2aa..651ddff6675444db14643cc99dffbdb3a80cadcc 100644 (file)
@@ -1,23 +1,34 @@
 <?php
 Route::group([
-    'prefix' => config('backpack.base.route_prefix', 'admin'),
+    'prefix'     => config('backpack.base.route_prefix', 'admin'),
     'middleware' => ['web', config('backpack.base.middleware_key', 'admin')],
-    'namespace' => 'App\Http\Controllers\Admin',
+    'namespace'  => 'App\Http\Controllers\Admin',
 ], function () { // custom admin routes
     try {
-        Route::crud('company', 'CompanyCrudController');
-        Route::crud('fluidbook-publication', 'FluidbookPublicationCrudController');
-        Route::crud('fluidbook-quote', 'FluidbookQuoteCrudController');
-        Route::crud('fluidbook-theme', 'FluidbookThemeCrudController');
-        Route::crud('locale', 'LocaleCrudController');
-        Route::crud('settings', 'SettingsCrudController');
-        Route::crud('signature', 'SignatureCrudController');
-        Route::crud('toolbox-translate', 'ToolboxTranslateCrudController');
-        Route::crud('quiz', 'QuizCrudController');
-        Route::crud('quizatttempt', 'QuizatttemptCrudController');
-        Route::crud('quiztranslation', 'QuiztranslationCrudController');
-        Route::crud('users', 'UsersCrudController');
-    } catch (\Throwable $e) {
+         Route::crud('elearning-media', 'ElearningMediaCrudController');
+     Route::crud('toolbox-translate', 'ToolboxTranslateCrudController');
+     Route::crud('quiztranslation', 'QuiztranslationCrudController');
+     Route::crud('team-emails', 'TeamEmailsCrudController');
+     Route::crud('fluidbook-quote', 'FluidbookQuoteCrudController');
+     Route::crud('locale', 'LocaleCrudController');
+     Route::crud('tool-sprite', 'ToolSpriteCrudController');
+     Route::crud('users', 'UsersCrudController');
+     Route::crud('users', 'UsersCrudController');
+     Route::crud('quiz', 'QuizCrudController');
+     Route::crud('page', 'PageCrudController');
+     Route::crud('settings', 'SettingsCrudController');
+     Route::crud('fluidbook-collection', 'FluidbookCollectionCrudController');
+     Route::crud('fluidbook-document', 'FluidbookDocumentCrudController');
+     Route::crud('fluidbook-publication', 'FluidbookPublicationCrudController');
+     Route::crud('quizatttempt', 'QuizatttemptCrudController');
+     Route::crud('elearning-package', 'ElearningPackageCrudController');
+     Route::crud('fluidbook-theme', 'FluidbookThemeCrudController');
+     Route::crud('company', 'CompanyCrudController');
+     Route::crud('signature', 'SignatureCrudController');
+     Route::crud('fluidbook-iconset', 'FluidbookIconsetCrudController');
+     Route::crud('users', 'UsersCrudController');
+     Route::crud('fluidbook-translate', 'FluidbookTranslateCrudController');
+    } catch(\Throwable $e) {
 
     }
 });