| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 | 
							- <?php
 
- /**
 
-  * Define a notification.
 
-  * @author Valentin CARRUESCO
 
-  * @category Plugin
 
-  * @license MIT
 
-  */
 
- class Notification extends Entity{
 
- 	public $id,$label,$html,$type,$meta,$end,$start,$pinned;
 
- 	protected $TABLE_NAME = 'notification';
 
- 	public $fields =
 
- 	array(
 
- 		'id' => 'key',
 
- 		'label' => 'string',
 
- 		'html' => 'longstring',
 
- 		'type' => 'string',
 
- 		'meta' => 'longstring',
 
- 		'start' => 'date',
 
- 		'end' => 'date',
 
- 		'pinned' => 'int'
 
- 	);
 
- 	function __construct(){
 
-  		parent::__construct();
 
-  		$this->pinned = 0;
 
- 	}
 
- 	public static function types($key = null){
 
- 		global $conf;
 
- 		$types = array(
 
- 			'notice' => array(
 
- 				'label' =>'Information',
 
- 				'color' =>'#007fdc',
 
- 				'icon'  =>'far fa-flag',
 
- 				'description'  =>"Notifications d'informations mineures",
 
- 				'default_methods' => array(
 
- 					'interface' => !empty($conf->get('notice_interface')) ? $conf->get('notice_interface') : true,
 
- 					'mail' => !empty($conf->get('notice_mail')) ? $conf->get('notice_mail') : false
 
- 				)
 
- 			),
 
- 			'announcement' => array(
 
- 				'label' =>'Annonce',
 
- 				'color' =>'#30336b',
 
- 				'icon'  =>'fas fa-bullhorn',
 
- 				'description'  =>"Annonce générale",
 
- 				'default_methods' => array(
 
- 					'interface' => !empty($conf->get('announcement_interface')) ? $conf->get('announcement_interface') : true,
 
- 					'mail' => !empty($conf->get('announcement_mail')) ? $conf->get('announcement_mail') : false
 
- 				)
 
- 			),
 
- 			'alert' => array(
 
- 				'label' =>'Alerte',
 
- 				'color' =>'#ff3100',
 
- 				'icon'  =>'fas fa-fire',
 
- 				'description'  =>"Notifications importantes ou critiques",
 
- 				'default_methods' => array(
 
- 					'interface' => !empty($conf->get('alert_interface')) ? $conf->get('alert_interface') : true,
 
- 					'mail' => !empty($conf->get('alert_mail')) ? $conf->get('alert_mail') : false
 
- 				)
 
- 			)
 
- 		);
 
- 		Plugin::callHook('notification_type',array(&$types));
 
- 		return $key ? (isset($types[$key]) ? $types[$key] : null)  : $types;
 
- 	}
 
- 	public static function categories(){
 
- 		$categories = array();
 
- 		foreach(Notification::types() as $slug => $type){
 
- 			$type['slug'] = $slug;
 
- 			if(!isset($type['category'])) $type['category'] = 'Général';
 
- 			if(!isset($categories[slugify($type['category'])])) $categories[slugify($type['category'])] = array('label'=>$type['category'],'items'=>array());
 
- 			$categories[slugify($type['category'])]['items'][] = $type;
 
- 		}
 
- 		return $categories;
 
- 	}
 
- 	public static function emit($infos){
 
- 		global $myFirm;
 
- 		$sendTypes = array();
 
- 		Plugin::callHook("notification_methods", array(&$sendTypes));
 
- 		$default = array(
 
- 			'label' => "Notification sans titre",
 
- 			'html' => "",
 
- 			'type' => "notice",
 
- 			'pinned' => 0,
 
- 			'meta' => array(),
 
- 			'start' => time(),
 
- 			'end' => strtotime('+3month'),
 
- 			'recipients' => array()
 
- 		);
 
- 		$infos = array_merge($default,$infos);
 
- 		$notification = new Notification();
 
- 		$notification->label = $infos['label'];
 
- 		$notification->html = $infos['html'];
 
- 		$notification->type = $infos['type'];
 
- 		$notification->pinned = $infos['pinned'];
 
- 		$notification->meta = json_encode($infos['meta']);
 
- 		$notification->end = $infos['end'];
 
- 		$notification->start = $infos['start'];
 
- 		$notification->save();
 
- 		$users = User::getAll();
 
- 		$users_rights = array();
 
- 		foreach ($users as $user) {
 
- 			if(!is_object($myFirm)) continue;
 
- 			$ranks = $user->getRanksId($myFirm->id);
 
- 			if (isset($ranks)) $users_rights[$user->login] = $ranks;
 
- 		}
 
- 		// Traitement des rangs
 
- 		$recipients = array();
 
- 		foreach ($infos['recipients'] as $recipient) {
 
- 			if (is_numeric($recipient)) {
 
- 				$users = array_keys(array_filter($users_rights, function($v) use ($recipient) {
 
- 				    return in_array($recipient, $v);
 
- 				}));
 
- 				$recipients = array_merge($users, $recipients);
 
- 			} else {
 
- 				$recipients[] = $recipient;
 
- 			}
 
- 		}
 
- 		$recipients = array_unique($recipients);
 
- 		// pour chaque destinataire, vérification des préférences
 
- 		foreach ($recipients as $recipient) {
 
- 			//$userPreferences = Notification::getNotificationPreferences($recipient);
 
- 			$userPreferences = Notification::settingPreferences($recipient);
 
- 			// pour chaque type d'envoi
 
- 			foreach ($sendTypes as $sendType) {
 
- 				if(!isset($userPreferences[$infos['type']]) || !isset($userPreferences[$infos['type']][$infos['type'].'_'.$sendType['slug']]) || !$userPreferences[$infos['type']][$infos['type'].'_'.$sendType['slug']]) continue;
 
- 				$sendType['callback']($recipient, $infos,$notification);
 
- 			}
 
- 		}
 
- 	}
 
- 	public static function clear(){
 
- 		require_once(__DIR__.SLASH.'UserNotification.class.php');
 
- 		$toDelete = array();
 
- 		//on fetch pour economiser de la mémoire
 
- 		foreach (Notification::staticQuery('SELECT id FROM {{table}} WHERE end < ?',array(time()))->fetchAll() as $notification) {
 
- 			$toDelete[] = $notification['id'];
 
- 		}
 
- 		Notification::delete(array('id:IN'=>$toDelete));
 
- 		UserNotification::delete(array('notification:IN'=>$toDelete));
 
- 	}
 
- 	public static function settingPreferences($user, $userPreferences=array()){
 
- 		global $conf;
 
- 		require_once(__DIR__.SLASH.'UserNotification.class.php');
 
- 		// récupération préférences par défault
 
- 		$defaultPreferences = array();
 
- 		foreach(Notification::types() as $slug => $type){
 
- 			$defaultMethods = array();
 
- 			foreach ($type['default_methods'] as $method => $state)
 
- 				$defaultMethods[$slug.'_'.$method] = $state;
 
- 			$defaultPreferences[$slug] = $defaultMethods;
 
- 		}
 
- 		if(empty($userPreferences)){
 
- 			// récupération préférences utilisateur
 
- 			$preferences = UserPreference::loadAll(array('user'=>$user, 'key'=>'notification_categories'));
 
- 			$userPreferences = array();
 
- 			foreach($preferences as $preference)
 
- 				$userPreferences = json_decode($preference->value, JSON_OBJECT_AS_ARRAY);
 
- 		}
 
- 		$notificationPreferences = array();
 
- 		foreach ($defaultPreferences as $slug => $type){
 
- 			$tab = array();
 
- 			$notificationPreferences[$slug] = $defaultPreferences[$slug];
 
- 			foreach ($type as $method => $state){
 
- 				if(isset($userPreferences[$slug][$method])){
 
- 					$tab[$method] =  $userPreferences[$slug][$method];
 
- 					unset($userPreferences[$slug][$method]);
 
- 				}else{
 
- 					$tab[$method] = $conf->get($method) ? $conf->get($method) : $defaultPreferences[$slug][$method];
 
- 				}
 
- 			}
 
- 			$notificationPreferences[$slug] = $tab;
 
- 		}
 
- 		foreach($userPreferences as $slug=>$types){
 
- 			if(!isset($notificationPreferences[$slug])) $notificationPreferences[$slug] = array();
 
- 			if(!is_array($types)) continue;
 
- 			$notificationPreferences[$slug] = array_merge($notificationPreferences[$slug],$types);
 
- 		}
 
- 		return $notificationPreferences;
 
- 	}
 
- }
 
- ?>
 
 
  |