diff --git a/controllers/discussions.php b/controllers/discussions.php new file mode 100755 index 0000000..bba8d38 --- /dev/null +++ b/controllers/discussions.php @@ -0,0 +1,232 @@ +getDiscussions(); + + foreach ($discussions as $key => $discussion) + { + if (!$contacts = $db->getFromTableWhere('contacts', ['number' => $discussion['number']])) + { + continue; + } + + $discussions[$key]['contact'] = $contacts[0]['name']; + } + + $this->render('discussions/default', array( + 'discussions' => $discussions, + )); + } + + /** + * Cette fonction permet d'afficher la discussion avec un numero + * @param string $number : La numéro de téléphone avec lequel on discute + */ + public function show ($number) + { + global $db; + + $contact = ''; + + if ($contacts = $db->getFromTableWhere('contacts', ['number' => $number])) + { + $contact = $contacts[0]['name']; + } + + $this->render('discussions/show', array( + 'number' => $number, + 'contact' => $contact, + )); + } + + /** + * Cette fonction récupère l'ensemble des messages pour un numéro, recçus, envoyés, en cours + * @param string $number : Le numéro cible + * @param string $transactionId : Le numéro unique de la transaction ajax (sert à vérifier si la requete doit être prise en compte) + */ + function getmessages($number, $transactionId) + { + global $db; + + $now = new DateTime(); + $now = $now->format('Y-m-d H:i:s'); + + $sendeds = $db->getFromTableWhere('sendeds', ['target' => $number], 'at'); + $receiveds = $db->getFromTableWhere('receiveds', ['send_by' => $number], 'at'); + $scheduleds = $db->getScheduledsBeforeDateForNumber($now, $number); + + $messages = []; + + foreach ($sendeds as $sended) + { + $messages[] = array( + 'date' => $sended['at'], + 'text' => $sended['content'], + 'type' => 'sended', + ); + } + + foreach ($receiveds as $received) + { + $messages[] = array( + 'date' => $received['at'], + 'text' => $received['content'], + 'type' => 'received', + ); + } + + foreach ($scheduleds as $scheduled) + { + $messages[] = array( + 'date' => $scheduled['at'], + 'text' => $scheduled['content'], + 'type' => 'inprogress', + ); + } + + //On va trier le tableau des messages + usort($messages, function($a, $b) { + return strtotime($a["date"]) - strtotime($b["date"]); + }); + + echo json_encode(['transactionId' => $transactionId, 'messages' => $messages]); + return true; + } + + /** + * Cette fonction permet d'envoyer facilement un sms à un numéro donné + * @param string $csrf : Le jeton csrf + * @param string $_POST['content'] : Le contenu du SMS + * @param string $_POST['numbers'] : Un tableau avec le numero des gens auxquel envoyer le sms + * @return json : Le statut de l'envoi + */ + function send ($csrf) + { + global $db; + $return = ['success' => true, 'message' => '']; + + //On vérifie que le jeton csrf est bon + if (!internalTools::verifyCSRF($csrf)) + { + $return['success'] = false; + $return['message'] = 'Jeton CSRF invalide'; + echo json_encode($return); + return false; + } + + $now = new DateTime(); + $now = $now->format('Y-m-d H:i:s'); + + $_POST['date'] = $now; + + $scheduleds = new scheduleds(); + if (!$scheduleds->create('', true, true)) + { + $return['success'] = false; + $return['message'] = 'Impossible de créer le SMS'; + echo json_encode($return); + return false; + } + + $return['id'] = $_SESSION['discussion_wait_progress'][count($_SESSION['discussion_wait_progress']) - 1]; + + echo json_encode($return); + return true; + } + + /** + * Cette fonction retourne les id des sms qui sont envoyés + * @return json : Tableau des ids des sms qui sont envoyés + */ + function checksendeds () + { + global $db; + + $_SESSION['discussion_wait_progress'] = isset($_SESSION['discussion_wait_progress']) ? $_SESSION['discussion_wait_progress'] : []; + + $scheduleds = $db->getScheduledsIn($_SESSION['discussion_wait_progress']); + + //On va chercher à chaque fois si on a trouvé le sms. Si ce n'est pas le cas c'est qu'il a été envoyé + $sendeds = []; + foreach ($_SESSION['discussion_wait_progress'] as $key => $id) + { + $found = false; + foreach ($scheduleds as $scheduled) + { + if ($id == $scheduled['id']) + { + $found = true; + } + } + + if (!$found) + { + unset($_SESSION['discussion_wait_progress'][$key]); + $sendeds[] = $id; + } + } + + echo json_encode($sendeds); + return true; + } + + /** + * Cette fonction retourne les messages reçus pour un numéro après la date $_SESSION['discussion_last_checkreceiveds'] + * @param string $number : Le numéro de téléphone pour lequel on veux les messages + * @return json : Un tableau avec les messages + */ + function checkreceiveds ($number) + { + global $db; + + $now = new DateTime(); + $now = $now->format('Y-m-d H:i'); + + $_SESSION['discussion_last_checkreceiveds'] = isset($_SESSION['discussion_last_checkreceiveds']) ? $_SESSION['discussion_last_checkreceiveds'] : $now; + + $receiveds = $db->getReceivedsSinceForNumberOrderByDate($_SESSION['discussion_last_checkreceiveds'], $number); + + //On va gérer le cas des messages en double en stockant ceux déjà reçus et en eliminant les autres + $_SESSION['discussion_already_receiveds'] = isset($_SESSION['discussion_already_receiveds']) ? $_SESSION['discussion_already_receiveds'] : []; + + foreach ($receiveds as $key => $received) + { + //Sms jamais recu + if (array_search($received['id'], $_SESSION['discussion_already_receiveds']) === false) + { + $_SESSION['discussion_already_receiveds'][] = $received['id']; + continue; + } + + //Sms déjà reçu => on le supprime des resultats + unset($receiveds[$key]); + } + + //On met à jour la date de dernière verif + $_SESSION['discussion_last_checkreceiveds'] = $now; + + echo json_encode($receiveds); + } + } diff --git a/controllers/internalConsole.php b/controllers/internalConsole.php index 4e10031..56996ab 100755 --- a/controllers/internalConsole.php +++ b/controllers/internalConsole.php @@ -134,7 +134,10 @@ $now = new DateTime(); $now = $now->format('Y-m-d H:i:s'); //On peut maintenant ajouter le SMS - $db->insertIntoTable('sendeds', ['at' => $now, 'number' => $number, 'content' => $scheduled['content']]); + if (!$db->insertIntoTable('sendeds', ['at' => $now, 'target' => $number, 'content' => $scheduled['content']])) + { + echo 'Impossible d\'inserer le sms pour le numero ' . $number . "\n"; + } $id_sended = $db->lastId(); //Commande qui envoie le SMS diff --git a/controllers/scheduleds.php b/controllers/scheduleds.php index 0b05039..dfca54e 100755 --- a/controllers/scheduleds.php +++ b/controllers/scheduleds.php @@ -102,7 +102,7 @@ * @param string $_POST['groups'] : Un tableau avec les ids des groupes auxquels envoyer le sms * @return boolean; */ - public function create($csrf = '', $api = false) + public function create($csrf = '', $api = false, $discussion = false) { if (!$api) { @@ -145,7 +145,7 @@ return false; } - if (!internalTools::validateDate($date, 'Y-m-d H:i')) + if (!internalTools::validateDate($date, 'Y-m-d H:i:s')) { if (!$api) { @@ -167,6 +167,13 @@ } $id_scheduled = $db->lastId(); + + if ($discussion) + { + $_SESSION['discussion_wait_progress'] = isset($_SESSION['discussion_wait_progress']) ? $_SESSION['discussion_wait_progress'] : []; + $_SESSION['discussion_wait_progress'][] = $id_scheduled; + } + $db->insertIntoTable('events', ['type' => 'SCHEDULED_ADD', 'text' => 'Ajout d\'un SMS pour le ' . $date]); $errors = false; diff --git a/controllers/smsAPI.php b/controllers/smsAPI.php index 3d8e3f7..1c3b05d 100755 --- a/controllers/smsAPI.php +++ b/controllers/smsAPI.php @@ -120,7 +120,7 @@ $_POST['groups'] = $groups; $scheduleds = new scheduleds(); - $success = $scheduleds->create(true); + $success = $scheduleds->create('', true); if (!$success) { diff --git a/css/style.css b/css/style.css index d8314a7..a7df0e9 100755 --- a/css/style.css +++ b/css/style.css @@ -88,3 +88,103 @@ footer color: #fff; background-color: #000; } + +.goto:hover +{ + cursor: pointer; +} + +/** DISCUSSION **/ +.table-discussions tbody tr:hover +{ + cursor: pointer; + background-color: #999; +} + +.discussion-container +{ + overflow: auto; +} + +.discussion-message +{ + border-radius: 5px; + display: inline-block; + max-width: 90%; + padding: 10px; + position: relative; +} + +.discussion-message-text +{ + font-size: 1.3em; +} + +.discussion-message-date +{ + font-size: 0.9em; +} + +.message-container +{ + margin-bottom: 10px; +} + +.message-received +{ + background-color: #1abc9c; + float: left; + color: #fff; +} + +.message-sended +{ + background-color: #ddd; + float: right; +} + +.message-received .discussion-message-date +{ + color: #f0f0f0; +} + +.message-sended .discussion-message-date +{ + text-align: right; + color: #888; +} + +.message-input +{ + width: 100%; + max-width: 100%; + background-color: #ddd; +} + +.message-input textarea +{ + width: 100%; + resize: none; + height: 6em; +} + +.message-input button +{ + float: right; + margin-top: 8px; +} + +.message-in-progress-hover +{ + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 900; + opacity: 0.7; + background-color: #fff; + font-size: 20px; + text-align: center; + padding-top: 10px; +} diff --git a/js/custom.js b/js/custom.js index f404c51..12261fd 100755 --- a/js/custom.js +++ b/js/custom.js @@ -33,8 +33,63 @@ function verifReceived() }); } +/** + * Cette fonction permet de scroller au dernier message + */ +function scrollDownDiscussion() +{ + jQuery('.discussion-container').animate({scrollTop: 1000000}); +} jQuery(document).ready(function() { var verifReceivedInterval = setInterval(verifReceived, 10000); + + jQuery('body').on('click', '.goto', function (e) { + e.preventDefault(); + if (jQuery(this).attr('url')) + { + if (jQuery(this).attr('target')) + { + window.open(jQuery(this).attr('url'), jQuery(this).attr('target')); + } + else + { + window.location = jQuery(this).attr('url'); + } + } + }); + + jQuery('body').on('submit', '.send-message-discussion', function (e) + { + e.preventDefault(); + + var form = jQuery(this); + var message = form.find('textarea').val(); + var formData = new FormData(form[0]); + jQuery('.discussion-container').find('#send-message-spiner').remove(); + jQuery('.discussion-container').append('
Date du dernier message | +Numéro | +
---|---|
+ | + |