From 9ed089c171556440d0f52990c35f04531247d934 Mon Sep 17 00:00:00 2001 From: "florian.azizian" <florian.azizian@maarch.org> Date: Sun, 8 Mar 2020 23:58:05 +0100 Subject: [PATCH] clean useless code --- apps/maarch_entreprise/_no_file.pdf | Bin 111108 -> 0 bytes apps/maarch_entreprise/css/styles.css | 134 -- apps/maarch_entreprise/img/loading.gif | Bin 8787 -> 0 bytes .../indexing_searching/choose_file.php | 202 --- apps/maarch_entreprise/js/functions.js | 33 - apps/maarch_entreprise/no_right.php | 45 - modules/attachments/js/functions.js | 6 - .../avis/class/avis_controler_Abstract.php | 242 --- modules/avis/css/module.css | 18 - modules/avis/js/functions.js | 336 ---- modules/avis/load_toolbar_avis.php | 49 - modules/avis/saveAvisModel.php | 50 - modules/avis/updateAvisWF.php | 55 - modules/avis/xml/IVS/requests_definitions.xml | 8 - modules/avis/xml/IVS/validation_rules.xml | 7 - modules/basket/lang/en.php | 6 - modules/basket/lang/fr.php | 9 - modules/basket/lang/nl.php | 9 - .../class/class_modules_tools_Abstract.php | 154 +- modules/notes/class/notes_controler.php | 42 - .../notes/class/notes_controler_Abstract.php | 111 -- modules/notes/css/module.css | 3 - modules/notes/js/functions.js | 92 -- modules/notes/lang/en.php | 13 - modules/notes/lang/fr.php | 12 - modules/notes/lang/nl.php | 51 - modules/notes/load_toolbar_notes.php | 52 - modules/notes/note_details.php | 360 ----- modules/notes/notes.php | 324 ---- modules/notes/notes_ajax_content.php | 540 ------- modules/notes/notes_tables.php | 37 - .../notes/xml/IVS/requests_definitions.xml | 10 - modules/notes/xml/IVS/validation_rules.xml | 23 - modules/notes/xml/config.xml | 5 - modules/notifications/lang/en.php | 2 - modules/notifications/lang/fr.php | 2 - modules/notifications/lang/nl.php | 6 - modules/sendmail/address_autocompletion.php | 112 -- .../sendmail/class/class_email_signatures.php | 26 - .../class/class_email_signatures_Abstract.php | 45 - .../class/class_modules_tools_Abstract.php | 332 +--- modules/sendmail/contact_autocompletion.php | 105 -- modules/sendmail/css/module.css | 50 - modules/sendmail/js/functions.js | 260 --- modules/sendmail/load_editor.php | 34 - modules/sendmail/load_toolbar_sendmail.php | 54 - modules/sendmail/mail_form.php | 1389 ----------------- modules/sendmail/sendmail.php | 366 ----- modules/sendmail/sendmail_ajax_content.php | 612 -------- .../sendmail/xml/IVS/requests_definitions.xml | 11 - modules/sendmail/xml/IVS/validation_rules.xml | 33 - .../class/class_modules_tools_Abstract.php | 33 - .../class/templates_controler_Abstract.php | 140 -- modules/templates/js/change_doctype.js | 53 - .../templates_ajax_content_for_mails.php | 55 - .../templates_ajax_content_for_notes.php | 37 - .../xml/IVS/requests_definitions.xml | 10 - .../templates/xml/IVS/validation_rules.xml | 12 - modules/visa/checkAllAnsSigned.php | 44 - modules/visa/class/class_modules_tools.php | 137 -- .../class/class_modules_tools_Abstract.php | 1066 +------------ modules/visa/create_sep.php | 36 - modules/visa/css/module.css | 45 - modules/visa/getVisaModelByTitle.php | 34 - modules/visa/js/functions.js | 417 ----- modules/visa/lang/en.php | 26 - modules/visa/lang/fr.php | 26 - modules/visa/lang/nl.php | 25 +- modules/visa/load_listmodel_visa.php | 199 --- modules/visa/load_listmodel_visa_users.php | 46 - modules/visa/load_toolbar_visa.php | 48 - modules/visa/printFolder_ajax.php | 316 ---- modules/visa/saveVisaModel.php | 79 - modules/visa/show_printFolder_tab.php | 29 - modules/visa/show_visa_tab.php | 78 - modules/visa/updateVisaWF.php | 72 - modules/visa/xml/IVS/requests_definitions.xml | 29 - modules/visa/xml/IVS/validation_rules.xml | 16 - .../app/signature-book.component.scss | 14 - 79 files changed, 9 insertions(+), 9590 deletions(-) delete mode 100755 apps/maarch_entreprise/_no_file.pdf delete mode 100755 apps/maarch_entreprise/img/loading.gif delete mode 100755 apps/maarch_entreprise/indexing_searching/choose_file.php delete mode 100755 apps/maarch_entreprise/no_right.php delete mode 100755 modules/avis/load_toolbar_avis.php delete mode 100755 modules/avis/saveAvisModel.php delete mode 100755 modules/avis/updateAvisWF.php delete mode 100755 modules/notes/class/notes_controler.php delete mode 100755 modules/notes/class/notes_controler_Abstract.php delete mode 100755 modules/notes/load_toolbar_notes.php delete mode 100755 modules/notes/note_details.php delete mode 100755 modules/notes/notes.php delete mode 100755 modules/notes/notes_ajax_content.php delete mode 100755 modules/notes/notes_tables.php delete mode 100644 modules/sendmail/address_autocompletion.php delete mode 100755 modules/sendmail/class/class_email_signatures.php delete mode 100755 modules/sendmail/class/class_email_signatures_Abstract.php delete mode 100755 modules/sendmail/contact_autocompletion.php delete mode 100755 modules/sendmail/load_editor.php delete mode 100755 modules/sendmail/load_toolbar_sendmail.php delete mode 100755 modules/sendmail/mail_form.php delete mode 100755 modules/sendmail/sendmail.php delete mode 100755 modules/sendmail/sendmail_ajax_content.php delete mode 100755 modules/templates/templates_ajax_content_for_mails.php delete mode 100755 modules/templates/templates_ajax_content_for_notes.php delete mode 100755 modules/visa/checkAllAnsSigned.php delete mode 100755 modules/visa/create_sep.php delete mode 100755 modules/visa/getVisaModelByTitle.php delete mode 100755 modules/visa/load_listmodel_visa.php delete mode 100755 modules/visa/load_listmodel_visa_users.php delete mode 100755 modules/visa/load_toolbar_visa.php delete mode 100755 modules/visa/printFolder_ajax.php delete mode 100755 modules/visa/saveVisaModel.php delete mode 100755 modules/visa/show_printFolder_tab.php delete mode 100755 modules/visa/show_visa_tab.php delete mode 100755 modules/visa/updateVisaWF.php diff --git a/apps/maarch_entreprise/_no_file.pdf b/apps/maarch_entreprise/_no_file.pdf deleted file mode 100755 index 9d9232393111deba6f1d726a371da01b8fbcb52e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111108 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	VQbI~PbUbUvdu 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℘OfmOspM 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 diff --git a/apps/maarch_entreprise/css/styles.css b/apps/maarch_entreprise/css/styles.css index ccb8ee7caad..d679e2dece3 100755 --- a/apps/maarch_entreprise/css/styles.css +++ b/apps/maarch_entreprise/css/styles.css @@ -2274,22 +2274,6 @@ hr { margin-left: 330px; } -#choose_exp_link { - margin-left: 0px; -} - -#info_user_welcome { - width: 100%; - padding-top: 10px; - border: 1px solid #BBBBBB; - background-color: White; - padding-bottom: 20px; - margin: 0px 0px 15px 0px; - padding: 5px 5px 2px 5px; - line-height: 1.8em; -} - - #info_user .button, #select_folder .button { width: 125px; @@ -2332,21 +2316,6 @@ hr { font-size: 12px; } -.dir_second_level { - margin-left: 20px; - margin-top: 0px; - margin-bottom: 15px; - font-size: 12px; -} - -.dir_third_level { - margin-left: 20px; - margin-top: 0px; - margin-bottom: 10px; - font-size: 11px; - -} - #link_right { text-align: right; margin-left: 100px; @@ -2680,18 +2649,6 @@ margin-right: 12px;*/ font-size: 14px; } -.header_menu { - display: none; - background-color: #135F7F; - height: 23px; - color: white; - - font-weight: bold; - font-size: 1.3em; - text-align: right; - border-bottom: 2px solid #FFFFFF; -} - .footer_menu { background-color: #135F7F; width: 100%; @@ -2723,10 +2680,6 @@ margin-right: 12px;*/ padding-right: 10px; } -.header_menu_blank { - height: 10px; -} - .img_credits_maarch_box { width: 100%; position: relative; @@ -3000,59 +2953,6 @@ height: 100%;*/ margin-bottom: 10px; } -#content_process { - text-align: left; -} - -/*********** ScrollBox *********************/ -.scrollbox_scrollbar { - float: left; - width: 10px; - height: 380px; - padding: 0; - margin: 0; - background: url(static.php?filename=scrollbox_blank.gif) top left no-repeat; - -} - -.scrollbox_up_button { - background: url(static.php?filename=scrollbox_up.png) no-repeat scroll right top; - /*_background:none; - _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../static.php?filename=scrollbox_up.png', sizingMethod='crop');*/ - height: 7px; - - width: 10px; - display: block; - - margin: 0; - padding: 0; - cursor: pointer; -} - -.scrollbox_down_button { - background: url(static.php?filename=down.png) no-repeat scroll right top; - /*_background:none; - _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../static.php?filename=scrollbox_down.png', sizingMethod='crop');*/ - height: 7px; - width: 10px; - display: block; - margin: 0; - padding: 0; - cursor: pointer; -} - -.scrollbox_handle { - background: url(static.php?filename=scrollbox_middle.png) top left no-repeat; - /* _background:none; - _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../static.php?filename=scrollbox_middle.png', sizingMethod='crop');*/ - width: 10px; - height: 10px; - display: block; - margin: 0; - padding: 0; - cursor: pointer; -} - #hist_courrier_frame .listing { width: 100%; } @@ -3075,40 +2975,6 @@ height: 100%;*/ color: #000000; } -#welcome_box_right { - border: 1px; - float: right; - /*min-width: 40%;*/ - width: 38%; - margin: 0 10px 0 13px; - display: inline; - /*position:absolute;*/ -} - -#welcome_box_left_quick_lunch { - border: 1px; - float: left; - min-width: 55%; - margin: 0 10px 0 13px; - /*display:relative;*/ -} - -#welcome_box_left_baskets { - border: 1px; - float: left; - min-width: 55%; - margin: 0 10px 0 13px; - /*display:relative;*/ -} - -#welcome_box_left_text { - border: 100px; - /*float: left;*/ - width: 97%; - margin: 0 10px 0 13px; - /*display:relative;*/ -} - .scroll_div { overflow: auto; } diff --git a/apps/maarch_entreprise/img/loading.gif b/apps/maarch_entreprise/img/loading.gif deleted file mode 100755 index 068cce8533cdd9680ad57456ff79403d92e62868..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8787 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 diff --git a/apps/maarch_entreprise/indexing_searching/choose_file.php b/apps/maarch_entreprise/indexing_searching/choose_file.php deleted file mode 100755 index abbd9f5ca4d..00000000000 --- a/apps/maarch_entreprise/indexing_searching/choose_file.php +++ /dev/null @@ -1,202 +0,0 @@ -<?php - -/* -* Copyright 2008-2015 Maarch -* -* This file is part of Maarch Framework. -* -* Maarch Framework is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Maarch Framework is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. -*/ - -/** - * @brief Frame to choose a file to index - * - * @file choose_file.php - * - * @author Claire Figueras <dev@maarch.org> - * @date $date$ - * - * @version $Revision$ - * @ingroup indexing_searching_mlb - */ -$core_tools = new core_tools(); -$core_tools->load_lang(); -$func = new functions(); -$core_tools->load_html(); -$core_tools->load_header('', true, false); -$upFileOK = false; -$_SESSION['with_file'] = false; -$_SESSION['upfile']['fileNamePdfOnTmp'] = ''; -?> - <body> - <?php - $_SESSION['upfile']['error'] = 0; - if (isset($_FILES['file']['error']) && $_FILES['file']['error'] == 1) { - $_SESSION['upfile']['error'] = $_FILES['file']['error']; - if ($_SESSION['upfile']['error'] == 1) { - ?> - <script language="javascript" type="text/javascript"> - var test = window.top.document.getElementById('file_iframe'); - if (test != null) - { - test.src = '<?php - echo $_SESSION['config']['businessappurl']; ?>index.php?display=true&dir=indexing_searching&page=file_iframe&#navpanes=0'; - } - </script> - <?php - } - } elseif (!empty($_FILES['file']['tmp_name']) && $_FILES['file']['error'] != 1) { - $extension = explode('.', $_FILES['file']['name']); - $count_level = count($extension) - 1; - $the_ext = $extension[$count_level]; - $fileNameOnTmp = 'tmp_file_'.$_SESSION['user']['UserId'] - .'_'.rand().'.'.strtolower($the_ext); - $filePathOnTmp = $_SESSION['config']['tmppath'].$fileNameOnTmp; - if (!is_uploaded_file($_FILES['file']['tmp_name'])) { - $_SESSION['error'] = _FILE_NOT_SEND.'. '._TRY_AGAIN - .'. '._MORE_INFOS.' (<a href="mailto:' - .$_SESSION['config']['adminmail'].'">' - .$_SESSION['config']['adminname'].'</a>)'; - } else { - require_once 'core/docservers_tools.php'; - $arrayIsAllowed = array(); - $arrayIsAllowed = Ds_isFileTypeAllowed($_FILES['file']['tmp_name'], strtolower($the_ext)); - if ($arrayIsAllowed['status'] == false) { - $_SESSION['error'] = _WRONG_FILE_TYPE.' '.$arrayIsAllowed['mime_type']; - $_SESSION['upfile'] = array(); - } elseif (!@move_uploaded_file($_FILES['file']['tmp_name'], $filePathOnTmp)) { - $_SESSION['error'] = _FILE_NOT_SEND.'. '._TRY_AGAIN.'. ' - ._MORE_INFOS.' (<a href="mailto:' - .$_SESSION['config']['adminmail'].'">' - .$_SESSION['config']['adminname'].'</a>)'; - } else { - $_SESSION['upfile']['size'] = $_FILES['file']['size']; - $_SESSION['upfile']['mime'] = $_FILES['file']['type']; - $_SESSION['upfile']['local_path'] = $filePathOnTmp; - //$_SESSION['upfile']['name'] = $_FILES['file']['name']; - $_SESSION['upfile']['name'] = $fileNameOnTmp; - $_SESSION['upfile']['format'] = $the_ext; - $upFileOK = true; - } - } - } elseif ($_REQUEST['with_file'] == 'true') { - $_SESSION['with_file'] = true; - $pathToFile = 'apps/'.$_SESSION['config']['app_id'].'/_no_file.pdf'; - - if (is_file('custom/'.$_SESSION['custom_override_id'].'/'.$pathToFile)) { - $pathToFile = 'custom/'.$_SESSION['custom_override_id'].'/'.$pathToFile; - } - - $_SESSION['upfile']['size'] = filesize($pathToFile); - $_SESSION['upfile']['mime'] = 'application/pdf'; - $fileNameOnTmp = 'tmp_file_'.$_SESSION['user']['UserId'] - .'_'.rand().'.pdf'; - $_SESSION['upfile']['name'] = $fileNameOnTmp; - $filePathOnTmp = $_SESSION['config']['tmppath'].$fileNameOnTmp; - $_SESSION['upfile']['local_path'] = $filePathOnTmp; - if (copy($pathToFile, $filePathOnTmp)) { - $upFileOK = true; - } - } elseif ($_REQUEST['with_file'] == 'false') { - $_SESSION['upfile'] = []; - $upFileOK = true; - } - //if ($upFileOK) { - ?> - <script language="javascript" type="text/javascript"> - function refreshFrame(frameId) { - frameId.src = '<?php - echo $_SESSION['config']['businessappurl']; - ?>index.php?display=true&dir=indexing_searching&page=file_iframe'; - } - - var test = window.top.document.getElementById('file_iframe'); - if (test.src == '<?php - echo $_SESSION['config']['businessappurl']; - ?>index.php?display=true&dir=indexing_searching&page=file_iframe&#navpanes=0') { - //test.location.refresh(); - //test.src = ''; - refreshFrame(test); - } - - if (test != null) { - //fix pb with toolbar of pdf - test.src = '<?php - echo $_SESSION['config']['businessappurl']; - ?>index.php?display=true&dir=indexing_searching&page=file_iframe&#navpanes=0'; - } - </script> - <?php - //} - ?> - <form name="select_file_form" id="select_file_form" method="get" enctype="multipart/form-data" action="<?php - echo $_SESSION['config']['businessappurl']; - ?>index.php?display=true&dir=indexing_searching&page=choose_file" class="forms"> - <input type="hidden" name="display" value="true" /> - <input type="hidden" name="dir" value="indexing_searching" /> - <input type="hidden" name="page" value="choose_file" /> - <p> - <label for="file" style="width:90%;margin-right: -12px;margin-top: -2px"> - <?php - if (!empty($_SESSION['upfile']['local_path']) && empty($_SESSION['error'])) { - ?> - <i class="fa fa-check-square fa-2x" title="<?php echo _DOWNLOADED_FILE; ?>"></i> - <input type="button" id="fileButton" onclick="$j('#file').click();" class="button" - value="<?php if ($_REQUEST['with_file'] == 'true') { - echo _WITHOUT_FILE; - } else { - echo _DOWNLOADED_FILE; - } ?>" - style="width: 90%;margin: 0px;margin-top: -2px;font-size: 15px;text-align: center;"> - <?php - } else { - ?> - <i class="fa fa-times fa-2x" title="<?php echo _NO_FILE_SELECTED; ?>"></i> - <input type="button" id="fileButton" onclick="$j('#file').click()" class="button" value="<?php echo _CHOOSE_FILE; ?>" style="width: 90%;margin: 0px;margin-top: -2px;font-size: 15px;text-align: center;"> - <?php - } ?> - </label> - <?php - if ($_REQUEST['with_file'] == 'true') { - ?> - <i class="fa fa-ban fa-2x" id="with_file_icon" onclick="$j('#with_file').click();" title="<?php echo _WITHOUT_FILE; ?> (actif)" style="cursor:pointer;"></i> - <?php - } else { - ?> - <i class="fa fa-ban fa-2x" id="with_file_icon" onclick="$j('#with_file')[0].value='true';$j('#with_file2').click();" title="<?php echo _WITHOUT_FILE; ?>" style="cursor:pointer;"></i> - <?php - } ?> - - </p> - <p style="display:none;"> - <label for="with_file"> - <?php echo _WITHOUT_FILE; ?> - </label> - <div align="center" style="display:none;"> - <?php echo _YES; ?> - <input <?php if ($_REQUEST['with_file'] == 'true') { - echo 'checked="checked"'; - } ?> - type="radio" name="with_file" id="with_file2" value="true" onclick="this.form.method = 'post';this.form.submit();" /> - <?php echo _NO; ?> - <input <?php if ($_REQUEST['with_file'] == 'false' || $_REQUEST['with_file'] == '') { - echo 'checked="checked"'; - } ?> - type="radio" name="with_file" id="with_file" value="false" onclick="this.form.method = 'post';this.form.submit();" /> - </div> - </p> - </form> - <?php $core_tools->load_js();?> - </body> -</html> diff --git a/apps/maarch_entreprise/js/functions.js b/apps/maarch_entreprise/js/functions.js index fc4e1e3b179..3e34183967a 100755 --- a/apps/maarch_entreprise/js/functions.js +++ b/apps/maarch_entreprise/js/functions.js @@ -2307,39 +2307,6 @@ function resetSelect(id) { $j('#' + id).trigger("chosen:updated"); } -function getChildrenHtml(branch_id, treeDiv, path_manage_script, opened, closed) { - var minus; - if ($j('#' + branch_id + ' i').first().prop('class') == closed) { - minus = false; - } else { - minus = true; - } - - $j.ajax({ - url: path_manage_script, - type: 'POST', - data: { - branch_id: branch_id - }, - success: function (result) { - if (minus) { - BootstrapTree.removeSons($j('#' + branch_id + ' > ul')); - $j('#' + branch_id + ' i').first().prop('class', closed); - } else { - if (result != '') { - BootstrapTree.addNode($j('#' + branch_id), $j(result), opened, closed); - BootstrapTree.init($j('#' + treeDiv), opened, closed); - $j('#' + branch_id + ' > ul').first().find('li').hide(); - $j('#' + branch_id + ' > ul').first().find('li').show('fast'); - $j('#' + branch_id + ' i').first().prop('class', opened); - } else { - $j('#' + branch_id + ' i').first().prop('class', 'emptyNode'); - } - } - } - }); -} - function titleWithTooltipster(id) { $j(document).ready(function () { $j('#' + id).tooltipster({ diff --git a/apps/maarch_entreprise/no_right.php b/apps/maarch_entreprise/no_right.php deleted file mode 100755 index 679580a0088..00000000000 --- a/apps/maarch_entreprise/no_right.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php - -/* -* Copyright 2008,2015 Maarch -* -* This file is part of Maarch Framework. -* -* Maarch Framework is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Maarch Framework is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. -*/ - -/** -* File : no_right.php -* -* Default error of right page -* -* @package Maarch PeopleBox 1.0 -* @version 2.1 -* @since 10/2005 -* @license GPL -* @author Claire Figueras <dev@maarch.org> -*/; - -$core_tools = new core_tools(); - -unset($_SESSION['location_bar']['level2']); -unset($_SESSION['location_bar']['level3']); -unset($_SESSION['location_bar']['level4']); -$core_tools->manage_location_bar(); -?> -<h1><?php echo _NO_RIGHT;?></h1> -<div id="inner_content" class="clearfix"> -<br/><br/> -<div class="error"><?php echo _NO_RIGHT_TXT;?></div> -</div> diff --git a/modules/attachments/js/functions.js b/modules/attachments/js/functions.js index b58ba4704b8..df00c72f140 100755 --- a/modules/attachments/js/functions.js +++ b/modules/attachments/js/functions.js @@ -1,9 +1,3 @@ -function cleanTitle(str) { - //permet de supprimer les # dans le titre qui bloque l'ouverture de l'applet java - var res = str.replace(/#/g, " "); - return(res); -} - function activePjTab(target) { $j('[id^=PjDocument_],#MainDocument').css('background-color', 'rgb(197, 197, 197)'); diff --git a/modules/avis/class/avis_controler_Abstract.php b/modules/avis/class/avis_controler_Abstract.php index 14d31acdedd..8bccb708261 100755 --- a/modules/avis/class/avis_controler_Abstract.php +++ b/modules/avis/class/avis_controler_Abstract.php @@ -14,247 +14,5 @@ */ abstract class avis_controler_Abstract { - public function getAvis($resId) - { - //define avis limit date - $db = new Database(); - $query = "SELECT notes.user_id,notes.note_text, opinion_limit_date FROM notes,res_letterbox WHERE identifier = ? AND note_text LIKE '[POUR AVIS]%' AND notes.identifier = res_letterbox.res_id"; - - $stmt = $db->query($query, array($resId)); - - $avis = $stmt->fetchObject(); - - return $avis; - } - - //#################################### - //# send avis - //#################################### - - public function getList($res_id, $coll_id, $bool_modif = false, $typeList, $isAvisStep = false, $fromDetail = '') - { - $circuit = $this->getWorkflow($res_id, $coll_id, $typeList); - - $str = '<div class="error" id="divErrorAvis" onclick="this.hide();"></div>'; - $str .= '<div class="info" id="divInfoAvis" onclick="this.hide();"></div>'; - - //AVIS USER LIST - if ($bool_modif == true) { - $str .= '<select data-placeholder="'._ADD_AVIS_ROLE.'" id="avisUserList" onchange="addAvisUser();">'; - $str .= '<option value="" ></option>'; - - $tab_userentities = $this->getEntityAvis(); - $tab_users = $this->getUsersAvis(); - //Order by parent entity - foreach ($tab_userentities as $key => $value) { - $str .= '<optgroup label="'.$tab_userentities[$key]['entity_id'].'">'; - foreach ($tab_users as $user) { - if ($tab_userentities[$key]['entity_id'] == $user['entity_id']) { - $selected = ' '; - if ($user['id'] == $step['user_id']) { - $selected = ' selected'; - } - $str .= '<option value="'.$user['id'].'" '.$selected.'>'.$user['lastname'].' '.$user['firstname'].'</option>'; - } - } - $str .= '</optgroup>'; - } - $str .= '</select>'; - $str .= '<script>'; - $str .= '$j("#avisUserList").chosen({width: "250px", disable_search_threshold: 10});'; - $str .= '</script>'; - - - $str .= ' <select data-placeholder="'._ADD_AVIS_MODEL.'" name="modelList" id="modelList" onchange="loadAvisModelUsers();">'; - $str .= '<option value=""></option>'; - $str .= '</select>'; - - $str .= '<script>'; - $str .= '$j("#modelList").chosen({width: "250px", disable_search_threshold: 10});'; - $str .= '</script>'; - $str .= '<br/><br/>'; - } - - $str .= '<div id="avis_content">'; - //AVIS USER IN DOCUMENT - $i = 1; - $lastUserAvis = true; - - if (empty($circuit['avis']['users']) || !is_array($circuit['avis']['users']) || count($circuit['avis']['users']) == 0) { - $str .= '<div id="emptyAvis"><strong><em>'._EMPTY_AVIS_WORKFLOW.'</em></strong></div>'; - } else { - $str .= '<div id="emptyAvis" style="display:none;"><strong><em>'._EMPTY_AVIS_WORKFLOW.'</em></strong></div>'; - if (count($circuit['avis']['users']) > 0) { - foreach ($circuit['avis']['users'] as $it => $info_userAvis) { - if (empty($info_userAvis['process_date'])) { - if ($lastUserAvis == true && $isAvisStep == true) { - $vised = ' currentAvis'; - $modif = 'false'; - $disabled = ''; - $link_vis = 'arrow-right '; - $del_vis = '<div class="delete_avis"></div>'; - if ($info_userAvis['user_id'] != $_SESSION['user']['UserId']) { - //$info_vised = '<p style="color:red;">Vous donnez votre avis à la place de ' . $info_userAvis['firstname'] . ' ' . $info_userAvis['lastname'] . '!</p>'; - $dropZone = ''; - } else { - //$info_vised = 'Vous êtes l\'actuel conseiller'; - $dropZone = ''; - } - } else { - $dropZone = '<i class="fa fa-exchange-alt fa-2x fa-rotate-90" aria-hidden="true" title="'._DRAG_N_DROP_CHANGE_ORDER.'" style="cursor: pointer"></i>'; - $vised = ''; - if ($bool_modif == true) { - $modif = 'true'; - $del_vis = '<i class="fa fa-trash-alt" aria-hidden="true" onclick="delAvisUser(this.parentElement.parentElement);" title="'._DELETE.'"></i>'; - $disabled = ''; - } else { - $dropZone = ''; - $modif = 'false'; - $del_vis = ''; - $disabled = ' disabled="disabled"'; - } - - $info_vised = ''; - $link_vis = 'hourglass-half'; - } - - $lastUserAvis = false; - } else { - $lastUserAvis = true; - $modif = 'false'; - $vised = ' vised'; - $link_vis = 'check'; - $disabled = ' disabled="disabled"'; - $info_vised = '<br/><sub>avis donné le : '.functions::format_date_db($info_userAvis['process_date'], '', '', true).'</sub>'; - $del_vis = ''; - } - //AVIS USER LINE CIRCUIT - $str .= '<div class="droptarget'.$vised.'" id="avis_'.$i.'" draggable="'.$modif.'">'; - $str .= '<span class="avisUserStatus">'; - $str .= '<i class="fa fa-'.$link_vis.'" aria-hidden="true"></i>'; - $str .= '</span>'; - $str .= '<span class="avisUserInfo">'; - $str .= '<sup class="avisUserPos nbResZero">'.$i.'</sup> '; - $str .= '<i class="fa fa-user fa-2x" aria-hidden="true"></i> '.$info_userAvis['lastname'].' '.$info_userAvis['firstname'].' <sup class="nbRes">'.$info_userAvis['entity_id'].'</sup>'.$info_vised; - $str .= '</span>'; - $str .= '<span class="avisUserAction">'; - $str .= $del_vis; - $str .= '</span>'; - $str .= '<span class="avisUserConsigne">'; - $str .= '<input class="userId" type="hidden" value="'.$info_userAvis['user_id'].'"/><input class="avisDate" type="hidden" value="'.$info_userAvis['process_date'].'"/><input'.$disabled.' class="consigne" type="text" value="'.$info_userAvis['process_comment'].'"/>'; - $str .= '</span>'; - $str .= '<span id="dropZone">'; - $str .= $dropZone; - $str .= '</span>'; - $str .= '</div>'; - - ++$i; - } - } - } - - $str .= '</div>'; - - if ($bool_modif == true) { - //SAVE AVIS CIRCUIT - $str .= '<input type="button" name="send" id="send" value="'._SAVE_CHANGES.'" class="button" '; - $str .= 'onclick="updateAvisWorkflow('.$res_id.');" /> '; - - //SAVE AS MODEL - $str .= '<input type="button" name="save" id="save" value="Enregistrer comme modèle" class="button" onclick="$(\'modalSaveAvisModel\').style.display = \'block\';" />'; - $str .= '<div id="modalSaveAvisModel" >'; - $str .= '<h3>'._SAVE_POSITION.' '._AVIS_WORKFLOW.'</h3><br/>'; - $str .= '<label for="titleModel">'._TITLE.'</label> '; - $str .= '<input type="text" name="titleModel" id="titleModel"/><br/>'; - $str .= '<input type="button" name="saveModel" id="saveModel" value="'._VALIDATE.'" class="button" onclick="saveAvisWorkflowAsModel();" /> '; - $str .= '<input type="button" name="cancelModel" id="cancelModel" value="'._CANCEL.'" class="button" onclick="$(\'modalSaveAvisModel\').style.display = \'none\';" />'; - $str .= '</div>'; - } - $str .= '<script>initDragNDropAvis();</script>'; - - return $str; - } - - public function getWorkflow($res_id, $coll_id, $typeList) - { - require_once 'modules/entities/class/class_manage_listdiff.php'; - $listdiff = new diffusion_list(); - $roles = $listdiff->list_difflist_roles(); - $circuitAvis = $listdiff->get_listinstance($res_id, false, $typeList); - if (isset($circuitAvis['copy'])) { - unset($circuitAvis['copy']); - } - - return $circuitAvis; - } - - public function getEntityAvis() - { - $db = new Database(); - - $stmt = $db->query("SELECT distinct(entities.entity_id) from users, usergroup_content, users_entities,entities WHERE users_entities.user_id = users.user_id and - users_entities.primary_entity = 'Y' and users.user_id = usergroup_content.user_id AND entities.entity_id = users_entities.entity_id AND group_id IN - (SELECT group_id FROM usergroups_services WHERE service_id = ?) - order by entities.entity_id", array('avis_documents')); - - $tab_userentities = array(); - - while ($res = $stmt->fetchObject()) { - array_push($tab_userentities, array('entity_id' => $res->entity_id)); - } - //print_r($tab_userentities); - return $tab_userentities; - } - - public function getUsersAvis($group_id = null) - { - $db = new Database(); - - if ($group_id != null) { - $stmt = $db->query("SELECT users.user_id, users.firstname, users.lastname, usergroup_content.group_id,entities.entity_id from users, usergroup_content, users_entities,entities WHERE users_entities.user_id = users.user_id and users.status <> 'DEL' and - users_entities.primary_entity = 'Y' and users.user_id = usergroup_content.user_id AND entities.entity_id = users_entities.entity_id AND group_id IN - (SELECT group_id FROM usergroups_services WHERE service_id = ? AND group_id = ?) order by users.lastname", array('avis_documents', $group_id)); - } else { - $stmt = $db->query("SELECT users.user_id, users.firstname, users.lastname, usergroup_content.group_id,entities.entity_id from users, usergroup_content, users_entities,entities WHERE users_entities.user_id = users.user_id and users.status <> 'DEL' and - users_entities.primary_entity = 'Y' and users.user_id = usergroup_content.user_id AND entities.entity_id = users_entities.entity_id AND group_id IN - (SELECT group_id FROM usergroups_services WHERE service_id = ?) - order by users.lastname", array('avis_documents')); - } - - $tab_users = array(); - - while ($res = $stmt->fetchObject()) { - array_push($tab_users, array('id' => $res->user_id, 'firstname' => $res->firstname, 'lastname' => $res->lastname, 'group_id' => $res->group_id, 'entity_id' => $res->entity_id)); - } - - return $tab_users; - } - - public function saveModelWorkflow($id_list, $workflow, $typeList, $title) - { - } - - public function saveWorkflow($res_id, $coll_id, $workflow, $typeList) - { - require_once 'modules/entities/class/class_manage_listdiff.php'; - $diff_list = new diffusion_list(); - - $diff_list->save_listinstance( - $workflow, - $typeList, - $coll_id, - $res_id, - $_SESSION['user']['UserId'], - $_SESSION['user']['primaryentity']['id'] - ); - } - - public function nbAvis($res_id, $coll_id) - { - $db = new Database(); - $stmt = $db->query("SELECT listinstance_id from listinstance WHERE res_id= ? and coll_id = ? and item_mode = ? and difflist_type = 'AVIS_CIRCUIT'", array($res_id, $coll_id, 'avis')); - - return $stmt->rowCount(); - } } diff --git a/modules/avis/css/module.css b/modules/avis/css/module.css index 2dca093d379..b0ebe1a5e41 100755 --- a/modules/avis/css/module.css +++ b/modules/avis/css/module.css @@ -1,17 +1,3 @@ -#modalSaveAvisModel{ - padding-top:20px; - z-index: 1050; - width: 300px; - height: 80px; - border: 2px solid #000; - display: none; - position: absolute; - background-color: #F2F2F2; - left: 40%; - top: 10%; - text-align: center; -} - [draggable=true]{ cursor: move; } @@ -21,10 +7,6 @@ [draggable=false]:hover{ cursor: not-allowed; } -#avis_content{ - display: block; - width: 100%; -} .droptarget{ position: relative; background-color: #135F7F33; diff --git a/modules/avis/js/functions.js b/modules/avis/js/functions.js index 47438752725..e69de29bb2d 100755 --- a/modules/avis/js/functions.js +++ b/modules/avis/js/functions.js @@ -1,336 +0,0 @@ -function addAvisUser(users) { - if (!users) { - nb_avis = $j(".droptarget").length; - next_avis = nb_avis + 1; - if (nb_avis == 0) { - $j("#emptyAvis").hide(); - } - $j("#avis_content").append('<div class="droptarget" id="avis_' + next_avis + '" draggable="true">' - + '<span class="avisUserStatus">' - + '<i class="fa fa-hourglass-half" aria-hidden="true"></i>' - + '</span>' - + '<span class="avisUserInfo">' - +'<sup class="avisUserPos nbResZero">'+next_avis+'</sup> ' - + '<i class="fa fa-user fa-2x" aria-hidden="true"></i> ' + $j("select#avisUserList option:selected").text() + ' <sup class="nbRes">' + $j("select#avisUserList option:selected").parent().get(0).label + '</sup>' - + '<input class="userId" type="hidden" value="' + $j("select#avisUserList option:selected").val() + '"/><input class="avisDate" type="hidden" value=""/>' - + '</span>' - + '<span class="avisUserAction">' - + '<i class="fa fa-trash-alt" aria-hidden="true" onclick="delAvisUser(this.parentElement.parentElement);"></i>' - + '</span>' - + '<span class="avisUserConsigne">' - + '<input type="text" class="consigne" value=""/>' - + '</span>' - + '<span id="dropZone" title="Glisser/déposer pour modifier l\'ordre du circuit" style="cursor: pointer">' - + '<i class="fa fa-exchange-alt fa-2x fa-rotate-90" aria-hidden="true"></i>' - + '</span>' - + '</div>'); - - document.getElementById("avisUserList").selectedIndex = 0; - $j("#avisUserList").trigger("chosen:updated"); - } else { - nb_avis = $j(".droptarget").length; - next_avis = nb_avis + 1; - if (nb_avis == 0) { - $j("#emptyAvis").hide(); - } - $j("#avis_content").append('<div class="droptarget" id="avis_' + next_avis + '" draggable="true">' - + '<span class="avisUserStatus">' - + '<i class="fa fa-hourglass-half" aria-hidden="true"></i>' - + '</span>' - + '<span class="avisUserInfo">' - +'<sup class="avisUserPos nbResZero">'+next_avis+'</sup> ' - + '<i class="fa fa-user fa-2x" aria-hidden="true"></i> ' + users.lastname + ' ' + users.firstname + ' <sup class="nbRes">' + users.entity_id + '</sup>' - + '<input class="userId" type="hidden" value="' + users.user_id + '"/><input class="avisDate" type="hidden" value=""/>' - + '</span>' - + '<span class="avisUserAction">' - + '<i class="fa fa-trash-alt" aria-hidden="true" onclick="delAvisUser(this.parentElement.parentElement);"></i>' - + '</span>' - + '<span class="avisUserConsigne">' - + '<input type="text" class="consigne" value="' + users.process_comment + '"/>' - + '</span>' - + '<span id="dropZone" title="Glisser/déposer pour modifier l\'ordre du circuit" style="cursor: pointer">' - + '<i class="fa fa-exchange-alt fa-2x fa-rotate-90" aria-hidden="true"></i>' - + '</span>' - + '</div>'); - - } - resetPosAvis(); -} -function delAvisUser(target) { - console.log(target); - var id = '#' + target.id; - - if ($j(".droptarget").length == 1) { - $j("#emptyAvis").show(); - } - $j(id).remove(); - - resetPosAvis(); - -} -function resetPosAvis() { - i = 1; - $j(".droptarget").each(function () { - this.id = 'avis_' + i; - $j("#" + this.id).find(".avisUserPos").text(i); - i++; - }); -} -function updateAvisWorkflow(resId) { - var $i = 0; - var userList = []; - if ($j(".droptarget").length) { - $j(".droptarget").each(function () { - //console.log('viseur : '+$j("#"+this.id+" .userdId").val()); - userId = $j("#" + this.id).find(".userId").val(); - userConsigne = $j("#" + this.id).find(".consigne").val(); - userAvisDate = $j("#" + this.id).find(".avisDate").val(); - userPos = $i; - userList.push({userId: userId, userPos: userPos, userConsigne: userConsigne, userAvisDate: userAvisDate}); - $i++; - }); - } - - //EXEMPLE BIEN FAIT - $j.ajax({ - url: 'index.php?display=true&module=avis&page=updateAvisWF', - type: 'POST', - dataType: 'JSON', - data: { - resId: resId, - userList: JSON.stringify(userList) - }, - success: function (response) { - if (response.status == 0) { - $('divInfoAvis').innerHTML = 'Mise à jour du circuit effectuée'; - $('divInfoAvis').style.display = 'table-cell'; - Element.hide.delay(5, 'divInfoAvis'); - eval(response.exec_js); - } else if (response.status != 1) { - alert(response.error_txt) - } - }, - error: function (error) { - alert(error); - } - - }); -} -function saveAvisWorkflowAsModel() { - var $i = 0; - var userList = []; - var title = $j("#titleModel").val(); - - if ($j(".droptarget").length) { - $j(".droptarget").each(function () { - //console.log('viseur : '+$j("#"+this.id+" .userdId").val()); - userId = $j("#" + this.id).find(".userId").val(); - userConsigne = $j("#" + this.id).find(".consigne").val(); - userAvisDate = $j("#" + this.id).find(".avisDate").val(); - userPos = $i; - userList.push({userId: userId, userPos: userPos, userConsigne: userConsigne, userAvisDate: userAvisDate}); - $i++; - }); - $j.ajax({ - url: 'index.php?display=true&module=avis&page=saveAvisModel', - type: 'POST', - dataType: 'JSON', - data: { - title: title, - userList: JSON.stringify(userList) - }, - success: function (response) { - if (response.status == 0) { - $('divInfoAvis').innerHTML = 'Modèle enregistré'; - $('divInfoAvis').style.display = 'table-cell'; - Element.hide.delay(5, 'divInfoAvis'); - $j('#modalSaveAvisModel').hide(); - eval(response.exec_js); - } else { - alert(response.error_txt) - } - }, - error: function (error) { - alert(error); - } - - }); - - } else { - alert('Aucun utilisateur dans le circuit !'); - } - -} -function loadAvisModelUsers() { - - var objectId = $j("select#modelList option:selected").val(); - var objectType = 'AVIS_CIRCUIT'; - $j.ajax({ - url: 'index.php?display=true&module=avis&page=load_listmodel_avis_users', - type: 'POST', - dataType: 'JSON', - data: { - objectType: objectType, - objectId: objectId - }, - success: function (response) { - if (response.status == 0) { - - var userList = response.result; - if (userList) { - userList.each(function (user, key) { - addAvisUser(user); - }); - } - - - } else { - alert(response.error_txt); - } - }, - error: function (error) { - alert(error); - } - - }); - - //prototype - document.getElementById("modelList").selectedIndex = 0; - $j("#modelList").trigger("chosen:updated"); -} - -function initDragNDropAvis() { - document.getElementById("avis_content").addEventListener("dragstart", function (event) { - $j(".droptarget").not(".vised,.currentVis").css("border", "dashed 2px #135F7F33"); - // The dataTransfer.setData() method sets the data type and the value of the dragged data - event.dataTransfer.setData("Text", event.target.id); - - // Output some text when starting to drag the p element - //document.getElementById("demo").innerHTML = "Started to drag the p element."; - - // Change the opacity of the draggable element - event.target.style.opacity = "0.4"; - }); - - // While dragging the p element, change the color of the output text - document.getElementById("avis_content").addEventListener("drag", function (event) { - //document.getElementById("demo").style.color = "red"; - }); - - // Output some text when finished dragging the p element and reset the opacity - document.getElementById("avis_content").addEventListener("dragend", function (event) { - //document.getElementById("demo").innerHTML = "Finished dragging the p element."; - $j(".droptarget").not(".vised,.currentVis").css("border", "dashed 2px #135F7F33"); - event.target.style.opacity = "1"; - }); - - - /* Events fired on the drop target */ - - // When the draggable p element enters the droptarget, change the DIVS's border style - document.getElementById("avis_content").addEventListener("dragenter", function (event) { - if (event.target.className == "droptarget") { - event.target.style.border = "dashed 2px green"; - } - }); - - // By default, data/elements cannot be dropped in other elements. To allow a drop, we must prevent the default handling of the element - document.getElementById("avis_content").addEventListener("dragover", function (event) { - event.preventDefault(); - }); - - // When the draggable p element leaves the droptarget, reset the DIVS's border style - document.getElementById("avis_content").addEventListener("dragleave", function (event) { - if (event.target.className == "droptarget") { - event.target.style.border = "dashed 2px #ccc"; - } - }); - - /* On drop - Prevent the browser default handling of the data (default is open as link on drop) - Reset the color of the output text and DIV's border color - Get the dragged data with the dataTransfer.getData() method - The dragged data is the id of the dragged element ("drag1") - Append the dragged element into the drop element - */ - document.getElementById("avis_content").addEventListener("drop", function (event) { - event.preventDefault(); - if (event.target.className == "droptarget") { - /*event.target.style.border = ""; - var data = event.dataTransfer.getData("Text"); - var oldContent = event.target.innerHTML; - var draggedConsigne = $j('#'+data+' .consigne').val(); - var replaceConsigne = $j('#'+event.target.id+' .consigne').val(); - event.target.innerHTML = document.getElementById(data).innerHTML; - $j('#'+event.target.id+' .consigne').val(draggedConsigne); - document.getElementById(data).innerHTML = oldContent; - $j('#'+data+' .consigne').val(replaceConsigne);*/ - var data = event.dataTransfer.getData("Text"); - var target = event.target.id; - posData = data.split("_"); - posTarget = target.split("_"); - if (posData[1] > posTarget[1]) { - $j('#' + target).before($j('#' + data)); - } else { - $j('#' + target).after($j('#' + data)); - } - resetPosAvis(); - - - } - }); - $j('#avis_content') - .on('focus', '.consigne', function(e) { - $j(this).closest('.droptarget').attr("draggable", false); - console.log($j(this).closest('.droptarget')); - }) - .on('blur', '.consigne', function(e) { - $j(this).closest('.droptarget').attr("draggable", true); - }); -} - -function checkRealDateAvis() { - - var processLimitDate; - var avisLimitDate; - - var current_date = Date.now(); - - if ($j('#process_limit_date')) { - processLimitDate = $j('#process_limit_date').val(); - var date4 = new Date(); - date4.setFullYear(processLimitDate.substr(6, 4)); - date4.setMonth(processLimitDate.substr(3, 2) - 1); - date4.setDate(processLimitDate.substr(0, 2)); - date4.setHours(0); - date4.setMinutes(0); - date4.setSeconds(0); - var d4_processLimitDate = date4.getTime(); - } - - - if ($j('#opinion_limit_date')) { - avisLimitDate = $j('opinion_limit_date_tr').val(); - var date5 = new Date(); - date5.setFullYear(avisLimitDate.substr(6, 4)); - date5.setMonth(avisLimitDate.substr(3, 2) - 1); - date5.setDate(avisLimitDate.substr(0, 2)); - date5.setHours(0); - date5.setMinutes(0); - date5.setSeconds(0); - var d5_avisLimitDate; - var d5_avisLimitDate = date5.getTime(); - } - - if (d4_processLimitDate != "" && avisLimitDate != "" && (d5_avisLimitDate > d4_processLimitDate && d4_processLimitDate > current_date)) { - alert("La date limite d'avis doit être antérieure à la date limite du courrier "); - $j('#opinion_limit_date').val(""); - $j('#opinion_limit_date_tr').val(""); - - } - - if (current_date > d5_avisLimitDate && avisLimitDate != "") { - alert("La date d'avis doit être supérieure à la date du jour "); - $j('#opinion_limit_date').val(""); - $j('#opinion_limit_date_tr').val(""); - } -} diff --git a/modules/avis/load_toolbar_avis.php b/modules/avis/load_toolbar_avis.php deleted file mode 100755 index e36f995dbcd..00000000000 --- a/modules/avis/load_toolbar_avis.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php -$targetTab = $_REQUEST['targetTab']; -$res_id = $_REQUEST['resId']; -$coll_id = $_REQUEST['collId']; - -require_once 'modules' . DIRECTORY_SEPARATOR . 'avis' . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR . 'avis_controler.php'; - -$avis = new avis_controler(); - -$nbAvis = $avis->nbAvis($res_id,$coll_id); - -if ($nbAvis == 0){ - $class = 'nbResZero'; - $style2 = 'display:none;'; - $style = '0.5'; - $styleDetail = '#9AA7AB'; -} -else{ - $class = 'nbRes'; - $style = ''; - $style2 = 'display:inherit;'; - $styleDetail = '#666'; -} - -if($_SESSION['req'] == 'details'){ - if($nbAvis == 0 && strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')){ - $nav = 'avis_tab'; - $style2 = 'visibility:hidden;'; - - } - if($_REQUEST['origin'] == 'parent'){ - $js .= 'parent.$(\''.$targetTab.'\').style.color=\''.$styleDetail.'\';parent.$(\''.$targetTab.'_badge\').innerHTML = \'<span id="nb_'.$targetTab.'" style="'.$style2.'font-size: 10px;" class="'.$class.'">'.$nbAvis.'</span>\''; - - }else { - $js .= '$(\''.$targetTab.'\').style.color=\''.$styleDetail.'\';$(\''.$targetTab.'_badge\').innerHTML = \'<span id="nb_'.$targetTab.'" style="'.$style2.'font-size: 10px;" class="'.$class.'">'.$nbAvis.'</span>\''; - - } -}else{ - if($_REQUEST['origin'] == 'parent'){ - $js .= 'parent.$(\''.$targetTab.'_img\').style.opacity=\''.$style.'\';parent.$(\''.$targetTab.'_badge\').innerHTML = \' <sup><span id="nb_'.$targetTab.'" style="'.$style2.'" class="'.$class.'">'.$nbAvis.'</span></sup>\''; - - }else { - $js .= '$(\''.$targetTab.'_img\').style.opacity=\''.$style.'\';$(\''.$targetTab.'_badge\').innerHTML = \' <sup><span id="nb_'.$targetTab.'" style="'.$style2.'" class="'.$class.'">'.$nbAvis.'</span></sup>\''; - - } -} - -echo "{status : 0, nav : '".$nav."',content : '', error : '', exec_js : '".addslashes($js)."'}"; -exit (); \ No newline at end of file diff --git a/modules/avis/saveAvisModel.php b/modules/avis/saveAvisModel.php deleted file mode 100755 index 4afc1b889b7..00000000000 --- a/modules/avis/saveAvisModel.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php - -/* - * Copyright Maarch since 2008 under licence GPLv3. - * See LICENCE.txt file at the root folder for more details. - * This file is part of Maarch software. - * - */ - -/* - * @brief saveAvisModel - * @author dev@maarch.org - * @ingroup avis - * - */ -require_once "modules" . DIRECTORY_SEPARATOR . "avis" . DIRECTORY_SEPARATOR - . "class" . DIRECTORY_SEPARATOR - . "avis_controler.php"; - - -$title = $_REQUEST['title']; -$id_list = 'AVIS_CIRCUIT_' . strtoupper(base_convert(date('U'), 10, 36)); - - -$userList = json_decode($_REQUEST['userList']); - -$avis = new avis_controler(); -$_SESSION['avis_wf']['diff_list']['avis']['users'] = array(); -$_SESSION['avis_wf']['diff_list']['sign']['users'] = array(); - -$i = 0; -foreach ($userList as $user) { - - array_push( - $_SESSION['avis_wf']['diff_list']['avis']['users'], array( - 'user_id' => $user->userId, - 'process_comment' => $user->userConsigne, - 'process_date' => $user->userAvisDate, - 'viewed' => 0, - 'visible' => 'Y', - 'difflist_type' => 'AVIS_CIRCUIT' - ) - ); -} -$avis->saveModelWorkflow($id_list, $_SESSION['avis_wf']['diff_list'], 'AVIS_CIRCUIT', $title); - -echo "{\"status\" : 0}"; - -exit(); -?> \ No newline at end of file diff --git a/modules/avis/updateAvisWF.php b/modules/avis/updateAvisWF.php deleted file mode 100755 index 5eb31170948..00000000000 --- a/modules/avis/updateAvisWF.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php - -/* - * Copyright Maarch since 2008 under licence GPLv3. - * See LICENCE.txt file at the root folder for more details. - * This file is part of Maarch software. - * - */ - -/* - * @brief updateAvisWF - * @author dev@maarch.org - * @ingroup avis - * - */ -require_once "modules" . DIRECTORY_SEPARATOR . "avis" . DIRECTORY_SEPARATOR - . "class" . DIRECTORY_SEPARATOR - . "avis_controler.php"; - - -$res_id = $_REQUEST['resId']; -$coll_id = 'letterbox_coll'; - -$userList = json_decode($_REQUEST['userList']); - -$avis = new avis_controler(); -$_SESSION['avis_wf']['diff_list']['avis']['users'] = array(); - -$i = 0; -if ($userList) { - foreach ($userList as $user) { - - array_push( - $_SESSION['avis_wf']['diff_list']['avis']['users'], array( - 'user_id' => $user->userId, - 'process_comment' => $user->userConsigne, - 'process_date' => $user->userAvisDate, - 'viewed' => 0, - 'visible' => 'Y', - 'difflist_type' => 'AVIS_CIRCUIT' - ) - ); - } -} - -$avis->saveWorkflow($res_id, $coll_id, $_SESSION['avis_wf']['diff_list'], 'AVIS_CIRCUIT'); - -//LOAD TOOLBAR BADGE -$toolbarBagde_script = $_SESSION['config']['businessappurl'] . 'index.php?display=true&module=avis&page=load_toolbar_avis&origin=parent&resId=' . $res_id . '&collId=' . $coll_id; -$js = 'loadToolbarBadge(\'avis_tab\',\'' . $toolbarBagde_script . '\');'; - - -echo "{\"status\" : 0, \"exec_js\" : \"" . $js . "\"}"; -exit(); -?> \ No newline at end of file diff --git a/modules/avis/xml/IVS/requests_definitions.xml b/modules/avis/xml/IVS/requests_definitions.xml index 1701e854820..71544fbeeb5 100755 --- a/modules/avis/xml/IVS/requests_definitions.xml +++ b/modules/avis/xml/IVS/requests_definitions.xml @@ -1,14 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <inputValidation xmlns:xi="http://www.w3.org/2001/XInclude"> <requestDefinitions> - <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="saveAvisModel" > - <parameter name="page" value="saveAvisModel"/> - <parameter name="module" value="Avis"/> - </requestDefinition> - <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="saveAvisModel" > - <parameter name="page" value="saveAvisModel"/> - <parameter name="module" value="Avis"/> - </requestDefinition> <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="sign_ans" > <parameter name="page" value="sign_ans"/> <parameter name="module" value="Avis"/> diff --git a/modules/avis/xml/IVS/validation_rules.xml b/modules/avis/xml/IVS/validation_rules.xml index f709fe7f2b1..89f446f200a 100755 --- a/modules/avis/xml/IVS/validation_rules.xml +++ b/modules/avis/xml/IVS/validation_rules.xml @@ -3,13 +3,6 @@ <parameter name="objectType" type="identifier" /> <parameter name="objectId" type="identifier" /> </validationRule> - <validationRule name="saveAvisModel" extends="standardForm" mode="error"> - <parameter name="id_list" type="string" /> - <parameter name="title" type="string" /> - <parameter name="conseillers" type="string" /> - <parameter name="consignes" type="string" /> - <parameter name="list_sign" type="string" /> - </validationRule> <validationRule name="update_AvisPage" extends="standardForm" mode="error"> <parameter name="res_id" type="integer" /> <parameter name="coll_id" type="collection_list" /> diff --git a/modules/basket/lang/en.php b/modules/basket/lang/en.php index ad91095b1a0..704e3f8308a 100755 --- a/modules/basket/lang/en.php +++ b/modules/basket/lang/en.php @@ -233,12 +233,6 @@ if (!defined("_MISSING")) define("_MISSING", "Absent"); if (!defined("_BACK_FROM_VACATION")) define("_BACK_FROM_VACATION", "Back from his/her absence"); -if (!defined("_MISSING_ADVERT_TITLE")) - define("_MISSING_ADVERT_TITLE","Absences management"); -if (!defined("_MISSING_ADVERT_01")) - define("_MISSING_ADVERT_01","This account is currently defined as absent and the mails are redirected to an other user."); -if (!defined("_MISSING_ADVERT_02")) - define("_MISSING_ADVERT_02","If you want to connect with this account, the 'absent' mode will be deleted then.<br/> The mails redirection will come at its end and the application will be reactivated"); if (!defined("_MISSING_CHOOSE")) define("_MISSING_CHOOSE"," Do you want to continue ?"); if (!defined("_CHOOSE_PERSON_TO_REDIRECT")) diff --git a/modules/basket/lang/fr.php b/modules/basket/lang/fr.php index c91f5962b38..2d354023ab8 100755 --- a/modules/basket/lang/fr.php +++ b/modules/basket/lang/fr.php @@ -178,15 +178,6 @@ if (!defined("_MISSING")) { if (!defined("_BACK_FROM_VACATION")) { define("_BACK_FROM_VACATION", "de retour de son absence"); } -if (!defined("_MISSING_ADVERT_TITLE")) { - define("_MISSING_ADVERT_TITLE", "Gestion des absences"); -} -if (!defined("_MISSING_ADVERT_01")) { - define("_MISSING_ADVERT_01", "Ce compte est actuellement défini en mode 'absent'."); -} -if (!defined("_MISSING_ADVERT_02")) { - define("_MISSING_ADVERT_02", "Si vous desirez vous connecter avec ce compte, le mode 'absent' sera alors supprimé.<br/> La redirection des courriers arrivera à son terme et l'application sera réactivée"); -} if (!defined("_MISSING_CHOOSE")) { define("_MISSING_CHOOSE", "Souhaitez-vous continuer?"); } diff --git a/modules/basket/lang/nl.php b/modules/basket/lang/nl.php index dc43e993f2e..1e790a7867e 100755 --- a/modules/basket/lang/nl.php +++ b/modules/basket/lang/nl.php @@ -303,15 +303,6 @@ if (!defined('_MISSING')) { if (!defined('_BACK_FROM_VACATION')) { define('_BACK_FROM_VACATION', 'bij terugkeer na afwezigheid'); } -if (!defined('_MISSING_ADVERT_TITLE')) { - define('_MISSING_ADVERT_TITLE', 'Afwezigheidsbeheer'); -} -if (!defined('_MISSING_ADVERT_01')) { - define('_MISSING_ADVERT_01', 'Deze account is momenteel in “afwezigheidsâ€modus gezet en de brieven worden naar een andere gebruiker omgeleid.'); -} -if (!defined('_MISSING_ADVERT_02')) { - define('_MISSING_ADVERT_02', 'Indien u zich met deze account wil verbinden, zal de modus “afwezig†verwijderd worden.<br/> De omleiding van de brieven zal voltooid worden en de applicatie zal opnieuw ingeschakeld worden'); -} if (!defined('_MISSING_CHOOSE')) { define('_MISSING_CHOOSE', 'Wilt u verdergaan?'); } diff --git a/modules/notes/class/class_modules_tools_Abstract.php b/modules/notes/class/class_modules_tools_Abstract.php index f519b81e3ca..c82dbee9ad5 100755 --- a/modules/notes/class/class_modules_tools_Abstract.php +++ b/modules/notes/class/class_modules_tools_Abstract.php @@ -36,7 +36,6 @@ // Loads the required class try { require_once("core/class/class_db.php"); - require_once("modules/notes/notes_tables.php"); require_once("modules/entities/entities_tables.php"); require_once ("modules/notes/class/class_modules_tools.php"); require_once "modules/entities/class/EntityControler.php"; @@ -57,16 +56,6 @@ abstract class notes_Abstract */ public static $ent; - /** - * Notes table - */ - public static $notes_table ; - - /** - * Notes_entities table - */ - public static $notes_entities_table ; - /** * Entities table */ @@ -78,33 +67,7 @@ abstract class notes_Abstract */ public function build_modules_tables() { - if (file_exists( - $_SESSION['config']['corepath'] . 'custom' . DIRECTORY_SEPARATOR - . $_SESSION['custom_override_id'] . DIRECTORY_SEPARATOR . "modules" - . DIRECTORY_SEPARATOR . "notes" . DIRECTORY_SEPARATOR . "xml" - . DIRECTORY_SEPARATOR . "config.xml" - ) - ) { - $path = $_SESSION['config']['corepath'] . 'custom' - . DIRECTORY_SEPARATOR . $_SESSION['custom_override_id'] - . DIRECTORY_SEPARATOR . "modules" . DIRECTORY_SEPARATOR - . "notes" . DIRECTORY_SEPARATOR . "xml" . DIRECTORY_SEPARATOR - . "config.xml"; - } else { - $path = "modules" . DIRECTORY_SEPARATOR . "notes" - . DIRECTORY_SEPARATOR . "xml" . DIRECTORY_SEPARATOR - . "config.xml"; - } - $xmlconfig = simplexml_load_file($path); - foreach ($xmlconfig->TABLENAME as $tableName) { - $_SESSION['tablename']['not_notes'] = (string) $tableName->not_notes; - $_SESSION['tablename']['note_entities'] = (string) $tableName->note_entities; - } - $hist = $xmlconfig->HISTORY; - $_SESSION['history']['noteadd'] = (string) $hist->noteadd; - $_SESSION['history']['noteup'] = (string) $hist->noteup; - $_SESSION['history']['notedel'] = (string) $hist->notedel; - } + } /** * Function to get which user can see a note @@ -115,127 +78,22 @@ abstract class notes_Abstract $db = new Database(); $ent = new EntityControler(); - $query = "SELECT entity_id, entity_label, short_label FROM ".NOTE_ENTITIES_TABLE." , entities WHERE item_id LIKE entity_id and note_id = ?"; + $query = "SELECT entity_id, entity_label, short_label FROM note_entities , entities WHERE item_id LIKE entity_id and note_id = ?"; - try{ + try { $stmt = $db->query($query, array($id)); - } catch (Exception $e){} - + } catch (Exception $e) { + } $entitiesList = array(); $entitiesChosen = array(); $entitiesList = $ent->getAllEntities(); - while($res = $stmt->fetchObject()) - { + while ($res = $stmt->fetchObject()) { array_push($entitiesChosen, $ent->get($res->entity_id)); } - //self::disconnect(); return $entitiesChosen; } - - public function getNotes($noteId, $userId, $userPrimaryEntity) - { - $query = "SELECT id FROM notes WHERE id in (" - . "SELECT note_id FROM ". NOTE_ENTITIES_TABLE. " WHERE (item_id in (" - ."SELECT entity_id FROM users_entities WHERE user_id = ?) and note_id = ?))" - . "or (id = ? and user_id = ?)"; - $db = new Database(); - $stmt = $db->query($query, array($userId, $noteId, $noteId, $userId)); - - if ($stmt->rowCount() > 0) { - return true; - } else { - // test if public - $query = "SELECT note_id FROM ". NOTE_ENTITIES_TABLE. " WHERE note_id = ?"; - $stmt = $db->query($query, array($noteId)); - if ($stmt->rowCount() == 0) { - return true; - } else { - return false; - } - } - } - - public function countUserNotes($id, $type = 'resource') { - $not_nbr = 0; - $db = new Database(); - - $stmt = $db->query("SELECT id, identifier, user_id, creation_date, note_text FROM " - . NOTES_TABLE - . " WHERE identifier = ? and type = ? order by creation_date desc", array($id, $type)); - - while ($res = $stmt->fetchObject()) - { - $query = "SELECT id FROM ". NOTE_ENTITIES_TABLE. " WHERE note_id = ?"; - - $stmt2 = $db->query($query, array($res->id)); - - if($stmt2->rowCount()==0) - $not_nbr++; - else - { - $stmt2 = $db->query( "SELECT id FROM notes WHERE id in (" - . "SELECT note_id FROM ". NOTE_ENTITIES_TABLE. " WHERE (item_id in (" - ."SELECT entity_id FROM users_entities WHERE user_id = ?) and note_id = ?))" - . "or (id = ? and user_id = ?)", - array($_SESSION['user']['UserId'], $res->id, $res->id, $_SESSION['user']['UserId'])); - - if($stmt2->rowCount()<>0) - $not_nbr++; - } - } - - return $not_nbr; - } - - public function getUserNotes($id, $coll_id) { - $userNotes = array(); - $db = new Database(); - - $stmt = $db->query("SELECT id, identifier, user_id, creation_date, note_text FROM " - . NOTES_TABLE - . " WHERE identifier = ? order by creation_date desc", - array($id)); - - while ($res = $stmt->fetchObject()) - { - $query = "SELECT id FROM ".NOTE_ENTITIES_TABLE." WHERE note_id = ?"; - - $stmt2 = $db->query($query, array($res->id)); - - $stmt3 = $db->query("SELECT id FROM USERS WHERE user_id = ?", array($_SESSION['user']['UserId'])); - $userInfo = $stmt3->fetchObject(); - - if($stmt2->rowCount()==0) { - array_push($userNotes, - array('id' => $res->id, //ID - 'label' => functions::show_string($res->note_text), //Label - 'author' => $res->user_id, //Author - 'date' => $res->creation_date //Date - ) - ); - } else { - $stmt2 = $db->query( "SELECT id FROM notes WHERE id in (" - . "select note_id from ". NOTE_ENTITIES_TABLE. " where (item_id in (" - ."SELECT entity_id FROM users_entities WHERE user_id = ?) and note_id = ?))" - . "or (id = ? and user_id = ?)", - array($userInfo->id, $res->id, $res->id, $userInfo->id)); - - if($stmt2->rowCount()<>0) { - array_push($userNotes, - array('id' => $res->id, //ID - 'label' => functions::show_string($res->note_text), //Label - 'author' => $res->user_id, //Author - 'date' => $res->creation_date //Date - ) - ); - } - } - } - - return $userNotes; - } } diff --git a/modules/notes/class/notes_controler.php b/modules/notes/class/notes_controler.php deleted file mode 100755 index e0539c49e5f..00000000000 --- a/modules/notes/class/notes_controler.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php -/* -* Copyright 2013-2016 Maarch -* -* This file is part of Maarch Framework. -* -* Maarch Framework is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Maarch Framework is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. -*/ - -/** -* @brief Contains the controler of the note Object -* -* -* @file -* @author Laurent Giovannoni <dev@maarch.org> -* @date $date$ -* @version $Revision$ -* @ingroup notes -*/ - -require_once 'modules/notes/class/notes_controler_Abstract.php'; - -/** -* @brief Controler of the note Object -* -* @ingroup notes -*/ -class notes_controler extends notes_controler_Abstract -{ - // custom -} diff --git a/modules/notes/class/notes_controler_Abstract.php b/modules/notes/class/notes_controler_Abstract.php deleted file mode 100755 index 137ca3d5262..00000000000 --- a/modules/notes/class/notes_controler_Abstract.php +++ /dev/null @@ -1,111 +0,0 @@ -<?php -/* -* Copyright 2013-2016 Maarch -* -* This file is part of Maarch Framework. -* -* Maarch Framework is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Maarch Framework is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. -*/ - -/** -* @brief Contains the controler of the note Object -* -* -* @file -* @author Laurent Giovannoni <dev@maarch.org> -* @date $date$ -* @version $Revision$ -* @ingroup notes -*/ - -/** -* @brief Controler of the note Object -* -* @ingroup notes -*/ -abstract class notes_controler_Abstract -{ - ##################################### - ## add note on a resource - ##################################### - public function addNote($resId, $collId, $noteContent, $typist='') - { - if(empty($typist)){ - $typist = $_SESSION['user']['UserId']; - } - $status = 'ok'; - $error = ''; - //control parameters - if (isset($resId) && empty($resId)) { - $status = 'ko'; - $error = 'resId empty '; - } - if (isset($collId) && empty($collId)) { - $status = 'ko'; - $error = 'collId empty '; - } - if (isset($noteContent) && empty($noteContent)) { - $status = 'ko'; - $error .= 'noteContent empty '; - } - //process - if ($status == 'ok') { - require_once 'core/class/class_security.php'; - require_once 'modules/notes/notes_tables.php'; - $security = new security(); - $view = $security->retrieve_view_from_coll_id($collId); - $table = $security->retrieve_table_from_coll($collId); - $db = new Database(); - $query = "SELECT res_id FROM " . $view . " WHERE res_id = ?"; - $stmt = $db->query($query, array($resId)); - if ($stmt->rowCount() == 0) { - $status = 'ko'; - $error .= 'resId not exists'; - } else { - $query = - "INSERT INTO " . NOTES_TABLE . "(identifier, note_text, " - . "creation_date, user_id) values" - . " (?, ?, CURRENT_TIMESTAMP, ?)"; - - $stmt = $db->query($query, array($resId, $noteContent, $typist)); - - $hist = new history(); - $stmt = $db->query( - "SELECT id FROM " . NOTES_TABLE . " WHERE " - . "identifier = ? and user_id = ? order by id desc", - array($resId, $typist) - ); - $res = $stmt->fetchObject(); - $id = $res->id; - $hist->add( - $view, $resId, 'UP', 'resup', _ADDITION_NOTE - . _ON_DOC_NUM . $resId . ' (' . $id . ') ' . _FROM_WS, - $_SESSION['config']['databasetype'], 'notes' - ); - $hist->add( - NOTES_TABLE, $id, 'ADD', 'noteadd', _NOTES_ADDED - . ' (' . $id . ') ' . _FROM_WS, - $_SESSION['config']['databasetype'], 'notes' - ); - - } - } - $returnArray = array( - 'status' => $status, - 'value' => $id, - 'error' => $error, - ); - return $returnArray; - } -} diff --git a/modules/notes/css/module.css b/modules/notes/css/module.css index a97d7af7c0b..fab06031e8c 100755 --- a/modules/notes/css/module.css +++ b/modules/notes/css/module.css @@ -1,4 +1 @@ /* menu */ - - -/* admin modules board */ diff --git a/modules/notes/js/functions.js b/modules/notes/js/functions.js index 434517a222d..e69de29bb2d 100755 --- a/modules/notes/js/functions.js +++ b/modules/notes/js/functions.js @@ -1,92 +0,0 @@ -function showNotesForm(path, width, height) { - - if(typeof(width)==='undefined'){ - var width = '800'; - } - - - if(typeof(height)==='undefined'){ - height = '480'; - } - - $j.ajax({ - url: path, - type: 'POST', - success: function (answer) { - eval("response = "+answer); - if(response.status == 0){ - var modal_content = convertToTextVisibleNewLine(response.content); - createModal(modal_content, 'form_notes', height, width); - } else { - window.top.$j('main_error').html( response.error); - } - }, - error: function (error) { - alert(error); - } - - }); -} - -function validNotesForm(path, form_id) { - - new Ajax.Request(path, - { - asynchronous:false, - method:'post', - parameters: Form.serialize(form_id), - encoding: 'UTF-8', - onSuccess: function(answer){ - eval("response = "+answer.responseText); - if(response.status == 0){ - if (typeof window.parent['angularSignatureBookComponent'] != "undefined") { - // window.parent.angularSignatureBookComponent.componentAfterNotes(); - } - destroyModal('form_notes'); - var modInfo = $j('<div class="info" id="main_info" onclick="this.remove();">'+response.msg_result+'</div>'); - modInfo.appendTo('body'); - modInfo.css({'display' : 'table-cell'}); - setTimeout(function() { - modInfo.remove(); - }, 5000); - - if(parent.$j('.contentShow iframe').length){ - parent.$j('.contentShow iframe')[0].contentWindow.location.reload(true); - } else { - eval(response.exec_js); - } - } else { - alert(response.error); - } - }, - error: function (error) { - alert(error); - } - - }); -} - -function addTemplateToNote(templateNotes, path) -{ - - $j.ajax({ - url: path, - type: 'POST', - data : {templateId : templateNotes}, - success: function (answer) { - eval("response = "+answer); - if (response.status == 0) { - var strContent = response.content; - var reg = new RegExp(/\\n/gi); - var strContentReplace = strContent.replace(reg, '\n'); - $j('#notes').val($j('#notes').val() + ' ' + strContentReplace) ; - } else { - window.top.$j('main_error').html(response.error); - } - }, - error: function (error) { - alert(error); - } - - }); -} diff --git a/modules/notes/lang/en.php b/modules/notes/lang/en.php index 4426bfbcfa7..3dadb4e0ba4 100755 --- a/modules/notes/lang/en.php +++ b/modules/notes/lang/en.php @@ -33,9 +33,6 @@ if (!defined("_READ")) { if (!defined("_ADDITION_NOTE")) { define("_ADDITION_NOTE", "Note addition"); } -if (!defined("_ADDITION_NOTE_PRIVATE")) { - define("_ADDITION_NOTE_PRIVATE", "Private note addition"); -} if (!defined("_NOTES_ADDED")) { define("_NOTES_ADDED", "Added note"); } @@ -57,21 +54,11 @@ if (!defined("_NOTES_COMMENT")) { if (!defined("_OF")) { define("_OF", "of"); } -if (!defined("_NOTE_DONT_EXIST")) { - define("_NOTE_DONT_EXIST", "This note doesn't exist"); -} -if (!defined("_THIS_NOTE_IS_VISIBLE_BY")) { - define("_THIS_NOTE_IS_VISIBLE_BY", "Limit this note to the following departments (if it's empty, the note is public)"); -} //TEMPLATES FOR NOTES if (!defined("_NOTE_TEMPLATE")) { define("_NOTE_TEMPLATE", "Note template"); } -if (!defined("_SELECT_NOTE_TEMPLATE")) { - define("_SELECT_NOTE_TEMPLATE", "Select a note template"); -} - if (!defined("_NOTE")) { define("_NOTE", "Note"); diff --git a/modules/notes/lang/fr.php b/modules/notes/lang/fr.php index f1fb6144eb2..2438d95690a 100755 --- a/modules/notes/lang/fr.php +++ b/modules/notes/lang/fr.php @@ -33,9 +33,6 @@ if (!defined("_READ")) { if (!defined("_ADDITION_NOTE")) { define("_ADDITION_NOTE", "Ajout d'une annotation"); } -if (!defined("_ADDITION_NOTE_PRIVATE")) { - define("_ADDITION_NOTE_PRIVATE", "Ajout d'une annotation privée"); -} if (!defined("_NOTES_ADDED")) { define("_NOTES_ADDED", "Annotation ajoutée"); } @@ -57,20 +54,11 @@ if (!defined("_NOTES_COMMENT")) { if (!defined("_OF")) { define("_OF", "de"); } -if (!defined("_NOTE_DONT_EXIST")) { - define("_NOTE_DONT_EXIST", "Cette annotation n'existe pas"); -} -if (!defined("_THIS_NOTE_IS_VISIBLE_BY")) { - define("_THIS_NOTE_IS_VISIBLE_BY", "Restreindre cette annotation aux entités suivantes (si vide alors l'annotation est publique)"); -} //TEMPLATES FOR NOTES if (!defined("_NOTE_TEMPLATE")) { define("_NOTE_TEMPLATE", "Modèle d'annotation"); } -if (!defined("_SELECT_NOTE_TEMPLATE")) { - define("_SELECT_NOTE_TEMPLATE", "Sélectionner un modèle d'annotation"); -} if (!defined("_NOTE")) { define("_NOTE", "Annotation"); diff --git a/modules/notes/lang/nl.php b/modules/notes/lang/nl.php index d43551d4d0e..29c08bd7551 100755 --- a/modules/notes/lang/nl.php +++ b/modules/notes/lang/nl.php @@ -19,9 +19,6 @@ if (!defined('_READ')) { if (!defined('_ADDITION_NOTE')) { define('_ADDITION_NOTE', 'Toevoeging van een aantekening'); } -if (!defined('_ADDITION_NOTE_PRIVATE')) { - define('_ADDITION_NOTE_PRIVATE', 'Toevoeging van een privéaantekening'); -} if (!defined('_NOTES_ADDED')) { define('_NOTES_ADDED', 'Toegevoegde aantekening'); } @@ -43,60 +40,12 @@ if (!defined('_NOTES_COMMENT')) { if (!defined('_OF')) { define('_OF', 'van'); } -if (!defined('_NOTE_DONT_EXIST')) { - define('_NOTE_DONT_EXIST', 'Deze aantekening bestaat niet'); -} -if (!defined('_THIS_NOTE_IS_VISIBLE_BY')) { - define('_THIS_NOTE_IS_VISIBLE_BY', 'Deze aantekening beperken tot de volgende eenheden (indien leeg, is de aantekening openbaar)'); -} if (!defined('_NOTE_TEMPLATE')) { define('_NOTE_TEMPLATE', 'Aantekeningmodel'); } -if (!defined('_SELECT_NOTE_TEMPLATE')) { - define('_SELECT_NOTE_TEMPLATE', 'Een aantekeningmodel selecteren'); -} -if (!defined('_RESTRICTED_SERVICES')) { - define('_RESTRICTED_SERVICES', 'Beperkt tot de eenheid (eenheden)'); -} if (!defined('_ADD_NOTE')) { define('_ADD_NOTE', 'Toevoeging van een opmerking'); } -if (!defined('_ADDITION_NOTE')) { - define('_ADDITION_NOTE', 'Toevoeging van een opmerking'); -} -if (!defined('_ADDITION_NOTE_PRIVATE')) { - define('_ADDITION_NOTE_PRIVATE', 'Toevoeging van een privé-opmerking'); -} -if (!defined('_NOTES_ADDED')) { - define('_NOTES_ADDED', 'Opmerking toegevoegd'); -} -if (!defined('_NOTES_DELETED')) { - define('_NOTES_DELETED', 'Opmerking verwijderd'); -} -if (!defined('_NOTES_MODIFIED')) { - define('_NOTES_MODIFIED', 'Opmerking gewijzigd'); -} -if (!defined('_NOTE_UPDATED')) { - define('_NOTE_UPDATED', 'Opmerking gewijzigd'); -} -if (!defined('_NOTES')) { - define('_NOTES', 'Opmerkingen'); -} -if (!defined('_NOTES_COMMENT')) { - define('_NOTES_COMMENT', 'Opmerkingen'); -} -if (!defined('_NOTE_DONT_EXIST')) { - define('_NOTE_DONT_EXIST', 'Deze opmerking bestaat niet'); -} -if (!defined('_THIS_NOTE_IS_VISIBLE_BY')) { - define('_THIS_NOTE_IS_VISIBLE_BY', 'Deze opmerking beperken tot de volgende eenheden (indien leeg, is de opmerking openbaar'); -} -if (!defined('_NOTE_TEMPLATE')) { - define('_NOTE_TEMPLATE', 'Opmerkingsmodel'); -} -if (!defined('_SELECT_NOTE_TEMPLATE')) { - define('_SELECT_NOTE_TEMPLATE', 'Een opmerkingsmodel selecteren'); -} if (!defined('_NOTE')) { define('_NOTE', 'Opmerking'); } diff --git a/modules/notes/load_toolbar_notes.php b/modules/notes/load_toolbar_notes.php deleted file mode 100755 index 21f04a963a1..00000000000 --- a/modules/notes/load_toolbar_notes.php +++ /dev/null @@ -1,52 +0,0 @@ -<?php -$targetTab = $_REQUEST['targetTab']; -$res_id = $_REQUEST['resId']; - -require_once 'modules/notes/class/class_modules_tools.php'; -$notes_tools = new notes(); -//Count notes -$nbr_notes = $notes_tools->countUserNotes($res_id); -if ($nbr_notes == 0){ - $class = 'nbResZero'; - $style2 = 'display:none;'; - $style = '0.5'; - $styleDetail = '#9AA7AB'; -} -else{ - $class = 'nbRes'; - $style = ''; - $style2 = 'display:inherit;'; - $styleDetail = '#666'; -} - -if($_SESSION['req'] == 'details'){ - - if($nbr_notes == 0 && strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')){ - $nav = 'notes_tab'; - $style2 = 'visibility:hidden;'; - - } - - if($_REQUEST['origin'] == 'parent'){ - $js .= 'parent.$(\''.$targetTab.'\').style.color=\''.$styleDetail.'\';parent.$(\''.$targetTab.'_badge\').innerHTML = \'<span id="nb_'.$targetTab.'" style="'.$style2.'font-size: 10px;" class="'.$class.'">'.$nbr_notes.'</span>\''; - - }else { - - $js .= '$(\''.$targetTab.'\').style.color=\''.$styleDetail.'\';$(\''.$targetTab.'_badge\').innerHTML = \'<span id="nb_'.$targetTab.'" style="'.$style2.'font-size: 10px;" class="'.$class.'">'.$nbr_notes.'</span>\''; - - } -}else{ - if($_REQUEST['origin'] == 'parent'){ - $js .= 'parent.$(\''.$targetTab.'_img\').style.opacity=\''.$style.'\';parent.$(\''.$targetTab.'_badge\').innerHTML = \' <sup><span id="nb_'.$targetTab.'" style="'.$style2.'" class="'.$class.'">'.$nbr_notes.'</span></sup>\''; - - }else { - $js .= '$(\''.$targetTab.'_img\').style.opacity=\''.$style.'\';$(\''.$targetTab.'_badge\').innerHTML = \' <sup><span id="nb_'.$targetTab.'" style="'.$style2.'" class="'.$class.'">'.$nbr_notes.'</span></sup>\''; - - } -} - -//echo '{status : 0, nav : "'.$nav.'",content : "", error : "", exec_js : "'.addslashes($js).'"}'; -//echo "{status : 0, nav : '".$nav."',content : '', error : '', exec_js : '".addslashes($js)."'}"; -//echo '{"status" : 0, "nav" : "'.$nav.'","content" : "", "error" : "", "exec_js" : "'.addslashes($js).'"}'; -echo "{status : 0, nav : '".$nav."',content : '', error : '', exec_js : '".addslashes($js)."'}"; -exit (); \ No newline at end of file diff --git a/modules/notes/note_details.php b/modules/notes/note_details.php deleted file mode 100755 index 25e022f1486..00000000000 --- a/modules/notes/note_details.php +++ /dev/null @@ -1,360 +0,0 @@ -<?php -/** -* File : notes_details.php -* -* Popup to show the notes -* -* @package Maarch LetterBox 2.3 -* @version 1.0 -* @since 06/2007 -* @license GPL -* @author Claire Figueras <dev@maarch.org> -*/ -require_once "core/class/class_security.php"; -require_once "core/class/class_request.php"; -require_once "core/class/class_history.php"; -require_once "modules/entities/class/EntityControler.php"; -require_once 'core/core_tables.php'; -require_once 'modules/notes/notes_tables.php'; -require_once "modules" . DIRECTORY_SEPARATOR . "notes" . DIRECTORY_SEPARATOR - . "class" . DIRECTORY_SEPARATOR - . "class_modules_tools.php"; -$core = new core_tools(); -$core->load_lang(); -$sec = new security(); -$req = new request(); -$ent = new EntityControler(); -$notes_mod_tools = new notes; -$func = new functions(); -$db = new Database(); -$table = ''; -$collId = ""; -$user = ''; -$text = ""; -$userId = ''; -$date = ""; -$identifier = ''; -if (empty($_SESSION['collection_id_choice'])) { - $_SESSION['collection_id_choice'] = $_SESSION['user']['collections'][0]; - $collId = $_SESSION['collection_id_choice'] ; -} else if (isset($_REQUEST['coll_id'])&& empty($collId)) { - $collId = $_REQUEST['coll_id']; -} -$view = $sec->retrieve_view_from_coll_id($collId); -$table = $sec->retrieve_table_from_coll($collId); - -$error = ''; -if (isset($_REQUEST['modify'])) { - $id = $_REQUEST['id']; - $identifier = $_REQUEST['identifier']; - $table = $_REQUEST['table']; - $collId = $_REQUEST['coll_id']; - - if (empty($_REQUEST['notes'])) { - $error = _NOTES . ' ' . _EMPTY; - } else if (empty($error)) { - $text = $_REQUEST['notes']; - $db->query( - "UPDATE ".NOTES_TABLE." SET note_text = ?, creation_date = CURRENT_TIMESTAMP WHERE id = ?", - array($text, $id) - ); - - echo "<pre>"; - //print_r($_REQUEST['entities_chosen']); - //print_r($_SESSION['notes']['entities']); - echo "</pre>"; - - if (isset($_REQUEST['entities_chosen']) && !empty($_REQUEST['entities_chosen'])) - { - for ($i=0; $i<count($_REQUEST['entities_chosen']); $i++) - { - $stmt = $db->query( - "SELECT id FROM " .NOTE_ENTITIES_TABLE. " WHERE item_id = ? and note_id = ?", - array($_REQUEST['entities_chosen'][$i], $id) - ); - $result = $stmt->fetchObject(); - $note_entity_id = $result->id; - - if ($stmt->rowCount() == 0) - { - $db->query( - "INSERT INTO " . NOTE_ENTITIES_TABLE . "(note_id, item_id) VALUES" - . " (?, ?)", - array($id, $_REQUEST['entities_chosen'][$i]) - ); - } - else - { - $db->query( - "UPDATE ".NOTE_ENTITIES_TABLE." SET item_id = ? WHERE id = ?", - array($_REQUEST['entities_chosen'][$i], $note_entity_id) - ); - } - - } - } - elseif (empty($_REQUEST['entities_chosen'])) - { - $db->query( - "DELETE FROM " . NOTE_ENTITIES_TABLE . " where note_id = ?", - array($id) - ); - } - if ($_SESSION['history']['noteup']) { - $hist = new history(); - $hist->add( - NOTES_TABLE, $id , "UP", 'noteup', _NOTE_UPDATED . ' (' . $id . ')', - $_SESSION['config']['databasetype'], 'notes' - ); - if ($_SESSION['origin'] == "show_folder" ) { - $hist->add( - $table, $identifier, "UP", 'noteup', _NOTE_UPDATED . _ON_FOLDER_NUM - . $identifier . ' (' . $id . ')', - $_SESSION['config']['databasetype'], 'notes' - ); - } else { - $hist->add( - $view, $identifier, "UP", 'noteup', _NOTE_UPDATED . _ON_DOC_NUM - . $identifier . ' (' . $id . ')', - $_SESSION['config']['databasetype'], 'notes' - ); - } - } - //$_SESSION['error'] = _NOTES_MODIFIED; - ?> - <script type="text/javascript">window.opener.location.reload();self.close();</script> - <?php - exit(); - } - -} -if (isset($_REQUEST['delete'])) { - $id = $_REQUEST['id']; - $identifier = $_REQUEST['identifier']; - - $db->query("DELETE FROM " . NOTE_ENTITIES_TABLE . " WHERE note_id = ?", array($id)); - $db->query("DELETE FROM " . NOTES_TABLE . " WHERE id = ?", array($id)); - - if ($_SESSION['history']['notedel']) { - $hist = new history(); - $hist->add( - NOTES_TABLE, $id, "DEL", 'notedel', _NOTES_DELETED . ' (' . $id . ')', - $_SESSION['config']['databasetype'], 'notes' - ); - if ($_SESSION['origin'] == "show_folder" ) { - $hist->add( - $table, $identifier, "DEL", 'notedel', _NOTES_DELETED . _ON_FOLDER_NUM - . $identifier . ' (' . $id . ')', - $_SESSION['config']['databasetype'], 'notes' - ); - } else { - $hist->add( - $view, $identifier, "DEL", 'notedel', _NOTES_DELETED . _ON_DOC_NUM - . $identifier . ' (' . $id . ')', - $_SESSION['config']['databasetype'], 'notes' - ); - } - } - //$_SESSION['error'] = _NOTES_DELETED; - ?> - <script type="text/javascript">window.opener.location.reload();self.close();</script> - <?php - exit(); -} - -if (isset($_REQUEST['id'])) { - $sId = $_REQUEST['id']; -} else { - $sId = ""; -} -if (isset($_REQUEST['identifier'])) { - $identifier = $_REQUEST['identifier']; -} -if (isset($_REQUEST['table']) && empty($table)) { - $table = $_REQUEST['table']; -} -if (isset($_REQUEST['coll_id']) && empty($collId)) { - $collId = $_REQUEST['coll_id']; -} - -$core->load_html(); -//here we building the header -$core->load_header(_NOTES); -$time = $core->get_session_time_expire(); -?> -<body id="pop_up" onload="setTimeout(window.close, <?php echo $time;?>*60*1000);"> -<?php -if (empty($table) && empty($collId)) { - $error = _PB_TABLE_COLL; -} else { - - $stmt = $db->query( - "SELECT n.identifier, n.creation_date, n.user_id, n.note_text, u.lastname, " - . "u.firstname FROM " . NOTES_TABLE . " n inner join ". USERS_TABLE - . " u on n.user_id = u.user_id WHERE n.id = :sId ", [":sId" => $sId] - ); - - $line = $stmt->fetchObject(); - $user = $func->show_string($line->lastname . " " . $line->firstname); - $text = $func->show_string($line->note_text); - $userId = $line->user_id; - $date = $line->creation_date; - $identifier = $line->identifier; -} - -$canModify = false; -if (trim($userId) == $_SESSION['user']['UserId']) { - $canModify = true; -} -?> -<div class="error"><?php -echo $error; -$error = ''; -?></div> -<h2 class="tit" style="padding:10px;"><?php echo _NOTES;?> </h2> - <h2 class="sstit" style="padding:10px;"><?php -echo _NOTES . " " . _OF . " " . $user . " (" . $core->format_date_db($date, false, '', true) . ") "; -?></h2> - - <div class="block" style="padding:10px"> - <form name="form1" method="post" class="forms" action="<?php -echo $_SESSION['config']['businessappurl'] . "index.php?display=true" - . "&module=notes&page=note_details"; -?>"> - <input type="hidden" name="display" value="true" /> - <input type="hidden" name="modules" value="notes" /> - <input type="hidden" name="page" value="note_details" /> - <textarea <?php -if (! $canModify) { - ?>readonly="readonly" class="readonly" <?php -} -?>style="width:380px" cols="70" rows="10" name="notes" id="notes"><?php -functions::xecho($text); -?></textarea> - - <input type="hidden" name="id" id="id" value="<?php functions::xecho($sId);?>"/> - <input type="hidden" name="identifier" id="identifier" value="<?php -functions::xecho($identifier); -?>"/> - <input type="hidden" name="table" id="table" value="<?php -functions::xecho($table); -?>"/> - <input type="hidden" name="coll_id" id="coll_id" value="<?php -functions::xecho($collId); -?>"/> - <br/> - <p class="buttons"> - <?php -if ($canModify) { - ?> - <input type="submit" name="modify" id="modify" value="<?php - echo _MODIFY; - ?>" class="button"/> - <input type="submit" name="delete" id="delete" value="<?php - echo _DELETE; - ?>" class="button"/> - <?php -} -?> - <input type="button" name="close_button" value="<?php -echo _CLOSE_WINDOW; -?>" onclick="javascript:self.close();" class="button"/> - </p> - <?php - -if ($canModify) { - ?> - <div> - <h3 class="sstit" style="color: red"><?php echo _THIS_NOTE_IS_VISIBLE_BY;?></h3> - </div> - <table> - <tr> - <td> - <div id="config_entities" class ="scrollbox" style=" width: 700px; margin-left:auto; margin-right: auto; height:140px; border: 1px solid #999;"> - <table align="center" width="100%" id="template_entities" > - <tr> - <td width="10%" align="center"> - <?php - $notesEntities = array(); - $entitiesList = array(); - $_SESSION['notes']['entities'] = array(); - $_SESSION['notes']['entities'] = $notes_mod_tools->getNotesEntities($sId); - //$notesEntities = $notes_mod_tools->getNotesEntities($sId); - $entitiesList = $ent->getAllEntities(); - echo "<pre>"; - echo "</pre>"; - if ($canModify) { - ?> - <select name="entitieslist[]" id="entitieslist" size="7" - ondblclick='moveclick($(entitieslist), $(entities_chosen));' multiple="multiple" > - <?php - - for ($j=0;$j<count($entitiesList);$j++) { - $state_entity = false; - - if (in_array($entitiesList[$j], $_SESSION['notes']['entities'])) { - $state_entity = true; - } else { - $state_entity = false; - } - - if ($state_entity == false) { - ?> - <option value="<?php - echo $entitiesList[$j]->entity_id; - ?>"><?php - echo $entitiesList[$j]->entity_label; - ?></option> - <?php - } - } - ?> - </select> - <br/> - </td> - <td width="10%" align="center"> - <input type="button" class="button" value="<?php - echo _ADD; - ?> >>" onclick='Move($(entitieslist), $(entities_chosen));' /> - <br /> - <br /> - <input type="button" class="button" value="<< <?php - echo _REMOVE; - ?>" onclick='Move($(entities_chosen), $(entitieslist));' /> - </td> - <?php -} -?> - <td width="10%" align="center"> - <select name="entities_chosen[]" id="entities_chosen" size="7" - ondblclick='moveclick($(entities_chosen), $(entitieslist));' multiple="multiple"> - <?php - for ($i=0;$i<count($_SESSION['notes']['entities']);$i++) { - $state_entity = false; - if ($state_entity == false) { - ?> - <option value="<?php - echo $_SESSION['notes']['entities'][$i]->entity_id; - ?>" selected="selected" ><?php - echo $_SESSION['notes']['entities'][$i]->entity_label; - ?></option> - <?php - } - } - ?> - </select> - </td> - </tr> - </table> - </div> - </td> - </tr> - </table> - <?php - } - ?> - </form> - </div> - <div class="block_end"> </div> -</body> -</html> diff --git a/modules/notes/notes.php b/modules/notes/notes.php deleted file mode 100755 index 03b859e38dc..00000000000 --- a/modules/notes/notes.php +++ /dev/null @@ -1,324 +0,0 @@ -<?php -/** -* Copyright Maarch since 2008 under licence GPLv3. -* See LICENCE.txt file at the root folder for more details. -* This file is part of Maarch software. -* -*/ - -/** -* @brief notes -* @author <dev@maarch.org> -* @ingroup notes -*/ - -require_once "core".DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_request.php"; -require_once "apps".DIRECTORY_SEPARATOR.$_SESSION['config']['app_id'].DIRECTORY_SEPARATOR - ."class".DIRECTORY_SEPARATOR."class_lists.php"; -require_once "modules".DIRECTORY_SEPARATOR."notes".DIRECTORY_SEPARATOR."notes_tables.php"; -require_once "modules" . DIRECTORY_SEPARATOR . "notes" . DIRECTORY_SEPARATOR - . "class" . DIRECTORY_SEPARATOR - . "class_modules_tools.php"; - -$core_tools = new core_tools(); -$request = new request(); -$list = new lists(); -$notes_tools = new notes(); - -$identifier = ''; -$origin = ''; -$parameters = ''; - -//Collection ID -if (isset($_REQUEST['coll_id']) && !empty($_REQUEST['coll_id'])) { - $parameters = "&coll_id=".$_REQUEST['coll_id']; -} - -//Identifier -if (isset($_REQUEST['identifier']) && !empty($_REQUEST['identifier'])) { - $identifier = $_REQUEST['identifier']; -} else { - echo '<span class="error">'._IDENTIFIER.' '._IS_EMPTY.'</span>'; - exit(); -} - -//Origin -if (isset($_REQUEST['origin']) && !empty($_REQUEST['origin'])) { - $origin = $_REQUEST['origin']; -} - -if (empty($origin)) { - $user = \User\models\UserModel::getByLogin(['login' => $_SESSION['user']['UserId'], 'select' => ['id']]); - $right = \Resource\controllers\ResController::hasRightByResId(['resId' => [$identifier], 'userId' => $user['id']]); - if (!$right) { - exit(_NO_RIGHT_TXT); - } -} - -//Extra parameters -if (isset($_REQUEST['size']) && !empty($_REQUEST['size'])) { - $parameters .= '&size='.$_REQUEST['size']; -} -if (isset($_REQUEST['order']) && !empty($_REQUEST['order'])) { - $parameters .= '&order='.$_REQUEST['order']; -} -if (isset($_REQUEST['order_field']) && !empty($_REQUEST['order_field'])) { - $parameters .= '&order_field='.$_REQUEST['order_field']; -} -if (isset($_REQUEST['what']) && !empty($_REQUEST['what'])) { - $parameters .= '&what='.$_REQUEST['what']; -} - -if (isset($_REQUEST['load'])) { - $core_tools->load_lang(); - $core_tools->load_html(); - $core_tools->load_header('', true, false); ?> - -<body><?php - $core_tools->load_js(); - - //Load list - if (!empty($identifier) && !empty($origin)) { - $target = $_SESSION['config']['businessappurl'] - .'index.php?module=notes&page=notes&identifier=' - .$identifier.'&origin='.$origin.$parameters; - - $listContent = $list->loadList($target); - echo $listContent; - } else { - echo '<span class="error">'._ERROR_IN_PARAMETERS.'</span>'; - } ?> - <div id="container" style="width:100%;min-height:0px;height:0px;"></div> -</body> - -</html><?php -} else { - //If size is full change some parameters - if (isset($_REQUEST['size']) - && ($_REQUEST['size'] == "full") - ) { - $sizeUser = "10"; - $sizeText = "40"; - $css = "listing spec"; - $cutString = 150; - } elseif (isset($_REQUEST['size']) - && ($_REQUEST['size'] == "medium") - ) { - $sizeUser = "15"; - $sizeText = "30"; - $css = "listingsmall"; - $cutString = 100; - } else { - $sizeUser = "10"; - $sizeText = "10"; - $css = "listingsmall"; - $cutString = 20; - } - - //Table or view - $select[NOTES_TABLE] = array(); //Notes - $select[USERS_TABLE] = array(); //Users - - //Fields - array_push($select[NOTES_TABLE], "id", "identifier", "creation_date", "user_id", "note_text", "note_text as note_short"); //Notes - array_push($select[USERS_TABLE], "user_id", "lastname || ' ' || firstname as user", "lastname as visibleBy"); //Users - - //Where clause - $where_tab = array(); - - $rawUserEntities = \Entity\models\EntityModel::getByLogin(['login' => $_SESSION['user']['UserId'], 'select' => ['entity_id']]); - $userEntities = array_column($rawUserEntities, 'entity_id'); - $userEntities = !empty($userEntities) ? $userEntities : ['']; - - $db = new Database(); - $stmt3 = $db->query("SELECT id FROM USERS WHERE user_id = ?", array($_SESSION['user']['UserId'])); - $userInfo = $stmt3->fetchObject(); - - $where_tab[] = "identifier = ?"; - $where_tab[] = "type = ?"; - $where_tab[] = "notes.id in (select notes.id from notes left join note_entities on notes.id = note_entities.note_id where item_id IS NULL OR item_id in (?) or notes.user_id = ".$userInfo->id.")"; - $arrayPDO = array($identifier); - $arrayPDO[] = 'resource'; - $arrayPDO[] = $userEntities; - - //Build where - $where = implode(' and ', $where_tab); - - //Order - $order = $order_field = ''; - $order = $list->getOrder(); - $order_field = $list->getOrderField(); - if (!empty($order_field) && !empty($order)) { - $orderstr = "order by ".$order_field." ".$order; - } else { - $list->setOrder(); - $list->setOrderField('creation_date'); - $orderstr = "order by creation_date desc"; - } - - if (isset($_REQUEST['start']) && !empty($_REQUEST['start'])) { - $parameters .= '&start='.$_REQUEST['start']; - $start = $_REQUEST['start']; - } else { - $start = $list->getStart(); - $parameters .= '&start='.$start; - } - - //Request - // $tabNotes=$request->PDOselect( - // $select, - // $where, - // $arrayPDO, - // $orderstr, - // $_SESSION['config']['databasetype'], - // "default", - // true, - // NOTES_TABLE, - // USERS_TABLE, - // "user_id", - // true, - // false, - // false, - // $start - // ); - - // $request->show_array($tabNotes); - for ($indNotes1 = 0; $indNotes1 < count($tabNotes); $indNotes1 ++) { - for ($indNotes2 = 0; $indNotes2 < count($tabNotes[$indNotes1]); $indNotes2 ++) { - foreach (array_keys($tabNotes[$indNotes1][$indNotes2]) as $value) { - if ($tabNotes[$indNotes1][$indNotes2][$value] == "id") { - $tabNotes[$indNotes1][$indNotes2]["id"] = $tabNotes[$indNotes1][$indNotes2]['value']; - $tabNotes[$indNotes1][$indNotes2]["label"] = 'ID'; - $tabNotes[$indNotes1][$indNotes2]["size"] = 1; - $tabNotes[$indNotes1][$indNotes2]["label_align"] = "left"; - $tabNotes[$indNotes1][$indNotes2]["align"] = "left"; - $tabNotes[$indNotes1][$indNotes2]["valign"] = "bottom"; - $tabNotes[$indNotes1][$indNotes2]["show"] = false; - $tabNotes[$indNotes1][$indNotes2]["order"] = "id"; - $indNotes1d = $tabNotes[$indNotes1][$indNotes2]['value']; - } - if ($tabNotes[$indNotes1][$indNotes2][$value] == "user_id") { - $tabNotes[$indNotes1][$indNotes2]["user_id"] = $tabNotes[$indNotes1][$indNotes2]['value']; - $tabNotes[$indNotes1][$indNotes2]["label"] = _ID; - $tabNotes[$indNotes1][$indNotes2]["size"] = 5; - $tabNotes[$indNotes1][$indNotes2]["label_align"] = "left"; - $tabNotes[$indNotes1][$indNotes2]["align"] = "left"; - $tabNotes[$indNotes1][$indNotes2]["valign"] = "bottom"; - $tabNotes[$indNotes1][$indNotes2]["show"] = false; - $tabNotes[$indNotes1][$indNotes2]["order"] = "user_id"; - } - - if ($tabNotes[$indNotes1][$indNotes2][$value] == "creation_date") { - $tabNotes[$indNotes1][$indNotes2]["creation_date"] = $tabNotes[$indNotes1][$indNotes2]['value']; - $tabNotes[$indNotes1][$indNotes2]["value"] = $core_tools->format_date_db($tabNotes[$indNotes1][$indNotes2]['value'], false, '', true); - $tabNotes[$indNotes1][$indNotes2]["label"] = _DATE; - $tabNotes[$indNotes1][$indNotes2]["size"] = 10; - $tabNotes[$indNotes1][$indNotes2]["label_align"] = "left"; - $tabNotes[$indNotes1][$indNotes2]["align"] = "left"; - $tabNotes[$indNotes1][$indNotes2]["valign"] = "bottom"; - $tabNotes[$indNotes1][$indNotes2]["show"] = true; - $tabNotes[$indNotes1][$indNotes2]["order"] = "creation_date"; - } - if ($tabNotes[$indNotes1][$indNotes2][$value] == "user") { - $tabNotes[$indNotes1][$indNotes2]["user"] = $tabNotes[$indNotes1][$indNotes2]['value']; - $tabNotes[$indNotes1][$indNotes2]["label"] = _USER; - $tabNotes[$indNotes1][$indNotes2]["size"] = 10; - $tabNotes[$indNotes1][$indNotes2]["label_align"] = "left"; - $tabNotes[$indNotes1][$indNotes2]["align"] = "left"; - $tabNotes[$indNotes1][$indNotes2]["valign"] = "bottom"; - $tabNotes[$indNotes1][$indNotes2]["show"] = true; - $tabNotes[$indNotes1][$indNotes2]["order"] = "lastname"; - } - if ($tabNotes[$indNotes1][$indNotes2][$value] == "note_text") { - //$tabNotes[$indNotes1][$indNotes2]["note_text"] = $tabNotes[$indNotes1][$indNotes2]['value']; - $tabNotes[$indNotes1][$indNotes2]["note_text"] = $request->cut_string($request->show_string($tabNotes[$indNotes1][$indNotes2]['value']), $cutString); - $tabNotes[$indNotes1][$indNotes2]["label"] = _NOTES; - $tabNotes[$indNotes1][$indNotes2]["size"] = 60; - $tabNotes[$indNotes1][$indNotes2]["label_align"] = "left"; - $tabNotes[$indNotes1][$indNotes2]["align"] = "left"; - $tabNotes[$indNotes1][$indNotes2]["valign"] = "bottom"; - $tabNotes[$indNotes1][$indNotes2]["show"] = true; - $tabNotes[$indNotes1][$indNotes2]["order"] = "note_text"; - } - - if ($tabNotes[$indNotes1][$indNotes2][$value] == "visibleby") { - $noteEntities = $notes_tools->getNotesEntities($indNotes1d); - $tabEntityLabel = []; - $tabEntityId = []; - $allEntities = ''; - $allEntitiesId = ''; - - foreach ($noteEntities as $value) { - $tabEntityLabel[] = $value->short_label; - $tabEntityId[] = $value->entity_id; - } - - if (!empty($tabEntityLabel)) { - $allEntities = implode(' - ', $tabEntityLabel); - if (count($tabEntityId) > 3) { - $allEntitiesId = $tabEntityId[0] .'<br/>'.$tabEntityId[1].'<br/>'.$tabEntityId[2].'<br/>...'; - } else { - $allEntitiesId = implode('<br/>', $tabEntityId); - } - } - - - $tabNotes[$indNotes1][$indNotes2]['value'] = '<div style="cursor:pointer;text-overflow: ellipsis;clear:both;white-space: nowrap;overflow: hidden;"><i title="'.$allEntities.'" >'.$allEntitiesId.'</i></div>'; - $tabNotes[$indNotes1][$indNotes2]["label"] = _VISIBLEBY; - $tabNotes[$indNotes1][$indNotes2]["size"] = 10; - $tabNotes[$indNotes1][$indNotes2]["label_align"] = "left"; - $tabNotes[$indNotes1][$indNotes2]["align"] = "left"; - $tabNotes[$indNotes1][$indNotes2]["valign"] = "bottom"; - $tabNotes[$indNotes1][$indNotes2]["show"] = true; - } - } - } - } - - //List - $listKey = 'id'; //Clé de la liste - $paramsTab = array(); //Initialiser le tableau de paramètres - $paramsTab['bool_sortColumn'] = true; //Affichage Tri - $paramsTab['pageTitle'] =''; //Titre de la page - $paramsTab['bool_bigPageTitle'] = false; //Affichage du titre en grand - $paramsTab['urlParameters'] = 'identifier='.$identifier - ."&origin=".$origin.'&display=true'.$parameters; //Parametres d'url supplementaires - $paramsTab['filters'] = array(); //Filtres - $paramsTab['listHeight'] = '100%'; //Hauteur de la liste - $paramsTab['start'] = $start; - $paramsTab['listCss'] = $css; //CSS - $paramsTab['tools'] = array(); //Icones dans la barre d'outils - - $add = array( - "script" => "showNotesForm('".$_SESSION['config']['businessappurl'] - . "index.php?display=true&module=notes&page=notes_ajax_content" - . "&mode=add&identifier=".$identifier."&origin=".$origin - . $parameters."')", - "icon" => 'pencil-alt', - "tooltip" => _ADD_NOTE, - "alwaysVisible" => true - ); - array_push($paramsTab['tools'], $add); - - //Action icons array - $paramsTab['actionIcons'] = array(); - - $read = array( - "script" => "showNotesForm('".$_SESSION['config']['businessappurl'] - ."index.php?display=true&module=notes&page=notes_ajax_content" - ."&mode=up&id=@@id@@&identifier=".$identifier."&origin=".$origin - . $parameters."');", - "class" => "read", - "icon" => "pencil-alt", - // "label" => _UPDATE.'/'._DELETE, - "tooltip" => _UPDATE.'/'._DELETION, - "disabledRules" => "@@user_id@@ != '".$_SESSION['user']['UserId']."'" - ); - array_push($paramsTab['actionIcons'], $read); - - //Output - $status = 0; - $content = $list->showList($tabNotes, $paramsTab, $listKey); - - echo "{status : " . $status . ", content : '" . addslashes($debug.$content) . "', error : '" . addslashes($error) . "'}"; - } diff --git a/modules/notes/notes_ajax_content.php b/modules/notes/notes_ajax_content.php deleted file mode 100755 index 4750096086f..00000000000 --- a/modules/notes/notes_ajax_content.php +++ /dev/null @@ -1,540 +0,0 @@ -<?php -/* -* -* Copyright 2012 Maarch -* -* This file is part of Maarch Framework. -* -* Maarch Framework is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Maarch Framework is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. -*/ - -/** -* @brief Script to return ajax result -* -* @file notes_ajax_content.php -* @author Yves Christian Kpakpo <dev@maarch.org> -* @date $date$ -* @version $Revision$ -* @ingroup notes -*/ - -require_once "core".DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_request.php"; -require_once "modules".DIRECTORY_SEPARATOR."entities" - .DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."EntityControler.php"; -require_once "apps".DIRECTORY_SEPARATOR.$_SESSION['config']['app_id'].DIRECTORY_SEPARATOR - ."class".DIRECTORY_SEPARATOR."class_lists.php"; -require_once 'modules/notes/notes_tables.php'; -require_once "modules" . DIRECTORY_SEPARATOR . "notes" . DIRECTORY_SEPARATOR - . "class" . DIRECTORY_SEPARATOR . "class_modules_tools.php"; - -$core_tools = new core_tools(); -$request = new request(); -$db = new Database(); -$sec = new security(); -$ent = new EntityControler(); -$notesTools = new notes(); -$list = new lists(); - -$destination = ''; - -function _parse($text) { - //... - $text = str_replace("\r\n", "\n", $text); - $text = str_replace("\r", "\n", $text); - - // - $text = str_replace("\n", "\\n ", $text); - return $text; -} - -$core_tools->load_lang(); - -$status = 0; -$error = $content = $js = $parameters = ''; - -$labels_array = array(); - -if (isset($_REQUEST['mode']) && !empty($_REQUEST['mode'])) { - $mode = $_REQUEST['mode']; -} else { - $error = _ERROR_IN_NOTES_FORM_GENERATION; - $status = 1; -} - -//Identifier of the element wich is noted -$identifier = ''; -if (isset($_REQUEST['identifier']) && ! empty($_REQUEST['identifier'])) { - $identifier = trim($_REQUEST['identifier']); -} - -//Collection -if (isset($_REQUEST['coll_id']) && ! empty($_REQUEST['coll_id'])) { - $collId = trim($_REQUEST['coll_id']); - $parameters .= '&coll_id='.$_REQUEST['coll_id']; - $view = $sec->retrieve_view_from_coll_id($collId); - $table = $sec->retrieve_table_from_coll($collId); - //retrieve the process entity of document - $stmt = $db->query( - "SELECT destination FROM " . $table . " WHERE res_id = ?", array($identifier) - ); - $resultDest = $stmt->fetchObject(); - $destination = $resultDest->destination; -} - -//Keep some origin parameters -if (isset($_REQUEST['size']) && !empty($_REQUEST['size'])) $parameters .= '&size='.$_REQUEST['size']; -if (isset($_REQUEST['order']) && !empty($_REQUEST['order'])) { - $parameters .= '&order='.$_REQUEST['order']; - if (isset($_REQUEST['order_field']) && !empty($_REQUEST['order_field'])) $parameters .= '&order_field='.$_REQUEST['order_field']; -} -if (isset($_REQUEST['what']) && !empty($_REQUEST['what'])) $parameters .= '&what='.$_REQUEST['what']; -if (isset($_REQUEST['template']) && !empty($_REQUEST['template'])) $parameters .= '&template='.$_REQUEST['template']; -if (isset($_REQUEST['start']) && !empty($_REQUEST['start'])) $parameters .= '&start='.$_REQUEST['start']; - -//Keep the origin to reload the origin list -$list_origin = $origin = ''; -if (isset($_REQUEST['origin']) && !empty($_REQUEST['origin'])) { - // - $origin = $_REQUEST['origin']; - - if ($_REQUEST['origin'] == "document") { - //From document - $list_origin = "loadList('".$_SESSION['config']['businessappurl'] - ."index.php?display=true&module=notes&page=notes&identifier=" - .$identifier."&origin=document".$parameters."', 'divList', true);"; - } -} - -//Path to actual script -$path_to_script = $_SESSION['config']['businessappurl'] - ."index.php?display=true&module=notes&page=notes_ajax_content&identifier=" - .$identifier."&origin=".$origin.$parameters; - -require 'modules/templates/class/templates_controler.php'; -$templatesControler = new templates_controler(); -$templates = array(); -if ($destination <> '') { - $templates = $templatesControler->getAllTemplatesForProcess($destination); -} else { - $templates = $templatesControler->getAllTemplatesForSelect(); -} -switch ($mode) { - case 'add': - if (empty($identifier)) { - $error = $request->wash_html(_IDENTIFIER.' '._IS_EMPTY.'!','NONE'); - $status = 1; - } else { - $entitiesList = array(); - $entitiesList = $ent->getAllEntities(); - $content .= '<div class="block">'; - $content .= '<form name="formNotes" id="formNotes" method="post" action="#">'; - $content .= '<input type="hidden" value="'.$identifier.'" name="identifier" id="identifier">'; - $content .= '<h2>'._ADD_NOTE.'</h2>'; - $content .= '<label for="templateNotes">' . _NOTE_TEMPLATE .' : </label>'; - $content .= '<select name="templateNotes" id="templateNotes" style="width:250px" ' - . 'onchange="addTemplateToNote($(\'templateNotes\').value, \'' - . $_SESSION['config']['businessappurl'] . 'index.php?display=true' - . '&module=templates&page=templates_ajax_content_for_notes\');">'; - $content .= '<option value="">' . _SELECT_NOTE_TEMPLATE . '</option>'; - for ($i=0;$i<count($templates);$i++) { - if ($templates[$i]['TYPE'] == 'TXT' && ($templates[$i]['TARGET'] == 'notes' || $templates[$i]['TARGET'] == '')) { - $content .= '<option value="'; - $content .= $templates[$i]['ID']; - $content .= '">'; - $content .= $templates[$i]['LABEL']; - } - $content .= '</option>'; - } - $content .= '</select><br />'; - $content .= '<textarea style="width:500px" cols="70" rows="10" name="notes" id="notes" ></textarea>'; - $content .= '<h3 class="sstit" style="color: red">'._THIS_NOTE_IS_VISIBLE_BY.'</h3>'; - $content .= '<table align="center" width="100%" id="template_entities">'; - $content .= '<tr><td width="20%" align="center">'; - $content .= '<select name="entitieslist[]" id="entitieslist" size="7" style="width: 206px" '; - $content .= 'ondblclick=\'moveclick($(entitieslist), $(entities_chosen));\' multiple="multiple">'; - $entitiesForRestriction = null; - if (!empty($_SESSION['user']['entities'])) { - foreach ($_SESSION['user']['entities'] as $tmpEntity) { - //if($tmpEntity['ENTITY_ID'] == $_SESSION['user']['primaryentity']['id']){ - $entitiesForRestriction[] = $tmpEntity['ENTITY_ID']; - //} - } - } - $entitiesForRestriction[] = $destination; - for ($i=0;$i<count($entitiesList);$i++) { - if ($entitiesForRestriction && in_array($entitiesList[$i]->entity_id, $entitiesForRestriction)) { - $state_entity = true; - } else { - $state_entity = false; - } - - if ($state_entity == false) { - $content .= '<option value="' - .$entitiesList[$i]->entity_id.'" alt="' - .functions::xssafe($entitiesList[$i]->short_label).'" title="' - .functions::xssafe($entitiesList[$i]->short_label).'">' - .functions::xssafe($entitiesList[$i]->short_label).'</option>'; - } - } - $content .= '</select><br/> </td>'; - $content .= '<td width="20%" align="center">'; - $content .= '<input type="button" class="button" value="'._ADD.' >>" onclick=\'Move($(entitieslist), $(entities_chosen));\' />'; - $content .= '<br /><br />'; - $content .= '<input type="button" class="button" value="<< '._REMOVE.'" onclick=\'Move($(entities_chosen), $(entitieslist));\' />'; - $content .= '</td>'; - $content .= '<td width="30%" align="center">'; - $content .= '<select name="entities_chosen[]" id="entities_chosen" size="7" style="width: 206px" '; - $content .= 'ondblclick=\'moveclick($(entities_chosen), $(entitieslist));\' multiple="multiple">'; - for ($i=0;$i<count($entitiesList);$i++) { - $state_entity = false; - if ($state_entity == true || ($entitiesForRestriction && in_array($entitiesList[$i]->entity_id, $entitiesForRestriction))) { - $content .= '<option value="' - .$entitiesList[$i]->entity_id.'" alt="' - .functions::xssafe($entitiesList[$i]->short_label).'" title="' - .functions::xssafe($entitiesList[$i]->short_label).'" selected="selected">' - .functions::xssafe($entitiesList[$i]->short_label).'</option>'; - } - } - $content .= '</select></td>'; - $content .= '</tr></table>'; - // Buttons - $content .='<hr />'; - $content .='<div align="center">'; - $content .=' <input type="button" name="valid" value=" '._VALIDATE - .' " id="valid" class="button" onclick="' - .'selectall($(\'entities_chosen\'));validNotesForm(\'' - .$path_to_script.'&mode=added\', \'formNotes\');" /> '; - $content .='<input type="button" name="cancel" id="cancel" class="button" value="' - ._CANCEL.'" onclick="destroyModal(\'form_notes\');"/>'; - $content .='</div">'; - $content .= '</form>'; - $content .= '</div>'; - } - break; - case 'added': - if (strlen(trim($_REQUEST['notes'])) > 0) { - //Identifier? - if (empty($identifier)) { - $error = $request->wash_html(_IDENTIFIER.' '._IS_EMPTY.'!','NONE'); - $status = 1; - } else { - - //Add notes - $notes = $_REQUEST['notes']; - $userId = $_SESSION['user']['UserId']; - $type = 'resource'; - - $db->query( - "INSERT INTO " . NOTES_TABLE . "(identifier, note_text, creation_date, user_id, type) VALUES (?, ?, CURRENT_TIMESTAMP, ?, ?)", - array($identifier, $notes, $userId, $type) - ); - - //Last insert ID from sequence - $id = $db->lastInsertId('notes_id_seq'); - - //Entities selected - if (!empty($id) && isset($_REQUEST['entities_chosen']) && !empty($_REQUEST['entities_chosen'])) - { - for ($i=0; $i<count($_REQUEST['entities_chosen']); $i++) - { - $db->query( - "INSERT INTO " . NOTE_ENTITIES_TABLE . "(note_id, item_id) VALUES" - . " (?, ?)", - array($id, $_REQUEST['entities_chosen'][$i]) - ); - } - } - - //History - if ($_SESSION['history']['noteadd']) { - $hist = new history(); - - if (isset($_REQUEST['origin']) && $_REQUEST['origin'] == "folder") { - if (!empty($id) && isset($_REQUEST['entities_chosen']) && !empty($_REQUEST['entities_chosen'])){ - - $hist->add( - $table, $identifier, "UP", 'folderup', _ADDITION_NOTE_PRIVATE . _ON_FOLDER_NUM - . $identifier . ' (' . $id . ')', - $_SESSION['config']['databasetype'], 'notes' - ); - }else{ - $hist->add( - $table, $identifier, "UP", 'folderup', _ADDITION_NOTE . _ON_FOLDER_NUM - . $identifier . ' (' . $id . ') : "' . $request->cut_string($notes, 254) .'"', - $_SESSION['config']['databasetype'], 'notes' - ); - } - } else if (isset($_REQUEST['origin']) && $_REQUEST['origin'] == "document") { - if (!empty($id) && isset($_REQUEST['entities_chosen']) && !empty($_REQUEST['entities_chosen'])){ - /*show restricted services*/ - $allEntity = ''; - foreach ($_REQUEST['entities_chosen'] as $value){ - - $allEntity .= $value." | "; - - } - $hist->add( - $table, $identifier, "UP", 'folderup', _ADDITION_NOTE_PRIVATE . _ON_DOC_NUM - . $identifier . ' (' . $id . ')'._VISIBLEBY.' '.$allEntity, - $_SESSION['config']['databasetype'], 'notes' - ); - }else{ - $hist->add( - $view, $identifier, "UP", 'resup', _ADDITION_NOTE . _ON_DOC_NUM - . $identifier . ' (' . $id . ') : "' . $request->cut_string($notes, 254) .'"', - $_SESSION['config']['databasetype'], 'notes' - ); - } - } - - $hist->add( - NOTES_TABLE, $id, "ADD", 'noteadd', _NOTES_ADDED . ' (' . $id . ')', - $_SESSION['config']['databasetype'], 'notes' - ); - } - - //Reload and show message - $js = $list_origin; - $msgResult = _NOTES_ADDED; - //Count notes - $toolbarBagde_script = $_SESSION['config']['businessappurl'] . 'index.php?display=true&module=notes&page=load_toolbar_notes&origin=parent&resId='.$identifier.'&collId='.$collId; - $js .='loadToolbarBadge(\'notes_tab\',\''.$toolbarBagde_script.'\');'; - } - } else { - $error = $request->wash_html(_NOTES.' '._IS_EMPTY.'!','NONE'); - $status = 1; - } - break; - case 'up': - if (isset($_REQUEST['id']) && !empty($_REQUEST['id'])) { - - $id = $_REQUEST['id']; - //Check if ID exists - $stmt = $db->query( - "SELECT n.identifier, n.creation_date, n.user_id, n.note_text, u.lastname, " - . "u.firstname FROM " . NOTES_TABLE . " n inner join ". USERS_TABLE - . " u on n.user_id = u.user_id WHERE n.id = :Id ", [":Id" => $id] - ); - - if($stmt->rowCount() > 0) { - - $line = $stmt->fetchObject(); - - $user = $request->show_string($line->lastname . " " . $line->firstname); - $notes = $line->note_text; - $userId = $line->user_id; - $date = $line->creation_date; - $identifier = $line->identifier; - - $notesEntities = array(); - $entitiesList = array(); - $notesEntities = $notesTools->getNotesEntities($id); - $entitiesList = $ent->getAllEntities(); - //Form - $content .= '<div class="block">'; - $content .= '<form name="formNotes" id="formNotes" method="post" action="#">'; - $content .= '<input type="hidden" value="'.$identifier.'" name="identifier" id="identifier">'; - $content .= '<input type="hidden" value="'.$id.'" name="id" id="id">'; - $content .= '<h2 class="sstit">'._NOTES . " " . _OF . " " . $user . " (" . $date . ")".'</h2>'; - $content .= '<label for="templateNotes">' . _NOTE_TEMPLATE .' : </label>'; - $content .= '<select name="templateNotes" id="templateNotes" style="width:250px" ' - . 'onchange="addTemplateToNote($(\'templateNotes\').value, \'' - . $_SESSION['config']['businessappurl'] . 'index.php?display=true' - . '&module=templates&page=templates_ajax_content_for_notes\');">'; - $content .= '<option value="">' . _SELECT_NOTE_TEMPLATE . '</option>'; - for ($i=0;$i<count($templates);$i++) { - if ($templates[$i]['TYPE'] == 'TXT' && ($templates[$i]['TARGET'] == 'notes' || $templates[$i]['TARGET'] == '')) { - $content .= '<option value="'; - $content .= $templates[$i]['ID']; - $content .= '">'; - $content .= $templates[$i]['LABEL']; - } - $content .= '</option>'; - } - $content .= '</select><br />'; - $content .= '<textarea style="width:500px" cols="70" rows="10" name="notes" id="notes">'.functions::xssafe($notes).'</textarea>'; - $content .= '<h3 class="sstit" style="color: red">'._THIS_NOTE_IS_VISIBLE_BY.'</h3>'; - $content .= '<table align="center" width="100%" id="template_entities">'; - $content .= '<tr><td width="20%" align="center">'; - $content .= '<select name="entitieslist[]" id="entitieslist" size="7" style="width: 206px" '; - $content .= 'ondblclick=\'moveclick($(entitieslist), $(entities_chosen));\' multiple="multiple">'; - for ($i=0;$i<count($entitiesList);$i++) { - if (!in_array($entitiesList[$i], $notesEntities)) { - $content .= '<option value="' - .$entitiesList[$i]->entity_id.'" alt="' - .functions::xssafe($entitiesList[$i]->short_label).'" title="' - .functions::xssafe($entitiesList[$i]->short_label).'">' - .functions::xssafe($entitiesList[$i]->short_label).'</option>'; - } - } - $content .= '</select><br/> </td>'; - $content .= '<td width="20%" align="center">'; - $content .= '<input type="button" class="button" value="'._ADD.' >>" onclick=\'Move($(entitieslist), $(entities_chosen));\' />'; - $content .= '<br /><br />'; - $content .= '<input type="button" class="button" value="<< '._REMOVE.'" onclick=\'Move($(entities_chosen), $(entitieslist));\' />'; - $content .= '</td>'; - $content .= '<td width="30%" align="center">'; - $content .= '<select name="entities_chosen[]" id="entities_chosen" size="7" style="width: 206px" '; - $content .= 'ondblclick=\'moveclick($(entities_chosen), $(entitieslist));\' multiple="multiple">'; - for ($i=0;$i<count($notesEntities);$i++) { - $content .= '<option value="' - .$notesEntities[$i]->entity_id.'" alt="' - .functions::xssafe($notesEntities[$i]->short_label).'" title="' - .functions::xssafe($notesEntities[$i]->short_label).'" selected="selected">' - .functions::xssafe($notesEntities[$i]->short_label).'</option>'; - } - $content .= '</select></td>'; - $content .= '</tr></table>'; - // Buttons - $content .='<hr />'; - $content .='<div align="center">'; - $content .=' <input type="button" name="valid" value=" '._VALIDATE - .' " id="valid" class="button" onclick="' - .'selectall($(\'entities_chosen\'));validNotesForm(\'' - .$path_to_script.'&mode=updated\', \'formNotes\');" /> '; - $content .=' <input type="button" name="valid" value=" '._DELETE - .' " id="valid" class="button" onclick="if(confirm(\''._REALLY_DELETE.': ' - .$request->cut_string(str_replace(array("'", "\n","\"","\r"),array("\'", " ", """, " "), $notes), 250).' ?\')) validNotesForm(\'' - .$path_to_script.'&mode=del\', \'formNotes\');" /> '; - $content .='<input type="button" name="cancel" id="cancel" class="button" value="' - ._CANCEL.'" onclick="destroyModal(\'form_notes\');"/>'; - $content .='</div">'; - $content .= '</form>'; - $content .= '</div>'; - } else { - $error = $request->wash_html($id.': '._NOTE_DONT_EXIST.'!','NONE'); - $status = 1; - } - - } else { - $error = $request->wash_html(_ID.' '._IS_EMPTY.'!','NONE'); - $status = 1; - } - break; - case 'updated': - if (strlen(trim($_REQUEST['notes'])) > 0) { - //ID? - if (empty($_REQUEST['id'])) { - $error = $request->wash_html(_ID.' '._IS_EMPTY.'!','NONE'); - $status = 1; - } else { - $id = $_REQUEST['id']; - //Identifier? - if (empty($identifier)) { - $error = $request->wash_html(_IDENTIFIER.' '._IS_EMPTY.'!','NONE'); - $status = 1; - } else { - - $notes = $_REQUEST['notes']; - - $db->query( - "UPDATE ".NOTES_TABLE." SET note_text = ?, creation_date = CURRENT_TIMESTAMP WHERE id = ?", - array($notes, $id) - ); - - //Entities selected - $db->query( - "DELETE FROM " . NOTE_ENTITIES_TABLE . " WHERE note_id = ?", array($id) - ); - if (isset($_REQUEST['entities_chosen']) && !empty($_REQUEST['entities_chosen'])) { - - for ($i=0; $i<count($_REQUEST['entities_chosen']); $i++) - { - $db->query( - "INSERT INTO " . NOTE_ENTITIES_TABLE . "(note_id, item_id) VALUES" - . " (?, ?)", - array($id, $_REQUEST['entities_chosen'][$i]) - ); - } - } - - //History - if ($_SESSION['history']['noteup']) { - $hist = new history(); - if (isset($_REQUEST['origin']) && $_REQUEST['origin'] == "folder") { - $hist->add( - $table, $identifier, "UP", 'folderup', _NOTE_UPDATED . _ON_FOLDER_NUM - . $identifier . ' (' . $id . ') : "' . $request->cut_string($notes, 254) .'"', - $_SESSION['config']['databasetype'], 'notes' - ); - } else if (isset($_REQUEST['origin']) && $_REQUEST['origin'] == "document") { - $hist->add( - $view, $identifier, "UP", 'resup', _NOTE_UPDATED . _ON_DOC_NUM - . $identifier . ' (' . $id . ') ', - $_SESSION['config']['databasetype'], 'notes' - ); - } - - $hist->add( - NOTES_TABLE, $id, "UP", 'noteup', _NOTE_UPDATED . ' (' . $id . ')', - $_SESSION['config']['databasetype'], 'notes' - ); - } - - //Reload and show message - $js = $list_origin; - $msgResult = _NOTE_UPDATED; - } - } - } else { - $error = $request->wash_html(_NOTES.' '._IS_EMPTY.'!','NONE'); - $status = 1; - } - break; - case 'del': - //ID? - if (empty($_REQUEST['id'])) { - $error = $request->wash_html(_ID.' '._IS_EMPTY.'!','NONE'); - $status = 1; - } else { - $id = $_REQUEST['id']; - - $db->query("DELETE FROM " . NOTE_ENTITIES_TABLE . " WHERE note_id = ?", array($id)); - $db->query("DELETE FROM " . NOTES_TABLE . " WHERE id = ?", array($id)); - - if ($_SESSION['history']['notedel']) { - $hist = new history(); - $hist->add( - NOTES_TABLE, $id, "DEL", 'notedel', _NOTES_DELETED . ' (' . $id . ')', - $_SESSION['config']['databasetype'], 'notes' - ); - if (isset($_REQUEST['origin']) && $_REQUEST['origin'] == "folder") { - $hist->add( - $table, $identifier, "UP", 'folderup', _NOTES_DELETED . _ON_FOLDER_NUM - . $identifier . ' (' . $id . ')', - $_SESSION['config']['databasetype'], 'notes' - ); - } else if (isset($_REQUEST['origin']) && $_REQUEST['origin'] == "document") { - $hist->add( - $view, $identifier, "UP", 'resup', _NOTES_DELETED . _ON_DOC_NUM - . $identifier . ' (' . $id . ')', - $_SESSION['config']['databasetype'], 'notes' - ); - } - } - - //Reload and show message - $js = $list_origin; - $msgResult = _NOTES_DELETED; - - //Count notes - $toolbarBagde_script = $_SESSION['config']['businessappurl'] . 'index.php?display=true&module=notes&page=load_toolbar_notes&origin=parent&resId='.$identifier; - $js .='loadToolbarBadge(\'notes_tab\',\''.$toolbarBagde_script.'\');'; - } - break; -} - -echo "{status : " . $status . ", msg_result : '" . $msgResult . "', content : '" . addslashes(_parse($content)) . "', error : '" . addslashes($error) . "', exec_js : '".addslashes($js)."'}"; -exit (); -?> diff --git a/modules/notes/notes_tables.php b/modules/notes/notes_tables.php deleted file mode 100755 index 0a111df7446..00000000000 --- a/modules/notes/notes_tables.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php -/* -* Copyright 2008 - 2011 Maarch -* -* This file is part of Maarch Framework. -* -* Maarch Framework is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Maarch Framework is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. -*/ - -/** -* @brief Notes tables declarations -* -* -* @file -* @author Claire Figueras <dev@maarch.org> -* @date $date$ -* @version $Revision$ -* @ingroup notes -*/ -if (! defined('NOTES_TABLE')) { - define('NOTES_TABLE', 'notes'); -} - -if (! defined('NOTE_ENTITIES_TABLE')) { - define('NOTE_ENTITIES_TABLE', 'note_entities'); -} diff --git a/modules/notes/xml/IVS/requests_definitions.xml b/modules/notes/xml/IVS/requests_definitions.xml index 0470daec930..87c36b040c3 100755 --- a/modules/notes/xml/IVS/requests_definitions.xml +++ b/modules/notes/xml/IVS/requests_definitions.xml @@ -1,9 +1,4 @@ <requestDefinitions> - <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="notes_ajax_content" > - <parameter name="page" value="notes_ajax_content"/> - <parameter name="module" value="notes"/> - <parameter name="display" value="true" /> - </requestDefinition> <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="notes" > <parameter name="page" value="notes"/> <parameter name="module" value="notes"/> @@ -19,9 +14,4 @@ <parameter name="module" value="notes"/> <parameter name="display" value="true" /> </requestDefinition> - <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="note_details" > - <parameter name="page" value="note_details"/> - <parameter name="module" value="notes"/> - <parameter name="display" value="true"/> - </requestDefinition> </requestDefinitions> diff --git a/modules/notes/xml/IVS/validation_rules.xml b/modules/notes/xml/IVS/validation_rules.xml index 587b5e573ae..af0edac910b 100755 --- a/modules/notes/xml/IVS/validation_rules.xml +++ b/modules/notes/xml/IVS/validation_rules.xml @@ -1,19 +1,4 @@ <validationRules> - <validationRule name="notes_ajax_content" extends="standardForm" mode="error"> - <parameter name="module" type="identifier" /> - <parameter name="coll_id" type="collection_list" /> - <parameter name="identifier" type="integer" /> - <parameter name="origin" type="identifier" /> - <parameter name="size" type="size" /> - <parameter name="cancel" type="identifier" /> - <parameter name="entities_chosen" type="identifier" /> - <parameter name="entitieslist" type="string" /> - <parameter name="notes" type="string" /> - <parameter name="templateNotes" type="identifier" /> - <parameter name="valid" type="string" /> - <parameter name="url" type="url" /> - <parameter name="id" type="integer" /> - </validationRule> <validationRule name="notes" extends="standardForm" mode="error"> <parameter name="module" type="identifier" /> <parameter name="coll_id" type="collection_list" /> @@ -24,12 +9,4 @@ <parameter name="size" type="size" /> <parameter name="url" type="url" /> </validationRule> - <validationRule name="note_details" extends="standardForm" mode="error"> - <parameter name="module" type="identifier" /> - <parameter name="coll_id" type="collection_list" /> - <parameter name="modify" type="identifier" /> - <parameter name="id" type="identifier" /> - <parameter name="resid" type="integer" /> - <parameter name="size" type="identifier" /> - </validationRule> </validationRules> diff --git a/modules/notes/xml/config.xml b/modules/notes/xml/config.xml index 69fe2c4b77a..1340e70494d 100755 --- a/modules/notes/xml/config.xml +++ b/modules/notes/xml/config.xml @@ -10,9 +10,4 @@ <not_notes>notes</not_notes> <note_entities>note_entities</note_entities> </TABLENAME> - <HISTORY> - <noteadd>true</noteadd> - <noteup>true</noteup> - <notedel>true</notedel> - </HISTORY> </root> diff --git a/modules/notifications/lang/en.php b/modules/notifications/lang/en.php index b4a242bc5dd..a8a0f139d5a 100755 --- a/modules/notifications/lang/en.php +++ b/modules/notifications/lang/en.php @@ -159,8 +159,6 @@ if (!defined("_HELLO_NOTE")) define("_HELLO_NOTE", "Hello, you have a new annotation for the mail"); if (!defined("_NOTE_BODY")) define("_NOTE_BODY", "The note is the next one: "); -if (!defined("_NOTE_DETAILS")) - define("_NOTE_DETAILS", "This note has been added by"); if (!defined("_NOTE_DATE_DETAILS")) define("_NOTE_DATE_DETAILS", "On"); if (!defined("_LINK_TO_MAARCH")) diff --git a/modules/notifications/lang/fr.php b/modules/notifications/lang/fr.php index 9fb0ac7421c..7d57aef0611 100755 --- a/modules/notifications/lang/fr.php +++ b/modules/notifications/lang/fr.php @@ -159,8 +159,6 @@ if (!defined("_HELLO_NOTE")) define("_HELLO_NOTE", "Bonjour, vous avez une nouvelle annotation pour le courrier"); if (!defined("_NOTE_BODY")) define("_NOTE_BODY", "L'annotation est la suivante : "); -if (!defined("_NOTE_DETAILS")) - define("_NOTE_DETAILS", "Cette annotation à été ajoutée par : "); if (!defined("_NOTE_DATE_DETAILS")) define("_NOTE_DATE_DETAILS", "le"); if (!defined("_LINK_TO_MAARCH")) diff --git a/modules/notifications/lang/nl.php b/modules/notifications/lang/nl.php index 15189d14c35..fa29149fe3e 100755 --- a/modules/notifications/lang/nl.php +++ b/modules/notifications/lang/nl.php @@ -195,9 +195,6 @@ if (!defined('_HELLO_NOTE')) { if (!defined('_NOTE_BODY')) { define('_NOTE_BODY', 'De opmerking is de volgende:'); } -if (!defined('_NOTE_DETAILS')) { - define('_NOTE_DETAILS', 'Deze opmerking werd toegevoegd door:'); -} if (!defined('_NOTE_DATE_DETAILS')) { define('_NOTE_DATE_DETAILS', 'op'); } @@ -405,6 +402,3 @@ if (!defined('_DEPARTMENT')) { if (!defined('_NOTE_BODY')) { define('_NOTE_BODY', 'De opmerking is de volgende: '); } -if (!defined('_NOTE_DETAILS')) { - define('_NOTE_DETAILS', 'Deze opmerking werd toegevoegd door: '); -} diff --git a/modules/sendmail/address_autocompletion.php b/modules/sendmail/address_autocompletion.php deleted file mode 100644 index f3a2d304ee4..00000000000 --- a/modules/sendmail/address_autocompletion.php +++ /dev/null @@ -1,112 +0,0 @@ -<?php -/** -* Copyright Maarch since 2008 under licence GPLv3. -* See LICENCE.txt file at the root folder for more details. -* This file is part of Maarch software. - -* @brief address_autocompletion -* @author dev <dev@maarch.org> -* @ingroup sendmail -*/ - -require_once("core".DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_request.php"); - -$db = new Database(); - -$timestart=microtime(true); - -$args = explode(' ', $_REQUEST['what']); -$args[] = $_REQUEST['what']; -$num_args = count($args); -if ($num_args == 0) { - return "<ul></ul>"; -} - -$query = "SELECT result, SUM(confidence) AS score, count(1) AS num FROM ("; -$subQuery = array(); -$subQuery[1] = "SELECT UPPER(lastname) || ' ' || firstname || ' (' || mail || ')' AS result, " - . ' %d AS confidence, mail AS email ' - . "FROM users" - . " WHERE status != 'SPD' AND " - . "(LOWER(lastname) LIKE LOWER('%s') OR LOWER(firstname) LIKE LOWER('%s') OR LOWER(user_id) LIKE LOWER('%s') OR LOWER(user_id) LIKE LOWER('%s') OR LOWER(user_id) LIKE LOWER('%s') OR LOWER(user_id) LIKE LOWER('%s') OR LOWER(mail) LIKE LOWER('%s'))"; - -$subQuery[2]= - "SELECT CASE WHEN contact_lastname = '' THEN UPPER(lastname) ELSE UPPER(contact_lastname) END || ' ' || CASE WHEN contact_firstname = '' THEN firstname ELSE contact_firstname END || CASE WHEN society = '' THEN '' ELSE ' - '||society END || " - . "' (' || email || ')' AS result, " - . ' %d AS confidence, email' - . " FROM view_contacts" - . " WHERE " - . " enabled = 'Y' AND email <> ''" - . " AND (" - . " (LOWER(contact_lastname) LIKE LOWER('%s') OR LOWER(lastname) LIKE LOWER('%s'))" - . " OR (LOWER(contact_firstname) LIKE LOWER('%s') OR LOWER(firstname) LIKE LOWER('%s'))" - . " OR LOWER(society) LIKE LOWER('%s')" - . " OR LOWER(society_short) LIKE LOWER('%s')" - . " OR LOWER(email) LIKE LOWER('%s')" - .")" - ."and (is_private = 'N' or ( user_id = '".$_SESSION['user']['UserId']."' and is_private = 'Y'))"; - -$queryParts = array(); - -for ($i=1; $i<3; $i++) { - foreach ($args as $arg) { - if (strlen($arg) == 0) { - continue; - } - # Full match of one given arg - $expr = $arg; - $conf = 100; - $queryParts[] = sprintf($subQuery[$i], $conf, $expr, $expr, $expr, $expr, $expr, $expr, $expr); - - # Partial match (starts with) - $expr = $arg . "%"; - ; - $conf = 34; # If found, partial match contains will also be so score is sum of both confidences, i.e. 67) - $queryParts[] = sprintf($subQuery[$i], $conf, $expr, $expr, $expr, $expr, $expr, $expr, $expr); - - # Partial match (contains) - $expr = "%" . $arg . "%"; - $conf = 33; - $queryParts[] = sprintf($subQuery[$i], $conf, $expr, $expr, $expr, $expr, $expr, $expr, $expr); - } -} - -$query .= implode(' UNION ALL ', $queryParts); -$query .= ") matches" - . " GROUP BY result " - . " ORDER BY score DESC, result ASC"; - -$stmt = $db->query($query); -$nb = $stmt->rowCount(); -$m = 30; -if ($nb >= $m) { - $l = $m; -} else { - $l = $nb; -} - -$timeend=microtime(true); -$time = number_format(($timeend-$timestart), 3); - -$found = false; -echo "<ul title='$l contacts found in " . $time."sec'>"; -for ($i=0; $i<$l; $i++) { - $res = $stmt->fetchObject(); - $score = round($res->score / $num_args); - if ($i%2==1) { - $color = 'LightYellow'; - } else { - $color = 'white'; - } - echo "<li style='font-size: 8pt; background-color:$color;' title='confiance:".$score."%' id='".$res->email."'>". $res->result ."</li>"; -} -if ($nb == 0) { - echo "<li></li>"; -} -echo "</ul>"; -if ($nb == 0) { - echo "<p align='left' style='background-color:LemonChiffon;' title=\"Aucun résultat trouvé, veuillez compléter votre recherche.\" >...</p>"; -} -if ($nb > $m) { - echo "<p align='left' style='background-color:LemonChiffon;' title=\"La liste n'a pas pu être affichée intégralement, veuillez compléter votre recherche.\" >...</p>"; -} diff --git a/modules/sendmail/class/class_email_signatures.php b/modules/sendmail/class/class_email_signatures.php deleted file mode 100755 index 6f82fbb8759..00000000000 --- a/modules/sendmail/class/class_email_signatures.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php -/* -* Copyright 2008-2016 Maarch -* -* This file is part of Maarch Framework. -* -* Maarch Framework is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Maarch Framework is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. -*/ - -require_once 'modules/sendmail/class/class_email_signatures_Abstract.php'; - -class EmailSignatures extends EmailSignaturesAbstract -{ - // custom -} \ No newline at end of file diff --git a/modules/sendmail/class/class_email_signatures_Abstract.php b/modules/sendmail/class/class_email_signatures_Abstract.php deleted file mode 100755 index a64153f94df..00000000000 --- a/modules/sendmail/class/class_email_signatures_Abstract.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php -/* -* Copyright 2008-2016 Maarch -* -* This file is part of Maarch Framework. -* -* Maarch Framework is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Maarch Framework is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. -*/ - -abstract class EmailSignaturesAbstract extends Database -{ - - protected function rawToHtml($text) { - $text = str_replace("\r\n", PHP_EOL, $text); - $text = str_replace("\r", PHP_EOL, $text); - $text = str_replace('###', ';', $text); - $text = str_replace('___', '--', $text); - - return $text; - } - - public function getForCurrentUser() { - $db = new Database(); - - $stmt = $db->query('SELECT * FROM users_email_signatures WHERE user_id = ? order by title', - [$_SESSION['user']['UserId']] - ); - $mailSignatures = []; - while($res = $stmt->fetchObject()) - $mailSignatures[] = ['id' => $res->id, 'title' => $res->title, 'signature' => $this->rawToHtml($res->html_body)]; - - return $mailSignatures; - } -} \ No newline at end of file diff --git a/modules/sendmail/class/class_modules_tools_Abstract.php b/modules/sendmail/class/class_modules_tools_Abstract.php index 7425600b29f..6a32f5c1bf3 100755 --- a/modules/sendmail/class/class_modules_tools_Abstract.php +++ b/modules/sendmail/class/class_modules_tools_Abstract.php @@ -57,132 +57,6 @@ abstract class SendmailAbstract extends Database $_SESSION['history']['maildel'] = (string) $hist->maildel; } - public function CheckEmailAdress($adress) - { - $error = ''; - if (!empty($adress)) { - $adressArray = explode(',', trim($adress)); - for ($i=0; $i < count($adressArray); $i++) { - if (!empty($adressArray[$i])) { - $this->wash($adressArray[$i], 'mail', _EMAIL.": ".$adressArray[$i], 'yes', 0, 255); - if (!empty($_SESSION['error'])) { - $error .= $_SESSION['error']; - $_SESSION['error']=''; - } - } - } - $error = str_replace("<br />", "###", $error); - } - return $error; - } - - public function getJoinedFiles($coll_id, $table, $id, $from_res_attachment = false) - { - // $joinedFiles = array(); - // $db = new Database(); - // if ($from_res_attachment === false) { - // $stmt = $db->query( - // "select res_id, description, subject, title, format, filesize, relation from " - // . $table . " where res_id = ? and status <> 'DEL'", - // array($id) - // ); - // } else { - // include_once 'modules/attachments/attachments_tables.php'; - // $stmt = $db->query( - // "SELECT rva.res_id, rva.res_id_version, rva.description, rva.subject, rva.title, rva.format, rva.filesize, rva.res_id_master, rva.attachment_type, rva.identifier, cv2.society, cv2.firstname, cv2.lastname, rva.filename, rva.path - // FROM res_view_attachments rva LEFT JOIN contacts_v2 cv2 ON rva.dest_contact_id = cv2.contact_id WHERE rva.res_id_master = ? and rva.coll_id = ? and rva.status <> 'DEL' and rva.status <> 'OBS' and rva.attachment_type NOT IN ('converted_pdf','print_folder') ORDER BY rva.attachment_type, rva.description", - // array($id, $coll_id) - // ); - // } - - // while ($res = $stmt->fetchObject()) { - // $pdf_exist = true; - // if ($from_res_attachment) { - // require_once 'modules/attachments/class/attachments_controler.php'; - // $ac = new attachments_controler(); - // if ($res->res_id != 0) { - // $idFile = $res->res_id; - // $isVersion = false; - // } else { - // $idFile = $res->res_id_version; - // $isVersion = true; - // } - // $convertedDocument = \Convert\models\AdrModel::getConvertedDocumentById(['select' => ['docserver_id', 'path', 'filename'], 'type' => 'PDF', 'resId' => $idFile, 'collId' => 'attachments_coll', 'isVersion' => $isVersion]); - // $viewLink = $_SESSION['config']['businessappurl'] - // .'index.php?display=true&module=attachments&page=view_attachment&res_id_master=' - // .$id.'&id='.$res->res_id; - - // if (!empty($convertedDocument)) { - // $docserver = \Docserver\models\DocserverModel::getByDocserverId(['docserverId' => $convertedDocument['docserver_id'], 'select' => ['path_template']]); - // $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $convertedDocument['path']) . $convertedDocument['filename']; - - - // if (!file_exists($pathToDocument)) { - // $pdf_exist = false; - // } - // } else { - // $pdf_exist = false; - // } - // } else { - // $idFile = $res->res_id; - // $convertedDocument = \Convert\models\AdrModel::getConvertedDocumentById(['select' => ['docserver_id', 'path', 'filename'], 'type' => 'PDF', 'resId' => $idFile, 'collId' => 'letterbox_coll', 'isVersion' => $isVersion]); - // $viewLink = $_SESSION['config']['businessappurl'] - // .'index.php?display=true&dir=indexing_searching&page=view_resource_controler&id=' - // .$id; - // if (!empty($convertedDocument)) { - // $docserver = \Docserver\models\DocserverModel::getByDocserverId(['docserverId' => $convertedDocument['docserver_id'], 'select' => ['path_template']]); - // $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $convertedDocument['path']) . $convertedDocument['filename']; - - // if (!file_exists($pathToDocument)) { - // $pdf_exist = false; - // } - // } else { - // $pdf_exist = false; - // } - // } - // $label = ''; - // //Tile, or subject or description - // if (strlen(trim($res->title)) > 0) { - // $label = $res->title; - // } elseif (strlen(trim($res->subject)) > 0) { - // $label = $res->subject; - // } elseif (strlen(trim($res->description)) > 0) { - // $label = $res->description; - // } - - // array_push( - // $joinedFiles, - // array('id' => $idFile, //ID - // 'label' => $this->show_string($label), //Label - // 'format' => $res->format, //Format - // 'filesize' => $res->filesize, //Filesize - // 'is_version' => $isVersion, - // 'pdf_exist' => $pdf_exist, - // 'version' => '', - // 'attachment_type' => $res->attachment_type, - // 'identifier' => $res->identifier, - // 'society' => $res->society, - // 'firstname' => $res->firstname, - // 'lastname' => $res->lastname, - // ) - // ); - // } - - // return $joinedFiles; - } - - public function rawToHtml($text) - { - //... - $text = str_replace("\r\n", PHP_EOL, $text); - $text = str_replace("\r", PHP_EOL, $text); - // - - //$text = str_replace(PHP_EOL, "<br />", $text); - // - return $text; - } - public function htmlToRaw($text) { // @@ -194,57 +68,11 @@ abstract class SendmailAbstract extends Database return $text; } - public function updateAdressInputField($ajaxPath, $adressArray, $inputField, $readOnly = false) - { - $content = ''; - //Init with loading div - $content .= '<div id="loading_'.$inputField.'" style="display:none;"><i class="fa fa-spinner fa-spin" title="loading..."></i></div>'; - //Get info from session array and display tag - if (isset($adressArray[$inputField]) && count($adressArray[$inputField]) > 0) { - foreach ($adressArray[$inputField] as $key => $adress) { - if (!empty($adress)) { - $content .= '<div class="email_element" id="'.$key.'_'.$adress.'">'.$adress; - if ($readOnly === false) { - $content .= ' <div class="email_delete_button" id="'.$key.'"' - . 'onclick="updateAdress(\''.$ajaxPath - .'&mode=adress\', \'del\', \''.$adress.'\', \'' - .$inputField.'\', this.id);" alt="'._DELETE.'" title="' - ._DELETE.'">x</div>'; - } - $content .= '</div>'; - } - } - } - return $content; - } - - public function updateContactInputField($ajaxPath, $adressArray, $inputField, $readOnly = false) - { - $content = '<div id="loading_'.$inputField.'" style="display:none;"><i class="fa fa-spinner fa-spin" title="loading..."></i></div>'; - //Get info from session array and display tag - if (isset($adressArray[$inputField]) && count($adressArray[$inputField]) > 0) { - foreach ($adressArray[$inputField] as $key => $adress) { - if (!empty($adress)) { - $content .= '<div class="email_element" id="'.$key.'_'.$adress.'">'.$adress; - if ($readOnly === false) { - $content .= ' <div class="email_delete_button" id="'.$key.'"' - . 'onclick="updateDestUser(\''.$ajaxPath - .'&mode=destUser\', \'del\', this.id, \'' - .$inputField.'\', this.id);" alt="'._DELETE.'" title="' - ._DELETE.'">x</div>'; - } - $content .= '</div>'; - } - } - } - return $content; - } - public function getResource($collectionArray, $coll_id, $res_id) { $viewResourceArr = array(); - for ($i=0;$i<count($collectionArray);$i++) { + for ($i=0; $i<count($collectionArray); $i++) { if ($collectionArray[$i]['id'] == $coll_id) { //Get table $table = $collectionArray[$i]['table']; @@ -387,131 +215,6 @@ abstract class SendmailAbstract extends Database return $viewAttachmentArr; } - public function getVersion($collectionArray, $coll_id, $res_id_master, $res_version) - { - $viewVersionArr = array(); - - //Parse collection - for ($i=0;$i<count($collectionArray);$i++) { - if ($collectionArray[$i]['id'] == $coll_id) { - //Get table - $table = $collectionArray[$i]['table']; - //Get adress - $adrTable = $collectionArray[$i]['adr']; - //Get versions table - $versionTable = $collectionArray[$i]['version_table']; - break; - } - } - - //Have version table - if ($versionTable <> '') { - $db = new Database(); - $stmt = $db->query( - "select res_id, description, subject, title, docserver_id, " - . "path, filename,format, filesize, relation from " - . $versionTable . " where res_id = ? and res_id_master = ? and status <> 'DEL'", - array($res_version, $res_id_master) - ); - //$db->show(); - //Have new version - if ($stmt->rowCount() > 0) { - $line = $stmt->fetchObject(); - //Tile, or subject or description - if (strlen(trim($line->title)) > 0) { - $label = $line->title; - } elseif (strlen(trim($line->subject)) > 0) { - $label = $line->subject; - } elseif (strlen(trim($line->description)) > 0) { - $label = $line->description; - } - - //Get file from docserver - include_once 'core/core_tables.php'; - include_once 'core/docservers_tools.php'; - - $docserver = $line->docserver_id; - $path = $line->path; - $filename = $line->filename; - $format = $line->format; - $stmt = $db->query( - "select path_template from " . _DOCSERVERS_TABLE_NAME - . " where docserver_id = ? ", - array($docserver) - ); - //$db->show(); - $lineDoc = $stmt->fetchObject(); - $docserver = $lineDoc->path_template; - $file = $docserver . $path . $filename; - $file = str_replace("#", DIRECTORY_SEPARATOR, $file); - - //Is there a corresponding file? - if (file_exists($file)) { - $mimeType = Ds_getMimeType($file); - - $fileNameOnTmp = 'tmp_file_' . rand() - . '.' . strtolower($format); - $filePathOnTmp = $_SESSION['config'] - ['tmppath'] . DIRECTORY_SEPARATOR - . $fileNameOnTmp; - copy($file, $filePathOnTmp); - - $viewVersionArr = array( - 'status' => 'ok', - 'label' => $this->show_string($label), - 'mime_type' => $mimeType, - 'ext' => $format, - 'file_content' => '', - 'tmp_path' => $_SESSION['config'] - ['tmppath'], - 'file_path' => $filePathOnTmp, - 'called_by_ws' => '', - 'error' => '' - ); - } else { - $viewVersionArr = array( - 'status' => 'ko', - 'label' => '', - 'mime_type' => '', - 'ext' => '', - 'file_content' => '', - 'tmp_path' => '', - 'file_path' => '', - 'called_by_ws' => '', - 'error' => _FILE_NOT_EXISTS_ON_THE_SERVER - ); - } - } else { - $viewVersionArr = array( - 'status' => 'ko', - 'label' => '', - 'mime_type' => '', - 'ext' => '', - 'file_content' => '', - 'tmp_path' => '', - 'file_path' => '', - 'called_by_ws' => '', - 'error' => _NO_RIGHT_ON_RESOURCE_OR_RESOURCE_NOT_EXISTS - ); - } - } else { - $viewVersionArr = array( - 'status' => 'ko', - 'label' => '', - 'mime_type' => '', - 'ext' => '', - 'file_content' => '', - 'tmp_path' => '', - 'file_path' => '', - 'called_by_ws' => '', - 'error' => _NO_VERSION_TABLE_FOR_THIS_COLLECTION - ); - } - // $this->show_array($viewVersionArr); - - return $viewVersionArr; - } - public function createFilename($label, $extension) { $search = array( @@ -597,26 +300,6 @@ abstract class SendmailAbstract extends Database return $arrayEntitiesMails; } - public function checkAttachedEntitiesMails() - { - $db = new Database; - $core_tools = new core_tools(); - - $entitiesMails = array(); - if ($core_tools->test_service('use_mail_services', 'sendmail', false)) { - $entitiesMails = $this->getAttachedEntitiesMails($_SESSION['user']['UserId']); - } - - $stmt = $db->query("SELECT mail FROM users WHERE user_id = ? ", array($_SESSION['user']['UserId'])); - $res = $stmt->fetchObject(); - - if ($res->mail<>"") { - $entitiesMails[$res->mail] = ""; - } - - return $entitiesMails; - } - public function explodeSenderEmail($senderEmail) { if (strpos($senderEmail, ",") === false) { @@ -626,17 +309,4 @@ abstract class SendmailAbstract extends Database return $explode[1]; } } - - public function emailStatus(array $args) - { - if ($args['status'] == 'SENT') { - return _EMAIL_SENT; - } elseif ($args['status'] == 'ERROR') { - return _EMAIL_ERROR; - } elseif ($args['status'] == 'WAITING') { - return _EMAIL_WAIT; - } else { - return _EMAIL_DRAFT; - } - } } diff --git a/modules/sendmail/contact_autocompletion.php b/modules/sendmail/contact_autocompletion.php deleted file mode 100755 index 4c69f5cbe9b..00000000000 --- a/modules/sendmail/contact_autocompletion.php +++ /dev/null @@ -1,105 +0,0 @@ -<?php - -/** -* Copyright Maarch since 2008 under licence GPLv3. -* See LICENCE.txt file at the root folder for more details. -* This file is part of Maarch software. -* -*/ - -/** -* @brief List of contact informations for autocompletion -* -* @file contact_autocompletion.php -* @date $date$ -* @version $Revision$ -* @ingroup sendmail -*/ - -$db = new Database(); - -$args = explode(' ', $_REQUEST['what']); -$args[] = $_REQUEST['what']; -$num_args = count($args); -if ($num_args == 0) { - return "<ul></ul>"; -} - -$query = "SELECT result, SUM(confidence) AS score, ca_id FROM ("; - -$subQuery[1]= - "SELECT CASE WHEN is_corporate_person = 'Y' THEN UPPER(society) ELSE COALESCE(contact_firstname, '') || ' ' || UPPER(COALESCE(contact_lastname, '')) END || " - . " ' - ' || CAST (external_id->>'m2m' as VARCHAR) || ' - ' || COALESCE(contact_purpose_label, '') || ' : ' || " - . " COALESCE(firstname, '') || ' ' || UPPER(COALESCE(lastname, ''))|| ' ' || COALESCE(address_num, '') || ' ' || COALESCE(address_street, '') || ' ' || COALESCE(address_postal_code, '')|| ' ' || COALESCE(address_town, '')|| ' ' || UPPER(COALESCE(address_country, ''))" - ." || '(Moyen de communication : ' || cc.value || ')' AS result, " - . ' %d AS confidence, ca_id' - . " FROM view_contacts left join contact_communication cc on view_contacts.contact_id = cc.contact_id" - . " WHERE " - . " enabled = 'Y' AND cc.value <> '' AND external_id->>'m2m' <> '' AND external_id->>'m2m' IS NOT NULL" - . " AND (" - . " (LOWER(contact_lastname) LIKE LOWER('%s') OR LOWER(lastname) LIKE LOWER('%s'))" - . " OR (LOWER(contact_firstname) LIKE LOWER('%s') OR LOWER(firstname) LIKE LOWER('%s'))" - . " OR LOWER(society) LIKE LOWER('%s')" - . " OR LOWER(society_short) LIKE LOWER('%s')" - . " OR LOWER(email) LIKE LOWER('%s')" - .")" - ."and (is_private = 'N' or ( user_id = '".$_SESSION['user']['UserId']."' and is_private = 'Y'))"; - -$queryParts = array(); - -foreach ($args as $arg) { - if (strlen($arg) == 0) { - continue; - } - # Full match of one given arg - $expr = $arg; - $conf = 100; - $queryParts[] = sprintf($subQuery[1], $conf, $expr, $expr, $expr, $expr, $expr, $expr, $expr); - - # Partial match (starts with) - $expr = $arg . "%"; - $conf = 34; # If found, partial match contains will also be so score is sum of both confidences, i.e. 67) - $queryParts[] = sprintf($subQuery[1], $conf, $expr, $expr, $expr, $expr, $expr, $expr, $expr); - - # Partial match (contains) - $expr = "%" . $arg . "%"; - $conf = 33; - $queryParts[] = sprintf($subQuery[1], $conf, $expr, $expr, $expr, $expr, $expr, $expr, $expr); -} - -$query .= implode(' UNION ALL ', $queryParts); -$query .= ") matches" - . " GROUP BY result, ca_id " - . " ORDER BY score DESC, result ASC"; - -$stmt = $db->query($query); -$nb = $stmt->rowCount(); -$m = 30; -if ($nb >= $m) { - $l = $m; -} else { - $l = $nb; -} - -echo "<ul title='$l contacts found'>"; -for ($i=0; $i<$l; $i++) { - $res = $stmt->fetchObject(); - $score = round($res->score / $num_args); - if ($i%2==1) { - $color = 'LightYellow'; - } else { - $color = 'white'; - } - echo "<li style='font-size: 8pt; background-color:$color;' title='confiance:".$score."%' id='".$res->ca_id."'>". $res->result ."</li>"; -} -if ($nb == 0) { - echo "<li></li>"; -} -echo "</ul>"; - -if ($nb == 0) { - echo "<p align='left' style='background-color:LemonChiffon;' title=\"Aucun résultat trouvé, veuillez compléter votre recherche.\" >...</p>"; -} -if ($nb > $m) { - echo "<p align='left' style='background-color:LemonChiffon;' title=\"La liste n'a pas pu être affichée intégralement, veuillez compléter votre recherche.\" >...</p>"; -} diff --git a/modules/sendmail/css/module.css b/modules/sendmail/css/module.css index 542f6c29c7d..248169ea3e1 100755 --- a/modules/sendmail/css/module.css +++ b/modules/sendmail/css/module.css @@ -1,51 +1 @@ /* Sendmail module */ -/* menu */ -.emailInput { - -moz-appearance: textfield; - -webkit-appearance: textfield; - background-color: white; - background-color: -moz-field; - border: 1px solid darkgray; - box-shadow: 1px 1px 1px 0 lightgray inset; - font: -moz-field; - font: -webkit-small-control; - margin-top: 2px; - padding: 2px 2px; - width: 700px; - min-height: 13px; -} - -textarea.emailInput { - width: 770px; -} - -input.emailInput { - width: 700px; -} - -input.emailSelect { - width: 250px; -} - -.email_element { - display:inline-block; - margin:3px; - padding: 1px 3px 2px 3px; - /*color:white;*/ - font-size: .9em; - background-color: #BAD1E2; - border-radius: 5px; -} - -.email_delete_button { - color:grey; - display:inline; - padding: 1px 1px 2px 1px; - background-color:#BAD1E2; - font-weight:bold; - font-size: 1.2em; - cursor: pointer; -} -.email_delete_button:hover { - background-image: url(static.php?filename=black_0.1.png); -} \ No newline at end of file diff --git a/modules/sendmail/js/functions.js b/modules/sendmail/js/functions.js index 0614a7fb782..362c159c986 100755 --- a/modules/sendmail/js/functions.js +++ b/modules/sendmail/js/functions.js @@ -24,240 +24,6 @@ var addEmailAdress = function (idField, idList, theUrlToListScript, paramNameSrv }); }; -function addTemplateToEmail(templateMails, path){ - - new Ajax.Request(path, - { - method :'post', - parameters :{ - templateId : templateMails, - mode : mode - }, - onSuccess :function(answer){ - eval("response = " + answer.responseText); - if (response.status == 0) { - var strContent = response.content; - if(mode == 'html'){ - var strContentReplace = strContent.replace(/\\n/g, ''); - tinyMCE.execCommand('mceSetContent', false, strContentReplace); - } else { - var strContentReplace = strContent.replace(/\\n/g, '\n'); - $j("textarea#body_from_raw").html(strContentReplace); - } - } - } - }); -} - -function changeSignature(selected, mailSignaturesJS){ - var nb = selected.getAttribute('data-nb'); - var body = $('body_from_html_ifr').contentWindow.document.getElementById("tinymce"); - var customTag = body.getElementsByTagName("mailSignature"); - - if (mode == 'html' && customTag.length == 0) { - body.innerHTML += "<mailSignature>t</mailSignature>"; - customTag = body.getElementsByTagName("mailSignature"); - } - - if (nb >= 0) { - var strContent = mailSignaturesJS[nb].signature; - if(mode == 'html'){ - customTag[0].innerHTML = strContent; - } else { - var text = $j(strContent).text(); - $j("textarea#body_from_raw").append(text); - } - - } else { - customTag[0].innerHTML = ""; - } -} - -function showEmailForm(path, width, height, iframe_container_id) { - - if(typeof(width)==='undefined'){ - width = '820px'; - } - - if(typeof(height)==='undefined'){ - height = '545px'; - } - - if(typeof(iframe_container_id)==='undefined'){ - iframe_container_id = ''; - } - new Ajax.Request(path, - { - method:'post', - parameters: { url : path - }, - onSuccess: function(answer) { - eval("response = "+answer.responseText); - - if(response.status == 0){ - console.log('Height = '+height); - console.log('Width = '+width); - var modal_content = convertToTextVisibleNewLine(response.content); - createModal(modal_content, 'form_email', height, width,'',iframe_container_id); - } else { - window.top.$('main_error').innerHTML = response.error; - } - } - }); -} - -function updateAdress(path, action, adress, target, array_index, email_format_text_error) { - - if (validateEmail(adress) === true) { - - new Ajax.Request(path, - { - method:'post', - parameters: { url : path, - 'for': action, - email: adress, - field: target, - index: array_index - }, - onLoading: function(answer) { - $('loading_' + target).style.display='inline'; - }, - onSuccess: function(answer) { - eval("response = "+answer.responseText); - if(response.status == 0){ - $(target).innerHTML = response.content; - if (action == 'add') {$('email').value = '';} - } else { - alert(response.error); - eval(response.exec_js); - } - } - }); - } else { - if(typeof(email_format_text_error) == 'undefined'){ - email_format_text_error = 'Email format is not available!'; - } - alert(email_format_text_error); - } -} - -function updateDestUser(path, action, adress, target, array_index) { - - new Ajax.Request(path, - { - method:'post', - parameters: { url : path, - 'for': action, - contactAddress: adress, - field: target, - index: array_index - }, - onLoading: function(answer) { - $('loading_' + target).style.display='inline'; - }, - onSuccess: function(answer) { - eval("response = "+answer.responseText); - if(response.status == 0){ - $(target).innerHTML = response.content; - if (action == 'add') {$('user').value = '';} - } else { - alert(response.error); - eval(response.exec_js); - } - } - }); -} - -function validEmailForm(path, form_id) { - - var attachments = $j("#joined_files input.check"); - - if (attachments.length > 0 && (path.includes("for=send") || path.includes("formContent=messageExchange"))) { - var hasOneChecked = false; - for (var i = 0; i < attachments.length; i++) { - if (attachments[i].checked == true) { - hasOneChecked = true; - break; - } - } - - if (!hasOneChecked) { - if(path.includes("formContent=messageExchange")){ - alert('Aucune pièce jointe sélectionnée'); - return; - } else if(path.includes("for=send")){ - var cfm = confirm('Aucune pièce jointe sélectionnée. Voulez-vous quand même envoyer le mail ?'); - if (!cfm) { - return; - } - } - } - } - - if (typeof($j('input[name=main_exchange_doc]:checked', '#formEmail').val()) === 'undefined' && path.includes("formContent=messageExchange")) { - alert('Aucun document principal sélectionné'); - return; - } - - $j("input#valid.button").prop("disabled", true).css("opacity", "0.5"); - - tinyMCE.triggerSave(); - new Ajax.Request(path, - { - asynchronous:false, - method:'post', - parameters: Form.serialize(form_id), - encoding: 'UTF-8', - onSuccess: function(answer){ - eval("response = "+answer.responseText); - if(response.status == 0){ - eval(response.exec_js); - window.parent.destroyModal('form_email'); - } else { - $j("input#valid.button").prop("disabled", false).css("opacity", "1"); - alert(response.error); - eval(response.exec_js); - } - } - }); -} - -function validEmailFormForSendToContact(path, form_id, path2, status) { - tinyMCE.triggerSave(); - new Ajax.Request(path, - { - asynchronous:false, - method:'post', - parameters: Form.serialize(form_id), - encoding: 'UTF-8', - onSuccess: function(answer){ - eval("response = "+answer.responseText); - if(response.status == 0){ - eval(response.exec_js); - changeStatusForActionSendToContact(path2, status); - window.parent.destroyModal('form_email'); - } else { - alert(response.error); - eval(response.exec_js); - } - } - }); -} - -function changeStatusForActionSendToContact(path, status){ - console.log(path); - new Ajax.Request(path, - { - asynchronous:false, - method:'post', - parameters: {status : status}, - encoding: 'UTF-8', - onSuccess : function(){ - parent.document.getElementById('storage').click(); - } - }); -} - function extractEmailAdress(field, item) { var fullAdress = item.innerHTML; field.value = fullAdress.match(/\(([^)]+)\)/)[1]; @@ -268,22 +34,6 @@ function extractDestUser(field, item) { $j('#valid').click(); } -function validateEmail(email) { - var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - return re.test(email); -} - -function switchMode(action) { - var div = document.getElementById(mode+"_mode"); - div.style.display = "block"; - if(action == "show") { - div.style.display = "none"; // Hide the current div. - mode = (mode === 'html')? 'raw' : 'html'; // switch the mode - document.getElementById("is_html").value = (mode === 'html')? 'Y' : 'N'; //Update the hidden field - document.getElementById(mode+"_mode").style.display = "block"; // Show the other div. - } -} - var MyAjax = { }; MyAjax.Autocompleter = Class.create(Ajax.Autocompleter, { updateChoices: function(choices) { @@ -313,13 +63,3 @@ MyAjax.Autocompleter = Class.create(Ajax.Autocompleter, { } } }); - -function clickAttachments(id){ - $("join_file_"+id).click(); -} -function clickAttachmentsInput(id){ - $("join_attachment_"+id).click(); -} -function clickAttachmentsNotes(id){ - $("note_"+id).click(); -} diff --git a/modules/sendmail/load_editor.php b/modules/sendmail/load_editor.php deleted file mode 100755 index 704e49583b8..00000000000 --- a/modules/sendmail/load_editor.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php -?> -<!-- tinyMCE --> -<script type="text/javascript"> - tinymce.baseURL = "../../node_modules/tinymce"; - tinymce.suffix = '.min'; - tinymce.init({ - selector: "textarea#body_from_html", - statusbar : false, - language : "fr_FR", - language_url: "tools/tinymce/langs/fr_FR.js", - height : "150", - plugins: [ - "advlist autolink link lists charmap print preview hr", - "searchreplace visualblocks visualchars code fullscreen insertdatetime nonbreaking", - "save table contextmenu directionality paste textcolor" - ], - external_plugins: { - 'bdesk_photo': "../../apps/maarch_entreprise/tools/tinymce/bdesk_photo/plugin.min.js" - }, - toolbar: "undo redo | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | preview fullpage | forecolor backcolor", - //save_callback : "customSave", - paste_data_images: true, - images_upload_handler: function (blobInfo, success, failure) { - success("data:" + blobInfo.blob().type + ";base64," + blobInfo.base64()); - } - }); - - // Custom save callback, gets called when the contents is to be submitted - function customSave(id, content) { - alert(id + "=" + content); - } -</script> -<!-- /tinyMCE --> diff --git a/modules/sendmail/load_toolbar_sendmail.php b/modules/sendmail/load_toolbar_sendmail.php deleted file mode 100755 index ab27719c827..00000000000 --- a/modules/sendmail/load_toolbar_sendmail.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php - -/** -* Copyright Maarch since 2008 under licence GPLv3. -* See LICENCE.txt file at the root folder for more details. -* This file is part of Maarch software. -* -*/ - -$targetTab = $_REQUEST['targetTab']; -$res_id = $_REQUEST['resId']; -$coll_id = $_REQUEST['collId']; - -require_once "modules" . DIRECTORY_SEPARATOR . "sendmail" . DIRECTORY_SEPARATOR . "class" . DIRECTORY_SEPARATOR . "class_modules_tools.php"; - -$sendmail_tools = new sendmail(); - -//Count mails -$nbr_emails = 0; -if ($nbr_emails == 0) { - $class = 'nbResZero'; - $style2 = 'display:none;'; - $style = '0.5'; - $styleDetail = '#9AA7AB'; -} else { - $class = 'nbRes'; - $style = ''; - $style2 = 'display:inherit;'; - $styleDetail = '#666'; -} -if ($_SESSION['req'] == 'details') { - if ($_REQUEST['origin'] == 'parent') { - if ($nbr_emails == 0 && strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')) { - $nav = 'sendmail_tab'; - $style2 = 'visibility:hidden;'; - } - $js .= 'parent.$(\''.$targetTab.'\').style.color=\''.$styleDetail.'\';parent.$(\''.$targetTab.'_badge\').innerHTML = \'<span id="nb_'.$targetTab.'" style="'.$style2.'font-size: 10px;" class="'.$class.'">'.$nbr_emails.'</span>\''; - } else { - if ($nbr_emails == 0 && strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')) { - $nav = 'sendmail_tab'; - $style2 = 'visibility:hidden;'; - } - $js .= '$(\''.$targetTab.'\').style.color=\''.$styleDetail.'\';$(\''.$targetTab.'_badge\').innerHTML = \'<span id="nb_'.$targetTab.'" style="'.$style2.'font-size: 10px;" class="'.$class.'">'.$nbr_emails.'</span>\''; - } -} else { - if ($_REQUEST['origin'] == 'parent') { - $js .= 'parent.$(\''.$targetTab.'_img\').style.opacity=\''.$style.'\';parent.$(\''.$targetTab.'_badge\').innerHTML = \' <sup><span id="nb_'.$targetTab.'" style="'.$style2.'" class="'.$class.'">'.$nbr_emails.'</span></sup>\''; - } else { - $js .= '$(\''.$targetTab.'_img\').style.opacity=\''.$style.'\';$(\''.$targetTab.'_badge\').innerHTML = \' <sup><span id="nb_'.$targetTab.'" style="'.$style2.'" class="'.$class.'">'.$nbr_emails.'</span></sup>\''; - } -} - -echo "{status : 0, nav : '".$nav."',content : '', error : '', exec_js : '".addslashes($js)."'}"; -exit(); diff --git a/modules/sendmail/mail_form.php b/modules/sendmail/mail_form.php deleted file mode 100755 index c7128e568db..00000000000 --- a/modules/sendmail/mail_form.php +++ /dev/null @@ -1,1389 +0,0 @@ -<?php - -/** -* Copyright Maarch since 2008 under licence GPLv3. -* See LICENCE.txt file at the root folder for more details. -* This file is part of Maarch software. -* -*/ - -/** - * @brief Script to return ajax result - * - * @file sendmail_ajax_content.php - * - * @author Yves Christian Kpakpo <dev@maarch.org> - * @date $date$ - * - * @version $Revision$ - * @ingroup sendmail - */ - -require_once 'core'.DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR.'class_request.php'; -require_once 'core'.DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR.'class_security.php'; -require_once 'apps'.DIRECTORY_SEPARATOR.$_SESSION['config']['app_id'] - .DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR - .'class_indexing_searching_app.php'; -require_once 'apps'.DIRECTORY_SEPARATOR.$_SESSION['config']['app_id'] - .DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR - .'class_users.php'; - -require_once 'modules'.DIRECTORY_SEPARATOR.'sendmail'.DIRECTORY_SEPARATOR - .'class'.DIRECTORY_SEPARATOR.'class_modules_tools.php'; -require_once 'modules/sendmail/class/class_email_signatures.php'; - -$core_tools = new core_tools(); -$request = new request(); -$sec = new security(); -$is = new indexing_searching_app(); -$users_tools = new class_users(); -$sendmail_tools = new sendmail(); -$db = new Database(); - -$parameters = ''; - -if (isset($_REQUEST['mode']) && !empty($_REQUEST['mode'])) { - $mode = $_REQUEST['mode']; -} else { - echo _ERROR_IN_SENDMAIL_FORM_GENERATION; - exit; -} - -//Identifier of the element wich is noted -$identifier = ''; -if (isset($_REQUEST['identifier']) && !empty($_REQUEST['identifier'])) { - $identifier = trim($_REQUEST['identifier']); -} - -//Collection -if (isset($_REQUEST['coll_id']) && !empty($_REQUEST['coll_id'])) { - $collId = trim($_REQUEST['coll_id']); - $parameters .= '&coll_id='.$_REQUEST['coll_id']; - $view = $sec->retrieve_view_from_coll_id($collId); - $table = $sec->retrieve_table_from_coll($collId); -} - -//Keep some origin parameters -if (isset($_REQUEST['size']) && !empty($_REQUEST['size'])) { - $parameters .= '&size='.$_REQUEST['size']; -} -if (isset($_REQUEST['order']) && !empty($_REQUEST['order'])) { - $parameters .= '&order='.$_REQUEST['order']; - if (isset($_REQUEST['order_field']) && !empty($_REQUEST['order_field'])) { - $parameters .= '&order_field='.$_REQUEST['order_field']; - } -} -if (isset($_REQUEST['what']) && !empty($_REQUEST['what'])) { - $parameters .= '&what='.$_REQUEST['what']; -} -if (isset($_REQUEST['template']) && !empty($_REQUEST['template'])) { - $parameters .= '&template='.$_REQUEST['template']; -} -if (isset($_REQUEST['start']) && !empty($_REQUEST['start'])) { - $parameters .= '&start='.$_REQUEST['start']; -} - -if (isset($_REQUEST['formContent']) && !empty($_REQUEST['formContent'])) { - $formContent = $_GET['formContent']; -} else { - $formContent = 'mail'; -} - -//Keep the origin -$origin = ''; -if (isset($_REQUEST['origin']) && !empty($_REQUEST['origin'])) { - $origin = $_REQUEST['origin']; -} - -//Path to actual script -$path_to_script = $_SESSION['config']['businessappurl'] - .'index.php?display=true&module=sendmail&page=sendmail_ajax_content&identifier=' - .$identifier.'&origin='.$origin.'&formContent='.$formContent.$parameters; - -$core_tools->load_lang(); -$core_tools->load_html(); -$core_tools->load_header('', true, false); -?> - -<body><?php -$core_tools->load_js(); - -$aUserEntities = \User\models\UserModel::getEntitiesByLogin(['login' => $_SESSION['user']['UserId']]); -$userEntities = []; -foreach ($aUserEntities as $value) { - $userEntities[] = $value['entity_id']; -} - -if (empty($userEntities)) { - $userEntities = ['']; -} - -$userTemplates = \SrcCore\models\DatabaseModel::select([ - 'select' => ['distinct t.template_id', 't.template_label', 't.template_content'], - 'table' => ['templates t', 'templates_association ta'], - 'left_join' => ['t.template_id = ta.template_id'], - 'where' => ['t.template_target = \'sendmail\'', 'value_field in (?)'], - 'data' => [$userEntities], - 'order_by' => ['t.template_label asc'] -]); - -//ADD -if ($mode == 'add') { - $content .= '<div style="padding: 10px;">'; - $content .= '<form name="formEmail" id="formEmail" method="post" action="#">'; - $content .= '<input type="hidden" value="'.$identifier.'" name="identifier" id="identifier">'; - if ($formContent == 'messageExchange') { - $content .= '<input type="hidden" value="N" name="is_html" id="is_html">'; - } else { - $content .= '<input type="hidden" value="Y" name="is_html" id="is_html">'; - } - $content .= '<input type="hidden" value="'.$_GET['formContent'].'" name="formContent" id="formContent">'; - $content .= '<table border="0" align="left" width="100%" cellspacing="5" '; - if ($formContent == 'messageExchange') { - $content .= 'style="margin-left: -30px;" '; - } - $content .= '>'; - $content .= '<tr>'; - $content .= '<td align="right" nowrap width="10%"><b>'.ucfirst(_FROM_SHORT).' </b></td><td>'; - - $content .= '<select name="sender_email" id="sender_email">'; - $userEntitiesMails = array(); - - if ($formContent != 'messageExchange') { - if ($core_tools->test_service('use_mail_services', 'sendmail', false)) { - $userEntitiesMails = $sendmail_tools->getAttachedEntitiesMails($_SESSION['user']['UserId']); - } - - $content .= '<option value="'.$_SESSION['user']['Mail'].'" '; - if (empty($userEntitiesMails)) { - $content .= 'selected="selected"'; - } - $content .= '>'.functions::xssafe($_SESSION['user']['FirstName']).' '.functions::xssafe($_SESSION['user']['LastName']).' ('.$_SESSION['user']['Mail'].')</option>'; - foreach ($userEntitiesMails as $key => $value) { - $primaryentity = explode(',', $key); - if ($primaryentity[0] == $_SESSION['user']['primaryentity']['id']) { - $content .= '<option value="'.$key.'" selected="selected" >'.$value.'</option>'; - } else { - $content .= '<option value="'.$key.'" >'.$value.'</option>'; - } - } - } else { - $userEntitiesMails = \Entity\models\EntityModel::getWithUserEntities(['where' => ['user_id = ?'], 'data' => [$_SESSION['user']['UserId']]]); - if (empty($userEntitiesMails)) { - $content .= '<option value="" >'._NO_SENDER.'</option>'; - } else { - foreach ($userEntitiesMails as $value) { - if (!empty($value['business_id'])) { - if ($value['entity_id'] == $_SESSION['user']['primaryentity']['id']) { - $content .= '<option value="'.$value['entity_id'].'" selected="selected" >'.$value['entity_label'].' ('.$value['business_id'].')</option>'; - } else { - $content .= '<option value="'.$value['entity_id'].'" >'.$value['entity_label'].' ('.$value['business_id'].')</option>'; - } - } - } - } - } - - $content .= '</select>'; - $content .= '</td>'; - $content .= '</tr>'; - if ($formContent != 'messageExchange') { - $content .= '<tr>'; - $content .= '<td align="right" >'._EMAIL.'</label></td>'; - $content .= '<td colspan="2"><input type="text" name="email" id="email" value="" class="emailSelect" />'; - $content .= '<div id="adressList" class="autocomplete"></div>'; - $content .= '<script type="text/javascript">addEmailAdress(\'email\', \'adressList\', \'' - .$_SESSION['config']['businessappurl'] - .'index.php?display=true&module=sendmail&page=address_autocompletion\', \'what\', \'2\');</script>'; - $content .= ' <select name="target" id="target">' - .'<option id="target_target_to" value="to">'._SEND_TO_SHORT.'</option>' - .'<option id="target_cc" value="cc">'._COPY_TO_SHORT.'</option>' - .'<option id="target_cci" value="cci">'._COPY_TO_INVISIBLE_SHORT.'</option>' - .'</select>'; - $content .= ' <input type="button" name="add" value=" '._ADD - .' " id="valid" class="button" onclick="updateAdress(\''.$path_to_script - .'&mode=adress\', \'add\', document.getElementById(\'email\').value, ' - .'document.getElementById(\'target\').value, false, \''.(addslashes(_EMAIL_WRONG_FORMAT)).'\');" /> '; - $content .= '</td>'; - $content .= '</tr>'; - } else { - $content .= '<tr>'; - $content .= '<td align="right" >Contact</label></td>'; - $content .= '<td colspan="2"><input type="text" name="user" id="user" style="width:96%" />'; - $content .= '<div id="destUSer" class="autocomplete"></div>'; - $content .= '<script type="text/javascript">addDestUser(\'user\', \'destUSer\', \'index.php?display=true&module=sendmail&page=contact_autocompletion\', \'what\', \'2\');</script>'; - $content .= ' <input type="hidden" id="valid" onclick="updateDestUser(\''.$path_to_script - .'&mode=destUser\', \'add\', document.getElementById(\'user\').value, \'to\', false);" /> '; - $content .= '</td>'; - $content .= '</tr>'; - } - $content .= '<tr>'; - $content .= '<td align="right" nowrap width="10%"><span class="red_asterisk"><i class="fa fa-star"></i></span> <label>' - ._SEND_TO_SHORT.'</label></td>'; - - $exp_user_id = null; - $dest_user_id = null; - $exp_contact_id = null; - $dest_contact_id = null; - $db = new Database(); - $stmt = $db->query('SELECT res_id, category_id, address_id, exp_user_id, dest_user_id, admission_date, exp_contact_id, dest_contact_id - FROM res_letterbox - WHERE (( exp_contact_id is not null - or dest_contact_id is not null - or exp_user_id is not null - or dest_user_id is not null) - and res_id = ?)', array($_SESSION['doc_id'])); - $res = $stmt->fetchObject(); - - $res_id = $res->res_id; - $category_id = $res->category_id; - $address_id = $res->address_id; - $exp_user_id = $res->exp_user_id; - $dest_user_id = $res->dest_user_id; - $admission_date = $res->admission_date; - $exp_contact_id = $res->exp_contact_id; - $dest_contact_id = $res->dest_contact_id; - - if ($res_id != null) { - $stmt = $db->query('SELECT subject FROM res_letterbox WHERE res_id = ?', array($res_id)); - $rawSubject = $stmt->fetchObject(); - $subject = $rawSubject->subject; - } - if ($formContent != 'messageExchange') { - if ($address_id != null) { - $adr = \Contact\models\ContactModel::getById(['select' => ['email'], 'id' => $address_id]); - $adress_mail = $adr['email']; - } elseif ($exp_user_id != null) { - $stmt = $db->query('SELECT mail FROM users WHERE user_id = ?', array($exp_user_id)); - $adr = $stmt->fetchObject(); - $adress_mail = $adr->mail; - } elseif ($dest_user_id != null) { - $stmt = $db->query('SELECT mail FROM users WHERE user_id = ?', array($dest_user_id)); - $adr = $stmt->fetchObject(); - $adress_mail = $adr->mail; - } - } elseif ($address_id != null) { - if ($exp_contact_id != null) { - $contact_id = $exp_contact_id; - } else { - $contact_id = $dest_contact_id; - } - if (!empty($contact_id)) { - $communicationTypeModel = \Contact\models\ContactModel::getContactCommunication(['contactId' => $contact_id]); - $contactInfo = \Contact\models\ContactModel::getByAddressId(['select' => ['external_id'], 'addressId' => $address_id]); - $externalId = (array)json_decode($contactInfo['external_id']); - } - } - if ($adress_mail != null and $_SESSION['user']['UserId'] != $exp_user_id and $_SESSION['user']['UserId'] != $dest_user_id) { - if ($formContent == 'messageExchange') { - $_SESSION['adresses']['to'][$address_id] = $adress_mail; - $onclickfunction = 'updateDestUser'; - $elementToDel = $address_id; - $modeUrl = 'destUser'; - $idToDel = $address_id; - } else { - $_SESSION['adresses']['to'][0] = $adress_mail; - $onclickfunction = 'updateAdress'; - $elementToDel = $adress_mail; - $idToDel = 0; - $modeUrl = 'adress'; - } - $content .= '<td width="90%" colspan="2"><div name="to" id="to" class="emailInput"><div id="loading_to" style="display:none;"></div><div class="email_element" id="0_'.$adress_mail.'">'. - $adress_mail.' <div class="email_delete_button" id="'.$idToDel.'" onclick="'.$onclickfunction.'(\''.$path_to_script - .'&mode='.$modeUrl.'\', \'del\', \''.$elementToDel.'\', \'to\', this.id);" - alt=\"Supprimer\" title=\"Supprimer\">x</div></div></div>' - .'<div id="loading_to" style="display:none;"><i class="fa fa-spinner fa-spin" title="loading..."></div></div></td>'; - } else { - $content .= '<td width="90%" colspan="2"><div name="to" id="to" class="emailInput">' - .'<div id="loading_to" style="display:none;"><i class="fa fa-spinner fa-spin" title="loading..."></div></div></td>'; - } - - $content .= '</tr>'; - - if ($formContent != 'messageExchange') { - $content .= '<tr><td colspan="3"><a href="javascript://" ' - .'onclick="new Effect.toggle(\'tr_cc\', \'blind\', {delay:0.2});' - .'new Effect.toggle(\'tr_cci\', \'blind\', {delay:0.2});">' - ._SHOW_OTHER_COPY_FIELDS.'</a></td></tr>'; - $content .= '<tr id="tr_cc" style="display:none">'; - $content .= '<td align="right" nowrap><label>'._COPY_TO_SHORT.'</label></td>'; - $content .= '<td colspan="2"><div name="cc" id="cc" class="emailInput">' - .'<div id="loading_cc" style="display:none;"><i class="fa fa-spinner fa-spin" title="loading..."></div></div></td>'; - $content .= '</tr>'; - $content .= '<tr id="tr_cci" style="display:none">'; - $content .= '<td align="right" nowrap><label>'._COPY_TO_INVISIBLE_SHORT.'</label></td>'; - $content .= '<td colspan="2"><div name="cci" id="cci" class="emailInput">' - .'<div id="loading_cci" style="display:none;"><i class="fa fa-spinner fa-spin" title="loading..."></div></div></td>'; - $content .= '</tr>'; - $content .= '<tr>'; - } - $content .= '<td align="right" nowrap><span class="red_asterisk"><i class="fa fa-star"></i></span><label> '._EMAIL_OBJECT.' </label></td>'; - - $content .= '<td colspan="2">'; - - if ($category_id == 'outgoing') { - $content .= '<input name="object" id="object" class="emailInput" type="text" value="'.$subject.'" '.$readOnlyObject.'/>'; - } else { - $content .= '<input name="object" id="object" class="emailInput" type="text" value="'._EMAIL_OBJECT_ANSWER.' '.functions::format_date_db($admission_date).'" '.$readOnlyObject.'/>'; - } - - $content .= '</td></tr>'; - $content .= '</table><br />'; - $content .= '<hr />'; - $content .= '<h4 onclick="new Effect.toggle(\'joined_files\', \'blind\', {delay:0.2});' - .'whatIsTheDivStatus(\'joined_files\', \'divStatus_joined_files\');" ' - .'class="categorie" style="width:90%;" onmouseover="this.style.cursor=\'pointer\';">'; - $content .= ' <span id="divStatus_joined_files" style="color:#1C99C5;"><i class="fa fa-plus-square"></i></span> ' - ._JOINED_FILES; - $content .= '</h4>'; - - $all_joined_files = "\n \n"; - $content .= '<div id="joined_files" style="display:none">'; - //Document - $joined_files = $sendmail_tools->getJoinedFiles($collId, $table, $identifier); - if (count($joined_files) > 0) { - $content .= '<br/>'; - $content .= '<div><span style="color:rgb(22, 173, 235);font-weight:bold;">'._DOC.'</span>'; - if ($formContent == 'messageExchange') { - $content .= '<span style="float: right;font-weight:bold">Principal</span>'; - } - $content .= '</div>'; - for ($i = 0; $i < count($joined_files); ++$i) { - //Get data - $id = $joined_files[$i]['id']; - $description = $joined_files[$i]['label']; - $format = $joined_files[$i]['format']; - $format = $joined_files[$i]['format']; - $mime_type = $is->get_mime_type($joined_files[$i]['format']); - $att_type = $joined_files[$i]['format']; - $filesize = $joined_files[$i]['filesize'] / 1024; - ($filesize > 1) ? $filesize = ceil($filesize).' Ko' : $filesize = round($filesize, 2).' Octets'; - //Show data - $version = ''; - $content .= '<table cellspacing="3" id="main_document" style="border-collapse:collapse;width:100%;"><tr>'; - if ($joined_files[$i]['is_version'] === true) { - //Version - $version = ' - '._VERSION.' '.$joined_files[$i]['version']; - //Contents - $content .= '<th style="width:25px;border: dashed 1px grey;border-right:none;vertical-align:middle;" alt="'.$description - .'" title="'.$description - .'"><input type="checkbox" id="join_file_'.$id - .'_V'.$joined_files[$i]['version'].'" name="join_version[]"' - .' class="check" value="' - .$id.'" ></th>' - .'<td style="cursor:pointer;border: dashed 1px grey;border-left:none;padding:5px;text-align:left;"'; - $content .= ' onclick="clickAttachments('.$id.')" '; - $content .= '><strong>'.$description.'</strong> <span style="font-size: 10px;color: grey;">('.$att_type.' - '.$filesize.')</span></</td>'; - } else { - $content .= '<th style="width:25px;border: dashed 1px grey;border-right:none;vertical-align:middle;" alt="'.$description - .'" title="'.$description - .'"><input type="checkbox" id="join_file_'.$id.'" name="join_file[]"' - .' class="check" value="' - .$id.'" ></th>' - .'<td style="cursor:pointer;border: dashed 1px grey;border-left:none;padding:5px;text-align:left;"'; - $content .= ' onclick="clickAttachments('.$id.')" '; - $content .= '><strong>'.$description.'</strong> <span style="font-size: 10px;color: grey;">('.$att_type.' - '.$filesize.')</span></td>'; - } - if ($formContent == 'messageExchange') { - $content .= '<td style="width:1%;text-align:center;width: 8%;margin-right: 2px;vertical-align: middle"><input type=radio name="main_exchange_doc" value="res_letterbox__'.$id.'">'; - $content .= '</td>'; - } - $content .= '</tr></table>'; - $filename = $sendmail_tools->createFilename($description.$version, $format); - $all_joined_files .= $description.': '.$filename.PHP_EOL; - } - } - - //Attachments - if ($core_tools->is_module_loaded('attachments')) { - $attachment_files = $sendmail_tools->getJoinedFiles($collId, $table, $identifier, true); - if (count($attachment_files) > 0) { - $content .= '<br/>'; - $content .= '<div style="color:rgb(22, 173, 235);font-weight:bold;">'._ATTACHMENTS.'</div>'; - $content .= '<table cellspacing="3" id="show_pj_mail" style="border-collapse:collapse;width:100%;">'; - - for ($i = 0; $i < count($attachment_files); ++$i) { - $content .= '<tr style="vertical-align:top;">'; - - //Get data - $id = $attachment_files[$i]['id']; - $isVersion = $attachment_files[$i]['is_version']; - $description = $attachment_files[$i]['label']; - if (strlen($description) > 73) { - $description = substr($description, 0, 70); - $description .= '...'; - } - $format = $attachment_files[$i]['format']; - $mime_type = $is->get_mime_type($attachment_files[$i]['format']); - $att_type = $attachment_files[$i]['format']; - $filesize = $attachment_files[$i]['filesize'] / 1024; - $attachment_type = $_SESSION['attachment_types'][$attachment_files[$i]['attachment_type']]; - $chrono = $attachment_files[$i]['identifier']; - $dest_society = $attachment_files[$i]['society']; - $dest_firstname = $attachment_files[$i]['firstname']; - $dest_lastname = $attachment_files[$i]['lastname']; - ($filesize > 1) ? $filesize = ceil($filesize).' Ko' : $filesize = $filesize.' Octets'; - - if ($isVersion) { - $inputName = 'join_version_attachment[]'; - $mainExchangeDocValue = 'res_version_attachments'; - } else { - $inputName = 'join_attachment[]'; - $mainExchangeDocValue = 'res_attachments'; - } - - $content .= '<th style="width:25px;border: dashed 1px grey;border-right:none;vertical-align:middle;" alt="'.$description - .'" title="'.$description - .'"><input style="margin-left: 3px" type="checkbox" id="join_attachment_'.$i.'" name="'.$inputName.'"' - .' class="check" value="' - .$id.'"'; - - // avec la condition ci-dessous, toutes les réponses signées sont cochées lorsqu'on veut envoyer le courrier par mail - if ($attachment_type == _SIGNED_RESPONSE) { - $content .= ' checked="checked" '; - } - $content .= '/></th>'; - - if (!$attachment_files[$i]['pdf_exist']) { - $content .= '<td style="cursor:pointer;border: dashed 1px grey;border-left:none;padding:5px;"'; - $content .= ' onclick="clickAttachmentsInput('.$i.')" '; - } else { - $content .= '<td style="border: dashed 1px grey;border-left:none;padding:5px;"'; - } - - $content .= '><span style="font-size: 10px;color: rgb(22, 173, 235);">'.$attachment_type.'</span> <span style="font-size: 10px;color: grey;">('.$att_type.' - '.$filesize.')</span><br/><strong>'.$description.'</strong>'; - if ($attachment_files[$i]['pdf_exist'] && $format != 'pdf' && $formContent != 'messageExchange') { - $content .= ' (<input style="margin: 0px" title="envoyer la version PDF" type="checkbox" id="join_attachment_'.$i.'" name="'.$inputName.'"' - .' class="check" value="' - .$id.'#PDF" />version pdf)'; - } - $content .= '<br/>'; - if ($chrono != '') { - $content .= "<span style='font-size: 10px;color: rgb(22, 173, 235);font-style:italic;'>".$chrono.'</span> - '; - } - $content .= "<span style='font-size: 10px;color: grey;font-style:italic;'>".$dest_firstname.' '.$dest_lastname.' '.$dest_society.'</span>'; - $content .= '</td>'; - if ($formContent == 'messageExchange') { - $content .= '<td style="width:1%;text-align:center;width: 8%;margin-right: 2px;vertical-align: middle"><input type=radio name="main_exchange_doc" value="'.$mainExchangeDocValue.'__'.$id.'">'; - $content .= '</td>'; - } - - $content .= '</tr>'; - - $filename = $sendmail_tools->createFilename($description, $format); - } - $content .= '</table>'; - } - } - //Notes - if ($core_tools->is_module_loaded('notes')) { - require_once 'modules'.DIRECTORY_SEPARATOR.'notes'.DIRECTORY_SEPARATOR - .'class'.DIRECTORY_SEPARATOR - .'class_modules_tools.php'; - $notes_tools = new notes(); - $user_notes = $notes_tools->getUserNotes($identifier, $collId); - if (count($user_notes) > 0) { - $content .= '<br/>'; - $content .= '<div style="color:rgb(22, 173, 235);font-weight:bold;">'._NOTES.'</div>'; - $content .= '<table cellspacing="3" style="border-collapse:collapse;width:100%;">'; - for ($i = 0; $i < count($user_notes); ++$i) { - $content .= '<tr style="vertical-align:top;">'; - - //Get data - $id = $user_notes[$i]['id']; - $noteShort = functions::xssafe($request->cut_string($user_notes[$i]['label'], 50)); - $note = functions::xssafe($user_notes[$i]['label']); - $userArray = $users_tools->get_user($user_notes[$i]['author']); - $date = $request->dateformat($user_notes[$i]['date']); - - $content .= '<th style="width:25px;border: dashed 1px grey;border-right:none;vertical-align:middle;" alt="'.$note - .'" title="'.$note - .'"><input type="checkbox" id="note_'.$id.'" name="notes[]"' - .' class="check" value="' - .$id.'"></th><td style="cursor:pointer;border: dashed 1px grey;border-left:none;padding:5px;"'; - $content .= ' onclick="clickAttachmentsNotes('.$id.')" '; - $content .= 'title="'.$note.'"><span style="font-size: 10px;color: rgb(22, 173, 235);">'.$userArray['firstname'].' '.$userArray['lastname'].' </span><span style="font-size: 10px;color: grey;">'.$date.'</span><br/>' - .'<strong>'.$noteShort.'</strong></td>'; - - $content .= '</tr>'; - } - - $content .= '</table>'; - } - } - - $content .= '</div>'; - $content .= '<hr />'; - - $content .= '<tr>'; - $content .= '<td><label style="padding-right:10px">'._Label_ADD_TEMPLATE_MAIL.'</label></td>'; - $content .= '<select name="templateMail" id="templateMail" style="width:200px" ' - .'onchange="addTemplateToEmail($(\'templateMail\').value, \'' - .$_SESSION['config']['businessappurl'].'index.php?display=true' - .'&module=templates&page=templates_ajax_content_for_mails&id='.$_REQUEST['identifier'].'\');">'; - - $content .= '<option value="">'._ADD_TEMPLATE_MAIL.'</option>'; - - foreach ($userTemplates as $result) { - $content .= "<option value='".$result['template_id']."'>".$result['template_label'].'</option>'; - } - $content .= '</select>'; - $content .= '<label style="margin-left: 15%;padding-right:10px">'.'Signature : '.'</label>'; - $emailSignaturesClass = new EmailSignatures(); - - $mailSignatures = $emailSignaturesClass->getForCurrentUser(); - $content .= '<script type="text/javascript">var mailSignaturesJS = '.json_encode($mailSignatures).';</script>'; - $content .= '<select style="width: 20%;" name="selectSignatures" id ="selectSignatures" onchange="changeSignature(this.options[this.selectedIndex], mailSignaturesJS)">'; - $content .= '<option value="none" data-nb="-1" selected >Sans signature</option>'; - for ($i = 0; $mailSignatures[$i]; ++$i) { - $content .= '<option value="'.$mailSignatures[$i]['id'].'" data-nb="'.$i.'">'.$mailSignatures[$i]['title'].'</option>'; - } - $content .= '</select>'; - $content .= '</tr></br></br>'; - - //Body - - if ($formContent != 'messageExchange') { - $displayHtml = 'block'; - $displayRaw = 'none'; - $textAreaMode = 'html'; - } else { - $displayHtml = 'none'; - $displayRaw = 'block'; - $textAreaMode = 'raw'; - } - - $content .= '<script type="text/javascript">var mode="'.$textAreaMode.'";</script>'; - - //Show/hide html VS raw mode - if ($formContent != 'messageExchange') { - $content .= '<a href="javascript://" onclick="switchMode(\'show\');"><em>'._HTML_OR_RAW.'</em></a>'; - } - - //load tinyMCE editor - ob_start(); - include 'modules/sendmail/load_editor.php'; - $content .= ob_get_clean(); - ob_end_flush(); - $content .= '<div id="html_mode" style="display:'.$displayHtml.'">'; - $content .= '<textarea name="body_from_html" id="body_from_html" style="width:100%" rows="15" cols="60">' - ._DEFAULT_BODY.$sendmail_tools->rawToHtml($all_joined_files).'</textarea>'; - $content .= '</div>'; - - //raw text arera - $content .= '<div id="raw_mode" style="display:'.$displayRaw.'">'; - $content .= '<textarea name="body_from_raw" id="body_from_raw" class="emailInput" cols="60" rows="14">' - ._DEFAULT_BODY.$sendmail_tools->htmlToRaw($all_joined_files).'</textarea>'; - $content .= '</div>'; - - //Buttons - $content .= '<hr style="margin-top:2px;" />'; - $content .= '<div align="center">'; - //Send - $content .= ' <input type="button" name="valid" value=" '._SEND_EMAIL - .' " id="valid" class="button" onclick="validEmailForm(\'' - .$path_to_script.'&mode=added&for=send\', \'formEmail\');" /> '; - if ($formContent != 'messageExchange') { - //Save - $content .= ' <input type="button" name="valid" value=" '._SAVE_EMAIL - .' " id="valid" class="button" onclick="validEmailForm(\'' - .$path_to_script.'&mode=added&for=save\', \'formEmail\');" /> '; - } - //Cancel - $content .= '<input type="button" name="cancel" id="cancel" class="button" value="' - ._CANCEL.'" onclick="window.parent.destroyModal(\'form_email\');"/>'; - $content .= '</div>'; - $content .= '</form>'; - $content .= '</div>'; - -//UPDATE OR TRANSFER -} elseif ($mode == 'up' || $mode == 'transfer') { - if (isset($_REQUEST['id']) && !empty($_REQUEST['id'])) { - $id = $_REQUEST['id']; - $user = \User\models\UserModel::getByLogin(['login' => $_SESSION['user']['UserId'], 'select' => ['id']]); - $emailArray = []; - - //Check if mail exists - if (count($emailArray) > 0) { - $content .= '<div>'; - $content .= '<form name="formEmail" id="formEmail" method="post" action="#">'; - $content .= '<input type="hidden" value="'.$identifier.'" name="identifier" id="identifier">'; - $content .= '<input type="hidden" value="'.$id.'" name="id" id="id">'; - $content .= '<input type="hidden" value="'.$emailArray['isHtml'].'" name="is_html" id="is_html">'; - $content .= '<table border="0" align="left" width="100%" cellspacing="5">'; - $content .= '<tr>'; - $content .= '<td align="right" nowrap width="10%"><b>'.ucfirst(_FROM_SHORT).' </b></td><td>'; - - $userEntitiesMails = array(); - - if ($core_tools->test_service('use_mail_services', 'sendmail', false)) { - $userEntitiesMails = $sendmail_tools->getAttachedEntitiesMails($_SESSION['user']['UserId']); - } - - $content .= '<select name="sender_email" id="sender_email"> - <option value="'.$_SESSION['user']['Mail'].'" '; - - if ($emailArray['sender_email'] == $_SESSION['user']['Mail']) { - $content .= ' selected="selected" '; - } - - $content .= '>'.functions::xssafe($_SESSION['user']['FirstName']).' '.functions::xssafe($_SESSION['user']['LastName']).' ('.$_SESSION['user']['Mail'].')</option>'; - foreach ($userEntitiesMails as $key => $value) { - $content .= '<option value="'.$key.'" '; - - if ($emailArray['sender_email'] == $key) { - $content .= ' selected="selected" '; - } - $content .= '>'.$value.'</option>'; - } - $content .= '</select>'; - $content .= '</td>'; - - $content .= '</tr>'; - $content .= '<tr>'; - $content .= '<td align="right">'._EMAIL.'</label></td>'; - $content .= '<td colspan="2"><input type="text" name="email" id="email" value="" class="emailSelect" />'; - $content .= '<div id="adressList" class="autocomplete"></div>'; - $content .= '<script type="text/javascript">addEmailAdress(\'email\', \'adressList\', \'' - .$_SESSION['config']['businessappurl'] - .'index.php?display=true&module=sendmail&page=address_autocompletion\', \'what\', \'2\');</script> '; - $content .= '<select name="target" id="target">' - .'<option id="target_target_to" value="to">'._SEND_TO_SHORT.'</option>' - .'<option id="target_cc" value="cc">'._COPY_TO_SHORT.'</option>' - .'<option id="target_cci" value="cci">'._COPY_TO_INVISIBLE_SHORT.'</option>' - .'</select>'; - $content .= ' <input type="button" name="add" value=" '._ADD - .' " id="valid" class="button" onclick="updateAdress(\''.$path_to_script - .'&mode=adress\', \'add\', document.getElementById(\'email\').value, ' - .'document.getElementById(\'target\').value, false, \''.(addslashes(_EMAIL_WRONG_FORMAT)).'\');" /> '; - $content .= '</td>'; - $content .= '</tr>'; - //To - if (count($emailArray['to']) > 0) { - $_SESSION['adresses']['to'] = array(); - $_SESSION['adresses']['to'] = $emailArray['to']; - } - $content .= '<tr>'; - $content .= '<td align="right" nowrap width="10%"><span class="red_asterisk"><i class="fa fa-star"></i></span> <label>' - ._SEND_TO_SHORT.'</label></td>'; - $content .= '<td width="90%" colspan="2"><div name="to" id="to" class="emailInput">'; - $content .= $sendmail_tools->updateAdressInputField($path_to_script, $_SESSION['adresses'], 'to'); - $content .= '</div></td>'; - $content .= '</tr>'; - //CC - if (count($emailArray['cc']) > 0) { - $_SESSION['adresses']['cc'] = array(); - $_SESSION['adresses']['cc'] = $emailArray['cc']; - } - $content .= '<tr><td colspan="3"><a href="javascript://" ' - .'onclick="new Effect.toggle(\'tr_cc\', \'blind\', {delay:0.2});' - .'new Effect.toggle(\'tr_cci\', \'blind\', {delay:0.2});">' - ._SHOW_OTHER_COPY_FIELDS.'</a></td></tr>'; - $content .= '<tr id="tr_cc" style="display:none">'; - $content .= '<td align="right" nowrap><label>'._COPY_TO_SHORT.'</label></td>'; - $content .= '<td colspan="2"><div name="cc" id="cc" class="emailInput">'; - $content .= $sendmail_tools->updateAdressInputField($path_to_script, $_SESSION['adresses'], 'cc'); - $content .= '</div></td>'; - $content .= '</tr>'; - //CCI - if (count($emailArray['cci']) > 0) { - $_SESSION['adresses']['cci'] = array(); - $_SESSION['adresses']['cci'] = $emailArray['cci']; - } - $content .= '<tr id="tr_cci" style="display:none">'; - $content .= '<td align="right" nowrap><label>'._COPY_TO_INVISIBLE_SHORT.'</label></td>'; - $content .= '<td colspan="2"><div name="cci" id="cci" class="emailInput">'; - $content .= $sendmail_tools->updateAdressInputField($path_to_script, $_SESSION['adresses'], 'cci'); - $content .= '</div></td>'; - $content .= '</tr>'; - //Object - $content .= '<tr>'; - $content .= '<td align="right" nowrap><span class="red_asterisk"><i class="fa fa-star"></i></span> <label>'._EMAIL_OBJECT.' </label></td>'; - $content .= '<td colspan="2"><input name="object" id="object" class="emailInput" type="text" value="' - .(($mode == 'transfer') ? 'Fw: '.$emailArray['object'] : $emailArray['object']).'" /></td>'; - $content .= '</tr>'; - $content .= '</table><br />'; - $content .= '<hr />'; - //Show hide joined info - $content .= '<h4 onclick="new Effect.toggle(\'joined_files\', \'blind\', {delay:0.2});' - .'whatIsTheDivStatus(\'joined_files\', \'divStatus_joined_files\');" ' - .'class="categorie" style="width:90%;" onmouseover="this.style.cursor=\'pointer\';">'; - $content .= ' <span id="divStatus_joined_files" style="color:#1C99C5;"><i class="fa fa-plus-square"></i></span> ' - ._JOINED_FILES; - $content .= '</h4>'; - - $content .= '<div id="joined_files" style="display:none">'; - //Document - $joined_files = $sendmail_tools->getJoinedFiles($collId, $table, $identifier); - if (count($joined_files) > 0) { - $content .= '<br/>'; - $content .= '<div style="color:rgb(22, 173, 235);font-weight:bold;">'._DOC.'</div>'; - for ($i = 0; $i < count($joined_files); ++$i) { - //Get data - $id = $joined_files[$i]['id']; - $description = $joined_files[$i]['label']; - $format = $joined_files[$i]['format']; - $format = $joined_files[$i]['format']; - $mime_type = $is->get_mime_type($joined_files[$i]['format']); - $att_type = $joined_files[$i]['format']; - $filesize = $joined_files[$i]['filesize'] / 1024; - ($filesize > 1) ? $filesize = ceil($filesize).' Ko' : $filesize = round($filesize, 2).' Octets'; - - //Show data - $version = ''; - $content .= '<table cellspacing="3" id="main_document" style="border-collapse:collapse;width:100%;"><tr>'; - if ($joined_files[$i]['is_version'] === true) { - //Version - $version = ' - '._VERSION.' '.$joined_files[$i]['version']; - //Contents - $content .= '<th style="width:25px;border: dashed 1px grey;border-right:none;vertical-align:middle;" alt="'.$description - .'" title="'.$description - .'"><input type="checkbox" id="join_file_'.$id - .'_V'.$joined_files[$i]['version'].'" name="join_version[]"'; - //Checked? - (in_array($id, $emailArray['version'])) ? $checked = ' checked="checked"' : $checked = ''; - $content .= ' '.$checked - .' class="check" value="' - .$id.'" ></th>' - .'<td style="cursor:pointer;border: dashed 1px grey;border-left:none;padding:5px;text-align:left;"'; - $content .= ' onclick="clickAttachments('.$id.')" '; - $content .= '><strong>'.$description.'</strong> <span style="font-size: 10px;color: grey;">('.$att_type.' - '.$filesize.')</span></</td>'; - } else { - $content .= '<th style="width:25px;border: dashed 1px grey;border-right:none;vertical-align:middle;" alt="'.$description - .'" title="'.$description - .'"><input type="checkbox" id="join_file_'.$id.'" name="join_file[]"'; - ($emailArray['resMasterAttached'] == 'Y') ? $checked = ' checked="checked"' : $checked = ''; - $content .= ' '.$checked - .' class="check" value="' - .$id.'" ></th>' - .'<td style="cursor:pointer;border: dashed 1px grey;border-left:none;padding:5px;text-align:left;"'; - $content .= ' onclick="clickAttachments('.$id.')" '; - $content .= '><strong>'.$description.'</strong> <span style="font-size: 10px;color: grey;">('.$att_type.' - '.$filesize.')</span></td>'; - } - $content .= '</tr></table>'; - //Filename - $filename = $sendmail_tools->createFilename($description.$version, $format); - $all_joined_files .= $description.': '.$filename.PHP_EOL; - } - } - - //Attachments - if ($core_tools->is_module_loaded('attachments')) { - $attachment_files = $sendmail_tools->getJoinedFiles($collId, $table, $identifier, true); - if (count($attachment_files) > 0) { - $content .= '<br/>'; - $content .= '<div style="color:rgb(22, 173, 235);font-weight:bold;">'._ATTACHMENTS.'</div>'; - $content .= '<table cellspacing="3" id="show_pj_mail" style="border-collapse:collapse;width:100%;">'; - for ($i = 0; $i < count($attachment_files); ++$i) { - $content .= '<tr style="vertical-align:top;">'; - - //Get data - $id = $attachment_files[$i]['id']; - $isVersion = $attachment_files[$i]['is_version']; - $id_converted = $attachment_files[$i]['converted_pdf']; - $description = $attachment_files[$i]['label']; - if (strlen($description) > 73) { - $description = substr($description, 0, 70); - $description .= '...'; - } - $format = $attachment_files[$i]['format']; - $mime_type = $is->get_mime_type($attachment_files[$i]['format']); - $att_type = $attachment_files[$i]['format']; - $filesize = $attachment_files[$i]['filesize'] / 1024; - $attachment_type = $_SESSION['attachment_types'][$attachment_files[$i]['attachment_type']]; - $chrono = $attachment_files[$i]['identifier']; - $dest_society = $attachment_files[$i]['society']; - $dest_firstname = $attachment_files[$i]['firstname']; - $dest_lastname = $attachment_files[$i]['lastname']; - ($filesize > 1) ? $filesize = ceil($filesize).' Ko' : $filesize = $filesize.' Octets'; - - if ($isVersion) { - $inputName = 'join_version_attachment[]'; - } else { - $inputName = 'join_attachment[]'; - } - - $content .= '<th style="width:25px;border: dashed 1px grey;border-right:none;vertical-align:middle;" alt="'.$description - .'" title="'.$description - .'"><input style="margin-left: 3px" type="checkbox" id="join_attachment_'.$id.'" name="'.$inputName.'"'; - - $checked = ''; - if (($isVersion && in_array($id, $emailArray['attachments_version'])) || (!$isVersion && in_array($id, $emailArray['attachments']))) { - $checked = ' checked="checked"'; - } - - $content .= ' '.$checked - .' class="check" value="' - .$id.'"'; - - //avec la condition ci-dessous, toutes les réponses signées sont cochées lorsqu'on veut envoyer le courrier par mail - if ($attachment_type == _SIGNED_RESPONSE && $mode == 'transfer') { - $content .= ' checked="checked" '; - } - $content .= '/></th>'; - - if (!$id_converted) { - $content .= '<td style="cursor:pointer;border: dashed 1px grey;border-left:none;padding:5px;"'; - $content .= ' onclick="clickAttachmentsInput('.$id.')" '; - } else { - $content .= '<td style="border: dashed 1px grey;border-left:none;padding:5px;"'; - } - - $content .= '><span style="font-size: 10px;color: rgb(22, 173, 235);">'.$attachment_type.'</span> <span style="font-size: 10px;color: grey;">('.$att_type.' - '.$filesize.')</span><br/><strong>'.$description.'</strong>'; - if ($id_converted) { - $content .= ' (<input style="margin: 0px" title="envoyer la version PDF" type="checkbox" id="join_attachment_'.$id_converted.'" name="join_attachment[]"' - .' class="check"'; - - (in_array($id_converted, $emailArray['attachments'])) ? $checked = ' checked="checked"' : $checked = ''; - $content .= ' '.$checked - .' value="' - .$id_converted.'" />version pdf)'; - } - $content .= "<br/><span style='font-size: 10px;color: rgb(22, 173, 235);font-style:italic;'>"; - if ($chrono != '') { - $content .= "<span style='font-size: 10px;color: rgb(22, 173, 235);font-style:italic;'>".$chrono.'</span> - '; - } - $content .= "<span style='font-size: 10px;color: grey;font-style:italic;'>".$dest_firstname.' '.$dest_lastname.' '.$dest_society.'</span>'; - $content .= '</td>'; - - $content .= '</tr>'; - - //Filename - $filename = $sendmail_tools->createFilename($description, $format); - $all_joined_files .= $description.': '.$filename.PHP_EOL; - } - $content .= '</table>'; - } - } - - //Notes - if ($core_tools->is_module_loaded('notes')) { - require_once 'modules'.DIRECTORY_SEPARATOR.'notes'.DIRECTORY_SEPARATOR - .'class'.DIRECTORY_SEPARATOR - .'class_modules_tools.php'; - $notes_tools = new notes(); - $user_notes = $notes_tools->getUserNotes($identifier, $collId); - if (count($user_notes) > 0) { - $content .= '<br/>'; - $content .= '<div style="color:rgb(22, 173, 235);font-weight:bold;">'._NOTES.'</div>'; - $content .= '<table cellspacing="3" style="border-collapse:collapse;width:100%;">'; - for ($i = 0; $i < count($user_notes); ++$i) { - $content .= '<tr style="vertical-align:top;">'; - - //Get data - $id = $user_notes[$i]['id']; - $noteShort = functions::xssafe($request->cut_string($user_notes[$i]['label'], 50)); - $note = functions::xssafe($user_notes[$i]['label']); - $userArray = $users_tools->get_user($user_notes[$i]['author']); - $date = $request->dateformat($user_notes[$i]['date']); - - $content .= '<th style="width:25px;border: dashed 1px grey;border-right:none;vertical-align:middle;" alt="'.$note - .'" title="'.$note - .'"><input type="checkbox" id="note_'.$id.'" name="notes[]"'; - - if (!empty($emailArray['notes']) && in_array($id, $emailArray['notes'])) { - $checked = ' checked="checked"' ; - } else { - $checked = ''; - } - - $content .= ' '.$checked - .' class="check" value="' - .$id.'"></th><td style="cursor:pointer;border: dashed 1px grey;border-left:none;padding:5px;"'; - $content .= ' onclick="clickAttachmentsNotes('.$id.')" '; - $content .= 'title="'.$note.'"><span style="font-size: 10px;color: rgb(22, 173, 235);">'.$userArray['firstname'].' '.$userArray['lastname'].' </span><span style="font-size: 10px;color: grey;">'.$date.'</span><br/>' - .'<strong>'.$noteShort.'</strong></td>'; - - $content .= '</tr>'; - } - - $content .= '</table>'; - //Filename - $filename = 'notes_'.$identifier.'_'.date('dmY').'.html'; - $all_joined_files .= _NOTES.': '.$filename.PHP_EOL; - } - } - $content .= '</div>'; - $content .= '<hr />'; - - $content .= '<tr>'; - $content .= '<td><label style="padding-right:10px">'._Label_ADD_TEMPLATE_MAIL.'</label></td>'; - $content .= '<select name="templateMail" id="templateMail" style="width:200px" ' - .'onchange="addTemplateToEmail($(\'templateMail\').value, \'' - .$_SESSION['config']['businessappurl'].'index.php?display=true' - .'&module=templates&page=templates_ajax_content_for_mails&id='.$_REQUEST['identifier'].'\');">'; - - $content .= '<option value="">'._ADD_TEMPLATE_MAIL.'</option>'; - - foreach ($userTemplates as $result) { - $content .= "<option value='".$result['template_id']."'>".$result['template_label'].'</option>'; - } - $content .= '</select>'; - $content .= '<label style="margin-left: 15%;padding-right:10px">'.'Signature de mail'.'</label>'; - $emailSignaturesClass = new EmailSignatures(); - - $mailSignatures = $emailSignaturesClass->getForCurrentUser(); - $content .= '<script type="text/javascript">var mailSignaturesJS = '.json_encode($mailSignatures).';</script>'; - $content .= '<select style="width: 20%;" name="selectSignatures" id ="selectSignatures" onchange="changeSignature(this.options[this.selectedIndex], mailSignaturesJS)">'; - $content .= '<option value="none" data-nb="-1" selected >Sans signature</option>'; - for ($i = 0; $mailSignatures[$i]; ++$i) { - $content .= '<option value="'.$mailSignatures[$i]['id'].'" data-nb="'.$i.'">'.$mailSignatures[$i]['title'].'</option>'; - } - $content .= '</select>'; - $content .= '</tr></br></br>'; - - //Body - if ($emailArray['isHtml'] == 'Y') { - $displayRaw = 'none'; - $displayHtml = 'block'; - $textAreaMode = 'html'; - } else { - $displayRaw = 'block'; - $displayHtml = 'none'; - $textAreaMode = 'raw'; - } - $content .= '<script type="text/javascript">var mode="'.$textAreaMode.'";</script>'; - //Show/hide html VS raw mode - $content .= '<a href="javascript://" onclick="switchMode(\'show\');"><em>'._HTML_OR_RAW.'</em></a>'; - - //load tinyMCE editor - ob_start(); - include 'modules/sendmail/load_editor.php'; - $content .= ob_get_clean(); - ob_end_flush(); - $content .= '<div id="html_mode" style="display:'.$displayHtml.'">'; - $content .= '<textarea name="body_from_html" id="body_from_html" style="width:100%" rows="15" cols="60">' - .$sendmail_tools->rawToHtml($emailArray['body']).'</textarea>'; - $content .= '</div>'; - - //raw textarera - $content .= '<div id="raw_mode" style="display:'.$displayRaw.'">'; - $content .= '<textarea name="body_from_raw" id="body_from_raw" class="emailInput" cols="60" rows="14">' - .$sendmail_tools->htmlToRaw($emailArray['body']).'</textarea>'; - $content .= '</div>'; - - //Buttons - $content .= '<hr style="margin-top:5px;margin-bottom:2px;" />'; - $content .= '<div align="center">'; - - if ($emailArray['status'] != 'SENT') { - //Send button - $content .= ' <input type="button" name="valid" value=" '._SEND_EMAIL - .' " id="valid" class="button" onclick="validEmailForm(\'' - .$path_to_script.'&mode=updated&for=send\', \'formEmail\');" /> '; - //Save button - $content .= ' <input type="button" name="valid" value=" '._SAVE_EMAIL - .' " id="valid" class="button" onclick="validEmailForm(\'' - .$path_to_script.'&mode=updated&for=save\', \'formEmail\');" /> '; - //Delete button - $content .= ' <input type="button" name="valid" value=" '._REMOVE_EMAIL - .' " id="valid" class="button" onclick="if(confirm(\'' - ._REALLY_DELETE.': '.$request->cut_string($emailArray['object'], 50) - .' ?\')) validEmailForm(\''.$path_to_script - .'&mode=del\', \'formEmail\');" /> '; - } else { - //Re-send button - $content .= ' <input type="button" name="valid" value=" '._RESEND_EMAIL - .' " id="valid" class="button" onclick="validEmailForm(\'' - .$path_to_script.'&mode=added&for=send\', \'formEmail\');" /> '; - //Save copy button - $content .= ' <input type="button" name="valid" value=" '._SAVE_COPY_EMAIL - .' " id="valid" class="button" onclick="validEmailForm(\'' - .$path_to_script.'&mode=added&for=save\', \'formEmail\');" /> '; - } - - //Cancel button - $content .= '<input type="button" name="cancel" id="cancel" class="button" value="' - ._CANCEL.'" onclick="window.parent.destroyModal(\'form_email\');"/>'; - $content .= '</div>'; - $content .= '</form>'; - $content .= '</div>'; - } else { - $content = $request->wash_html($id.': '._EMAIL_DONT_EXIST.'!', 'NONE'); - } - } else { - $content = $request->wash_html(_ID.' '._IS_EMPTY.'!', 'NONE'); - } -} elseif ($mode == 'read') { - if (isset($_REQUEST['id']) && !empty($_REQUEST['id'])) { - $id = $_REQUEST['id']; - if ($formContent == 'messageExchange') { - } else { - $user = \User\models\UserModel::getByLogin(['login' => $_SESSION['user']['UserId'], 'select' => ['id']]); - $emailArray = []; - } - - //Check if mail exists - if (count($emailArray) > 0 && $emailArray['type'] != 'ArchiveTransferReplySent') { - $content .= '<div>'; - $content .= '<table border="0" align="left" width="100%" cellspacing="5">'; - $content .= '<tr>'; - - $content .= '<td width="10%" align="right" nowrap><b>'.ucfirst(_FROM_SHORT).' </b></td><td width="90%" colspan="2">'; - - if ($formContent == 'messageExchange') { - $content .= $emailArray['from']; - } else { - $usermailArray = $users_tools->get_user($emailArray['userId']); - $mailEntities = $sendmail_tools->getAttachedEntitiesMails(); - - if (in_array($emailArray['sender_email'], array_keys($mailEntities))) { - $content .= $mailEntities[$emailArray['sender_email']]; - } elseif ($emailArray['sender_email'] == $usermailArray['mail']) { - $content .= $usermailArray['firstname'].' '.$usermailArray['lastname'].' ('.$emailArray['sender_email'].')'; - } else { - $content .= $sendmail_tools->explodeSenderEmail($emailArray['sender_email']); - } - } - - $content .= '<br/></td>'; - $content .= '</tr>'; - //To - if (!empty($emailArray['to']) && count($emailArray['to']) > 0) { - $_SESSION['adresses']['to'] = array(); - $_SESSION['adresses']['to'] = $emailArray['to']; - } - $content .= '<tr>'; - $content .= '<td align="right" nowrap width="10%"><span class="red_asterisk"><i class="fa fa-star"></i></span> <label>' - ._SEND_TO_SHORT.'</label></td>'; - $content .= '<td width="90%" colspan="2"><div name="to" id="to" class="emailInput">'; - if ($formContent == 'messageExchange') { - $content .= $emailArray['contactInfo']; - } else { - $content .= $sendmail_tools->updateAdressInputField($path_to_script, $_SESSION['adresses'], 'to', true); - } - $content .= '</div></td>'; - $content .= '</tr>'; - if ($formContent == 'messageExchange') { - $content .= '<tr><td align="right" nowrap width="10%"></td><td width="90%">'._COMMUNICATION_TYPE.' : '.$emailArray['communicationType'].'</td></tr>'; - } else { - //CC - if (!empty($emailArray['cc']) && count($emailArray['cc']) > 0) { - $_SESSION['adresses']['cc'] = array(); - $_SESSION['adresses']['cc'] = $emailArray['cc']; - } - $content .= '<tr>'; - $content .= '<td align="right" nowrap><label>'._COPY_TO_SHORT.'</label></td>'; - $content .= '<td colspan="2"><div name="cc" id="cc" class="emailInput">'; - $content .= $sendmail_tools->updateAdressInputField($path_to_script, $_SESSION['adresses'], 'cc', true); - $content .= '</div></td>'; - $content .= '</tr>'; - //CCI - if (!empty($emailArray['cci']) && count($emailArray['cci']) > 0) { - $_SESSION['adresses']['cci'] = array(); - $_SESSION['adresses']['cci'] = $emailArray['cci']; - } - $content .= '<tr>'; - $content .= '<td align="right" nowrap><label>'._COPY_TO_INVISIBLE_SHORT.'</label></td>'; - $content .= '<td colspan="2"><div name="cci" id="cci" class="emailInput">'; - $content .= $sendmail_tools->updateAdressInputField($path_to_script, $_SESSION['adresses'], 'cci', true); - $content .= '</div></td>'; - $content .= '</tr>'; - } - //Object - $content .= '<tr>'; - $content .= '<td align="right" nowrap><span class="red_asterisk"><i class="fa fa-star"></i></span> <label>'._EMAIL_OBJECT.' </label></td>'; - $content .= '<td colspan="2"><div name="object" id="object" class="emailInput">' - .$emailArray['object'].'</div></td>'; - $content .= '</tr>'; - if ($formContent == 'messageExchange') { - $content .= '<tr><td width="10%" align="right" nowrap>'._IDENTIFIER.'</td><td><div class="emailInput">'.$emailArray['reference'].'</div></td></tr>'; - } - $content .= '</table><br />'; - - $content .= '<hr />'; - //Show hide joined info - $content .= '<h4 onclick="new Effect.toggle(\'joined_files\', \'blind\', {delay:0.2});' - .'whatIsTheDivStatus(\'joined_files\', \'divStatus_joined_files\');" ' - .'class="categorie" style="width:90%;" onmouseover="this.style.cursor=\'pointer\';">'; - $content .= ' <span id="divStatus_joined_files" style="color:#1C99C5;"><i class="fa fa-plus-square"></i></span> ' - ._JOINED_FILES; - $content .= '</h4>'; - - $content .= '<div id="joined_files" style="display:none">'; - //Document - $joined_files = $sendmail_tools->getJoinedFiles($collId, $table, $identifier); - if (count($joined_files) > 0) { - $content .= '<br/>'; - $content .= '<div><span style="color:rgb(22, 173, 235);font-weight:bold;">'._DOC.'</span>'; - if ($formContent == 'messageExchange') { - $content .= '<span style="float: right;font-weight:bold">Principal</span>'; - } - $content .= '</div>'; - for ($i = 0; $i < count($joined_files); ++$i) { - //Get data - $id = $joined_files[$i]['id']; - $description = $joined_files[$i]['label']; - $format = $joined_files[$i]['format']; - $format = $joined_files[$i]['format']; - $mime_type = $is->get_mime_type($joined_files[$i]['format']); - $att_type = $joined_files[$i]['format']; - $filesize = $joined_files[$i]['filesize'] / 1024; - ($filesize > 1) ? $filesize = ceil($filesize).' Ko' : $filesize = round($filesize, 2).' Octets'; - - //Show data - $version = ''; - $content .= '<table cellspacing="3" id="main_document" style="border-collapse:collapse;width:100%;"><tr>'; - if ($joined_files[$i]['is_version'] === true) { - //Version - $version = ' - '._VERSION.' '.$joined_files[$i]['version']; - //Contents - $content .= '<th style="width:25px;border: dashed 1px grey;border-right:none;vertical-align:middle;" alt="'.$description - .'" title="'.$description - .'"><input type="checkbox" disabled="disabled" id="join_file_'.$id - .'_V'.$joined_files[$i]['version'].'" name="join_version[]"'; - //Checked? - (in_array($id, $emailArray['version'])) ? $checked = ' checked="checked"' : $checked = ''; - $content .= ' '.$checked - .' class="check" value="' - .$id.'" ></th>' - .'<td style="cursor:pointer;border: dashed 1px grey;border-left:none;padding:5px;text-align:left;"'; - $content .= ' onclick="clickAttachments('.$id.')" '; - $content .= '><strong>'.$description.'</strong> <span style="font-size: 10px;color: grey;">('.$att_type.' - '.$filesize.')</span></</td>'; - } else { - $content .= '<th style="width:25px;border: dashed 1px grey;border-right:none;vertical-align:middle;" alt="'.$description - .'" title="'.$description - .'"><input type="checkbox" disabled="disabled" id="join_file_'.$id.'" name="join_file[]"'; - ($emailArray['resMasterAttached'] == 'Y') ? $checked = ' checked="checked"' : $checked = ''; - $content .= ' '.$checked - .' class="check" value="' - .$id.'" ></th>' - .'<td style="cursor:pointer;border: dashed 1px grey;border-left:none;padding:5px;text-align:left;"'; - $content .= ' onclick="clickAttachments('.$id.')" '; - $content .= '><strong>'.$description.'</strong> <span style="font-size: 10px;color: grey;">('.$att_type.' - '.$filesize.')</span></td>'; - } - if ($formContent == 'messageExchange') { - $content .= '<td style="width:1%;text-align:center;width: 8%;margin-right: 2px;vertical-align: middle"><input type=radio name="main_exchange_doc" disabled '; - if ($emailArray['disposition']->tablename == 'res_letterbox' && $emailArray['disposition']->res_id == $id) { - $content .= ' checked '; - } - $content .= '></td>'; - } - $content .= '</tr></table>'; - //Filename - $filename = $sendmail_tools->createFilename($description.$version, $format); - $all_joined_files .= $description.': '.$filename.PHP_EOL; - } - } - - //Attachments - if ($core_tools->is_module_loaded('attachments')) { - $attachment_files = $sendmail_tools->getJoinedFiles($collId, $table, $identifier, true); - if (count($attachment_files) > 0) { - $content .= '<br/>'; - $content .= '<div style="color:rgb(22, 173, 235);font-weight:bold;">'._ATTACHMENTS.'</div>'; - $content .= '<table cellspacing="3" id="show_pj_mail" style="border-collapse:collapse;width:100%;">'; - for ($i = 0; $i < count($attachment_files); ++$i) { - $content .= '<tr style="vertical-align:top;">'; - - //Get data - $id = $attachment_files[$i]['id']; - $isVersion = $attachment_files[$i]['is_version']; - $id_converted = $attachment_files[$i]['converted_pdf']; - $description = $attachment_files[$i]['label']; - if (strlen($description) > 73) { - $description = substr($description, 0, 70); - $description .= '...'; - } - $format = $attachment_files[$i]['format']; - $mime_type = $is->get_mime_type($attachment_files[$i]['format']); - $att_type = $attachment_files[$i]['format']; - $filesize = $attachment_files[$i]['filesize'] / 1024; - $attachment_type = $_SESSION['attachment_types'][$attachment_files[$i]['attachment_type']]; - $chrono = $attachment_files[$i]['identifier']; - $dest_society = $attachment_files[$i]['society']; - $dest_firstname = $attachment_files[$i]['firstname']; - $dest_lastname = $attachment_files[$i]['lastname']; - ($filesize > 1) ? $filesize = ceil($filesize).' Ko' : $filesize = $filesize.' Octets'; - - if ($isVersion) { - $inputName = 'join_version_attachment[]'; - } else { - $inputName = 'join_attachment[]'; - } - - $content .= '<th style="width:25px;border: dashed 1px grey;border-right:none;vertical-align:middle;" alt="'.$description - .'" title="'.$description - .'"><input style="margin-left: 3px" disabled="disabled" type="checkbox" id="join_attachment_'.$id.'" name="'.$inputName.'"'; - - $checked = ''; - if (($isVersion && in_array($id, $emailArray['attachments_version'])) || (!$isVersion && in_array($id, $emailArray['attachments']))) { - $checked = ' checked="checked"'; - } - - $content .= ' '.$checked - .' class="check" value="' - .$id.'"'; - - $content .= '/></th>'; - - if (!$id_converted) { - $content .= '<td style="cursor:pointer;border: dashed 1px grey;border-left:none;padding:5px;"'; - $content .= ' onclick="clickAttachmentsInput('.$id.')" '; - } else { - $content .= '<td style="border: dashed 1px grey;border-left:none;padding:5px;"'; - } - - $content .= '><span style="font-size: 10px;color: rgb(22, 173, 235);">'.$attachment_type.'</span> <span style="font-size: 10px;color: grey;">('.$att_type.' - '.$filesize.')</span><br/><strong>'.$description.'</strong>'; - if ($id_converted) { - $content .= ' (<input style="margin: 0px" title="envoyer la version PDF" disabled="disabled" type="checkbox" id="join_attachment_'.$id_converted.'" name="join_attachment[]"' - .' class="check"'; - - (in_array($id_converted, $emailArray['attachments'])) ? $checked = ' checked="checked"' : $checked = ''; - $content .= ' '.$checked - .' value="' - .$id_converted.'" />version pdf)'; - } - $content .= "<br/><span style='font-size: 10px;color: rgb(22, 173, 235);font-style:italic;'>"; - if ($chrono != '') { - $content .= "<span style='font-size: 10px;color: rgb(22, 173, 235);font-style:italic;'>".$chrono.'</span> - '; - } - $content .= "<span style='font-size: 10px;color: grey;font-style:italic;'>".$dest_firstname.' '.$dest_lastname.' '.$dest_society.'</span>'; - $content .= '</td>'; - if ($formContent == 'messageExchange') { - $content .= '<td style="width:1%;text-align:center;width: 8%;margin-right: 2px;vertical-align: middle"><input type=radio name="main_exchange_doc" disabled '; - if ($emailArray['disposition']->res_id == $id && ($emailArray['disposition']->tablename == 'res_attachments' && !$isVersion) - || ($emailArray['disposition']->tablename == 'res_version_attachments' && $isVersion)) { - $content .= ' checked '; - } - $content .= '></td>'; - } - $content .= '</tr>'; - - //Filename - $filename = $sendmail_tools->createFilename($description, $format); - $all_joined_files .= $description.': '.$filename.PHP_EOL; - } - $content .= '</table>'; - } - } - - //Notes - if ($core_tools->is_module_loaded('notes')) { - require_once 'modules'.DIRECTORY_SEPARATOR.'notes'.DIRECTORY_SEPARATOR - .'class'.DIRECTORY_SEPARATOR.'class_modules_tools.php'; - $notes_tools = new notes(); - $user_notes = $notes_tools->getUserNotes($identifier, $collId); - if (count($user_notes) > 0) { - $content .= '<br/>'; - $content .= '<div style="color:rgb(22, 173, 235);font-weight:bold;">'._NOTES.'</div>'; - $content .= '<table cellspacing="3" style="border-collapse:collapse;width:100%;">'; - for ($i = 0; $i < count($user_notes); ++$i) { - $content .= '<tr style="vertical-align:top;">'; - - //Get data - $id = $user_notes[$i]['id']; - $noteShort = functions::xssafe($request->cut_string($user_notes[$i]['label'], 50)); - $note = functions::xssafe($user_notes[$i]['label']); - $userArray = $users_tools->get_user($user_notes[$i]['author']); - $date = $request->dateformat($user_notes[$i]['date']); - - $content .= '<th style="width:25px;border: dashed 1px grey;border-right:none;vertical-align:middle;" alt="'.$note - .'" title="'.$note - .'"><input type="checkbox" disabled="disabled" id="note_'.$id.'" name="notes[]"'; - - if (!empty($emailArray['notes']) && in_array($id, $emailArray['notes'])) { - $checked = ' checked="checked"' ; - } else { - $checked = ''; - } - - $content .= ' '.$checked - .' class="check" value="' - .$id.'"></th><td style="cursor:pointer;border: dashed 1px grey;border-left:none;padding:5px;"'; - $content .= ' onclick="clickAttachmentsNotes('.$id.')" '; - $content .= 'title="'.$note.'"><span style="font-size: 10px;color: rgb(22, 173, 235);">'.$userArray['firstname'].' '.$userArray['lastname'].' </span><span style="font-size: 10px;color: grey;">'.$date.'</span><br/>' - .'<strong>'.$noteShort.'</strong></td>'; - - $content .= '</tr>'; - } - - $content .= '</table>'; - //Filename - $filename = 'notes_'.$identifier.'_'.date('dmY').'.html'; - $all_joined_files .= _NOTES.': '.$filename.PHP_EOL; - } - } - $content .= '</div>'; - $content .= '<hr />'; - //Body (html or raw mode) - if ($emailArray['isHtml'] == 'Y') { - $content .= '<script type="text/javascript">var mode="html";</script>'; - //load tinyMCE editor - ob_start(); - include 'modules/sendmail/load_editor.php'; - $content .= ob_get_clean(); - ob_end_flush(); - $content .= '<div id="html_mode" style="display:block">'; - $content .= '<textarea name="body_from_html" id="body_from_html" style="width:100%" ' - .'rows="15" cols="60" readonly="readonly">' - .$sendmail_tools->rawToHtml($emailArray['body']).'</textarea>'; - $content .= '</div>'; - } else { - $content .= '<script type="text/javascript">var mode="raw";</script>'; - //raw textarera - $content .= '<div id="raw_mode" style="display:block">'; - $content .= '<textarea name="body_from_raw" id="body_from_raw" class="emailInput" ' - .'cols="60" rows="14" readonly="readonly">' - .$sendmail_tools->htmlToRaw($emailArray['body']).'</textarea>'; - $content .= '</div>'; - } - - if (!empty($emailArray['receptionDate'])) { - $content .= '<br><hr style="margin-top:2px;" />'; - $content .= '<b>'._RECEPTION_DATE.' : </b>'.$emailArray['receptionDate'].'<br><br>'; - $content .= '<div onclick="new Effect.toggle(\'operationCommentsDiv\', \'blind\', {delay:0.2});" onmouseover="this.style.cursor=\'pointer\';"> - <span id="divStatus_operationComments" style="color:#1C99C5;"><i class="fa fa-plus-square"></i></span> '._MORE_INFORMATIONS.' - </div>'; - $content .= '<div id="operationCommentsDiv" style="display:none">'; - foreach ($emailArray['operationComments'] as $value) { - $content .= $value->value.'<br>'; - } - } - if (!empty($emailArray['operationDate'])) { - $content .= '</div><br>'; - $content .= '<b>'._OPERATION_DATE.' : </b>'.$emailArray['operationDate'].'<br><br>'; - } - if (!empty($emailArray['messageReview'])) { - $content .= '<h4>'._M2M_FOLLOWUP_REQUEST.'</h4>'; - $content .= '<div>'; - foreach ($emailArray['messageReview'] as $value) { - $content .= $value.'<br>'; - } - $content .= '</div>'; - } - //Buttons - $content .= '<br><hr style="margin-top:2px;" />'; - $content .= '<div align="center">'; - //Close button - $content .= '<input type="button" name="cancel" id="cancel" class="button" value="' - ._CLOSE.'" onclick="window.parent.destroyModal(\'form_email\');"/>'; - $content .= '</div>'; - $content .= '</div>'; - } elseif ($emailArray['type'] == 'ArchiveTransferReplySent') { - $content .= '<b>'._REPLY_RESPONSE_SENT.' : </b>'.$emailArray['creationDate'].'<br><br>'; - - foreach ($emailArray['operationComments'] as $value) { - $content .= $value->value.'<br>'; - } - - //Buttons - $content .= '<br><hr style="margin-top:2px;" />'; - $content .= '<div align="center">'; - //Close button - $content .= '<input type="button" name="cancel" id="cancel" class="button" value="' - ._CLOSE.'" onclick="window.parent.destroyModal(\'form_email\');"/>'; - $content .= '</div>'; - } else { - $content = $request->wash_html($id.': '._EMAIL_DONT_EXIST.'!', 'NONE'); - } - } else { - $content = $request->wash_html(_ID.' '._IS_EMPTY.'!', 'NONE'); - } -} -echo $content; - -?> -</body> - -</html> diff --git a/modules/sendmail/sendmail.php b/modules/sendmail/sendmail.php deleted file mode 100755 index 0abda462117..00000000000 --- a/modules/sendmail/sendmail.php +++ /dev/null @@ -1,366 +0,0 @@ -<?php -/** -* Copyright Maarch since 2008 under licence GPLv3. -* See LICENCE.txt file at the root folder for more details. -* This file is part of Maarch software. - -* @brief sendmail.php -* @author dev <dev@maarch.org> -* @ingroup sendmail -*/ - -require_once 'core'.DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR.'class_request.php'; -require_once 'apps'.DIRECTORY_SEPARATOR.$_SESSION['config']['app_id'].DIRECTORY_SEPARATOR - .'class'.DIRECTORY_SEPARATOR.'class_lists.php'; -require_once 'modules'.DIRECTORY_SEPARATOR.'sendmail'.DIRECTORY_SEPARATOR - .'class'.DIRECTORY_SEPARATOR.'class_modules_tools.php'; - -$core_tools = new core_tools(); -$request = new request(); -$list = new lists(); -$sendmail_tools = new sendmail(); - -$identifier = ''; -$origin = ''; -$parameters = ''; - -//Collection ID -if (isset($_REQUEST['coll_id']) && !empty($_REQUEST['coll_id'])) { - $parameters = '&coll_id='.$_REQUEST['coll_id']; -} elseif ((isset($_SESSION['collection_id_choice']) && !empty($_SESSION['collection_id_choice']))) { - $parameters = '&coll_id='.$_SESSION['collection_id_choice']; -} - -//Identifier -if (isset($_REQUEST['identifier']) && !empty($_REQUEST['identifier'])) { - $identifier = $_REQUEST['identifier']; -} elseif (isset($_SESSION['doc_id']) && !empty($_SESSION['doc_id'])) { - $identifier = $_SESSION['doc_id']; -} else { - echo '<span class="error">'._IDENTIFIER.' '._IS_EMPTY.'</span>'; - exit(); -} - -$security = new security(); -$right = $security->test_right_doc('letterbox_coll', $identifier); -if (!$right) { - exit(_NO_RIGHT_TXT); -} - -//Origin -if (isset($_REQUEST['origin']) && !empty($_REQUEST['origin'])) { - $origin = $_REQUEST['origin']; -} else { - $origin = 'document'; -} - -//Extra parameters -if (isset($_REQUEST['size']) && !empty($_REQUEST['size'])) { - $parameters .= '&size='.$_REQUEST['size']; -} else { - $parameters .= '&size=full'; -} -if (isset($_REQUEST['order']) && !empty($_REQUEST['order'])) { - $parameters .= '&order='.$_REQUEST['order']; -} -if (isset($_REQUEST['order_field']) && !empty($_REQUEST['order_field'])) { - $parameters .= '&order_field='.$_REQUEST['order_field']; -} -if (isset($_REQUEST['what']) && !empty($_REQUEST['what'])) { - $parameters .= '&what='.$_REQUEST['what']; -} -if (isset($_REQUEST['start']) && !empty($_REQUEST['start'])) { - $parameters .= '&start='.$_REQUEST['start']; -} else { - $_REQUEST['start'] = 0; -} - -if (isset($_REQUEST['load'])) { - $core_tools->load_lang(); - $core_tools->load_html(); - $core_tools->load_header('', true, false); - - echo '<body>'; - - $core_tools->load_js(); - - //Load list - if (!empty($identifier)) { - $target = $_SESSION['config']['businessappurl'] - .'index.php?module=sendmail&page=sendmail&identifier=' - .$identifier.'&origin='.$origin.$parameters; - - $listContent = $list->loadList($target); - echo $listContent; - } else { - echo '<span class="error">'._ERROR_IN_PARAMETERS.'</span>'; - } - echo '<div id="container" style="width:100%;min-height:0px;height:0px;"></div>'; - - echo '</body>'; - echo '</html>'; -} else { - //If size is full change some parameters - if (isset($_REQUEST['size']) - && ($_REQUEST['size'] == 'full') - ) { - $sizeUser = '10'; - $sizeObject = '30'; - $css = 'listing spec'; - $cutString = 150; - } elseif (isset($_REQUEST['size']) - && ($_REQUEST['size'] == 'medium') - ) { - $sizeUser = '15'; - $sizeObject = '30'; - $css = 'listingsmall'; - $cutString = 100; - } else { - $sizeUser = '10'; - $sizeObject = '10'; - $css = 'listingsmall'; - $cutString = 20; - } - - //Table or view - $select['emails'] = array(); //Emails - $select[USERS_TABLE] = array(); //Users - - //Fields - array_push( - $select['emails'], - 'id as email_id', - 'document->>\'id\' as res_id', - 'creation_date', - 'user_id', - 'object as email_object_short', - 'sender as sender_email', - 'recipients as email_destinataire', - 'id', - 'status', - 'status as status_label' - ); - - array_push($select[USERS_TABLE], 'user_id', 'firstname', 'lastname', 'mail'); //Users - - //Where clause - $where_tab = array(); - - $where_tab[] = ' document->>\'id\' = \''.$identifier.'\' '; - $where_tab[] = 'emails.user_id = users.id'; - - //Build where - $where = implode(' and ', $where_tab); - - //Order - $order = $order_field = ''; - $order = $list->getOrder(); - $order_field = $list->getOrderField(); - if (!empty($order_field) && !empty($order)) { - $orderstr = 'order by '.$order_field.' '.$order; - } else { - $list->setOrder(); - $list->setOrderField('creation_date'); - $orderstr = 'order by creation_date desc'; - } - - if (isset($_REQUEST['lines'])) { - $limit = $_REQUEST['lines']; - } else { - $limit = 'default'; - } - - //Request - $tab = $request->PDOselect( - $select, - $where, - array(), - $orderstr, - $_SESSION['config']['databasetype'], - $limit, - false, - '', - '', - '', - true, - false, - false, - $_REQUEST['start'] - ); - - //Result Array - if (!empty($tab)) { - for ($i = 0; $i < count($tab); ++$i) { - for ($j = 0; $j < count($tab[$i]); ++$j) { - foreach (array_keys($tab[$i][$j]) as $value) { - if ($tab[$i][$j][$value] == 'email_id') { - $tab[$i][$j]['email_id'] = $tab[$i][$j]['value']; - $tab[$i][$j]['label'] = 'ID'; - $tab[$i][$j]['size'] = '1'; - $tab[$i][$j]['label_align'] = 'left'; - $tab[$i][$j]['align'] = 'left'; - $tab[$i][$j]['valign'] = 'bottom'; - $tab[$i][$j]['show'] = false; - $tab[$i][$j]['order'] = 'id'; - } - if ($tab[$i][$j][$value] == 'creation_date') { - $tab[$i][$j]['value'] = $request->dateformat($tab[$i][$j]['value']); - $tab[$i][$j]['label'] = _CREATION_DATE; - $tab[$i][$j]['size'] = '11'; - $tab[$i][$j]['label_align'] = 'left'; - $tab[$i][$j]['align'] = 'left'; - $tab[$i][$j]['valign'] = 'bottom'; - $tab[$i][$j]['show'] = true; - $tab[$i][$j]['order'] = 'creation_date'; - } - if ($tab[$i][$j][$value] == 'user_id') { - $tab[$i][$j]['label'] = _USER_ID; - $tab[$i][$j]['size'] = '5'; - $tab[$i][$j]['label_align'] = 'left'; - $tab[$i][$j]['align'] = 'left'; - $tab[$i][$j]['valign'] = 'bottom'; - $tab[$i][$j]['show'] = false; - $tab[$i][$j]['order'] = 'user_id'; - } - if ($tab[$i][$j][$value] == 'email_destinataire') { - $tab_dest = (array)json_decode(htmlspecialchars_decode($tab[$i][$j]['value'], ENT_QUOTES | ENT_HTML401)); - $tab[$i][$j]['value'] = implode(', ', $tab_dest); - $tab[$i][$j]['label'] = _RECIPIENT; - $tab[$i][$j]['size'] = $sizeObject; - $tab[$i][$j]['label_align'] = 'left'; - $tab[$i][$j]['align'] = 'left'; - $tab[$i][$j]['valign'] = 'bottom'; - $tab[$i][$j]['show'] = true; - $tab[$i][$j]['order'] = 'email_destinataire'; - } - if ($tab[$i][$j][$value] == 'email_object_short') { - $tab[$i][$j]['value'] = $request->cut_string($request->show_string($tab[$i][$j]['value']), $cutString); - $tab[$i][$j]['label'] = _EMAIL_OBJECT; - $tab[$i][$j]['size'] = $sizeObject; - $tab[$i][$j]['label_align'] = 'left'; - $tab[$i][$j]['align'] = 'left'; - $tab[$i][$j]['valign'] = 'bottom'; - $tab[$i][$j]['show'] = true; - $tab[$i][$j]['order'] = 'email_object_short'; - } - if ($tab[$i][$j][$value] == 'status_label') { - $tab[$i][$j]['value'] = $sendmail_tools->emailStatus(['status' => $tab[$i][$j]['value']]); - $tab[$i][$j]['label'] = _STATUS; - $tab[$i][$j]['size'] = '10'; - $tab[$i][$j]['label_align'] = 'left'; - $tab[$i][$j]['align'] = 'left'; - $tab[$i][$j]['valign'] = 'bottom'; - $tab[$i][$j]['show'] = true; - $tab[$i][$j]['order'] = 'status_label'; - } - if ($tab[$i][$j][$value] == 'sender_email') { - $senderInfo = (array)json_decode(htmlspecialchars_decode($tab[$i][$j]['value'], ENT_QUOTES | ENT_HTML401)); - $tab[$i][$j]['value'] = $senderInfo['email']; - - $tab[$i][$j]['label'] = _SENDER; - $tab[$i][$j]['size'] = '20'; - $tab[$i][$j]['label_align'] = 'left'; - $tab[$i][$j]['align'] = 'left'; - $tab[$i][$j]['valign'] = 'bottom'; - $tab[$i][$j]['show'] = true; - $tab[$i][$j]['order'] = 'sender_email'; - } - if ($tab[$i][$j][$value] == 'id') { - $tab[$i][$j]['value'] = (\Email\models\EmailModel::hasJoinFiles(['id' => $tab[$i][$j]['value']])) ? - '<i class="fa fa-paperclip fa-2x" title="'._JOINED_FILES.'"></i>' : - ''; - $tab[$i][$j]['label'] = false; - $tab[$i][$j]['size'] = '1'; - $tab[$i][$j]['label_align'] = 'left'; - $tab[$i][$j]['align'] = 'left'; - $tab[$i][$j]['valign'] = 'bottom'; - $tab[$i][$j]['show'] = true; - $tab[$i][$j]['order'] = false; - } - } - } - } - } - - //List - $listKey = 'email_id'; // Cle de la liste - $paramsTab = array(); // Initialiser le tableau de parametres - $paramsTab['bool_sortColumn'] = true; // Affichage Tri - $paramsTab['pageTitle'] = ''; // Titre de la page - $paramsTab['bool_bigPageTitle'] = false; // Affichage du titre en grand - $paramsTab['urlParameters'] = 'identifier='.$identifier - .'&origin='.$origin.'&display=true'.$parameters; // Parametres d'url supplementaires - $paramsTab['filters'] = array(); // Filtres - $paramsTab['listHeight'] = '100%'; // Hauteur de la liste - $paramsTab['start'] = $_REQUEST['start']; - $paramsTab['listCss'] = $css; // CSS - $paramsTab['tools'] = array(); // Icones dans la barre d'outils - - $addMail = array( - 'script' => "showEmailForm('".$_SESSION['config']['businessappurl'] - .'index.php?display=true&module=sendmail&page=sendmail_ajax_content' - .'&mode=add&identifier='.$identifier.'&origin='.$origin.'&formContent=email' - .$parameters."')", - 'icon' => 'envelope', - 'tooltip' => _NEW_EMAIL, - 'alwaysVisible' => true, - ); - - $addExchangeMessage = array( - 'script' => "showEmailForm('".$_SESSION['config']['businessappurl'] - .'index.php?display=true&module=sendmail&page=sendmail_ajax_content' - .'&mode=add&identifier='.$identifier.'&origin='.$origin.'&formContent=messageExchange' - .$parameters."')", - 'icon' => 'exchange-alt', - 'tooltip' => _NEW_NUMERIC_PACKAGE, - 'alwaysVisible' => true, - ); - - array_push($paramsTab['tools'], $addMail, $addExchangeMessage); - - //Action icons array - $paramsTab['actionIcons'] = array(); - $read = array( - 'script' => "showEmailForm('".$_SESSION['config']['businessappurl'] - .'index.php?display=true&module=sendmail&page=sendmail_ajax_content' - .'&mode=read&id=@@email_id@@&identifier='.$identifier.'&origin='.$origin - .$parameters."');", - 'icon' => 'eye', - 'tooltip' => _READ, - ); - array_push($paramsTab['actionIcons'], $read); - $update = array( - 'script' => "showEmailForm('".$_SESSION['config']['businessappurl'] - .'index.php?display=true&module=sendmail&page=sendmail_ajax_content' - .'&mode=up&id=@@email_id@@&identifier='.$identifier.'&origin='.$origin - .$parameters."');", - 'class' => 'change', - 'tooltip' => _UPDATE, - 'disabledRules' => "@@user_id@@ != '".$_SESSION['user']['UserId']."'", - ); - array_push($paramsTab['actionIcons'], $update); - $transfer = array( - 'script' => "showEmailForm('".$_SESSION['config']['businessappurl'] - .'index.php?display=true&module=sendmail&page=sendmail_ajax_content' - .'&mode=transfer&id=@@email_id@@&identifier='.$identifier.'&origin='.$origin - .$parameters."');", - 'icon' => 'share', - 'tooltip' => _TRANSFER_EMAIL, - 'disabledRules' => "@@user_id@@ != '".$_SESSION['user']['UserId']."' || @@status@@ != 'SENT'", - ); - array_push($paramsTab['actionIcons'], $transfer); - - //Output - $status = 0; - $content = $list->showList($tab, $paramsTab, $listKey); - - $toolbarBagde_script = $_SESSION['config']['businessappurl'].'index.php?display=true&module=sendmail&page=load_toolbar_sendmail&origin=parent&resId='.$identifier.'&collId=letterbox_coll'; - - $content .= '<script>loadToolbarBadge(\'sendmail_tab\',\''.$toolbarBagde_script.'\');</script>'; - - // /********* MESSAGE EXCHANGE PART ***************/ - // include_once 'modules/sendmail/messageExchangeList.php'; - // include_once 'modules/sendmail/acknowledgementReceiptsList.php'; - - echo '{status : '.$status.", content : '".addslashes($debug.$content.$contentMessageExchange.$contentAcknowledgementReceipts)."', error : '".addslashes($error)."'}"; -} diff --git a/modules/sendmail/sendmail_ajax_content.php b/modules/sendmail/sendmail_ajax_content.php deleted file mode 100755 index 059d6a3aafa..00000000000 --- a/modules/sendmail/sendmail_ajax_content.php +++ /dev/null @@ -1,612 +0,0 @@ -<?php -/* -* -* Copyright 2013 Maarch -* -* This file is part of Maarch Framework. -* -* Maarch Framework is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Maarch Framework is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. -*/ - -/** -* @brief Script to return ajax result -* -* @file sendmail_ajax_content.php -* @author Yves Christian Kpakpo <dev@maarch.org> -* @date $date$ -* @version $Revision$ -* @ingroup sendmail -*/ - -require_once "core".DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_request.php"; -require_once "core".DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_db_pdo.php"; -require_once "core".DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_security.php"; -require_once 'apps' . DIRECTORY_SEPARATOR . $_SESSION['config']['app_id'] - . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR - . 'class_indexing_searching_app.php'; -require_once 'apps' . DIRECTORY_SEPARATOR . $_SESSION['config']['app_id'] - . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR - . 'class_users.php'; -require_once 'modules/notifications/notifications_tables_definition.php'; -require_once "modules" . DIRECTORY_SEPARATOR . "sendmail" . DIRECTORY_SEPARATOR - . "class" . DIRECTORY_SEPARATOR . "class_modules_tools.php"; -require_once 'modules/sendmail/Controllers/SendMessageExchangeController.php'; - -$core_tools = new core_tools(); -$request = new request(); -$db = new Database(); -$sec = new security(); -$is = new indexing_searching_app(); -$users_tools = new class_users(); -$sendmail_tools = new sendmail(); - -if ($_SESSION['features']['send_to_contact_with_mandatory_attachment'] == true && !isset($_REQUEST['join_attachment']) && $_REQUEST['action'] == 'send_to_contact_with_mandatory_attachment') { - $error = $request->wash_html(_PLEASE_CHOOSE_AN_ATTACHMENT, 'NONE'); - $status = 1; - echo "{status : " . $status . ", content : '" . addslashes(_parse($content)) . "', error : '" . addslashes(_parse_error($error)) . "', exec_js : '".addslashes($js)."'}"; - exit(); -} - - -function _parse($text) -{ - $text = str_replace("\r\n", PHP_EOL, $text); - $text = str_replace("\r", PHP_EOL, $text); - $text = str_replace(PHP_EOL, "\\n ", $text); - return $text; -} -function _parse_error($text) -{ - $text = str_replace("###", "\\n ", $text); - return $text; -} - -$core_tools->load_lang(); - -$status = 0; -$error = $content = $js = $parameters = ''; - -$labels_array = array(); - -if (isset($_REQUEST['mode']) && !empty($_REQUEST['mode'])) { - $mode = $_REQUEST['mode']; -} else { - $error = _ERROR_IN_SENDMAIL_FORM_GENERATION; - $status = 1; -} - -//Identifier of the element wich is noted -$identifier = ''; -if (isset($_REQUEST['identifier']) && ! empty($_REQUEST['identifier'])) { - $identifier = trim($_REQUEST['identifier']); -} - -//formContent of the element wich is noted -$formContent = ''; -if (isset($_GET['formContent']) && ! empty($_GET['formContent'])) { - $formContent = trim($_GET['formContent']); -} - -//Collection -if (isset($_REQUEST['coll_id']) && ! empty($_REQUEST['coll_id'])) { - $collId = trim($_REQUEST['coll_id']); - $parameters .= '&coll_id='.$_REQUEST['coll_id']; - $view = $sec->retrieve_view_from_coll_id($collId); - $table = $sec->retrieve_table_from_coll($collId); -} - -//Keep some origin parameters -if (isset($_REQUEST['size']) && !empty($_REQUEST['size'])) { - $parameters .= '&size='.$_REQUEST['size']; -} -if (isset($_REQUEST['order']) && !empty($_REQUEST['order'])) { - $parameters .= '&order='.$_REQUEST['order']; - if (isset($_REQUEST['order_field']) && !empty($_REQUEST['order_field'])) { - $parameters .= '&order_field='.$_REQUEST['order_field']; - } -} -if (isset($_REQUEST['what']) && !empty($_REQUEST['what'])) { - $parameters .= '&what='.$_REQUEST['what']; -} -if (isset($_REQUEST['template']) && !empty($_REQUEST['template'])) { - $parameters .= '&template='.$_REQUEST['template']; -} -if (isset($_REQUEST['start']) && !empty($_REQUEST['start'])) { - $parameters .= '&start='.$_REQUEST['start']; -} - -//Keep the origin to reload the origin list -$list_origin = $origin = ''; -if (isset($_REQUEST['origin']) && !empty($_REQUEST['origin'])) { - // - $origin = $_REQUEST['origin']; - - if ($_REQUEST['origin'] == "document") { - //From document - $list_origin = "window.parent.loadList('".$_SESSION['config']['businessappurl'] - ."index.php?display=true&module=sendmail&page=sendmail&identifier=" - .$identifier."&origin=document".$parameters."', 'divList', true);"; - } -} - -//Path to actual script -$path_to_script = $_SESSION['config']['businessappurl'] - ."index.php?display=true&module=sendmail&page=sendmail_ajax_content&identifier=" - .$identifier."&origin=".$origin.$parameters; - -switch ($mode) { - case 'up': - case 'read': - case 'transfer': - if (isset($_REQUEST['id']) && !empty($_REQUEST['id'])) { - $parameters .= '&id='.$_REQUEST['id']; - } else { - $error = $request->wash_html(_ID.' '._IS_EMPTY.'!', 'NONE'); - $status = 1; - //Close the modal - $js = "window.parent.destroyModal('form_email');"; - break; - } - // no break - case 'add': - if (empty($identifier)) { - $error = $request->wash_html(_IDENTIFIER.' '._IS_EMPTY.'!', 'NONE'); - $status = 1; - //Close the modal - $js = "window.parent.destroyModal('form_email');"; - } else { - //Reset arry of adresses - unset($_SESSION['adresses']); - $_SESSION['adresses'] = array(); - //Show iframe - $content .='<iframe name="form_mail" id="form_mail" src="' - . $_SESSION['config']['businessappurl'] - . 'index.php?display=true&module=sendmail&page=mail_form&identifier=' - . $identifier.'&origin=document&coll_id='.$collId.'&mode='.$mode.$parameters.'&formContent='.$_GET['formContent'].'" ' - . 'frameborder="0" width="100%" style="height:540px;padding:0px;overflow-x:hidden;overflow-y: auto;"></iframe>'; - } - break; - - case 'added': - if ($formContent == 'messageExchange') { - $return = SendMessageExchangeController::createMessageExchange($_REQUEST); - if (!empty($return['errors'])) { - if (is_array($return['errors'])) { - $error = implode(", ", $return['errors']); - } else { - $error = $return['errors']; - } - $status = 1; - } - //Reload and show message - $js = $list_origin."window.parent.top.$('main_info').innerHTML = '"._EMAIL_ADDED."';"; - } else { - $userEntitiesMails = array(); - if ($core_tools->test_service('use_mail_services', 'sendmail', false)) { - $userEntitiesMails = $sendmail_tools->checkAttachedEntitiesMails($_SESSION['user']['UserId']); - } - if (empty($identifier)) { - $error = $request->wash_html(_IDENTIFIER.' '._IS_EMPTY.'!', 'NONE'); - $status = 1; - } elseif (!in_array($_REQUEST['sender_email'], array_keys($userEntitiesMails)) && $core_tools->test_service('use_mail_services', 'sendmail', false)) { - $error = $request->wash_html(_INCORRECT_SENDER, 'NONE'); - $status = 1; - } else { - if (isset($_SESSION['adresses']['to']) && count($_SESSION['adresses']['to']) > 0) { - if (!empty($_REQUEST['object'])) { - - //Check adress for to - $to = join(',', $_SESSION['adresses']['to']); - $error = $sendmail_tools->CheckEmailAdress($to); - - if (empty($error)) { - - //Check adress for cc - (isset($_SESSION['adresses']['cc']) && count($_SESSION['adresses']['cc']) > 0)? - $cc = join(',', $_SESSION['adresses']['cc']) : $cc = ''; - $error = $sendmail_tools->CheckEmailAdress($cc); - - if (empty($error)) { - - //Check adress for cci - (isset($_SESSION['adresses']['cci']) && count($_SESSION['adresses']['cci']) > 0)? - $cci = join(',', $_SESSION['adresses']['cci']) : $cci = ''; - $error = $sendmail_tools->CheckEmailAdress($cci); - - if (empty($error)) { - //Data - ( - isset($_REQUEST['join_file']) - && count($_REQUEST['join_file']) > 0 - )? $res_master_attached = true : $res_master_attached = false; - - $document = ['id' => $identifier, 'isLinked' => $res_master_attached, 'original' => false]; - - $attachments = []; - //attachment - if (isset($_REQUEST['join_attachment']) && count($_REQUEST['join_attachment']) > 0) { - foreach ($_REQUEST['join_attachment'] as $rawAttachment) { - $id = $rawAttachment; - $original = true; - if (strpos($rawAttachment, '#') !== false) { - $id = substr($rawAttachment, 0, strpos($rawAttachment, '#')); - $original = false; - } - $attachments[] = [ - 'id' => (int)$id, - 'isVersion' => false, - 'original' => $original, - ]; - } - } - - //Version attachment - if (isset($_REQUEST['join_version_attachment']) && count($_REQUEST['join_version_attachment']) > 0) { - foreach ($_REQUEST['join_version_attachment'] as $rawAttachment) { - $id = $rawAttachment; - $original = true; - if (strpos($rawAttachment, '#') !== false) { - $id = substr($rawAttachment, 0, strpos($rawAttachment, '#')); - $original = false; - } - $attachments[] = [ - 'id' => (int)$id, - 'isVersion' => true, - 'original' => $original, - ]; - } - } - if (!empty($attachments)) { - $document['attachments'] = $attachments; - } - - //Notes - if (isset($_REQUEST['notes']) && count($_REQUEST['notes']) > 0) { - $document['notes'] = []; - foreach ($_REQUEST['notes'] as $note) { - $document['notes'][] = (int)$note; - } - } - - if (!empty($_REQUEST['is_html']) && $_REQUEST['is_html'] == 'Y') { - $isHtml = true; - $body = $_REQUEST['body_from_html']; - } else { - $isHtml = false; - $body = $_REQUEST['body_from_raw']; - } - - //Status - if ($_REQUEST['for'] == 'save') { - $email_status = 'DRAFT'; - } elseif ($_REQUEST['for'] == 'send') { - $email_status = 'TO_SEND'; - } - - $userInfo = \User\models\UserModel::getByLogin(['login' => $_SESSION['user']['UserId'], 'select' => ['id', 'mail']]); - - $aSenderInfo = explode(",", $_REQUEST['sender_email']); - if (!empty($aSenderInfo[1]) && !empty($aSenderInfo[0])) { - $entityInfo = \Entity\models\EntityModel::getByEntityId(['entityId' => $aSenderInfo[0], 'select' => ['id']]); - } - $isSent = \Email\controllers\EmailController::createEmail([ - 'userId' => $userInfo['id'], - 'data' => [ - 'sender' => empty($entityInfo) ? ['email' => $userInfo['mail']] : ['email' => $aSenderInfo[1], 'entityId' => $entityInfo['id']], - 'recipients' => explode(",", $to), - 'cc' => explode(",", $cc), - 'cci' => explode(",", $cci), - 'object' => (empty($_REQUEST['object']) ? '' : substr($_REQUEST['object'], 0, 100)), - 'body' => $body, - 'document' => $document, - 'isHtml' => $isHtml, - 'status' => $email_status - ] - ]); - - if (!empty($isSent['errors'])) { - $error = $isSent['errors']; - } - - //Reload and show message - $js = $list_origin."window.parent.top.$('main_info').innerHTML = '"._EMAIL_ADDED."';"; - } else { - $status = 1; - } - } else { - $status = 1; - } - } else { - $status = 1; - } - } else { - $error = $request->wash_html(_EMAIL_OBJECT.' '._IS_EMPTY.'!', 'NONE'); - $status = 1; - } - } else { - $error = $request->wash_html(_SEND_TO.' '._IS_EMPTY.'!', 'NONE'); - $status = 1; - } - } - } - break; - - case 'updated': - if (isset($_REQUEST['id']) && !empty($_REQUEST['id'])) { - //Email ID - $id = $_REQUEST['id']; - $userEntitiesMails = array(); - if ($core_tools->test_service('use_mail_services', 'sendmail', false)) { - $userEntitiesMails = $sendmail_tools->checkAttachedEntitiesMails($_SESSION['user']['UserId']); - } - //Res ID - if (empty($identifier)) { - $error = $request->wash_html(_IDENTIFIER.' '._IS_EMPTY.'!', 'NONE'); - $status = 1; - } elseif (!in_array($_REQUEST['sender_email'], array_keys($userEntitiesMails)) && $core_tools->test_service('use_mail_services', 'sendmail', false)) { - $error = $request->wash_html(_INCORRECT_SENDER, 'NONE'); - $status = 1; - } else { - if ((isset($_SESSION['adresses']['to']) && count($_SESSION['adresses']['to']) > 0) || $_REQUEST['for'] == 'save') { - if (!empty($_REQUEST['object']) || $_REQUEST['for'] == 'save') { - - //Check adress for to - if (!empty($_SESSION['adresses']['to'])) { - $to = join(',', $_SESSION['adresses']['to']); - $error = $sendmail_tools->CheckEmailAdress($to); - } - - if (empty($error)) { - - //Check adress for cc - (isset($_SESSION['adresses']['cc']) && count($_SESSION['adresses']['cc']) > 0)? - $cc = join(',', $_SESSION['adresses']['cc']) : $cc = ''; - $error = $sendmail_tools->CheckEmailAdress($cc); - - if (empty($error)) { - - //Check adress for cci - (isset($_SESSION['adresses']['cci']) && count($_SESSION['adresses']['cci']) > 0)? - $cci = join(',', $_SESSION['adresses']['cci']) : $cci = ''; - $error = $sendmail_tools->CheckEmailAdress($cci); - - if (empty($error)) { - - //Data - ( - isset($_REQUEST['join_file']) - && count($_REQUEST['join_file']) > 0 - )? $res_master_attached = true : $res_master_attached = false; - - $document = ['id' => $identifier, 'isLinked' => $res_master_attached, 'original' => false]; - - $attachments = []; - //attachment - if (isset($_REQUEST['join_attachment']) && count($_REQUEST['join_attachment']) > 0) { - foreach ($_REQUEST['join_attachment'] as $rawAttachment) { - $id = $rawAttachment; - $original = true; - if (strpos($rawAttachment, '#') !== false) { - $id = substr($rawAttachment, 0, strpos($rawAttachment, '#')); - $original = false; - } - $attachments[] = [ - 'id' => (int)$id, - 'isVersion' => false, - 'original' => $original, - ]; - } - } - - //Version attachment - if (isset($_REQUEST['join_version_attachment']) && count($_REQUEST['join_version_attachment']) > 0) { - foreach ($_REQUEST['join_version_attachment'] as $rawAttachment) { - $id = $rawAttachment; - $original = true; - if (strpos($rawAttachment, '#') !== false) { - $id = substr($rawAttachment, 0, strpos($rawAttachment, '#')); - $original = false; - } - $attachments[] = [ - 'id' => (int)$id, - 'isVersion' => true, - 'original' => $original, - ]; - } - } - if (!empty($attachments)) { - $document['attachments'] = $attachments; - } - - //Notes - if (isset($_REQUEST['notes']) && count($_REQUEST['notes']) > 0) { - $document['notes'] = []; - foreach ($_REQUEST['notes'] as $note) { - $document['notes'][] = (int)$note; - } - } - - if (!empty($_REQUEST['is_html']) && $_REQUEST['is_html'] == 'Y') { - $isHtml = true; - $body = $_REQUEST['body_from_html']; - } else { - $isHtml = false; - $body = $_REQUEST['body_from_raw']; - } - - //Status - if ($_REQUEST['for'] == 'save') { - $email_status = 'DRAFT'; - } elseif ($_REQUEST['for'] == 'send') { - $email_status = 'TO_SEND'; - } - - $userInfo = \User\models\UserModel::getByLogin(['login' => $_SESSION['user']['UserId'], 'select' => ['id', 'mail']]); - - $aSenderInfo = explode(",", $_REQUEST['sender_email']); - if (!empty($aSenderInfo[1])) { - $entityInfo = \Entity\models\EntityModel::getByEntityId(['entityId' => $aSenderInfo[0], 'select' => ['id']]); - } - - - if (!empty($isSent['errors'])) { - $error = $isSent['errors']; - } - - //Reload and show message - $js = $list_origin."window.parent.top.$('main_info').innerHTML = '"._EMAIL_UPDATED."';"; - } else { - $status = 1; - } - } else { - $status = 1; - } - } else { - $status = 1; - } - } else { - $error = $request->wash_html(_EMAIL_OBJECT.' '._IS_EMPTY.'!', 'NONE'); - $status = 1; - } - } else { - $error = $request->wash_html(_SEND_TO.' '._IS_EMPTY.'!', 'NONE'); - $status = 1; - } - } - } else { - $error = $request->wash_html(_ID.' '._IS_EMPTY.'!', 'NONE'); - $status = 1; - //Close the modal - $js = "window.parent.destroyModal('form_email');"; - } - break; - - case 'del': - if (isset($_REQUEST['id']) && !empty($_REQUEST['id'])) { - $id = $_REQUEST['id']; - - $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'DELETE']); - $request = \Slim\Http\Request::createFromEnvironment($environment); - \Email\controllers\EmailController::delete($request, new \Slim\Http\Response(), ['id' => $id]); - - //Reload and show message - $js = $list_origin."window.parent.top.$('main_info').innerHTML = '"._EMAIL_REMOVED."';"; - } else { - $error = $request->wash_html(_ID.' '._IS_EMPTY.'!', 'NONE'); - $status = 1; - //Close the modal - $js = "window.parent.destroyModal('form_email');"; - } - break; - case 'adress': - if (isset($_REQUEST['for']) && isset($_REQUEST['field']) && isset($_REQUEST['email'])) { - if (isset($_REQUEST['email']) && !empty($_REQUEST['email'])) { - //Clean up email - $email = trim($_REQUEST['email']); - //Reset session adresses if necessary - if (!isset($_SESSION['adresses'][$_REQUEST['field']])) { - $_SESSION['adresses'][$_REQUEST['field']] = array(); - } - //For ADD - if ($_REQUEST['for'] == 'add') { - array_push($_SESSION['adresses'][$_REQUEST['field']], $email); - //For DEL - } elseif ($_REQUEST['for'] == 'del') { - //unset adress in array - unset($_SESSION['adresses'][$_REQUEST['field']][$_REQUEST['index']]); - //If no adresse for field, unset the entire sub-array - if (count($_SESSION['adresses'][$_REQUEST['field']]) == 0) { - unset($_SESSION['adresses'][$_REQUEST['field']]); - } - } - //Get content - $content = $sendmail_tools->updateAdressInputField($path_to_script, $_SESSION['adresses'], $_REQUEST['field']); - } else { - $error = $request->wash_html(_EMAIL.' '._IS_EMPTY.'!', 'NONE'); - $status = 1; - } - } else { - $error = $request->wash_html(_UNKNOW_ERROR.'!', 'NONE'); - $status = 1; - } - break; - case 'destUser': - if (isset($_REQUEST['for']) && isset($_REQUEST['field']) && isset($_REQUEST['contactAddress'])) { - if (isset($_REQUEST['contactAddress']) && !empty($_REQUEST['contactAddress'])) { - $contactAddress = trim($_REQUEST['contactAddress']); - if (!isset($_SESSION['adresses'][$_REQUEST['field']])) { - $_SESSION['adresses'][$_REQUEST['field']] = array(); - } - - if ($_REQUEST['for'] == 'add') { -// $contactLabel = \Contact\models\ContactModel::getContactFullLabel(['addressId' => $contactAddress]); //TODO -// $contactInfo = \Contact\models\ContactModel::getFullAddressById(['addressId' => $contactAddress]); -// $contactCommunication = \Contact\models\ContactModel::getContactCommunication(['contactId' => $contactInfo[0]['contact_id']]); - $_SESSION['adresses'][$_REQUEST['field']][$contactAddress] = $contactLabel.'. ('._COMMUNICATION_TYPE.' : '.$contactCommunication['value'].'))'; - } elseif ($_REQUEST['for'] == 'del') { - unset($_SESSION['adresses'][$_REQUEST['field']][$_REQUEST['index']]); - //If no adresse for field, unset the entire sub-array - if (count($_SESSION['adresses'][$_REQUEST['field']]) == 0) { - unset($_SESSION['adresses'][$_REQUEST['field']]); - } - } - - $content = $sendmail_tools->updateContactInputField($path_to_script, $_SESSION['adresses'], $_REQUEST['field']); - } else { - $error = $request->wash_html(_EMAIL.' '._IS_EMPTY.'!', 'NONE'); - $status = 1; - } - } else { - $error = $request->wash_html(_UNKNOW_ERROR.'!', 'NONE'); - $status = 1; - } - break; - case 'download': - require_once 'modules/export_seda/RequestSeda.php'; - $RequestSeda = new RequestSeda(); - $messageExchangeData = $RequestSeda->getMessageByIdentifierAndResId(['message_id' => $_GET['id'], 'res_id_master' => $_GET['identifier']]); - - $docserver = \Docserver\models\DocserverModel::getByDocserverId(['docserverId' => $messageExchangeData->docserver_id]); - $docserverType = \Docserver\models\DocserverTypeModel::getById(['id' => $docserver['docserver_type_id']]); - - $pathDirectory = str_replace('#', DIRECTORY_SEPARATOR, $messageExchangeData->path); - $filePath = $docserver['path_template'] . $pathDirectory . $messageExchangeData->filename; - $fingerprint = \Resource\controllers\StoreController::getFingerPrint([ - 'filePath' => $filePath, - 'mode' => $docserverType['fingerprint_mode'], - ]); - - if ($fingerprint != $messageExchangeData->fingerprint) { - echo _PB_WITH_FINGERPRINT_OF_DOCUMENT; - exit; - } - - if (file_exists($filePath)) { - header('Pragma: public'); - header('Expires: 0'); - header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); - header('Cache-Control: public'); - header('Content-Description: File Transfer'); - header('Content-Type: ' . strtolower(mime_content_type($filePath))); - header("Content-length: " . filesize($filePath)); - header('Content-Disposition: attachment; filename=' . basename($messageExchangeData->reference.'.zip') . ';'); - header("Content-Type: application/force-download"); - header('Content-Transfer-Encoding: binary'); - readfile($filePath); - exit(); - } - exit(); -} -echo "{status : " . $status . ", content : '" . addslashes(_parse($content)) . "', error : '" . addslashes(_parse_error($error)) . "', exec_js : '".addslashes($js)."'}"; -exit(); diff --git a/modules/sendmail/xml/IVS/requests_definitions.xml b/modules/sendmail/xml/IVS/requests_definitions.xml index 5b1b6123d61..eb83ffbbf81 100755 --- a/modules/sendmail/xml/IVS/requests_definitions.xml +++ b/modules/sendmail/xml/IVS/requests_definitions.xml @@ -1,9 +1,4 @@ <requestDefinitions> - <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="sendmail_ajax_content" > - <parameter name="page" value="sendmail_ajax_content"/> - <parameter name="module" value="sendmail"/> - <parameter name="display" value="true" /> - </requestDefinition> <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="mail_form" > <parameter name="page" value="mail_form"/> <parameter name="module" value="sendmail"/> @@ -24,12 +19,6 @@ <parameter name="module" value="sendmail"/> <parameter name="display" value="true" /> </requestDefinition> - <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="adress_comletion" > - <parameter name="page" value="address_autocompletion"/> - <parameter name="module" value="sendmail"/> - <parameter name="display" value="true" /> - </requestDefinition> - </requestDefinitions> diff --git a/modules/sendmail/xml/IVS/validation_rules.xml b/modules/sendmail/xml/IVS/validation_rules.xml index 3f9807cd976..5f0ad04b520 100755 --- a/modules/sendmail/xml/IVS/validation_rules.xml +++ b/modules/sendmail/xml/IVS/validation_rules.xml @@ -1,37 +1,4 @@ <validationRules> - <validationRule name="sendmail_ajax_content" extends="standardForm" mode="error"> - <parameter name="module" type="identifier" /> - <parameter name="id" type="base64" /> - <parameter name="identifier" type="integer" /> - <parameter name="origin" type="identifier" /> - <parameter name="coll_id" type="collection_list" /> - <parameter name="size" type="size" /> - <parameter name="url" type="url" /> - <parameter name="for" type="identifier" /> - <parameter name="email" type="string" /> - <parameter name="field" type="identifier" /> - <parameter name="index" type="identifier" /> - <parameter name="is_html" type="YN" /> - <parameter name="add" type="string" /> - <parameter name="target" type="identifier" /> - <parameter name="body_from_html" type="string" /> - <parameter name="body_from_raw" type="string" /> - <parameter name="cancel" type="identifier" /> - <parameter name="join_attachment" type="string" /> - <parameter name="join_version_attachment" type="string" /> - <parameter name="join_file" type="identifier" /> - <parameter name="notes" type="string" /> - <parameter name="object" type="string" /> - <parameter name="valid" type="string" /> - <parameter name="sender_email" type="string" /> - <parameter name="templateMail" type="integer" /> - <parameter name="selectSignatures" type="string" /> - <parameter name="action" type="string" /> - <parameter name="formContent" type="string" /> - <parameter name="main_exchange_doc" type="string" /> - <parameter name="contactAddress" type="integer" /> - </validationRule> - <validationRule name="mail_form" extends="standardForm" mode="error"> <parameter name="module" type="identifier" /> <parameter name="identifier" type="integer" /> diff --git a/modules/templates/class/class_modules_tools_Abstract.php b/modules/templates/class/class_modules_tools_Abstract.php index 05159a8edfe..63bc1dd3d14 100755 --- a/modules/templates/class/class_modules_tools_Abstract.php +++ b/modules/templates/class/class_modules_tools_Abstract.php @@ -79,37 +79,4 @@ abstract class templates_Abstract extends Database return $return; } - - - public function getAllItemsLinkedToModel($template_id, $field ='') - { - $db = new Database(); - $items = array(); - if (empty($template_id)) { - return $items; - } - - if (empty($field)) { - $items['destination'] = []; - foreach (array_keys($items) as $key) { - $stmt2 = $db->query( - "select value_field from ".$_SESSION['tablename']['temp_templates_association']." where template_id = ? ", - array($template_id) - ); - while ($res = $stmt2->fetchOject()) { - array_push($items[$key], $res->value_field); - } - } - } else { - $items[$field] = []; - $stmt = $db->query( - "select value_field from ".$_SESSION['tablename']['temp_templates_association']." where template_id = ? ", - array($template_id) - ); - while ($res = $stmt->fetchObject()) { - array_push($items[$field], $res->value_field); - } - } - return $items; - } } diff --git a/modules/templates/class/templates_controler_Abstract.php b/modules/templates/class/templates_controler_Abstract.php index ccde9401c83..90c9c2f7fbd 100755 --- a/modules/templates/class/templates_controler_Abstract.php +++ b/modules/templates/class/templates_controler_Abstract.php @@ -498,41 +498,6 @@ abstract class templates_controler_Abstract extends ObjectControler implements O return $return; } - /** - * Return all templates in an array for an entity - * - * @param $entityId entity identifier - * @return array of templates - */ - public function getAllTemplatesForProcess($entityId) - { - include_once 'core/class/docservers_controler.php'; - - $db = new Database(); - $stmt = $db->query( - 'select * from ' . _TEMPLATES_TABLE_NAME . ' t, ' . _TEMPLATES_ASSOCIATION_TABLE_NAME . ' ta ' - . 'where t.template_id = ta.template_id and ta.value_field = ? ORDER BY t.template_label', - [$entityId] - ); - $docservers_controler = new docservers_controler(); - $docserverTemplate = $docservers_controler->get('TEMPLATES'); - $templates = []; - while ($res = $stmt->fetchObject()) { - array_push( - $templates, - array( - 'ID' => $res->template_id, - 'LABEL' => $res->template_label, - 'TYPE' => $res->template_type, - 'TARGET' => $res->template_target, - 'ATTACHMENT_TYPE' => $res->template_attachment_type, - 'FILE' => $docserverTemplate->path_template.str_replace('#', '/', $res->template_path).$res->template_file_name - ) - ); - } - return $templates; - } - public function updateTemplateEntityAssociation($templateId) { $db = new Database(); @@ -551,65 +516,6 @@ abstract class templates_controler_Abstract extends ObjectControler implements O } } - public function getAllItemsLinkedToModel($templateId, $field ='') - { - $db = new Database(); - $items = array(); - if (empty($templateId)) { - return $items; - } - if (empty($field)) { - $items['destination'] = []; - $stmt = $db->query( - "select value_field from " - . _TEMPLATES_ASSOCIATION_TABLE_NAME - . " where template_id = ?", - array($templateId) - ); - while ($res = $stmt->fetchObject()) { - array_push($items['destination'], $res->value_field); - } - } else { - $items[$field] = []; - $stmt = $db->query( - "select value_field from " - . _TEMPLATES_ASSOCIATION_TABLE_NAME - . " where template_id = ?", - array($templateId) - ); - while ($res = $stmt->fetchObject()) { - array_push($items[$field], $res->value_field); - } - } - return $items; - } - - public function getTemplatesStyles($dir, $stylesArray) - { - $this->stylesArray = $stylesArray; - //Browse all files of the style template dir - $classScan = dir($dir); - while (($filescan = $classScan->read()) != false) { - if ($filescan == '.' || $filescan == '..' || $filescan == '.svn') { - continue; - } elseif (is_dir($dir . $folder . $filescan)) { - $this->getTemplatesStyles($dir . $folder . $filescan . '/', $this->stylesArray); - } else { - $filePath = $dir . $folder . '/' . $filescan; - $info = pathinfo($filePath); - array_push( - $this->stylesArray, - array( - 'fileName' => basename($filePath, '.' . $info['extension']), - 'fileExt' => strtoupper($info['extension']), - 'filePath' => $filePath, - ) - ); - } - } - return $this->stylesArray; - } - public function getTemplatesDatasources($configXml) { $datasources = array(); @@ -634,52 +540,6 @@ abstract class templates_controler_Abstract extends ObjectControler implements O return $datasources; } - public function getTemplatesTargets() - { - $targets = array(); - //attachments - array_push( - $targets, - array( - 'id' => 'attachments', - 'label' => _ATTACHMENTS, - ) - ); - //notifications - array_push( - $targets, - array( - 'id' => 'notifications', - 'label' => _NOTIFICATIONS, - ) - ); - //doctypes - array_push( - $targets, - array( - 'id' => 'doctypes', - 'label' => _DOCTYPES, - ) - ); - //notes - array_push( - $targets, - array( - 'id' => 'notes', - 'label' => _NOTES, - ) - ); - //sendmail - array_push( - $targets, - array( - 'id' => 'sendmail', - 'label' => _SENDMAIL, - ) - ); - return $targets; - } - //returns file ext public function extractFileExt($sFullPath) { diff --git a/modules/templates/js/change_doctype.js b/modules/templates/js/change_doctype.js index e94e1c36da7..e69de29bb2d 100755 --- a/modules/templates/js/change_doctype.js +++ b/modules/templates/js/change_doctype.js @@ -1,53 +0,0 @@ - -function doctype_template(args) -{ - //alert(print_r(args)); - var choose_file_div = $('choose_file_div'); - var file_iframe = $('file_iframe'); - - var template = ''; - var is_generated = false; - var doc_frame = ''; - var model_frame = ''; - for(var i=0; i< args.length; i++) - { - if(args[i]['id'] == 'template_id') - { - template = args[i]['value']; - } - if(args[i]['id'] == 'is_generated' && args[i]['value'] == 'Y') - { - is_generated = true; - } - if(args[i]['id'] == 'doc_frame') - { - doc_frame = args[i]['value']; - } - if(args[i]['id'] == 'model_frame') - { - model_frame = args[i]['value']; - } - } - - if(is_generated == true) - { - if(choose_file_div != null) - { - choose_file_div.style.display = 'none'; - } - if(file_iframe != null && model_frame!= '' && model_frame != null) - { - file_iframe.src = model_frame; - } - } - else - { - if(file_iframe.src.includes("display=true&module=templates&page=file_iframe&model_id")){ - choose_file_div.style.display = 'block'; - if(file_iframe != null && doc_frame!= '' && doc_frame != null) - { - file_iframe.src = doc_frame; - } - } - } -} diff --git a/modules/templates/templates_ajax_content_for_mails.php b/modules/templates/templates_ajax_content_for_mails.php deleted file mode 100755 index 3b8de783bae..00000000000 --- a/modules/templates/templates_ajax_content_for_mails.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php - -/* -* Copyright 2008-2015 Maarch -* -* This file is part of Maarch Framework. -* -* Maarch Framework is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Maarch Framework is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. -*/ - -require_once 'modules/templates/class/templates_controler.php'; -require_once 'core/class/class_security.php'; -$templateController = new templates_controler(); - -if ((! isset($_REQUEST['templateId']) || empty($_REQUEST['templateId']))) { - $error = _TEMPLATE_ID . ' ' . _EMPTY; - echo "{status : 1, error_txt : '" . addslashes($error) . "'}"; - exit(); -} - -$sec = new security(); -$res_view = $sec->retrieve_view_from_coll_id('letterbox_coll'); - -$params = array( - 'res_id' => $_GET['id'], - 'coll_id'=> "letterbox_coll", - 'res_view'=> $res_view - ); - -$template = $templateController->get($_REQUEST['templateId']); -$template->template_content = $templateController->merge($_REQUEST['templateId'], $params, 'content', 'email'); -$template->template_content = str_replace("\r\n", "\n", $template->template_content); -$template->template_content = str_replace("\r", "\n", $template->template_content); -$template->template_content = str_replace("\n", "\\n ", $template->template_content); -$template->template_content = str_replace("''", "'", $template->template_content); - -if ($_REQUEST['mode'] == 'raw') { - $template->template_content = str_replace("<br>", "\\n", $template->template_content); - $template->template_content = str_replace("<br />", "\\n", $template->template_content); - $template->template_content = strip_tags($template->template_content); -} - -echo "{status : 0, content : '" . addslashes($template->template_content) . "'}"; -exit(); diff --git a/modules/templates/templates_ajax_content_for_notes.php b/modules/templates/templates_ajax_content_for_notes.php deleted file mode 100755 index 1fc9500077a..00000000000 --- a/modules/templates/templates_ajax_content_for_notes.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -/* -* Copyright 2008-2015 Maarch -* -* This file is part of Maarch Framework. -* -* Maarch Framework is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Maarch Framework is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. -*/ - -require_once 'modules/templates/class/templates_controler.php'; -$templateController = new templates_controler(); - -if ((! isset($_REQUEST['templateId']) || empty($_REQUEST['templateId']))) { - $error = _TEMPLATE_ID . ' ' . _EMPTY; - echo "{status : 1, error_txt : '" . addslashes($error) . "'}"; - exit(); -} -$template = $templateController->get($_REQUEST['templateId']); - -$template->template_content = str_replace("\r\n", "\n", $template->template_content); -$template->template_content = str_replace("\r", "\n", $template->template_content); -$template->template_content = str_replace("\n", "\\n ", $template->template_content); - -echo "{status : 0, content : '" . addslashes($template->template_content) . "'}"; -exit(); diff --git a/modules/templates/xml/IVS/requests_definitions.xml b/modules/templates/xml/IVS/requests_definitions.xml index 430ae760b58..f2489e4e711 100755 --- a/modules/templates/xml/IVS/requests_definitions.xml +++ b/modules/templates/xml/IVS/requests_definitions.xml @@ -16,16 +16,6 @@ <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="template_manage_add" > <parameter name="page" value="templates_management_controler"/> <parameter name="module" value="templates"/> - </requestDefinition> - <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="templates_ajax_content_for_mails" > - <parameter name="page" value="templates_ajax_content_for_mails"/> - <parameter name="module" value="templates"/> - <parameter name="display" value="true"/> - </requestDefinition> - <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="templates_ajax_content_for_notes" > - <parameter name="page" value="templates_ajax_content_for_notes"/> - <parameter name="module" value="templates"/> - <parameter name="display" value="true"/> </requestDefinition> <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="file_iframe" > <parameter name="page" value="file_iframe"/> diff --git a/modules/templates/xml/IVS/validation_rules.xml b/modules/templates/xml/IVS/validation_rules.xml index acfd768e35a..0dd8fea2bed 100755 --- a/modules/templates/xml/IVS/validation_rules.xml +++ b/modules/templates/xml/IVS/validation_rules.xml @@ -22,18 +22,6 @@ <parameter name="template_path" type="docserver_path" /> <parameter name="entitieslist" type="identifier" /> </validationRule> - - <validationRule name="templates_ajax_content_for_mails" extends="standardForm" mode="error"> - <parameter name="module" type="identifier" /> - <parameter name="id" type="integer" /> - <parameter name="templateId" type="integer" /> - <parameter name="mode" type="string" /> - </validationRule> - - <validationRule name="templates_ajax_content_for_notes" extends="standardForm" mode="error"> - <parameter name="module" type="identifier" /> - <parameter name="templateId" type="integer" /> - </validationRule> <validationRule name="admin_change_templates" extends="standardForm" mode="error"> <parameter name="template_style" type="string" /> diff --git a/modules/visa/checkAllAnsSigned.php b/modules/visa/checkAllAnsSigned.php deleted file mode 100755 index 363eb140aa2..00000000000 --- a/modules/visa/checkAllAnsSigned.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php - -/* -* Copyright 2008 - 2015 Maarch -* -* This file is part of Maarch Framework. -* -* Maarch Framework is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Maarch Framework is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. -*/ - - require_once('core' . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR - . 'class_request.php'); - require_once('core' . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR - . 'class_db.php'); - - require_once 'modules/attachments/attachments_tables.php'; - - $core_tools = new core_tools(); - $core_tools->test_user(); - - $db = new Database(); - $stmt = $db->query("SELECT status from res_attachments where attachment_type= ? and res_id_master = ? ", array('response_project', $_REQUEST['res_id'])); - while($line = $stmt->fetchObject()){ - if ($line->status == 'TRA' || $line->status == 'A_TRA' ){ - echo "{status:0}"; - exit(); - } - } - - echo "{status:1}"; - exit(); - -?> \ No newline at end of file diff --git a/modules/visa/class/class_modules_tools.php b/modules/visa/class/class_modules_tools.php index e9632003531..2664e319f27 100755 --- a/modules/visa/class/class_modules_tools.php +++ b/modules/visa/class/class_modules_tools.php @@ -46,141 +46,4 @@ class ConcatPdf extends ConcatPdf_Abstract // custom } -/* EXEMPLE TAB VISA_CIRCUIT - -Array -( - [coll_id] => letterbox_coll - [res_id] => 190 - [difflist_type] => entity_id - [sign] => Array - ( - [users] => Array - ( - [0] => Array - ( - [user_id] => sgros - [lastname] => GROS - [firstname] => Sébastien - [entity_id] => CHEFCABINET - [entity_label] => Chefferie - [visible] => Y - [viewed] => 0 - [difflist_type] => VISA_CIRCUIT - [process_date] => - [process_comment] => - ) - - ) - - ) - - [visa] => Array - ( - [users] => Array - ( - [0] => Array - ( - [user_id] => sbes - [lastname] => BES - [firstname] => Stéphanie - [entity_id] => CHEFCABINET - [entity_label] => Chefferie - [visible] => Y - [viewed] => 0 - [difflist_type] => VISA_CIRCUIT - [process_date] => - [process_comment] => - ) - - [1] => Array - ( - [user_id] => fbenrabia - [lastname] => BENRABIA - [firstname] => Fadela - [entity_id] => POLESOCIAL - [entity_label] => Pôle social - [visible] => Y - [viewed] => 0 - [difflist_type] => VISA_CIRCUIT - [process_date] => - [process_comment] => - ) - - [2] => Array - ( - [user_id] => bpont - [lastname] => PONT - [firstname] => Brieuc - [entity_id] => POLEAFFAIRESETRANGERES - [entity_label] => Pôle affaires étrangères - [visible] => Y - [viewed] => 0 - [difflist_type] => VISA_CIRCUIT - [process_date] => - [process_comment] => - ) - - ) - - ) - -) - - - - - -<h3>Document</h3><pre>Array -( - [0] => Array - ( - [id] => 197 - [label] => 123456 - [format] => pdf - [filesize] => 46468 - [attachment_type] => - [is_version] => - [version] => - ) - -) -</pre><h3>Document</h3><pre>Array -( - [0] => Array - ( - [id] => 400 - [label] => reponse 1 v5 - [format] => docx - [filesize] => 36219 - [attachment_type] => response_project - [is_version] => - [version] => - ) - - [1] => Array - ( - [id] => 409 - [label] => Nouvelle PJ - [format] => pdf - [filesize] => 1204460 - [attachment_type] => simple_attachment - [is_version] => - [version] => - ) - - [2] => Array - ( - [id] => 410 - [label] => pj 2 - [format] => pdf - [filesize] => 361365 - [attachment_type] => simple_attachment - [is_version] => - [version] => - ) - -) - -*/ ?> diff --git a/modules/visa/class/class_modules_tools_Abstract.php b/modules/visa/class/class_modules_tools_Abstract.php index 2a909f4c0cc..857c68e830e 100755 --- a/modules/visa/class/class_modules_tools_Abstract.php +++ b/modules/visa/class/class_modules_tools_Abstract.php @@ -90,938 +90,12 @@ abstract class visa_Abstract extends Database $_SESSION['modules_loaded']['visa']['routing_template'] = $routing_template; } - - public function checkResponseProject($res_id, $coll_id) - { - $this->errorMessageVisa = null; - - $attachmentTypes = \Attachment\models\AttachmentModel::getAttachmentsTypesByXML(); - - $noSignableAttachments = []; - foreach ($attachmentTypes as $key => $value) { - if (!$value['sign']) { - $noSignableAttachments[] = $key; - } - } - - $db = new Database(); - if (empty($noSignableAttachments)) { - $stmt = $db->query("SELECT * FROM res_attachments WHERE res_id_master = ? AND status NOT IN ('DEL','OBS','TMP') AND in_signature_book = ?", [$res_id, true]); - } else { - $stmt = $db->query("SELECT * FROM res_attachments WHERE res_id_master = ? AND status NOT IN ('DEL','OBS','TMP') AND attachment_type NOT IN (?) AND in_signature_book = ? ", [$res_id, $noSignableAttachments, true]); - } - if ($stmt->rowCount() <= 0) { - $this->errorMessageVisa = _NO_RESPONSE_PROJECT_VISA; - - return false; - } - - return true; - } - - public function getWorkflow($res_id, $coll_id, $typeList) - { - require_once 'modules/entities/class/class_manage_listdiff.php'; - $listdiff = new diffusion_list(); - $roles = $listdiff->list_difflist_roles(); - $circuit = $listdiff->get_listinstance($res_id, false, $typeList); - if (isset($circuit['copy'])) { - unset($circuit['copy']); - } - - return $circuit; - } - - public function saveWorkflow($res_id, $coll_id, $workflow, $typeList) - { - require_once 'modules/entities/class/class_manage_listdiff.php'; - $diff_list = new diffusion_list(); - - $diff_list->save_listinstance( - $workflow, - $typeList, - $coll_id, - $res_id, - $_SESSION['user']['UserId'], - $_SESSION['user']['primaryentity']['id'] - ); - } - - public function saveModelWorkflow($id_list, $workflow, $typeList, $title) - { - } - - protected function getWorkflowsNumberByTitle($title) - { - $db = new Database(); - $stmt = $db->query('SELECT * FROM listmodels WHERE title = ?', array($title)); - - return $stmt->rowCount(); - } - - public function isWorkflowTitleFree($title) - { - $nb = $this->getWorkflowsNumberByTitle($title); - if ($nb == 0) { - return true; - } else { - return false; - } - } - - public function nbVisa($res_id, $coll_id) - { - $db = new Database(); - $stmt = $db->query('SELECT listinstance_id from listinstance WHERE res_id= ? and coll_id = ? and item_mode = ?', array($res_id, $coll_id, 'visa')); - - return $stmt->rowCount(); - } - - public function getCurrentStep($res_id, $coll_id, $listDiffType) - { - $db = new Database(); - $where = 'res_id= ? and coll_id = ? and difflist_type = ? and process_date IS NULL'; - $order = 'ORDER BY listinstance_id ASC'; - $query = $db->limit_select(0, 1, 'sequence, item_mode', 'listinstance', $where, '', '', $order); - - $stmt = $db->query($query, array($res_id, $coll_id, $listDiffType)); - $res = $stmt->fetchObject(); - if ($res->item_mode == 'sign') { - return $this->nbVisa($res_id, $coll_id); - } - - return $res->sequence; - } - - public function getUsersCurrentVis($res_id) - { - $db = new Database(); - $result = array(); - $stmt = $db->query("SELECT item_id from listinstance WHERE res_id= ? and difflist_type = 'VISA_CIRCUIT' ORDER BY sequence ASC", array($res_id)); - while ($res = $stmt->fetchObject()) { - $result[] = $res->item_id; - } - - return $result; - } - - public function getCurrentUserStep($res_id) - { - $db = new Database(); - $stmt = $db->query('SELECT item_id from listinstance WHERE res_id= ? and coll_id = ? and difflist_type = ? and process_date ISNULL ORDER BY listinstance_id ASC LIMIT 1', array($res_id, 'letterbox_coll', 'VISA_CIRCUIT')); - $res = $stmt->fetchObject(); - - return $res->item_id; - } - - public function getStepDetails($res_id, $coll_id, $listDiffType, $sequence) - { - $stepDetails = array(); - $db = new Database(); - $order = 'ORDER by listinstance_id ASC'; - $where = 'res_id= ? and coll_id = ? and difflist_type = ? and sequence = ? '; - $query = $db->limit_select(0, 1, '*', 'listinstance', $where, '', '', $order); - - $stmt = $db->query($query, array($res_id, $coll_id, $listDiffType, $sequence)); - - $res = $stmt->fetchObject(); - $stepDetails['listinstance_id'] = $res->listinstance_id; - $stepDetails['coll_id'] = $res->coll_id; - $stepDetails['res_id'] = $res->res_id; - $stepDetails['sequence'] = $res->sequence; - $stepDetails['item_id'] = $res->item_id; - $stepDetails['item_type'] = $res->item_type; - $stepDetails['item_mode'] = $res->item_mode; - $stepDetails['added_by_user'] = $res->added_by_user; - $stepDetails['visible'] = $res->visible; - $stepDetails['viewed'] = $res->viewed; - $stepDetails['difflist_type'] = $res->difflist_type; - $stepDetails['process_date'] = $res->process_date; - $stepDetails['process_comment'] = $res->process_comment; - - return $stepDetails; - } - - public function processVisaWorkflow($aArgs = []) - { - $message = []; - $db = new Database(); - //enables to process the visa if i am not the item_id - if ($aArgs['stepDetails']['item_id'] != $_SESSION['user']['UserId']) { - $db->query( - 'UPDATE listinstance SET process_date = CURRENT_TIMESTAMP ' - .' WHERE listinstance_id = ? AND item_mode = ? AND res_id = ? AND item_id = ? AND difflist_type = ?', - array($aArgs['stepDetails']['listinstance_id'], $aArgs['stepDetails']['item_mode'], $aArgs['res_id'], $aArgs['stepDetails']['item_id'], 'VISA_CIRCUIT') - ); - - $stmt = $db->query('SELECT firstname, lastname, user_id FROM users WHERE user_id IN (?)', array([$_SESSION['user']['UserId'], $aArgs['stepDetails']['item_id']])); - foreach ($stmt as $value) { - if ($value['user_id'] == $_SESSION['user']['UserId']) { - $user1 = $value['firstname'].' '.$value['lastname']; - } else { - $user2 = $value['firstname'].' '.$value['lastname']; - } - } - - $message[] = ' '._VISA_BY.' '.$user1.' '._INSTEAD_OF.' '.$user2; - } else { - $db->query( - 'UPDATE listinstance SET process_date = CURRENT_TIMESTAMP ' - .' WHERE listinstance_id = ? AND item_mode = ? AND res_id = ? AND item_id = ? AND difflist_type = ?', - array($aArgs['stepDetails']['listinstance_id'], $aArgs['stepDetails']['item_mode'], $aArgs['res_id'], $_SESSION['user']['UserId'], 'VISA_CIRCUIT') - ); - $message[] = ''; - } - - return $message; - } - - public function getUsersVis($group_id = null) - { - $db = new Database(); - - if ($group_id != null) { - $stmt = $db->query("SELECT users.user_id, users.firstname, users.lastname, usergroup_content.group_id,entities.entity_id from users, usergroup_content, users_entities,entities WHERE users_entities.user_id = users.user_id and users.status <> 'DEL' and - users_entities.primary_entity = 'Y' and users.user_id = usergroup_content.user_id AND entities.entity_id = users_entities.entity_id AND group_id IN - (SELECT group_id FROM usergroups_services WHERE service_id = ? AND group_id = ?) order by users.lastname", array('visa_documents', $group_id)); - } else { - $stmt = $db->query("SELECT distinct on(users.user_id) users.user_id, users.firstname, users.lastname, usergroup_content.group_id,entities.entity_id from users, usergroup_content, users_entities,entities WHERE users_entities.user_id = users.user_id and users.status <> 'DEL' and - users_entities.primary_entity = 'Y' and users.user_id = usergroup_content.user_id AND entities.entity_id = users_entities.entity_id AND group_id IN - (SELECT group_id FROM usergroups_services WHERE service_id = ?) - order by users.user_id,users.lastname", array('visa_documents')); - } - - $tab_users = array(); - - while ($res = $stmt->fetchObject()) { - array_push($tab_users, array('id' => $res->user_id, 'firstname' => $res->firstname, 'lastname' => $res->lastname, 'group_id' => $res->group_id, 'entity_id' => $res->entity_id)); - } - - return $tab_users; - } - - public function getEntityVis() - { - $db = new Database(); - - $stmt = $db->query("SELECT distinct(entities.entity_id) FROM users, usergroup_content, users_entities,entities WHERE users_entities.user_id = users.user_id and - users_entities.primary_entity = 'Y' and users.user_id = usergroup_content.user_id AND entities.entity_id = users_entities.entity_id AND group_id IN - (SELECT group_id FROM usergroups_services WHERE service_id = ?) - order by entities.entity_id", array('visa_documents')); - - $tab_userentities = array(); - - while ($res = $stmt->fetchObject()) { - array_push($tab_userentities, array('entity_id' => $res->entity_id)); - } - - return $tab_userentities; - } - - public function setStatusVisa($res_id, $coll_id, $inDetails = false) - { - $curr_visa_wf = $this->getWorkflow($res_id, $coll_id, 'VISA_CIRCUIT'); - - $db = new Database(); - $where = 'res_id= ? and coll_id = ? and difflist_type = ? and process_date IS NULL'; - $order = 'ORDER BY listinstance_id ASC'; - $query = $db->limit_select(0, 1, 'requested_signature', 'listinstance', $where, '', '', $order); - - $stmt = $db->query($query, array($res_id, $coll_id, 'VISA_CIRCUIT')); - $resListDiffVisa = $stmt->fetchObject(); - - // If there is only one step in the visa workflow, we set status to ESIG - if ($resListDiffVisa->requested_signature) { - $mailStatus = 'ESIG'; - } else { - $mailStatus = 'EVIS'; - } - - $db->query('UPDATE res_letterbox SET status = ? WHERE res_id = ? ', array($mailStatus, $res_id)); - } - - public function getList($res_id, $coll_id, $bool_modif = false, $typeList, $isVisaStep = false, $fromDetail = '') - { - $core = new core_tools(); - $circuit = $this->getWorkflow($res_id, $coll_id, $typeList); - $sAllAttachmentSigned = $this->isAllAttachementSigned($res_id); - if ($sAllAttachmentSigned == 'noAttachment') { - $str = '<input type="hidden" id="isAllAttachementSigned" value="false"/>'; - $isAllAttachementSigned = ''; - $isAllAttachementSignedInfo = ''; - } elseif ($sAllAttachmentSigned == 'yes') { - $str = '<input type="hidden" id="isAllAttachementSigned" value="allsigned"/>'; - $isAllAttachementSigned = ''; - $isAllAttachementSignedInfo = _IS_ALL_ATTACHMENT_SIGNED_INFO2; - } else { - $str = '<input type="hidden" id="isAllAttachementSigned" value="false"/>'; - $isAllAttachementSigned = ''; - } - - $str .= '<div class="error" id="divErrorVisa" onclick="this.hide();"></div>'; - $str .= '<div class="info" id="divInfoVisa" onclick="this.hide();"></div>'; - - //VISA USER LIST - if ($bool_modif == true) { - $str .= '<select data-placeholder="'._ADD_VISA_ROLE.'" id="visaUserList" onchange="addVisaUser();">'; - $str .= '<option value="" ></option>'; - - $tab_userentities = $this->getEntityVis(); - $tab_users = $this->getUsersVis(); - /* Order by parent entity **/ - foreach ($tab_userentities as $key => $value) { - $str .= '<optgroup label="'.$tab_userentities[$key]['entity_id'].'">'; - foreach ($tab_users as $user) { - if ($tab_userentities[$key]['entity_id'] == $user['entity_id']) { - $selected = ' '; - if ($user['id'] == $step['user_id']) { - $selected = ' selected'; - } - $str .= '<option value="'.$user['id'].'" '.$selected.'>'.$user['lastname'].' '.$user['firstname'].'</option>'; - } - } - $str .= '</optgroup>'; - } - $str .= '</select>'; - $str .= '<script>'; - $str .= ' $j("#visaUserList").chosen({width: "250px", disable_search_threshold: 10});'; - $str .= '</script>'; - - $str .= ' <select data-placeholder="'._ADD_VISA_MODEL.'" name="modelList" id="modelList" onchange="loadVisaModelUsers();">'; - $str .= '<option value=""></option>'; - $str .= '</select>'; - - $str .= '<script>'; - $str .= ' $j("#modelList").chosen({width: "250px", disable_search_threshold: 10});'; - $str .= '</script>'; - $str .= '<br/><br/>'; - } - if (!empty($isAllAttachementSignedInfo)) { - $str .= '<b style="color:red;">'.$isAllAttachementSignedInfo.'</b>'; - } - $str .= '<div id="visa_content">'; - //VISA USER IN DOCUMENT - $i = 1; - $lastUserVis = true; - - if ((empty($circuit['visa']['users']) || !is_array($circuit['visa']['users']) || count($circuit['visa']['users']) == 0) && (empty($circuit['sign']['users']) || !is_array($circuit['sign']['users']) || count($circuit['sign']['users']) == 0)) { - $str .= '<div id="emptyVisa"><strong><em>'._EMPTY_VISA_WORKFLOW.'</em></strong></div>'; - } else { - $str .= '<div id="emptyVisa" style="display:none;"><strong><em>'._EMPTY_VISA_WORKFLOW.'</em></strong></div>'; - if (!empty($circuit['visa']['users']) && is_array($circuit['visa']['users']) && count($circuit['visa']['users']) > 0) { - $isCurrentVisa = false; - foreach ($circuit['visa']['users'] as $it => $info_userVis) { - if (empty($info_userVis['process_date'])) { - if ($lastUserVis == true && $isVisaStep == true && $isCurrentVisa === false) { - $vised = ' currentVis'; - $disabled = ''; - $link_vis = 'arrow-right '; - $del_vis = '<div class="delete_visa"></div>'; - if ($info_userVis['requested_signature'] && $info_userVis['user_id'] != $_SESSION['user']['UserId']) { - $info_vised = '<p style="color:red;">'._SIGN_USER_COU_DESC.' '.$info_userVis['firstname'].' '.$info_userVis['lastname'].'</p>'; - $dropZone = ''; - } elseif ($info_userVis['requested_signature'] && $info_userVis['user_id'] == $_SESSION['user']['UserId']) { - $info_vised = '<p style="font-weight:normal;">'._SIGN_USER_COU.'</p>'; - $dropZone = ''; - } elseif (!$info_userVis['requested_signature'] && $info_userVis['user_id'] != $_SESSION['user']['UserId']) { - $info_vised = '<p style="color:red;">'._VISA_USER_COU_DESC.' '.$info_userVis['firstname'].' '.$info_userVis['lastname'].'</p>'; - $dropZone = ''; - } else { - $info_vised = '<p style="font-weight:normal;">'._VISA_USER_COU.'</p>'; - $dropZone = ''; - } - if ($core->test_service('modify_visa_in_signatureBook', 'visa', false)) { - $modif = 'true'; - $dropZone = '<i class="fa fa-exchange-alt fa-2x fa-rotate-90" aria-hidden="true" title="'._DRAG_N_DROP_CHANGE_ORDER.'" style="cursor: pointer"></i>'; - $del_vis = '<i class="fa fa-trash-alt" aria-hidden="true" onclick="delVisaUser(this.parentElement.parentElement);" title="'._DELETE.'"></i>'; - } else { - $modif = 'false'; - } - - $info_vised .= '<select style="display:none;" id="signRequest_'.$i.'" '.$isAllAttachementSigned; - $info_vised .= ' disabled="disabled" '; - $info_vised .= '>'; - $info_vised .= '<option value="false">'._VISA_USER_SEARCH.'</option>'; - - $info_vised .= '<option value="true"'; - if (!empty($info_userVis['requested_signature'])) { - $info_vised .= ' selected="selected" '; - } - $info_vised .= '>'._SIGNATORY.'</option>'; - $info_vised .= '</select>'; - } else { - $dropZone = '<i class="fa fa-exchange-alt fa-2x fa-rotate-90" aria-hidden="true" title="'._DRAG_N_DROP_CHANGE_ORDER.'" style="cursor: pointer"></i>'; - $vised = ''; - if ($bool_modif == true) { - $modif = 'true'; - $del_vis = '<i class="fa fa-trash-alt" aria-hidden="true" onclick="delVisaUser(this.parentElement.parentElement);" title="'._DELETE.'"></i>'; - $disabled = ''; - } else { - $modif = 'false'; - $dropZone = ''; - $del_vis = ''; - $disabled = ' disabled="disabled"'; - } - - $info_vised = '<br/><select id="signRequest_'.$i.'" '.$isAllAttachementSigned; - if (!empty($info_userVis['signatory'])) { - $info_vised .= ' disabled="disabled" '; - } - $info_vised .= '>'; - $info_vised .= '<option value="false">'._VISA_USER_SEARCH.'</option>'; - - $info_vised .= '<option value="true"'; - if (!empty($info_userVis['requested_signature'])) { - $info_vised .= ' selected="selected" '; - } - $info_vised .= '>'._SIGNATORY.'</option>'; - $info_vised .= '</select>'; - $link_vis = 'hourglass-half'; - } - - $lastUserVis = false; - $isCurrentVisa = true; - } else { - $lastUserVis = true; - $modif = 'false'; - - $disabled = ' disabled="disabled"'; - if (preg_match("/\[DEL\]/", $info_userVis['process_comment'])) { - $info_vised = '<br/><select id="signRequest_'.$i.'" '.$isAllAttachementSigned; - if (!empty($info_userVis['signatory'])) { - $info_vised .= ' disabled="disabled" '; - } - $info_vised .= '>'; - $info_vised .= '<option value="false">'._VISA_USER_SEARCH.'</option>'; - - $info_vised .= '<option value="true"'; - if (!empty($info_userVis['requested_signature'])) { - $info_vised .= ' selected="selected" '; - } - $info_vised .= '>'._SIGNATORY.'</option>'; - $info_vised .= '</select>'; - $link_vis = 'times'; - $vised = ' moved vised'; - $del_vis = '<i class="fa fa-trash-alt" aria-hidden="true" onclick="delVisaUser(this.parentElement.parentElement);" title="'._DELETE.'"></i>'; - } else { - if (!empty($info_userVis['signatory'])) { - $info_vised = '<br/><sub>signé le : '.functions::format_date_db($info_userVis['process_date'], '', '', true).'</sub>'; - $info_vised .= '<br/><select id="signRequest_'.$i.'" style="width:auto;display:none;" disabled="disabled" '.$isAllAttachementSigned; - $info_vised .= '>'; - $info_vised .= '<option value="false" selected="selected">'._VISA_USER_SEARCH.'</option>'; - - $info_vised .= '<option value="true"'; - $info_vised .= '>'._SIGNATORY.'</option>'; - $info_vised .= '</select>'; - } else { - $info_vised = '<br/><sub>visé le : '.functions::format_date_db($info_userVis['process_date'], '', '', true).'</sub>'; - - $info_vised .= '<br/><select id="signRequest_'.$i.'" style="width:auto;display:none;" disabled="disabled" '.$isAllAttachementSigned; - $info_vised .= '>'; - $info_vised .= '<option value="false">'._VISA_USER_SEARCH.'</option>'; - - $info_vised .= '<option value="true" selected="selected"'; - $info_vised .= '>'._SIGNATORY.'</option>'; - $info_vised .= '</select>'; - } - - $link_vis = 'check'; - $vised = ' vised'; - $del_vis = ''; - } - } - //VISA USER LINE CIRCUIT - $str .= '<div class="droptarget'.$vised.'" id="visa_'.$i.'" draggable="'.$modif.'">'; - $str .= '<span class="visaUserStatus">'; - $str .= '<i class="fa fa-'.$link_vis.'" aria-hidden="true"></i>'; - $str .= '</span>'; - $str .= '<span class="visaUserInfo">'; - $str .= '<sup class="visaUserPos nbResZero">'.$i.'</sup> '; - $str .= '<i class="fa fa-user fa-2x" aria-hidden="true"></i> '.$info_userVis['lastname'].' '.$info_userVis['firstname'].' <sup class="nbRes">'.$info_userVis['entity_id'].'</sup>'; - $str .= ' <sub><i id="signedUser_'.$i.'" title="au moins un document a été signé par cet utilisateur" class="visaUserSign fa fa-certificate" aria-hidden="true" style="color:#F99830;'; - if (empty($info_userVis['signatory'])) { - $str .= 'visibility:hidden'; - } - $str .= '"></i>'.$info_vised; - $str .= '</span>'; - $str .= '<span class="visaUserAction">'; - $str .= $del_vis; - $str .= '</span>'; - $str .= '<span class="visaUserConsigne">'; - $str .= '<input class="userId" type="hidden" value="'.$info_userVis['user_id'].'"/><input class="visaDate" type="hidden" value="'.$info_userVis['process_date'].'"/><input'.$disabled.' class="consigne" type="text" value="'.$info_userVis['process_comment'].'"/>'; - $str .= '</span>'; - - $str .= '<span id="dropZone">'; - $str .= $dropZone; - $str .= '</span>'; - $str .= '</div>'; - - ++$i; - } - } - - //FOR USER SIGN - if (!empty($circuit['sign']['users'])) { - foreach ($circuit['sign']['users'] as $info_userSign) { - if (empty($info_userSign['process_date'])) { - if (($lastUserVis == true && $isVisaStep == true)) { - $vised = ' currentVis'; - $modif = 'false'; - $disabled = ''; - $del_vis = ''; - $link_vis = 'arrow-right '; - if ($info_userSign['requested_signature'] && $info_userSign['user_id'] != $_SESSION['user']['UserId']) { - $dropZone = ''; - $info_vised = '<p style="color:red;">'._SIGN_USER_COU_DESC.' '.$info_userSign['firstname'].' '.$info_userSign['lastname'].'</p>'; - } elseif ($info_userSign['requested_signature'] && $info_userSign['user_id'] == $_SESSION['user']['UserId']) { - $dropZone = ''; - $info_vised = '<p style="font-weight:normal;">'._SIGN_USER_COU.'</p>'; - } elseif (!$info_userSign['requested_signature'] && $info_userSign['user_id'] != $_SESSION['user']['UserId']) { - $dropZone = ''; - $info_vised = '<p style="color:red;">'._VISA_USER_COU_DESC.' '.$info_userSign['firstname'].' '.$info_userSign['lastname'].'</p>'; - } else { - $dropZone = ''; - $info_vised = '<p style="font-weight:normal;">'._VISA_USER_COU.'</p>'; - } - if ($core->test_service('modify_visa_in_signatureBook', 'visa', false)) { - $modif = 'true'; - $dropZone = '<i class="fa -alt fa-2x fa-rotate-90" aria-hidden="true" title="'._DRAG_N_DROP_CHANGE_ORDER.'" style="cursor: pointer"></i>'; - $del_vis = '<i class="fa fa-trash-alt" aria-hidden="true" onclick="delVisaUser(this.parentElement.parentElement);" title="'._DELETE.'"></i>'; - } else { - $modif = 'false'; - } - $info_vised .= '<select style="display:none;" id="signRequest_'.$i.'" '.$isAllAttachementSigned; - $info_vised .= ' disabled="disabled" '; - $info_vised .= '>'; - $info_vised .= '<option value="false">'._VISA_USER_SEARCH.'</option>'; - - $info_vised .= '<option value="true"'; - if (!empty($info_userSign['requested_signature'])) { - $info_vised .= ' selected="selected" '; - } - $info_vised .= '>'._SIGNATORY.'</option>'; - $info_vised .= '</select>'; - } else { - $dropZone = '<i class="fa fa-exchange-alt fa-2x fa-rotate-90" aria-hidden="true" title="'._DRAG_N_DROP_CHANGE_ORDER.'" style="cursor: pointer"></i>'; - $vised = ''; - if ($bool_modif == true) { - $modif = 'true'; - $del_vis = '<i class="fa fa-trash-alt" aria-hidden="true" onclick="delVisaUser(this.parentElement.parentElement);" title="'._DELETE.'"></i>'; - $disabled = ''; - } else { - $dropZone = ''; - $modif = 'false'; - $del_vis = ''; - $disabled = ' disabled="disabled"'; - } - - $info_vised = '<br/><select id="signRequest_'.$i.'" '.$isAllAttachementSigned; - if (!empty($info_userSign['signatory'])) { - $info_vised .= ' disabled="disabled" '; - } - $info_vised .= '>'; - $info_vised .= '<option value="false">'._VISA_USER_SEARCH.'</option>'; - - $info_vised .= '<option value="true"'; - if (!empty($info_userSign['requested_signature'])) { - $info_vised .= ' selected="selected" '; - } - $info_vised .= '>'._SIGNATORY.'</option>'; - $info_vised .= '</select>'; - $link_vis = 'hourglass-half'; - } - } else { - $modif = 'false'; - if (preg_match("/\[DEL\]/", $info_userSign['process_comment'])) { - $info_vised = '<br/><select id="signRequest_'.$i.'" '.$isAllAttachementSigned; - if (!empty($info_userSign['signatory'])) { - $info_vised .= ' disabled="disabled" '; - } - $info_vised .= '>'; - $info_vised .= '<option value="false">'._VISA_USER_SEARCH.'</option>'; - - $info_vised .= '<option value="true"'; - if (!empty($info_userSign['requested_signature'])) { - $info_vised .= ' selected="selected" '; - } - $info_vised .= '>'._SIGNATORY.'</option>'; - $info_vised .= '</select>'; - - $link_vis = 'hourglass-half'; - $link_vis = 'times'; - $vised = ' moved vised'; - $del_vis = '<i class="fa fa-trash-alt" aria-hidden="true" onclick="delVisaUser(this.parentElement.parentElement);" title="'._DELETE.'"></i>'; - } else { - $vised = ' vised'; - $link_vis = 'check'; - - if (!empty($info_userSign['signatory'])) { - $info_vised = '<br/><sub>signé le : '.functions::format_date_db($info_userSign['process_date'], '', '', true).'</sub>'; - - $info_vised .= '<br/><select id="signRequest_'.$i.'" style="width:auto;display:none;" '.$isAllAttachementSigned; - $info_vised .= ' disabled="disabled" '; - $info_vised .= '>'; - $info_vised .= '<option value="false">'._VISA_USER_SEARCH.'</option>'; - $info_vised .= '<option value="true"'; - $info_vised .= ' selected="selected" '; - $info_vised .= '>'._SIGNATORY.'</option>'; - $info_vised .= '</select>'; - } else { - $info_vised = '<br/><sub>visé le : '.functions::format_date_db($info_userSign['process_date'], '', '', true).'</sub>'; - - $info_vised .= '<br/><select id="signRequest_'.$i.'" style="width:auto;display:none;" '.$isAllAttachementSigned; - $info_vised .= ' disabled="disabled" '; - $info_vised .= '>'; - $info_vised .= '<option value="false" selected="selected">'._VISA_USER_SEARCH.'</option>'; - $info_vised .= '<option value="true"'; - $info_vised .= '>'._SIGNATORY.'</option>'; - $info_vised .= '</select>'; - } - } - } - //VISA USER LINE CIRCUIT - $str .= '<div class="droptarget'.$vised.'" id="visa_'.$i.'" draggable="'.$modif.'">'; - $str .= '<span class="visaUserStatus">'; - $str .= '<i class="fa fa-'.$link_vis.'" aria-hidden="true"></i>'; - $str .= '</span>'; - $str .= '<span class="visaUserInfo">'; - $str .= '<sup class="visaUserPos nbResZero">'.$i.'</sup> '; - $str .= '<i class="fa fa-user fa-2x" aria-hidden="true"></i> '.$info_userSign['lastname'].' '.$info_userSign['firstname'].' <sup class="nbRes">'.$info_userSign['entity_id'].'</sup>'; - $str .= ' <sub><i id="signedUser_'.$i.'" title="au moins un document a été signé par cet utilisateur" class="visaUserSign fa fa-certificate" aria-hidden="true" style="color:#F99830;'; - if (empty($info_userSign['signatory'])) { - $str .= 'visibility:hidden'; - } - $str .= '"></i>'.$info_vised; - $str .= '</span>'; - $str .= '<span class="visaUserAction">'; - $str .= $del_vis; - $str .= '</span>'; - $str .= '<span class="visaUserConsigne">'; - $str .= '<input class="userId" type="hidden" value="'.$info_userSign['user_id'].'"/><input class="visaDate" type="hidden" value="'.$info_userSign['process_date'].'"/><input'.$disabled.' class="consigne" type="text" value="'.$info_userSign['process_comment'].'"/>'; - $str .= '</span>'; - $str .= '<span id="dropZone">'; - $str .= $dropZone; - $str .= '</span>'; - $str .= '</div>'; - ++$i; - } - } - } - - $str .= '</div>'; - - if ($bool_modif == true) { - //SAVE VISA CIRCUIT - $str .= '<input type="button" name="send" id="send" value="'._SAVE_CHANGES.'" class="button" '; - $str .= 'onclick="updateVisaWorkflow('.$res_id.');" /> '; - - //SAVE AS MODEL - $str .= '<input type="button" name="save" id="save" value="Enregistrer comme modèle" class="button" onclick="$(\'modalSaveVisaModel\').style.display = \'block\';" />'; - $str .= '<div id="modalSaveVisaModel" >'; - $str .= '<h3>'._SAVE_POSITION.' '._VISA_WORKFLOW.'</h3><br/>'; - $str .= '<label for="titleModel">'._TITLE.'</label> '; - $str .= '<input type="text" name="titleModel" id="titleModel"/><br/>'; - $str .= '<input type="button" name="saveModel" id="saveModel" value="'._VALIDATE.'" class="button" onclick="saveVisaWorkflowAsModel();" /> '; - $str .= '<input type="button" name="cancelModel" id="cancelModel" value="'._CANCEL.'" class="button" onclick="$(\'modalSaveVisaModel\').style.display = \'none\';" />'; - $str .= '</div>'; - } - $str .= '<script>initDragNDropVisa();</script>'; - - return $str; - } - - /* DOSSIER IMPRESSION */ - public function getJoinedFiles($coll_id, $table, $id, $from_res_attachment = false, $filter_attach_type = 'all') - { - $joinedFiles = array(); - $db = new Database(); - if ($from_res_attachment === false) { - $stmt = $db->query( - 'select res_id, description, subject, title, format, filesize, relation, creation_date from ' - . " res_letterbox where res_id = ? and status <> 'DEL'", - array($id) - ); - } else { - require_once 'modules/attachments/attachments_tables.php'; - if ($filter_attach_type == 'all') { - $stmt = $db->query( - 'select res_id, description, subject, title, format, filesize, res_id_master, attachment_type, creation_date, typist from ' - ." res_attachments where res_id_master = ? and attachment_type <> 'converted_pdf' and attachment_type <> 'print_folder' and status <> 'DEL' order by attachment_type, creation_date", - array($id) - ); - } else { - $stmt = $db->query( - 'select res_id, description, subject, title, format, filesize, res_id_master, attachment_type, creation_date, typist from ' - .' res_attachments ' - ." where res_id_master = ? and attachment_type = '" - .$filter_attach_type."' and status not in ('DEL', 'OBS') order by creation_date", - array($id) - ); - } - } - - while ($res = $stmt->fetchObject()) { - $pdf_exist = true; - if ($from_res_attachment) { - require_once 'modules/attachments/class/attachments_controler.php'; - $ac = new attachments_controler(); - $idFile = $res->res_id; - $convertedDocument = \Convert\models\AdrModel::getConvertedDocumentById(['select' => ['docserver_id', 'path', 'filename'], 'type' => 'PDF', 'resId' => $idFile, 'collId' => 'attachments_coll']); - $viewLink = $_SESSION['config']['businessappurl'] - .'index.php?display=true&module=attachments&page=view_attachment&res_id_master=' - .$id.'&id='.$res->res_id; - - if (!empty($convertedDocument)) { - $docserver = \Docserver\models\DocserverModel::getByDocserverId(['docserverId' => $convertedDocument['docserver_id'], 'select' => ['path_template']]); - $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $convertedDocument['path']) . $convertedDocument['filename']; - - - if (!file_exists($pathToDocument)) { - $pdf_exist = false; - } - } else { - $pdf_exist = false; - } - } else { - $idFile = $res->res_id; - $convertedDocument = \Convert\models\AdrModel::getConvertedDocumentById(['select' => ['docserver_id', 'path', 'filename'], 'type' => 'PDF', 'resId' => $idFile, 'collId' => 'letterbox_coll']); - $viewLink = $_SESSION['config']['businessappurl'] - .'index.php?display=true&dir=indexing_searching&page=view_resource_controler&id=' - .$id; - if (!empty($convertedDocument)) { - $docserver = \Docserver\models\DocserverModel::getByDocserverId(['docserverId' => $convertedDocument['docserver_id'], 'select' => ['path_template']]); - $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $convertedDocument['path']) . $convertedDocument['filename']; - - if (!file_exists($pathToDocument)) { - $pdf_exist = false; - } - } else { - $pdf_exist = false; - } - } - $label = ''; - //Tile, or subject or description - if (strlen(trim($res->title)) > 0) { - $label = $res->title; - } elseif (strlen(trim($res->subject)) > 0) { - $label = $res->subject; - } elseif (strlen(trim($res->description)) > 0) { - $label = $res->description; - } - - if (isset($res->attachment_type) && $res->attachment_type != '') { - $attachment_type = $res->attachment_type; - } else { - $attachment_type = ''; - } - - if (isset($res->typist) && $res->typist != '') { - $typist = $res->typist; - } else { - $typist = ''; - } - - if ($pdf_exist == false) { - $collIdConv = ($from_res_attachment) ? 'attachments_coll' : 'letterbox_coll'; - - $viewLinkHtml = '<a id="gen_'.$idFile.'" style="cursor:pointer;" title="'._GENERATE_PDF .'" target="_blank" onclick="generatePdf(\''.$idFile.'\',\''.$collIdConv.'\')">' - .'<i id="spinner_'.$idFile.'" class="fa fa-sync-alt fa-2x" title="'._GENERATE_PDF.'"></i>' - .'</a>'; - } else { - $viewLinkHtml = ''; - } - array_push( - $joinedFiles, - array('id' => $idFile, //ID - 'label' => $label, //Label - 'format' => $res->format, //Format - 'filesize' => $res->filesize, //Filesize - 'creation_date' => $res->creation_date, //Filesize - 'attachment_type' => $attachment_type, //attachment_type - 'typist' => $typist, //attachment_type - 'pdf_exist' => $pdf_exist, - 'version' => '', - 'viewLink' => $viewLinkHtml, - ) - ); - } - - return $joinedFiles; - } - - public function showPrintFolder($coll_id, $table, $id) - { - require_once 'apps'.DIRECTORY_SEPARATOR.$_SESSION['config']['app_id'] - .DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR - .'class_indexing_searching_app.php'; - $is = new indexing_searching_app(); - - require_once 'apps'.DIRECTORY_SEPARATOR.$_SESSION['config']['app_id'] - .DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR - .'class_users.php'; - - $users_tools = new class_users(); - - require_once 'core/class/class_request.php'; - - $request = new request(); - - require_once 'core/class/class_security.php'; - $sec = new security(); - $view = $sec->retrieve_view_from_coll_id($coll_id); - $stmt = $this->query("select subject, contact_society, category_id from $view where res_id = ?", array($id)); - $res = $stmt->fetchObject(); - $str = ''; - $str .= '<div align="left" class="block">'; - $str .= '<div class="error" id="divErrorPrint" name="divErrorPrint" onclick="this.hide();"></div>'; - - $str .= '<p><b>Requérant</b> : '.$res->contact_society.'</p>'; - $str .= '<p><b>'._SUBJECT.'</b> : '.$res->subject.'</p>'; - $str .= '<hr/>'; - $str .= '<form style="width:99%;" name="print_folder_form" id="print_folder_form" action="#" method="post">'; - $str .= '<table style="width:99%;" name="print_folder" id="print_folder" >'; - $str .= '<thead><tr><th style="width:25%;text-align:left;"></th><th style="width:40%;text-align:left;">Titre</th><th style="width:20%;text-align:left;">Rédacteur</th><th style="width:10%;text-align:left;">Date</th><th style="width:5%;text-align:left;"><input title="'._SELECT_ALL.'" id="allPrintFolder" type="checkbox" onclick="selectAllPrintFolder();"></th></tr></thead>'; - $str .= '<tbody>'; - - if ($res->category_id != 'outgoing') { - $str .= '<tr><td><h3>+ Courrier entrant</h3></td><td></td><td></td><td></td><td></td></tr>'; - $joined_files = $this->getJoinedFiles($coll_id, $table, $id, false); - for ($i = 0; $i < count($joined_files); ++$i) { - //Get data - $id_doc = $joined_files[$i]['id']; - $description = $joined_files[$i]['label']; - $format = $joined_files[$i]['format']; - - $contact = $users_tools->get_user($joined_files[$i]['typist']); - $dateFormat = explode(' ', $joined_files[$i]['creation_date']); - $creation_date = $request->dateformat($dateFormat[0]); - if ($joined_files[$i]['pdf_exist']) { - $check = 'class="check checkPrintFolder" checked="checked"'; - } else { - $check = ' disabled title="'._NO_PDF_FILE.'"'; - } - //Show data - $str .= '<tr><td></td><td>'.$description.'</td><td>'.$res->contact_society - .'</td><td>'.$creation_date.'</td><td><input id="join_file_' - .$id_doc.'" type="checkbox" name="join_file[]" value="'.$id_doc.'" '.$check - .'/>'.$joined_files[$i]['viewLink'].'</td></tr>'; - } - } - //ATTACHMENTS TYPES LOOP - foreach ($_SESSION['attachment_types'] as $attachmentTypeId => $attachmentTypeLabel) { - if ($attachmentTypeId != 'print_folder' && $attachmentTypeId != 'converted_pdf') { - $joined_files = $this->getJoinedFiles($coll_id, $table, $id, true, $attachmentTypeId); - if (count($joined_files) > 0) { - $str .= '<tr><td><h3>+ '.$attachmentTypeLabel.'</h3></td><td></td><td></td><td></td><td></td></tr>'; - for ($i = 0; $i < count($joined_files); ++$i) { - $id_doc = $joined_files[$i]['id']; - $description = $joined_files[$i]['label']; - $format = $joined_files[$i]['format']; - $contact = $users_tools->get_user($joined_files[$i]['typist']); - $dateFormat = explode(' ', $joined_files[$i]['creation_date']); - $creation_date = $request->dateformat($dateFormat[0]); - if ($joined_files[$i]['pdf_exist']) { - $check = 'class="check checkPrintFolder" checked="checked"'; - } else { - $check = ' disabled title="'._NO_PDF_FILE.'"'; - } - - $str .= '<tr><td></td><td>'.$description.'</td><td>'.$contact['firstname'].' ' - .$contact['lastname'].'</td><td>'.$creation_date.'</td><td><input id="join_file_' - .$id_doc.'" type="checkbox" name="join_attachment[]" value="'.$id_doc.'" '.$check - .'/>'.$joined_files[$i]['viewLink'].'</td></tr>'; - } - } - } - } - - //NOTES - $core_tools = new core_tools(); - if ($core_tools->is_module_loaded('notes')) { - require_once 'modules'.DIRECTORY_SEPARATOR.'notes'.DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR.'class_modules_tools.php'; - - $notes_tools = new notes(); - $user_notes = $notes_tools->getUserNotes($id, $coll_id); - if (count($user_notes) > 0) { - $str .= '<tr><td><h3>+ '._NOTES.'</h3></td><td></td><td></td><td></td><td></td></tr>'; - for ($i = 0; $i < count($user_notes); ++$i) { - //Get data - $idNote = $user_notes[$i]['id']; - //$noteShort = $request->cut_string($user_notes[$i]['label'], 50); - $noteShort = $request->cut_string( - str_replace(array("'", "\r", "\n", '"'), array("'", ' ', ' ', '"'), $user_notes[$i]['label']), - 50 - ); - $noteShort = functions::xssafe($noteShort); - $note = $user_notes[$i]['label']; - $userArray = $users_tools->get_user($user_notes[$i]['author']); - $date = $request->dateformat($user_notes[$i]['date']); - - $check = ' '; - - $str .= '<tr><td></td><td>'.$noteShort.'</td><td>' - .$userArray['firstname'].' '.$userArray['lastname'] - .'</td><td>'.$date.'</td><td><input id="note_'.$idNote.'" class="checkPrintFolder" type="checkbox" name="notes[]" value="' - .$idNote.'" '.$check.'/></td></tr>'; - } - } - } - - $str .= '</body>'; - $str .= '</table>'; - - $path_to_script = $_SESSION['config']['businessappurl'] - .'index.php?display=true&module=visa&page=printFolder_ajax'; - - $str .= '<hr/>'; - $str .= '<input style="margin-left:44%" type="button" name="send" id="send" value="Imprimer" class="button" onclick="printFolder(\''.$id.'\', \''.$coll_id.'\', \'print_folder_form\', \''.$path_to_script.'\');" /> '; - $str .= '</form>'; - $str .= '</div>'; - - return $str; - } - - public function isAllAttachementSigned($res_id) - { - $db = new Database(); - $stmt2 = $db->query("SELECT count(1) as nb from res_attachments WHERE in_signature_book = true AND signatory_user_serial_id IS NULL AND status NOT IN ('DEL','OBS','TMP') AND attachment_type NOT IN ('converted_pdf','print_folder','signed_response') AND res_id_master = ?", array($res_id)); - $res2 = $stmt2->fetchObject(); - $stmt3 = $db->query("SELECT count(1) as nb from res_attachments WHERE in_signature_book = true AND status NOT IN ('DEL','OBS','TMP') AND attachment_type NOT IN ('converted_pdf','print_folder','signed_response') AND res_id_master = ?", array($res_id)); - $res3 = $stmt3->fetchObject(); - if ($res3->nb == 0) { - return 'noAttachment'; - } elseif ($res2->nb == 0) { - return 'yes'; - } else { - return false; - } - } - - public function currentUserSignRequired($res_id) - { - $user_id = $this->getCurrentUserStep($res_id); - if ($_SESSION['user']['UserId'] != $user_id) { - return 'false'; - } - $db = new Database(); - $stmt = $db->query("SELECT count(listinstance_id) as nb from listinstance l where l.res_id=? AND l.item_id=? AND l.difflist_type='VISA_CIRCUIT' AND l.requested_signature='true'", array($res_id, $user_id)); - $res = $stmt->fetchObject(); - $stmt2 = $db->query("SELECT count(1) as nb from res_attachments r where r.res_id_master=? AND r.signatory_user_serial_id = (select id from users where user_id = ?) AND status NOT IN ('DEL','OBS','TMP') AND attachment_type NOT IN ('converted_pdf','print_folder')", array($res_id, $user_id)); - $res2 = $stmt2->fetchObject(); - - if ($res->nb > 0 && $res2->nb == 0) { - return 'true'; - } else { - return 'false'; - } - } } abstract class PdfNotes_Abstract extends FPDI { public function LoadData($tab, $collId) { - require_once 'modules/notes/notes_tables.php'; require_once 'core/class/class_request.php'; $request = new request(); // Lecture des lignes du fichier @@ -1032,7 +106,7 @@ abstract class PdfNotes_Abstract extends FPDI //Check if ID exists $stmt2 = $db2->query( 'SELECT n.identifier, n.creation_date, n.user_id, n.note_text, u.lastname, ' - .'u.firstname FROM '.NOTES_TABLE.' n inner join '.USERS_TABLE + .'u.firstname FROM notes n inner join '.USERS_TABLE .' u on n.user_id = u.user_id WHERE n.id = :Id ', [':Id' => $id] ); @@ -1165,141 +239,3 @@ abstract class ConcatPdf_Abstract extends FPDI } } } - -/* EXEMPLE TAB VISA_CIRCUIT - -Array -( - [coll_id] => letterbox_coll - [res_id] => 190 - [difflist_type] => entity_id - [sign] => Array - ( - [users] => Array - ( - [0] => Array - ( - [user_id] => sgros - [lastname] => GROS - [firstname] => Sébastien - [entity_id] => CHEFCABINET - [entity_label] => Chefferie - [visible] => Y - [viewed] => 0 - [difflist_type] => VISA_CIRCUIT - [process_date] => - [process_comment] => - ) - - ) - - ) - - [visa] => Array - ( - [users] => Array - ( - [0] => Array - ( - [user_id] => sbes - [lastname] => BES - [firstname] => Stéphanie - [entity_id] => CHEFCABINET - [entity_label] => Chefferie - [visible] => Y - [viewed] => 0 - [difflist_type] => VISA_CIRCUIT - [process_date] => - [process_comment] => - ) - - [1] => Array - ( - [user_id] => fbenrabia - [lastname] => BENRABIA - [firstname] => Fadela - [entity_id] => POLESOCIAL - [entity_label] => Pôle social - [visible] => Y - [viewed] => 0 - [difflist_type] => VISA_CIRCUIT - [process_date] => - [process_comment] => - ) - - [2] => Array - ( - [user_id] => bpont - [lastname] => PONT - [firstname] => Brieuc - [entity_id] => POLEAFFAIRESETRANGERES - [entity_label] => Pôle affaires étrangères - [visible] => Y - [viewed] => 0 - [difflist_type] => VISA_CIRCUIT - [process_date] => - [process_comment] => - ) - - ) - - ) - -) - - - - - -<h3>Document</h3><pre>Array -( - [0] => Array - ( - [id] => 197 - [label] => 123456 - [format] => pdf - [filesize] => 46468 - [attachment_type] => - [is_version] => - [version] => - ) - -) -</pre><h3>Document</h3><pre>Array -( - [0] => Array - ( - [id] => 400 - [label] => reponse 1 v5 - [format] => docx - [filesize] => 36219 - [attachment_type] => response_project - [is_version] => - [version] => - ) - - [1] => Array - ( - [id] => 409 - [label] => Nouvelle PJ - [format] => pdf - [filesize] => 1204460 - [attachment_type] => simple_attachment - [is_version] => - [version] => - ) - - [2] => Array - ( - [id] => 410 - [label] => pj 2 - [format] => pdf - [filesize] => 361365 - [attachment_type] => simple_attachment - [is_version] => - [version] => - ) - -) - -*/ diff --git a/modules/visa/create_sep.php b/modules/visa/create_sep.php deleted file mode 100755 index 5b503250598..00000000000 --- a/modules/visa/create_sep.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php -$core_path = $_SESSION['config']['corepath']; -$core_path = str_replace("\\", "/", $core_path); -define('FPDF_FONTPATH',$core_path.'apps/maarch_entreprise/tools/pdflib/font/'); -//above line is import to define, otherwise it gives an error : Could not include font metric file -require($core_path.'apps/maarch_entreprise/tools/pdflib/fpdf.php'); - - -if(isset($argv[1])){ - $service = $argv[1]; - $dossier = $argv[2]; - $label = $argv[3]; -} -else { - $service = $_REQUEST['service']; - $dossier = $_REQUEST['path']; - $label = $_REQUEST['label']; -} - - -$pdf = new FPDF(); -$pdf->AddPage(); -$pdf->Cell(180,10,'',0,1, 'C'); -$pdf->Cell(180,10,'',0,1, 'C'); -$pdf->Cell(180,10,'',0,1, 'C'); -$pdf->Cell(180,10,'',0,1, 'C'); -$pdf->Cell(180,10,'',0,1, 'C'); -$pdf->Cell(180,10,'',0,1, 'C'); -$pdf->Cell(180,10,'',0,1, 'C'); -$pdf->Cell(180,10,'',0,1, 'C'); -$pdf->SetFont('Arial','B',12); -$pdf->Cell(180,10, utf8_decode($label),1,1, 'C'); - -$filename = $dossier."/sep_".$service.".pdf"; -$pdf->Output($filename, 'F'); -?> \ No newline at end of file diff --git a/modules/visa/css/module.css b/modules/visa/css/module.css index cad0c3c9e33..85371ed27c9 100755 --- a/modules/visa/css/module.css +++ b/modules/visa/css/module.css @@ -48,55 +48,10 @@ width:100%; } -#modalPIN{ - padding-top:50px; - z-index: 1050; - width: 300px; - height: 80px; - border: 2px solid #000; - display: none; - position: absolute; - background-color: #F2F2F2; - left: 40%; - top: 40%; - text-align: center; -} - -#modalSaveVisaModel{ - padding-top:20px; - z-index: 1050; - width: 300px; - height: 80px; - border: 2px solid #000; - display: none; - position: absolute; - background-color: #F2F2F2; - left: 40%; - top: 10%; - text-align: center; -} - -.listDocsBasket{ - border-collapse: collapse; - height: 96%; - width: 100%; - overflow-y: scroll; -} - -.listDocsBasket div{ - width:100%; - border-bottom: thin solid black; -} - .selectedId{ background-color:#F99830; } - -.listDocsBasket li{ - padding:5px; -} - #tab_visaSetWorkflow td{ white-space: pre; } diff --git a/modules/visa/getVisaModelByTitle.php b/modules/visa/getVisaModelByTitle.php deleted file mode 100755 index ff41e1636c6..00000000000 --- a/modules/visa/getVisaModelByTitle.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php - /* - * Copyright 2008-2015 Maarch and Document Image Solutions - * - * This file is part of Maarch Framework. - * - * Maarch Framework is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Maarch Framework is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. - */ - -require_once 'modules' . DIRECTORY_SEPARATOR . 'visa' . DIRECTORY_SEPARATOR - . 'class' . DIRECTORY_SEPARATOR . 'class_modules_tools.php'; - -$core = new core_tools(); -$core->test_user(); - -$title = $_REQUEST['title']; - -$visa = new visa(); -$isFree = $visa->isWorkflowTitleFree($title); -$response = ['isWorkflowTitleFree' => $isFree]; - -echo json_encode($response); -exit(); \ No newline at end of file diff --git a/modules/visa/js/functions.js b/modules/visa/js/functions.js index 1ce45cc7305..8b137891791 100755 --- a/modules/visa/js/functions.js +++ b/modules/visa/js/functions.js @@ -1,418 +1 @@ -function addVisaUser(users) { - if (!users) { - nb_visa = $j(".droptarget").length; - next_visa = nb_visa + 1; - if(nb_visa == 0){ - $j("#emptyVisa").hide(); - } - selected = ' selected="selected" '; - - if($j("#isAllAttachementSigned").val() == 'allsigned' || $j("#isAllAttachementSigned").val() == 'false'){ - signRequest = '<br/><sub><select id="signRequest_'+next_visa+'"><option value="false" '+selected+'>VISEUR</option><option value="true">SIGNATAIRE</option></select></sub>'; - } else { - signRequest = '<br/><sub><select id="signRequest_'+next_visa+'" disabled="disabled"><option value="false" '+selected+'>VISEUR</option><option value="true">SIGNATAIRE</option></select></sub>'; - } - - $j("#visa_content").append('<div class="droptarget" id="visa_' + next_visa + '" draggable="true">' - +'<span class="visaUserStatus">' - +'<i class="fa fa-hourglass-half" aria-hidden="true"></i>' - +'</span>' - +'<span class="visaUserInfo">' - +'<sup class="visaUserPos nbResZero">'+next_visa+'</sup> ' - +'<i class="fa fa-user fa-2x" aria-hidden="true"></i> '+ $j("select#visaUserList option:selected").text() +' <sup class="nbRes">'+$j("select#visaUserList option:selected").parent().get( 0 ).label+'</sup>' - +'<input class="userId" type="hidden" value="' + $j("select#visaUserList option:selected").val() + '"/><input class="visaDate" type="hidden" value=""/>' - +' <i id="signedUser_'+next_visa+'" title="Personne signataire" class="visaUserSign fa fa-certificate" aria-hidden="true" style="color:#F99830;visibility:hidden;"></i>' - + signRequest - +'</span>' - +'<span class="visaUserAction">' - +'<i class="fa fa-trash-alt" aria-hidden="true" onclick="delVisaUser(this.parentElement.parentElement);"></i>' - +'</span>' - +'<span class="visaUserConsigne">' - +'<input type="text" class="consigne" value=""/>' - +'</span>' - +'<span id="dropZone" title="Glisser/déposer pour modifier l\'ordre du circuit" style="cursor: pointer">' - +'<i class="fa fa-exchange-alt fa-2x fa-rotate-90" aria-hidden="true"></i>' - +'</span>' - +'</div>'); - - //prototype - document.getElementById("visaUserList").selectedIndex = 0; - $j('#visaUserList').trigger("chosen:updated"); - } else { - nb_visa = $j(".droptarget").length; - next_visa = nb_visa + 1; - if(nb_visa == 0){ - $j("#emptyVisa").hide(); - } - - selected = ' selected="selected" '; - - if($j("#isAllAttachementSigned").val() == 'allsigned' || $j("#isAllAttachementSigned").val() == 'false'){ - if (users.requested_signature == true) { - signRequest = '<br/><sub><select id="signRequest_'+next_visa+'"><option value="false">VISEUR</option><option value="true" '+selected+'>SIGNATAIRE</option></select></sub>'; - } else { - signRequest = '<br/><sub><select id="signRequest_'+next_visa+'"><option value="false" '+selected+'>VISEUR</option><option value="true">SIGNATAIRE</option></select></sub>'; - } - } else { - signRequest = '<br/><sub><select id="signRequest_'+next_visa+'" disabled="disabled"><option value="false" '+selected+'>VISEUR</option><option value="true">SIGNATAIRE</option></select></sub>'; - } - $j("#visa_content").append('<div class="droptarget" id="visa_' + next_visa + '" draggable="true">' - +'<span class="visaUserStatus">' - +'<i class="fa fa-hourglass-half" aria-hidden="true"></i>' - +'</span>' - +'<span class="visaUserInfo">' - +'<sup class="visaUserPos nbResZero">'+next_visa+'</sup> ' - +'<i class="fa fa-user fa-2x" aria-hidden="true"></i> ' + users.lastname + ' ' + users.firstname + ' <sup class="nbRes">'+users.entity_id+'</sup>' - +'<input class="userId" type="hidden" value="' + users.user_id + '"/><input class="visaDate" type="hidden" value=""/>' - +' <i id="signedUser_'+next_visa+'" title="Personne signataire" class="visaUserSign fa fa-certificate" aria-hidden="true" style="color:#F99830;visibility:hidden;"></i>' - + signRequest - +'</span>' - +'<span class="visaUserAction">' - +'<i class="fa fa-trash-alt" aria-hidden="true" onclick="delVisaUser(this.parentElement.parentElement);"></i>' - +'</span>' - +'<span class="visaUserConsigne">' - +'<input type="text" class="consigne" value="' + users.process_comment + '"/>' - +'</span>' - +'<span id="dropZone" title="Glisser/déposer pour modifier l\'ordre du circuit" style="cursor: pointer">' - +'<i class="fa fa-exchange-alt fa-2x fa-rotate-90" aria-hidden="true"></i>' - +'</span>' - +'</div>'); - - } - resetPosVisa(); -} -function delVisaUser(target) { - var id = '#' + target.id; - - if ($j(".droptarget").length == 1) { - $j("#emptyVisa").show(); - } - $j(id).remove(); - - resetPosVisa(); - -} -function resetPosVisa () { - i = 1; - $j(".droptarget").each(function() { - this.id = 'visa_' + i; - $j("#" + this.id).find("select[id^=signRequest_]")[0].id='signRequest_'+i; - $j("#" + this.id).find("[id^=signedUser_]")[0].id='signedUser_'+i; - $j("#" + this.id).find(".visaUserPos").text(i); - i++; - }); - i--; - -} -function updateVisaWorkflow(resId) { - var i = 0; - var userList = []; - var hasSignatory = false; - if (($j("select[id^=signRequest_] option:selected[value=true]").length == 0) && $j(".droptarget").length != 0) { - $j('#signRequest_'+i).val("true"); - } - if ($j(".droptarget").length) { - $j(".droptarget").each(function () { - if ($j("#signRequest_"+(i+1)+" option:selected[value=true]").length) { - userRequestSign=true; - } else { - userRequestSign=false; - } - if ($j("#signedUser_"+(i+1)).css('visibility') == 'visible') { - userSignatory=true; - } else { - userSignatory=false; - } - - userId = $j("#" + this.id).find(".userId").val(); - userConsigne = $j("#" + this.id).find(".consigne").val(); - userVisaDate = $j("#" + this.id).find(".visaDate").val(); - userPos = i; - // last one is signatory if no one selected - if(userRequestSign || userSignatory){ - hasSignatory = true; - } - if ($j("#signRequest_"+(i+2)).length == 0 && !hasSignatory) { - userRequestSign=true; - $j('#signRequest_'+(i+1)).val("true"); - } - userList.push({userId: userId, userPos: userPos, userConsigne: userConsigne, userVisaDate: userVisaDate, userRequestSign: userRequestSign, userSignatory: userSignatory}); - i++; - }); - } - $j.ajax({ - url : 'index.php?display=true&module=visa&page=updateVisaWF', - type : 'POST', - dataType : 'JSON', - data: { - resId: resId, - userList: JSON.stringify(userList) - }, - success : function(response){ - if (response.status == 0) { - var modInfo = $j('<div class="info" id="main_info" onclick="this.remove();">Mise à jour du circuit effectuée</div>'); - modInfo.appendTo('body'); - modInfo.css({'display' : 'table-cell'}); - setTimeout(function() { - modInfo.remove(); - }, 5000); - - if(parent.$j('#visa_tab').length){ - eval(response.exec_js); - } - if(parent.$j('.contentShow iframe').length){ - parent.$j('.contentShow iframe')[0].contentWindow.location.reload(true); - } - } else if (response.status != 1) { - alert(response.error_txt) - } - }, - error : function(error){ - alert(error); - } - - }); - -} -function saveVisaWorkflowAsModel () { - var $i = 0; - var userList = []; - var title = $j("#titleModel").val(); - - if($j(".droptarget").length){ - $j(".droptarget").each(function() { - //console.log('viseur : '+$j("#"+this.id+" .userdId").val()); - userId = $j("#"+this.id).find(".userId").val(); - userConsigne = $j("#"+this.id).find(".consigne").val(); - userVisaDate = $j("#"+this.id).find(".visaDate").val(); - userPos = $i; - userList.push({userId:userId, userPos:userPos, userConsigne:userConsigne, userVisaDate:userVisaDate}); - $i++; - }); - $j.ajax({ - url : 'index.php?display=true&module=visa&page=saveVisaModel', - type : 'POST', - dataType : 'JSON', - data: { - title: title, - userList: JSON.stringify(userList) - }, - success : function(response){ - if (response.status == 0) { - $('divInfoVisa').innerHTML = 'Modèle enregistré'; - $('divInfoVisa').style.display = 'table-cell'; - Element.hide.delay(5, 'divInfoVisa'); - $j('#modalSaveVisaModel').hide(); - eval(response.exec_js); - } else { - alert(response.error_txt) - } - }, - error : function(error){ - alert(error); - } - - }); - - }else{ - alert('Aucun utilisateur dans le circuit !'); - } - -} -function loadVisaModelUsers() { - - var objectId = $j("select#modelList option:selected").val(); - var objectType = 'VISA_CIRCUIT'; - $j.ajax({ - url : 'index.php?display=true&module=visa&page=load_listmodel_visa_users', - type : 'POST', - dataType : 'JSON', - data: { - objectType: objectType, - objectId: objectId - }, - success : function(response){ - if (response.status == 0) { - - var userList = response.result; - if(userList){ - userList.each(function(user, key) { - addVisaUser(user); - }); - } - - - } else { - alert(response.error_txt); - } - }, - error : function(error){ - alert(error); - } - - }); - - //prototype - document.getElementById("modelList").selectedIndex = 0; - $j('#modelList').trigger("chosen:updated"); -} - -function initDragNDropVisa() { - document.getElementById("visa_content").addEventListener("dragstart", function(event) { - $j(".droptarget").not(".vised,.currentVis").css("border","dashed 2px #135F7F33"); - // The dataTransfer.setData() method sets the data type and the value of the dragged data - event.dataTransfer.setData("Text", event.target.id); - - // Output some text when starting to drag the p element - //document.getElementById("demo").innerHTML = "Started to drag the p element."; - - // Change the opacity of the draggable element - event.target.style.opacity = "0.4"; - }); - - // While dragging the p element, change the color of the output text - document.getElementById("visa_content").addEventListener("drag", function(event) { - //document.getElementById("demo").style.color = "red"; - }); - - // Output some text when finished dragging the p element and reset the opacity - document.getElementById("visa_content").addEventListener("dragend", function(event) { - //document.getElementById("demo").innerHTML = "Finished dragging the p element."; - $j(".droptarget").not(".vised,.currentVis").css("border","dashed 2px #135F7F33"); - event.target.style.opacity = "1"; - }); - - - /* Events fired on the drop target */ - - // When the draggable p element enters the droptarget, change the DIVS's border style - document.getElementById("visa_content").addEventListener("dragenter", function(event) { - if ( event.target.className == "droptarget") { - event.target.style.border = "dashed 2px green"; - } - }); - - // By default, data/elements cannot be dropped in other elements. To allow a drop, we must prevent the default handling of the element - document.getElementById("visa_content").addEventListener("dragover", function(event) { - event.preventDefault(); - }); - - // When the draggable p element leaves the droptarget, reset the DIVS's border style - document.getElementById("visa_content").addEventListener("dragleave", function(event) { - if ( event.target.className == "droptarget" ) { - event.target.style.border = "dashed 2px #ccc"; - } - }); - - /* On drop - Prevent the browser default handling of the data (default is open as link on drop) - Reset the color of the output text and DIV's border color - Get the dragged data with the dataTransfer.getData() method - The dragged data is the id of the dragged element ("drag1") - Append the dragged element into the drop element - */ - document.getElementById("visa_content").addEventListener("drop", function(event) { - event.preventDefault(); - if ( event.target.className == "droptarget" ) { - /*event.target.style.border = ""; - var data = event.dataTransfer.getData("Text"); - var oldContent = event.target.innerHTML; - var draggedConsigne = $j('#'+data+' .consigne').val(); - var replaceConsigne = $j('#'+event.target.id+' .consigne').val(); - event.target.innerHTML = document.getElementById(data).innerHTML; - $j('#'+event.target.id+' .consigne').val(draggedConsigne); - document.getElementById(data).innerHTML = oldContent; - $j('#'+data+' .consigne').val(replaceConsigne);*/ - var data = event.dataTransfer.getData("Text"); - var target =event.target.id; - posData = data.split("_"); - posTarget = target.split("_"); - if(posData[1] > posTarget[1]){ - $j('#'+target).before($j('#'+data)); - }else{ - $j('#'+target).after($j('#'+data)); - } - resetPosVisa(); - - - } - }); - $j('#visa_content') - .on('focus', '.consigne', function(e) { - $j(this).closest('.droptarget').attr("draggable", false); - console.log($j(this).closest('.droptarget')); - }) - .on('blur', '.consigne', function(e) { - $j(this).closest('.droptarget').attr("draggable", true); - }); -} - -function setTitle(input) { - input.title = input.value; -} - -//load applet in a modal -function loadAppletSign(url){ - displayModal(url, 'VisaApplet', 300, 300); -} - -function printFolder(res_id, coll_id, form_id, path) { - //console.log("printFolder"); - new Ajax.Request(path, - { - asynchronous: false, - method: 'post', - parameters: Form.serialize(form_id), - encoding: 'UTF-8', - onSuccess: function (answer) { - eval("response = " + answer.responseText); - if (response.status == 0) { - var id_folder = response.id_folder; - var winPrint = window.open('index.php?display=true&module=attachments&page=view_attachment&res_id_master=' + res_id + '&id=' + id_folder, '', 'height=800, width=700,scrollbars=yes,resizable=yes'); - /*winPrint.focus(); - winPrint.print();*/ - } - else if (response.status == 1 || response.status == -1) { - $('divErrorPrint').innerHTML = response.error_txt; - $('divErrorPrint').style.display = 'table-cell'; - Element.hide.delay(5, 'divErrorPrint'); - } - } - }); - -} - -function selectAllPrintFolder() { - console.log($j('#allPrintFolder')[0].checked); - if($j('#allPrintFolder')[0].checked == true){ - $j('.checkPrintFolder').prop('checked', true); - }else{ - $j('.checkPrintFolder').prop('checked', false); - } -} - -function generatePdf(resId, collId) { - $j("#spinner_"+resId).addClass( "fa-spin" ); - $j.ajax({ - url: '?display=true&module=visa&page=generatePdf', - type : 'POST', - dataType : 'json', - data: { - res_id : resId, - coll_id : collId - }, - success: function(result) { - if (result.status == "0") { - parent.document.getElementById('uniqueDetailsIframe').contentWindow.location.reload(); - } else { - $j("#spinner_"+resId).removeClass( "fa-spin" ); - $j("#spinner_"+resId).removeClass( "fa-sync-alt" ); - $j("#spinner_"+resId).addClass( "fa-exclamation-triangle" ); - $j("#spinner_"+resId).css({"cursor":"initial"}) - $j("#spinner_"+resId).prop('title', result.error_txt); - $j("#gen_"+resId).prop("onclick", null).off("click"); - alert(result.error_txt); - } - } - }); -} diff --git a/modules/visa/lang/en.php b/modules/visa/lang/en.php index baac6cf3358..5a1eb2e39f8 100755 --- a/modules/visa/lang/en.php +++ b/modules/visa/lang/en.php @@ -1,13 +1,5 @@ <?php -if (!defined('_PRINTFOLDER')) { - define('_PRINTFOLDER', 'Print folder'); -} - -if (!defined('_NO_PDF_FILE')) { - define('_NO_PDF_FILE', 'No pdf file for this file'); -} - // CIRCUIT DE VISA if (!defined('_VISA_WORKFLOW')) { define('_VISA_WORKFLOW', 'Visa workflow'); @@ -18,18 +10,6 @@ if (!defined('_INTERRUPT_WORKFLOW')) { if (!defined('_VISA_WORKFLOW_COMMENT')) { define('_VISA_WORKFLOW_COMMENT', 'Visa workflow management'); } -if (!defined('_VIEW_VISA_WORKFLOW')) { - define('_VIEW_VISA_WORKFLOW', 'Visa workflow view'); -} -if (!defined('_VIEW_VISA_WORKFLOW_DESC')) { - define('_VIEW_VISA_WORKFLOW_DESC', 'Allows to view the visa workflow in the parts of diffusion list and in those of progress.'); -} -if (!defined('_EMPTY_USER_LIST')) { - define('_EMPTY_USER_LIST', 'Users list is empty'); -} -if (!defined('_EMPTY_VISA_WORKFLOW')) { - define('_EMPTY_VISA_WORKFLOW', 'No set visa flow'); -} if (!defined('_NO_VISA')) { define('_NO_VISA', 'No designed person on visa'); @@ -37,12 +17,6 @@ if (!defined('_NO_VISA')) { if (!defined('_NO_RESPONSE_PROJECT_VISA')) { define('_NO_RESPONSE_PROJECT_VISA', 'Please, integrate at least one attachment to signature book'); } -if (!defined('_NO_CONVERTED_PDF_VISA')) { - define('_NO_CONVERTED_PDF_VISA', 'Please edit your attachment(s)'); -} -if (!defined('_PLEASE_CONVERT_PDF_VISA')) { - define('_PLEASE_CONVERT_PDF_VISA', 'Please edit the following attachments : '); -} // CIRCUIT D"AVIS if (!defined('_AVIS_WORKFLOW')) { diff --git a/modules/visa/lang/fr.php b/modules/visa/lang/fr.php index 0d6cab89f50..3a13f44f118 100755 --- a/modules/visa/lang/fr.php +++ b/modules/visa/lang/fr.php @@ -1,13 +1,5 @@ <?php -if (!defined('_PRINTFOLDER')) { - define('_PRINTFOLDER', "Dossier d'impression"); -} - -if (!defined('_NO_PDF_FILE')) { - define('_NO_PDF_FILE', 'Aucun PDF présent pour ce fichier'); -} - // CIRCUIT DE VISA if (!defined('_VISA_WORKFLOW')) { define('_VISA_WORKFLOW', 'Circuit de visa'); @@ -18,18 +10,6 @@ if (!defined('_INTERRUPT_WORKFLOW')) { if (!defined('_VISA_WORKFLOW_COMMENT')) { define('_VISA_WORKFLOW_COMMENT', 'Gestion du circuit de visa'); } -if (!defined('_VIEW_VISA_WORKFLOW')) { - define('_VIEW_VISA_WORKFLOW', 'Visualisation du circuit de visa'); -} -if (!defined('_VIEW_VISA_WORKFLOW_DESC')) { - define('_VIEW_VISA_WORKFLOW_DESC', "Permet de visualiser le circuit de visa dans les parties de liste de diffusion et dans celles d'avancement."); -} -if (!defined('_EMPTY_USER_LIST')) { - define('_EMPTY_USER_LIST', 'La liste des utilisateurs est vide'); -} -if (!defined('_EMPTY_VISA_WORKFLOW')) { - define('_EMPTY_VISA_WORKFLOW', 'Aucun circuit de visa paramétré'); -} if (!defined('_NO_VISA')) { define('_NO_VISA', 'Aucune personne désignée en visa'); @@ -37,12 +17,6 @@ if (!defined('_NO_VISA')) { if (!defined('_NO_RESPONSE_PROJECT_VISA')) { define('_NO_RESPONSE_PROJECT_VISA', 'Veuillez intégrer au moins une pièce jointe au parapheur.'); } -if (!defined('_NO_CONVERTED_PDF_VISA')) { - define('_NO_CONVERTED_PDF_VISA', 'Veuillez éditer votre/vos pièce(s) jointe(s)'); -} -if (!defined('_PLEASE_CONVERT_PDF_VISA')) { - define('_PLEASE_CONVERT_PDF_VISA', 'Veuillez éditer les pièces jointes suivantes : '); -} // CIRCUIT D"AVIS if (!defined('_AVIS_WORKFLOW')) { diff --git a/modules/visa/lang/nl.php b/modules/visa/lang/nl.php index 5474d5dd5fc..29d7385e74c 100755 --- a/modules/visa/lang/nl.php +++ b/modules/visa/lang/nl.php @@ -4,12 +4,7 @@ * See LICENCE.txt file at the root folder for more details. * This file is part of Maarch software. */ -if (!defined('_PRINTFOLDER')) { - define('_PRINTFOLDER', 'Afdrukmap'); -} -if (!defined('_NO_PDF_FILE')) { - define('_NO_PDF_FILE', 'Geen PDF voor dit bestand aanwezig'); -} + if (!defined('_VISA_WORKFLOW')) { define('_VISA_WORKFLOW', 'Goedkeuringscircuit'); } @@ -19,30 +14,12 @@ if (!defined('_INTERRUPT_WORKFLOW')) { if (!defined('_VISA_WORKFLOW_COMMENT')) { define('_VISA_WORKFLOW_COMMENT', 'Beheer van het goedkeuringscircuit'); } -if (!defined('_VIEW_VISA_WORKFLOW')) { - define('_VIEW_VISA_WORKFLOW', 'Weergave van het goedkeuringscircuit'); -} -if (!defined('_VIEW_VISA_WORKFLOW_DESC')) { - define('_VIEW_VISA_WORKFLOW_DESC', 'Om het goedkeuringscircuit weer te geven in de delen van de verdelingslijst en in de vooruitgangslijsten.'); -} -if (!defined('_EMPTY_USER_LIST')) { - define('_EMPTY_USER_LIST', 'De lijst van gebruikers is leeg'); -} -if (!defined('_EMPTY_VISA_WORKFLOW')) { - define('_EMPTY_VISA_WORKFLOW', 'Geen ingesteld berichtencircuit'); -} if (!defined('_NO_VISA')) { define('_NO_VISA', 'Geen persoon aangeduid in de goedkeuring'); } if (!defined('_NO_RESPONSE_PROJECT_VISA')) { define('_NO_RESPONSE_PROJECT_VISA', 'Gelieve minstens één bijlage in de parafeerder te integreren.'); } -if (!defined('_NO_CONVERTED_PDF_VISA')) { - define('_NO_CONVERTED_PDF_VISA', 'Bewerk uw bijlage(n)'); -} -if (!defined('_PLEASE_CONVERT_PDF_VISA')) { - define('_PLEASE_CONVERT_PDF_VISA', 'Bewerk de volgende bijlagen:'); -} if (!defined('_AVIS_WORKFLOW')) { define('_AVIS_WORKFLOW', 'Berichtencircuit'); } diff --git a/modules/visa/load_listmodel_visa.php b/modules/visa/load_listmodel_visa.php deleted file mode 100755 index 4fe6c6a5beb..00000000000 --- a/modules/visa/load_listmodel_visa.php +++ /dev/null @@ -1,199 +0,0 @@ -<?php -/** -* File : change_doctype.php. -* -* Script called by an ajax object to process the document type change during -* indexing (index_mlb.php) -* -* @version 1 -* -* @since 10/2005 -* -* @license GPL v3 -* @author Cyril Vazquez <dev@maarch.org> -*/ -require_once 'modules/entities/class/class_manage_listdiff.php'; -require_once 'modules'.DIRECTORY_SEPARATOR.'visa'.DIRECTORY_SEPARATOR - .'class'.DIRECTORY_SEPARATOR - .'class_modules_tools.php'; - - $db = new Database(); - $core = new core_tools(); - $core->load_lang(); - $diffList = new diffusion_list(); - - $objectType = $_REQUEST['objectType']; - $objectId = $_REQUEST['objectId']; - $origin = 'visa'; - - // Get listmodel_parameters - $_SESSION[$origin]['difflist_type'] = $diffList->get_difflist_type($objectType); - - if ($objectId != '') { - $_SESSION[$origin]['difflist_object']['object_id'] = $objectId; - if ($objectType == 'entity_id') { - $stmt = $db->query('select entity_label from entities where entity_id = ?', array($objectId)); - $res = $stmt->fetchObject(); - if ($res->entity_label != '') { - $_SESSION[$origin]['difflist_object']['object_label'] = $res->entity_label; - } - } - } - - $roles = $diffList->list_difflist_roles(); - $circuit = $_SESSION[$origin]['diff_list']; - if (!isset($circuit['visa']['users']) && !isset($circuit['sign']['users'])) { - echo "{status : 1, error_txt : 'Modèle inexistant'}"; - exit(); - } - if ($circuit['object_type'] == 'VISA_CIRCUIT') { - $id_tab = 'tab_visaSetWorkflow'; - $id_form = 'form_visaSetWorkflow'; - } else { - $id_tab = 'tab_avisSetWorkflow'; - $id_form = 'form_avisSetWorkflow'; - } - - $content = ''; - - $content .= '<thead><tr>'; - $content .= '<th style="width:40%;" align="left" valign="bottom"><span>Visa</span></th>'; - $content .= '<th style="width:5%;"></th>'; - $content .= '<th style="width:5%;"></th>'; - $content .= '<th style="width:5%;"></th>'; - $content .= '<th style="width:5%;"></th>'; - $content .= '<th style="width:45%;" align="left" valign="bottom"><span>Consigne</span></th>'; - $content .= '<th style="width:0;display:none" align="left" valign="bottom"></th>'; - $content .= '<th style="width:0;display:none" align="center" valign="bottom"></th>'; - - $content .= '</tr></thead>'; - $content .= '<tbody>'; - $color = ''; - $visa = new visa(); - if (isset($circuit['visa']['users'])) { - foreach ($circuit['visa']['users'] as $seq => $step) { - if ($color == ' class="col"') { - $color = ''; - } else { - $color = ' class="col"'; - } - - $content .= '<tr '.$color.'>'; - $content .= '<td>'; - - $content .= '<span id="rank_'.$seq.'"> <span class="nbResZero" style="font-weight:bold;opacity:0.5;">'.($seq + 1).'</span> </span>'; - $content .= '<select id="conseiller_'.$seq.'" name="conseiller_'.$seq.'" >'; - $content .= '<option value="" >Sélectionnez un utilisateur</option>'; - - $tab_userentities = $visa->getEntityVis(); - $tab_users = $visa->getUsersVis(); - - /* Order by parent entity **/ - foreach ($tab_userentities as $key => $value) { - $content .= '<optgroup label="'.$tab_userentities[$key]['entity_id'].'">'; - foreach ($tab_users as $user) { - if ($tab_userentities[$key]['entity_id'] == $user['entity_id']) { - $selected = ' '; - if ($user['id'] == $step['user_id']) { - $selected = ' selected'; - } - $content .= '<option value="'.$user['id'].'" '.$selected.'>'.$user['lastname'].', '.$user['firstname'].'</option>'; - } - } - $content .= '</optgroup>'; - } - $content .= '</select>'; - - $content .= '</select>'; - $content .= '<span id="signatory_'.$seq.'">'; - if (empty($circuit['sign']['users']) && $seq == count($circuit['visa']['users']) - 1) { - $content .= ' <i title="Signataire" style="color : #F99830" class="fa fa-certificate fa-lg fa-fw"></i>'; - } - $content .= '</span></td>'; - - $up = ' style="visibility:visible"'; - $down = ' style="visibility:visible"'; - if (empty($circuit['sign']['users']) && $seq == count($circuit['visa']['users']) - 1) { - $add = ' style="visibility:visible"'; - $down = ' style="visibility:hidden"'; - } else { - $add = ' style="visibility:hidden"'; - } - if ($seq == 0) { - $up = ' style="visibility:hidden"'; - } - - $content .= '<td><a href="javascript://" '.$down.' id="down_'.$seq.'" name="down_'.$seq.'" onclick="deplacerLigne(this.parentNode.parentNode.rowIndex, this.parentNode.parentNode.rowIndex+2,\''.$id_tab.'\')" ><i class="fa fa-arrow-down fa-2x"></i></a></td>'; - $content .= '<td><a href="javascript://" '.$up.' id="up_'.$seq.'" name="up_'.$seq.'" onclick="deplacerLigne(this.parentNode.parentNode.rowIndex, this.parentNode.parentNode.rowIndex-1,\''.$id_tab.'\')" ><i class="fa fa-arrow-up fa-2x"></i></a></td>'; - $content .= '<td><a href="javascript://" onclick="delRow(this.parentNode.parentNode.rowIndex,\''.$id_tab.'\')" id="suppr_'.$j.'" name="suppr_'.$j.'" style="visibility:visible;" ><i class="fa fa-user-times fa-2x"></i></a></td>'; - $content .= '<td><a href="javascript://" '.$add.' id="add_'.$seq.'" name="add_'.$seq.'" onclick="addRow(\''.$id_tab.'\')" ><i class="fa fa-user-plus fa-2x"></i></a></td>'; - $content .= '<td><input type="text" id="consigne_'.$seq.'" name="consigne_'.$seq.'" value="'.$step['process_comment'].'" onmouseover="setTitle(this);" style="width:95%;"/></td>'; - $content .= '<td style="display:none"><input type="hidden" value="'.$step['process_date'].'" id="date_'.$seq.'" name="date_'.$seq.'"/></td>'; - $content .= '<td style="display:none"><input type="checkbox" style="visibility:hidden" id="isSign_'.$seq.'" name="isSign_'.$seq.'" /></td>'; - $content .= '<td><i class="fa fa-plus fa-lg" title="Nouvel utilisateur ajouté"></i></td>'; - $content .= '</tr>'; - } - } - -//ajout signataire - if (!empty($circuit['sign']['users'])) { - $seq = count($circuit['visa']['users']); - - if ($color == ' class="col"') { - $color = ''; - } else { - $color = ' class="col"'; - } - - $content .= '<tr '.$color.'>'; - - $content .= '<td>'; - $content .= '<span id="rank_'.$seq.'"> <span class="nbResZero" style="font-weight:bold;opacity:0.5;">'.($seq + 1).'</span> </span>'; - $content .= '<select id="conseiller_'.$seq.'" name="conseiller_'.$seq.'" >'; - $content .= '<option value="" >Sélectionnez un utilisateur</option>'; - - $tab_users = $visa->getUsersVis(); - $tab_userentities = $visa->getEntityVis(); - - /* Order by parent entity **/ - foreach ($tab_userentities as $key => $value) { - $content .= '<optgroup label="'.$tab_userentities[$key]['entity_id'].'">'; - foreach ($tab_users as $user) { - if ($tab_userentities[$key]['entity_id'] == $user['entity_id']) { - $selected = ' '; - if ($user['id'] == $circuit['sign']['users'][0]['user_id']) { - $selected = ' selected'; - } - $content .= '<option value="'.$user['id'].'" '.$selected.'>'.$user['lastname'].', '.$user['firstname'].'</option>'; - } - } - $content .= '</optgroup>'; - } - $content .= '</select>'; - $content .= "<span id=\"signatory_' . $j . '\"> <i title=\"Signataire\" style=\"color : #F99830\" class=\"fa fa-certificate fa-lg fa-fw\"></i></span>"; - $content .= '</td>'; - - $up = 'style="visibility:visible"'; - $down = 'style="visibility:hidden"'; - $add = 'style="visibility:visible"'; - $del = 'style="visibility:visible"'; - if (count($circuit['visa']['users']) == 0) { - $up = 'style="visibility:hidden"'; - $del = 'style="visibility:hidden"'; - } - - $content .= '<td><a href="javascript://" '.$down." id=\"down_$seq\" name=\"down_$seq\"".' onclick="deplacerLigne(this.parentNode.parentNode.rowIndex, this.parentNode.parentNode.rowIndex+2,\''.$id_tab.'\')" ><i class="fa fa-arrow-down fa-2x"></i></a></td>'; - $content .= '<td><a href="javascript://" '.$up." id=\"up_$seq\" name=\"up_$seq\"".' onclick="deplacerLigne(this.parentNode.parentNode.rowIndex, this.parentNode.parentNode.rowIndex-1,\''.$id_tab.'\')" ><i class="fa fa-arrow-up fa-2x"></i></a></td>'; - $content .= '<td><a href="javascript://" '.$del." id=\"suppr_$seq\" name=\"suppr_$seq\"".' onclick="delRow(this.parentNode.parentNode.rowIndex,\''.$id_tab."')\" ><i class='fa fa-user-times fa-2x'></i></a></td>"; - $content .= '<td><a href="javascript://" '.$add." id=\"add_$seq\" name=\"add_$seq\"".' onclick="addRow(\''.$id_tab.'\')" ><i class="fa fa-user-plus fa-2x"></i></a></td>'; - $content .= '<td><input type="text" id="consigne_'.$seq.'" name="consigne_'.$seq.'" value="'.$circuit['sign']['users'][0]['process_comment'].'" onmouseover="setTitle(this);" style="width:95%;"/></td>'; - $content .= '<td style="display:none"><input type="hidden" id="date_'.$seq.'" name="date_'.$seq.'" value="'.$circuit['sign']['users'][0]['process_date'].'" /></td>'; - $content .= '<td style="display:none"><input type="checkbox" style="visibility:hidden" id="isSign_'.$seq.'" name="isSign_'.$seq.'" checked/></td>'; - $content .= '<td><i class="fa fa-plus fa-lg" title="Nouvel utilisateur ajouté"></i></td>'; - $content .= '</tr>'; - } - - $content .= '</tbody>'; - - echo "{status : 0, div_content : '".addslashes($content.'<br>')."'}"; - exit(); diff --git a/modules/visa/load_listmodel_visa_users.php b/modules/visa/load_listmodel_visa_users.php deleted file mode 100755 index 22b9930e838..00000000000 --- a/modules/visa/load_listmodel_visa_users.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php -/** -* File : load_listmodel_visa_users.php -* -* Script called by an ajax object to retrieve users in visa circuit -* -* -* @package maarch -* @version 1 -* @since 10/2005 -* @license GPL v3 -* @author Alex ORLUC <dev@maarch.org> -*/ -require_once 'modules/entities/class/class_manage_listdiff.php'; -require_once "modules" . DIRECTORY_SEPARATOR . "visa" . DIRECTORY_SEPARATOR - . "class" . DIRECTORY_SEPARATOR - . "class_modules_tools.php"; - - -$db = new Database(); -$core = new core_tools(); -$core->load_lang(); -$diffList = new diffusion_list(); - -$objectType = $_REQUEST['objectType']; -$objectId = $_REQUEST['objectId']; -$origin = 'visa'; - -// Get listmodel_parameters -$contentListModel = $diffList->get_listmodel($objectType, $objectId); - -if(!$contentListModel['visa']['users']){ - $contentListModel['visa']['users'] = array(); -} - -if(!$contentListModel['sign']['users']){ - $contentListModel['sign']['users'] = array(); -} - -$userList = array_merge($contentListModel['visa']['users'],$contentListModel['sign']['users']); - -$userList = json_encode($userList); - - -echo "{\"status\" : 0, \"result\" :" . $userList . "}"; -exit(); diff --git a/modules/visa/load_toolbar_visa.php b/modules/visa/load_toolbar_visa.php deleted file mode 100755 index 3a0e0686901..00000000000 --- a/modules/visa/load_toolbar_visa.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php -$targetTab = $_REQUEST['targetTab']; -$res_id = $_REQUEST['resId']; -$coll_id = $_REQUEST['collId']; - -require_once "modules" . DIRECTORY_SEPARATOR . "visa" . DIRECTORY_SEPARATOR . "class" . DIRECTORY_SEPARATOR . "class_modules_tools.php"; - -$db = new Database(); -$stmt = $db->query("SELECT listinstance_id from listinstance WHERE res_id= ? and coll_id = ? and (item_mode = ? OR item_mode = ?)", array($res_id, $coll_id, 'visa', 'sign')); -$nbVisa = $stmt->rowCount(); - -if ($nbVisa == 0){ - $class = 'nbResZero'; - $style2 = 'display:none;'; - $style = '0.5'; - $styleDetail = '#9AA7AB'; -} -else{ - $class = 'nbRes'; - $style = ''; - $style2 = 'display:inherit;'; - $styleDetail = '#666'; -} -if($_SESSION['req'] == 'details'){ - if($nbVisa == 0 && strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')){ - $nav = 'visa_tab'; - $style2 = 'visibility:hidden;'; - - } - if($_REQUEST['origin'] == 'parent'){ - $js .= 'parent.$(\''.$targetTab.'\').style.color=\''.$styleDetail.'\';parent.$(\''.$targetTab.'_badge\').innerHTML = \'<span id="nb_'.$targetTab.'" style="'.$style2.'font-size: 10px;" class="'.$class.'">'.$nbVisa.'</span>\''; - - }else { - $js .= '$(\''.$targetTab.'\').style.color=\''.$styleDetail.'\';$(\''.$targetTab.'_badge\').innerHTML = \'<span id="nb_'.$targetTab.'" style="'.$style2.'font-size: 10px;" class="'.$class.'">'.$nbVisa.'</span>\''; - - } -}else{ - if($_REQUEST['origin'] == 'parent'){ - $js .= 'parent.$(\''.$targetTab.'_img\').style.opacity=\''.$style.'\';parent.$(\''.$targetTab.'_badge\').innerHTML = \' <sup><span id="nb_'.$targetTab.'" style="'.$style2.'" class="'.$class.'">'.$nbVisa.'</span></sup>\''; - - }else { - $js .= '$(\''.$targetTab.'_img\').style.opacity=\''.$style.'\';$(\''.$targetTab.'_badge\').innerHTML = \' <sup><span id="nb_'.$targetTab.'" style="'.$style2.'" class="'.$class.'">'.$nbVisa.'</span></sup>\''; - - } -} - -echo "{status : 0, nav : '".$nav."',content : '', error : '', exec_js : '".addslashes($js)."'}"; -exit (); \ No newline at end of file diff --git a/modules/visa/printFolder_ajax.php b/modules/visa/printFolder_ajax.php deleted file mode 100755 index eb7cd3e4158..00000000000 --- a/modules/visa/printFolder_ajax.php +++ /dev/null @@ -1,316 +0,0 @@ -<?php - -/* -* Copyright 2015 Maarch -* -* This file is part of Maarch Framework. -* -* Maarch Framework is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Maarch Framework is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. -*/ - -function createPdfNotes($list_notes, $coll_id) -{ - require_once("modules".DIRECTORY_SEPARATOR."visa".DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_modules_tools.php"); - $pdf = new PdfNotes(); - $pdf->addPage(); - $data = $pdf->LoadData($list_notes, $coll_id); - $header = array('Nom', 'Consigne', 'Date'); - $pdf->SetFont('Arial', 'B', 12); - $pdf->SetY(30); - //$pdf->Table($header, $data); - $pdf->SetWidths(array(40,30,100)); - $pdf->SetAligns(array('C','C','C')); - $pdf->Row(array('Nom', 'Date', 'Note')); - $pdf->SetAligns(array('L','C','L')); - $pdf->SetFont('Arial', '', 10); - foreach ($data as $d) { - $pdf->Row($d); - } - - $filePathOnTmp = $_SESSION['config']['tmppath'] . DIRECTORY_SEPARATOR . "listNotes".$_SESSION['user']['UserId'].".pdf"; - $pdf->Output($filePathOnTmp, 'F'); - return $filePathOnTmp; -} - - -function concat_files($folder) -{ - $tmpFileName = 'tmp_print_folder_' . rand() . '.pdf'; - $filePathOnTmp = $_SESSION['config']['tmppath'] . $tmpFileName; - - $command = "pdfunite " . implode(" ", $folder) . ' ' . $filePathOnTmp; - - - exec($command.' 2>&1', $output, $return); - - if (!file_exists($filePathOnTmp)) { - return $output[0]; - } else { - return $filePathOnTmp; - } -} - -function ajout_bdd($tmpFolderFile, $res_id_master) -{ - require_once 'modules/attachments/attachments_tables.php'; - require_once 'core/class/docservers_controler.php'; - require_once "core/class/class_security.php"; - - $sec = new security(); - $docserverControler = new docservers_controler(); - if (! isset($_SESSION['collection_id_choice']) - || empty($_SESSION['collection_id_choice']) - ) { - $_SESSION['collection_id_choice'] = $_SESSION['user']['collections'][0]; - } - - $docserver = $docserverControler->getDocserverToInsert( - $_SESSION['collection_id_choice'] - ); - if (empty($docserver)) { - $_SESSION['error'] = _DOCSERVER_ERROR . ' : ' - . _NO_AVAILABLE_DOCSERVER . ". " . _MORE_INFOS . "."; - $location = ""; - } else { - $filesize = filesize($tmpFolderFile); - $newSize = $docserverControler->checkSize( - $docserver, - $filesize - ); - if ($newSize == 0) { - $_SESSION['error'] = _DOCSERVER_ERROR . ' : ' - . _NOT_ENOUGH_DISK_SPACE . ". " . _MORE_INFOS . "."; - } else { - $basename = pathinfo($tmpFolderFile, PATHINFO_BASENAME); - $fileInfos = array( - "tmpDir" => $_SESSION['config']['tmppath'], - "size" => $filesize, - "format" => 'pdf', - "tmpFileName" => $basename - ); - - $storeResult = array(); - $storeResult = $docserverControler->storeResourceOnDocserver( - $_SESSION['collection_id_choice'], - $fileInfos - ); - - if (isset($storeResult['error']) && $storeResult['error'] <> '') { - $_SESSION['error'] = $storeResult['error']; - } else { - $resAttach = new resource(); - $title = "Dossier du document n°".$_SESSION['doc_id']; - $_SESSION['data'] = array(); - array_push( - $_SESSION['data'], - array( - 'column' => "typist", - 'value' => $_SESSION['user']['UserId'], - 'type' => "string", - ) - ); - array_push( - $_SESSION['data'], - array( - 'column' => "format", - 'value' => 'pdf', - 'type' => "string", - ) - ); - array_push( - $_SESSION['data'], - array( - 'column' => "docserver_id", - 'value' => $storeResult['docserver_id'], - 'type' => "string", - ) - ); - array_push( - $_SESSION['data'], - array( - 'column' => "status", - 'value' => 'TRA', - 'type' => "string", - ) - ); - array_push( - $_SESSION['data'], - array( - 'column' => "offset_doc", - 'value' => ' ', - 'type' => "string", - ) - ); - array_push( - $_SESSION['data'], - array( - 'column' => "title", - 'value' => $title, - 'type' => "string", - ) - ); - array_push( - $_SESSION['data'], - array( - 'column' => "attachment_type", - 'value' => 'print_folder', - 'type' => "string", - ) - ); - array_push( - $_SESSION['data'], - array( - 'column' => "coll_id", - 'value' => $_SESSION['collection_id_choice'], - 'type' => "string", - ) - ); - array_push( - $_SESSION['data'], - array( - 'column' => "res_id_master", - 'value' => $_SESSION['doc_id'], - 'type' => "integer", - ) - ); - - - array_push( - $_SESSION['data'], - array( - 'column' => "type_id", - 'value' => 0, - 'type' => "int", - ) - ); - - array_push( - $_SESSION['data'], - array( - 'column' => "relation", - 'value' => 1, - 'type' => "int", - ) - ); - - $id = $resAttach->load_into_db( - RES_ATTACHMENTS_TABLE, - $storeResult['destination_dir'], - $storeResult['file_destination_name'], - $storeResult['path_template'], - $storeResult['docserver_id'], - $_SESSION['data'], - $_SESSION['config']['databasetype'] - ); - - if ($id == false) { - $_SESSION['error'] = $resAttach->get_error(); - } else { - /*if ($_SESSION['history']['attachadd'] == "true") { - $hist = new history(); - $view = $sec->retrieve_view_from_coll_id( - $_SESSION['collection_id_choice'] - ); - $hist->add( - $view, $_SESSION['doc_id'], "ADD", 'attachadd', - ucfirst(_DOC_NUM) . $id . ' ' - . _NEW_ATTACH_ADDED . ' ' . _TO_MASTER_DOCUMENT - . $_SESSION['doc_id'], - $_SESSION['config']['databasetype'], - 'apps' - ); - $_SESSION['info'] = _NEW_ATTACH_ADDED; - $hist->add( - RES_ATTACHMENTS_TABLE, $id, "ADD",'attachadd', - $_SESSION['info'] . " (" . $title - . ") ", - $_SESSION['config']['databasetype'], - 'attachments' - ); - }*/ - return $id; - } - } - } - } -} - -require_once "core/class/class_security.php"; -require_once 'modules/attachments/class/attachments_controler.php'; -require_once 'core/class/class_request.php'; -require_once 'core/class/class_resource.php'; - -$sec = new security(); -$ac = new attachments_controler(); -$resource = new resource(); -( - isset($_REQUEST['join_file']) - && count($_REQUEST['join_file']) > 0 -)? $res_master_attached = 'Y' : $res_master_attached = 'N'; -//Version attached -if (isset($_REQUEST['join_attachment']) && count($_REQUEST['join_attachment']) > 0) { - $attachment_list = join(',', $_REQUEST['join_attachment']); -} -//Attachments -if (isset($_REQUEST['join_version']) && count($_REQUEST['join_version']) > 0) { - $version_list = join(',', $_REQUEST['join_version']); -} -//Notes -if (isset($_REQUEST['notes']) && count($_REQUEST['notes']) > 0) { - $note_list = join(',', $_REQUEST['notes']); -} -$list_path_folder = array(); -if ($res_master_attached == 'Y') { - $convertedDocument = \Convert\models\AdrModel::getConvertedDocumentById(['select' => ['docserver_id', 'path', 'filename'], 'resId' => (int)$_REQUEST['join_file'][0], 'type' => 'PDF', 'collId' => 'letterbox_coll']); - $docserver = \Docserver\models\DocserverModel::getByDocserverId(['docserverId' => $convertedDocument['docserver_id'], 'select' => ['path_template']]); - $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $convertedDocument['path']) . $convertedDocument['filename']; - - array_push($list_path_folder, $pathToDocument); -} -if (isset($_REQUEST['join_attachment']) && count($_REQUEST['join_attachment']) > 0) { - foreach ($_REQUEST['join_attachment'] as $id_attach) { - $convertedDocument = \Convert\models\AdrModel::getConvertedDocumentById(['select' => ['docserver_id', 'path', 'filename'], 'resId' => $id_attach, 'type' => 'PDF', 'collId' => 'attachments_coll']); - $docserver = \Docserver\models\DocserverModel::getByDocserverId(['docserverId' => $convertedDocument['docserver_id'], 'select' => ['path_template']]); - $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $convertedDocument['path']) . $convertedDocument['filename']; - - array_push($list_path_folder, $pathToDocument); - } -} -if (isset($_REQUEST['join_version']) && count($_REQUEST['join_version']) > 0) { - foreach ($_REQUEST['join_version'] as $id_attach) { - $convertedDocument = \Convert\models\AdrModel::getConvertedDocumentById(['select' => ['docserver_id', 'path', 'filename'], 'resId' => $id_attach, 'type' => 'PDF', 'collId' => 'attachments_coll']); - $docserver = \Docserver\models\DocserverModel::getByDocserverId(['docserverId' => $convertedDocument['docserver_id'], 'select' => ['path_template']]); - $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $convertedDocument['path']) . $convertedDocument['filename']; - - array_push($list_path_folder, $pathToDocument); - } -} -if (isset($_REQUEST['notes']) && count($_REQUEST['notes']) > 0) { - $path_file_notes = createPdfNotes($_REQUEST['notes'], $_SESSION['user']['collections'][0]); - array_push($list_path_folder, $path_file_notes); -} - -if (count($list_path_folder) == 0) { - echo "{status : 1, error_txt : '"._NO_FILE_PRINT."'}"; - exit(); -} else { - $out_file = concat_files($list_path_folder); - if (!file_exists($out_file)) { - echo "{status : -1, error_txt : \"{$out_file}\"}"; - } else { - $id_folder = ajout_bdd($out_file, $_SESSION['doc_id']); - echo "{status : 0, id_folder : $id_folder}"; - } - exit(); -} diff --git a/modules/visa/saveVisaModel.php b/modules/visa/saveVisaModel.php deleted file mode 100755 index c6d6eb17839..00000000000 --- a/modules/visa/saveVisaModel.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php - -/* - * Copyright 2008-2015 Maarch and Document Image Solutions - * - * This file is part of Maarch Framework. - * - * Maarch Framework is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Maarch Framework is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. - */ - -/** - * @brief Save the visa diffusion list - * - * Save the visa diffusion list - * - * @file - * @author Nicolas Couture <couture@docimsol.com> - * @date $date$ - * @version $Revision$ - * @ingroup apps - */ -require_once "modules" . DIRECTORY_SEPARATOR . "visa" . DIRECTORY_SEPARATOR - . "class" . DIRECTORY_SEPARATOR - . "class_modules_tools.php"; - - -$title = $_REQUEST['title']; -$id_list = 'VISA_CIRCUIT_'. strtoupper(base_convert(date('U'), 10, 36)); - - -$userList = json_decode($_REQUEST['userList']); - -$visa = new visa(); -$_SESSION['visa_wf']['diff_list']['visa']['users'] = array(); -$_SESSION['visa_wf']['diff_list']['sign']['users'] = array(); - -$i = 0; -foreach ($userList as $user) { - if (++$i === count($userList)) { - array_push( - $_SESSION['visa_wf']['diff_list']['sign']['users'], array( - 'user_id' => $user->userId, - 'process_comment' => $user->userConsigne, - 'process_date' => $user->userVisaDate, - 'viewed' => 0, - 'visible' => 'Y', - 'difflist_type' => 'VISA_CIRCUIT' - ) - ); - } else { - array_push( - $_SESSION['visa_wf']['diff_list']['visa']['users'], array( - 'user_id' => $user->userId, - 'process_comment' => $user->userConsigne, - 'process_date' => $user->userVisaDate, - 'viewed' => 0, - 'visible' => 'Y', - 'difflist_type' => 'VISA_CIRCUIT' - ) - ); - } -} -$visa->saveModelWorkflow($id_list, $_SESSION['visa_wf']['diff_list'], 'VISA_CIRCUIT', $title); - -echo "{\"status\" : 0}"; - -exit(); -?> \ No newline at end of file diff --git a/modules/visa/show_printFolder_tab.php b/modules/visa/show_printFolder_tab.php deleted file mode 100755 index fa16ac06685..00000000000 --- a/modules/visa/show_printFolder_tab.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php - -require_once 'core'.DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR.'class_request.php'; -require_once 'core' . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR . 'class_security.php'; -require_once "modules" . DIRECTORY_SEPARATOR . "visa" . DIRECTORY_SEPARATOR - . "class" . DIRECTORY_SEPARATOR - . "class_modules_tools.php"; - -$res_id = $_REQUEST["resId"]; -$coll_id = $_REQUEST["collId"]; -$table = $_REQUEST["table"]; - -$security = new security(); -$right = $security->test_right_doc($coll_id, $res_id); - -if(!$right){ - exit(_NO_RIGHT_TXT); -} - -$core_tools = new core_tools(); -$core_tools->load_lang(); -$core_tools->load_html(); -$core_tools->load_header('', true, false); -$core_tools->load_js(); - -$print_folder = new visa(); -$frm_str .= $print_folder->showPrintFolder($coll_id, $table, $res_id); - -echo $frm_str; \ No newline at end of file diff --git a/modules/visa/show_visa_tab.php b/modules/visa/show_visa_tab.php deleted file mode 100755 index 1363636bbe4..00000000000 --- a/modules/visa/show_visa_tab.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php - -require_once 'core'.DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR.'class_request.php'; -require_once 'core'.DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR.'class_security.php'; -require_once 'modules'.DIRECTORY_SEPARATOR.'visa'.DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR.'class_modules_tools.php'; - -$res_id = $_REQUEST['resId']; -$coll_id = $_REQUEST['collId']; -$destination = $_REQUEST['destination']; - -$security = new security(); -$right = $security->test_right_doc($coll_id, $res_id); - -if (!$right) { - exit(_NO_RIGHT_TXT); -} - -if (isset($_REQUEST['fromDetail']) && $_REQUEST['fromDetail'] == true) { - $from_detail = true; -} else { - $from_detail = false; -} - -if (isset($_REQUEST['visaStep']) && $_REQUEST['visaStep'] == true) { - $visaStep = true; -} else { - $visaStep = false; -} - -$core_tools = new core_tools(); -$core_tools->load_lang(); -$core_tools->load_html(); -$core_tools->load_header('', true, false); -$core_tools->load_js(); - -$modifVisaWorkflow = false; -if ($from_detail == true) { - if ($core_tools->test_service('config_visa_workflow_in_detail', 'visa', false)) { - $modifVisaWorkflow = true; - } -} else { - if ($core_tools->test_service('config_visa_workflow', 'visa', false)) { - $modifVisaWorkflow = true; - } -} - -$frm_str .= '<div class="error" id="divError" name="divError"></div>'; -$frm_str .= '<div style="text-align:center;">'; -$visa = new visa(); -$frm_str .= $visa->getList($res_id, $coll_id, $modifVisaWorkflow, 'VISA_CIRCUIT', $visaStep, $from_detail); - -$frm_str .= '</div><br>'; -/* Historique diffusion visa */ -$frm_str .= '<br/>'; -$frm_str .= '<br/>'; -$frm_str .= '<span class="diff_list_visa_history" style="width: 90%; cursor: pointer;" onmouseover="this.style.cursor=\'pointer\';" onclick="new Effect.toggle(\'diff_list_visa_history_div\', \'blind\', {delay:0.2});whatIsTheDivStatus(\'diff_list_visa_history_div\', \'divStatus_diff_list_visa_history_div\');return false;">'; -$frm_str .= '<span id="divStatus_diff_list_visa_history_div" style="color:#1C99C5;"><i class="fa fa-plus-square"></i></span>'; -$frm_str .= '<b> <small>'._DIFF_LIST_VISA_HISTORY.'</small></b>'; -$frm_str .= '</span>'; - -$frm_str .= '<div id="diff_list_visa_history_div" style="display:none">'; - -$s_id = $res_id; -$return_mode = true; -$diffListType = 'VISA_CIRCUIT'; -require_once 'modules/entities/difflist_visa_history_display.php'; - -$frm_str .= '</div>'; - -//script -$curr_visa_wf = $visa->getWorkflow($res_id, $coll_id, 'VISA_CIRCUIT'); -if ((empty($curr_visa_wf['visa']) || !is_array($curr_visa_wf['visa']) || count($curr_visa_wf['visa']) == 0) && (empty($curr_visa_wf['sign']) || !is_array($curr_visa_wf['sign']) || count($curr_visa_wf['sign']) == 0)) { - $frm_str .= '<script>'; - $frm_str .= '$j("#modelList").val(\''.$destination.'\');$j("#modelList").change();'; - $frm_str .= '</script>'; -} - -echo $frm_str; diff --git a/modules/visa/updateVisaWF.php b/modules/visa/updateVisaWF.php deleted file mode 100755 index d79fb32e14d..00000000000 --- a/modules/visa/updateVisaWF.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php -/** -* Copyright Maarch since 2008 under licence GPLv3. -* See LICENCE.txt file at the root folder for more details. -* This file is part of Maarch software. - -* @brief updateVisaWF -* @author dev <dev@maarch.org> -* @ingroup visa -*/ - -require_once "modules" . DIRECTORY_SEPARATOR . "visa" . DIRECTORY_SEPARATOR - . "class" . DIRECTORY_SEPARATOR - . "class_modules_tools.php"; - -$res_id = $_REQUEST['resId']; -$coll_id = 'letterbox_coll'; - -$userList = json_decode($_REQUEST['userList']); - -$visa = new visa(); -$_SESSION['visa_wf']['diff_list']['visa']['users'] = array(); -$_SESSION['visa_wf']['diff_list']['sign']['users'] = array(); - -$i = 0; -if ($userList) { - foreach ($userList as $user) { - if (++$i === count($userList)) { - array_push( - $_SESSION['visa_wf']['diff_list']['sign']['users'], array( - 'user_id' => $user->userId, - 'process_comment' => $user->userConsigne, - 'process_date' => $user->userVisaDate, - 'viewed' => 0, - 'visible' => 'Y', - 'difflist_type' => 'VISA_CIRCUIT', - 'signatory' => $user->userSignatory, - 'requested_signature' => $user->userRequestSign - ) - ); - } else { - array_push( - $_SESSION['visa_wf']['diff_list']['visa']['users'], array( - 'user_id' => $user->userId, - 'process_comment' => $user->userConsigne, - 'process_date' => $user->userVisaDate, - 'viewed' => 0, - 'visible' => 'Y', - 'difflist_type' => 'VISA_CIRCUIT', - 'signatory' => $user->userSignatory, - 'requested_signature' => $user->userRequestSign - ) - ); - } - } -} -$visa->saveWorkflow($res_id, $coll_id, $_SESSION['visa_wf']['diff_list'], 'VISA_CIRCUIT'); - -$db = new Database(); -$stmt = $db->query("SELECT status FROM res_letterbox WHERE res_id = ?", array($res_id)); -$res = $stmt->fetchObject(); -if ($res->status == 'EVIS' || $res->status == 'ESIG') { - $visa->setStatusVisa($res_id, $coll_id, true); -} - -//LOAD TOOLBAR BADGE -$toolbarBagde_script = $_SESSION['config']['businessappurl'] . 'index.php?display=true&module=visa&page=load_toolbar_visa&origin=parent&resId=' . $res_id . '&collId=' . $coll_id; -$js ='loadToolbarBadge(\'visa_tab\',\'' . $toolbarBagde_script . '\');'; - - -echo "{\"status\" : 0, \"exec_js\" : \"" . $js . "\"}"; -exit(); diff --git a/modules/visa/xml/IVS/requests_definitions.xml b/modules/visa/xml/IVS/requests_definitions.xml index 7979de938ee..65262b9ffae 100755 --- a/modules/visa/xml/IVS/requests_definitions.xml +++ b/modules/visa/xml/IVS/requests_definitions.xml @@ -15,14 +15,6 @@ <parameter name="page" value="checkSignFile"/> <parameter name="module" value="visa"/> </requestDefinition> - <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="vi_create_sep" > - <parameter name="page" value="create_sep"/> - <parameter name="module" value="visa"/> - </requestDefinition> - <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="vi_create_sep" > - <parameter name="page" value="create_sep"/> - <parameter name="module" value="visa"/> - </requestDefinition> <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="vi_encodePinCode" > <parameter name="page" value="encodePinCode"/> <parameter name="module" value="visa"/> @@ -31,27 +23,6 @@ <parameter name="page" value="encodePinCode"/> <parameter name="module" value="visa"/> </requestDefinition> - <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="vi_load_listmodel_visa" > - <parameter name="page" value="load_listmodel_visa"/> - <parameter name="module" value="visa"/> - </requestDefinition> - <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="vi_load_listmodel_visa" > - <parameter name="page" value="load_listmodel_visa"/> - <parameter name="module" value="visa"/> - </requestDefinition> - <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="vi_saveVisaModel" > - <parameter name="page" value="saveVisaModel"/> - <parameter name="module" value="visa"/> - </requestDefinition> - <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="vi_saveVisaModel" > - <parameter name="page" value="saveVisaModel"/> - <parameter name="module" value="visa"/> - </requestDefinition> - <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="vi_getVisaModelByTitle" > - <parameter name="display" value="true"/> - <parameter name="module" value="visa"/> - <parameter name="page" value="getVisaModelByTitle"/> - </requestDefinition> <requestDefinition method="POST" path="/apps/maarch_entreprise/index.php" validationRule="vi_saveVisaWF" > <parameter name="page" value="saveVisaWF"/> <parameter name="module" value="visa"/> diff --git a/modules/visa/xml/IVS/validation_rules.xml b/modules/visa/xml/IVS/validation_rules.xml index 249b2d6e95d..2233f56fdce 100755 --- a/modules/visa/xml/IVS/validation_rules.xml +++ b/modules/visa/xml/IVS/validation_rules.xml @@ -23,25 +23,9 @@ <validationRule name="vi_checkSignFile" extends="standardForm" mode="error"> <parameter name="res_id" type="integer" /> </validationRule> - <validationRule name="vi_create_sep" extends="standardForm" mode="error"> - <parameter name="service" type="string" /> - <parameter name="path" type="string" /> - <parameter name="label" type="string" /> - </validationRule> <validationRule name="vi_encodePinCode" extends="standardForm" mode="error"> <parameter name="pinCode" type="string" /> </validationRule> - <validationRule name="vi_load_listmodel_visa" extends="standardForm" mode="error"> - <parameter name="objectType" type="identifier" /> - <parameter name="objectId" type="identifier" /> - </validationRule> - <validationRule name="vi_getVisaModelByTitle" extends="standardForm" mode="error"> - <parameter name="title" type="string" /> - </validationRule> - <validationRule name="vi_saveVisaModel" extends="standardForm" mode="error"> - <parameter name="title" type="string" /> - <parameter name="userList" type="string" /> - </validationRule> <validationRule name="vi_saveVisaWF" extends="standardForm" mode="error"> <parameter name="res_id" type="integer" /> <parameter name="coll_id" type="collection_list" /> diff --git a/src/frontend/app/signature-book.component.scss b/src/frontend/app/signature-book.component.scss index bc2f681531d..619e6d7cbe5 100755 --- a/src/frontend/app/signature-book.component.scss +++ b/src/frontend/app/signature-book.component.scss @@ -1,19 +1,5 @@ @import "../css/vars.scss"; -#modalSaveVisaModel{ - padding-top:20px; - z-index: 1050; - width: 300px; - height: 80px; - border: 2px solid #000; - display: none; - position: absolute; - background-color: #fbfbfb; - left: 40%; - top: 10%; - text-align: center; -} - .selectedId{ background-color:$secondary; } -- GitLab