From 18c0da4e2484812a547f962d35464020d7aee920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20David?= Date: Thu, 10 Aug 2023 09:33:10 +0200 Subject: [PATCH] #1434 [Control] add: public control history --- class/actions_digiquali.class.php | 40 +++- class/control.class.php | 84 ++++++++ core/modules/modDigiQuali.class.php | 7 +- core/tpl/digiquali_public_control.tpl.php | 85 ++++++++ ...9_modDigiQuali_DigiQualiTriggers.class.php | 1 - js/digiquali.min.js | 2 +- js/modules/control.js | 33 +++ langs/fr_FR/digiquali.lang | 4 + public/control/public_control.php | 89 +------- public/control/public_control_history.php | 194 ++++++++++++++++++ 10 files changed, 449 insertions(+), 90 deletions(-) create mode 100644 core/tpl/digiquali_public_control.tpl.php create mode 100644 public/control/public_control_history.php diff --git a/class/actions_digiquali.class.php b/class/actions_digiquali.class.php index 3f62c9e2..3530a623 100644 --- a/class/actions_digiquali.class.php +++ b/class/actions_digiquali.class.php @@ -267,7 +267,26 @@ public function printCommonFooter($parameters) jQuery('.fichecenter').last().after() db); + $productLot->fetch(GETPOST('id')); + $objectB64 = $productLot->array_options['options_control_history_link']; + $publicControlInterfaceUrl = dol_buildpath('custom/digiquali/public/control/public_control_history.php?track_id=' . $objectB64, 3); + + $out = '
'; + $out .= $langs->trans('ShowObjectControlHistory'); + $out .= '
'; + + ?> + + results = array('myreturn' => 999); @@ -278,6 +297,25 @@ public function printCommonFooter($parameters) } } + public function formObjectOptions($parameters, $object, $options) { + global $langs, $user; + + if ($parameters['currentcontext'] == 'globalcard' && preg_match('/productlotcard/', $parameters['context'])) { + $objectData = [ + 'type' => $object->element, + 'id' => $object->id + ]; + + $objectDataJson = json_encode($objectData); + $objectDataB64 = base64_encode($objectDataJson); + + if (dol_strlen($object)->array_options['options_control_history_link'] == 0 ) { + $object->array_options['options_control_history_link'] = $objectDataB64; + $object->update($user, 1); + } + } + } + /** * Overloading the redirectAfterConnection function : replacing the parent's function with the one below * diff --git a/class/control.class.php b/class/control.class.php index 97f55ed1..4d087484 100644 --- a/class/control.class.php +++ b/class/control.class.php @@ -347,6 +347,90 @@ public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = } } + + /** + * Load list of objects in memory from the database. + * + * @param string $sortorder Sort Order + * @param string $sortfield Sort field + * @param int $limit limit + * @param int $offset Offset + * @param array $filter Filter array. Example array('field'=>'valueforlike', 'customurl'=>...) + * @param string $filtermode Filter mode (AND or OR) + * @return array|int int <0 if KO, array of pages if OK + */ + public function fetchAllWithLeftJoin($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND', $fetchCategories = false, $leftJoin = '') + { + dol_syslog(__METHOD__, LOG_DEBUG); + + $records = array(); + + $sql = 'SELECT '; + $sql .= $this->getFieldList('t'); + $sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t'; + if (isModEnabled('categorie') && $fetchCategories) { + require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; + $sql .= Categorie::getFilterJoinQuery('control', 't.rowid'); + } + if (dol_strlen($leftJoin)) { + $sql .= ' ' . $leftJoin; + } + if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) $sql .= ' WHERE t.entity IN (' . getEntity($this->table_element) . ')'; + else $sql .= ' WHERE 1 = 1'; + + // Manage filter + $sqlwhere = array(); + if (count($filter) > 0) { + foreach ($filter as $key => $value) { + if ($key == 't.rowid') { + $sqlwhere[] = $key . '=' . $value; + } elseif (in_array($this->fields[$key]['type'], array('date', 'datetime', 'timestamp'))) { + $sqlwhere[] = $key . ' = \'' . $this->db->idate($value) . '\''; + } elseif ($key == 'customsql') { + $sqlwhere[] = $value; + } elseif (strpos($value, '%') === false) { + $sqlwhere[] = $key . ' IN (' . $this->db->sanitize($this->db->escape($value)) . ')'; + } else { + $sqlwhere[] = $key . ' LIKE \'%' . $this->db->escape($value) . '%\''; + } + } + } + if (count($sqlwhere) > 0) { + $sql .= ' AND (' . implode(' ' . $filtermode . ' ', $sqlwhere) . ')'; + } + + if ( ! empty($sortfield)) { + $sql .= $this->db->order($sortfield, $sortorder); + } + if ( ! empty($limit)) { + $sql .= ' ' . $this->db->plimit($limit, $offset); + } + + $resql = $this->db->query($sql); + if ($resql) { + $num = $this->db->num_rows($resql); + $i = 0; + while ($i < ($limit ? min($limit, $num) : $num)) { + $obj = $this->db->fetch_object($resql); + + $record = new self($this->db); + $record->setVarsFromFetchObj($obj); + + $records[$record->id] = $record; + + $i++; + } + $this->db->free($resql); + + return $records; + } else { + $this->errors[] = 'Error ' . $this->db->lasterror(); + dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR); + + return -1; + } + } + /** * Set draft status. * diff --git a/core/modules/modDigiQuali.class.php b/core/modules/modDigiQuali.class.php index a9f53108..c3b9db44 100644 --- a/core/modules/modDigiQuali.class.php +++ b/core/modules/modDigiQuali.class.php @@ -124,7 +124,9 @@ public function __construct($db) 'controlcard', 'publiccontrol', 'publicsurvey', - 'digiqualiadmindocuments' + 'digiqualiadmindocuments', + 'globalcard', + 'productlotcard' ], // Set this to 1 if features of module are opened to external users 'moduleforexternal' => 0, @@ -635,7 +637,8 @@ public function init($options = ''): int $linkableObject = new $className($this->db); $tableElement = $linkableObject->table_element; - $extraFields->addExtraField('qc_frequency', 'QcFrequency', 'int', 100, 10, $tableElement, 0, 0, '', 'a:1:{s:7:"options";a:1:{s:0:"";N;}}', 1, '', '1', '','',0, 'digiquali@digiquali', '$conf->digiquali->enabled'); + $extraFields->addExtraField('qc_frequency', 'QcFrequency', 'int', 100, 10, $tableElement, 0, 0, '', 'a:1:{s:7:"options";a:1:{s:0:"";N;}}', 1, '', '1', '','',0, 'digiquali@digiquali', '$conf->digiquali->enabled'); + $extraFields->addExtraField('control_history_link', 'ControlHistoryLink', 'varchar', 100, 255, $tableElement, 0, 0, '', '', 0, '', '1', '','',0, 'digiquali@digiquali', '$conf->digiquali->enabled'); } } diff --git a/core/tpl/digiquali_public_control.tpl.php b/core/tpl/digiquali_public_control.tpl.php new file mode 100644 index 00000000..9d7b7e16 --- /dev/null +++ b/core/tpl/digiquali_public_control.tpl.php @@ -0,0 +1,85 @@ +
+
+
digiquali->multidir_output[$conf->entity] . '/' . $object->element . '/'. $object->ref . '/photos/', 'small', '', 0, 0, 0, 200, 200, 0, 0, 0, $object->element . '/'. $object->ref . '/photos/', $object, 'photo', 0, 0,0, 1); ?>
+
+
getNomUrl(1, 'nolink'); ?>
+
+
+
' . $langs->trans('Verdict'); ?>
+ verdict == 1 ? 'green' : ($object->verdict == 2 ? 'red' : 'grey'); + ?> +
' . $object->fields['verdict']['arrayofkeyval'][(!empty($object->verdict)) ?: 3] . '
'; ?>
+
+
+
+ $linkableObject) { + if ($linkableObject['conf'] > 0 && (!empty($object->linkedObjectsIds[$linkableObject['link_name']]))) { + + $className = $linkableObject['className']; + $linkedObject = new $className($db); + + $linkedObjectKey = array_key_first($object->linkedObjectsIds[$linkableObject['link_name']]); + $linkedObjectId = $object->linkedObjectsIds[$linkableObject['link_name']][$linkedObjectKey]; + + + $result = $linkedObject->fetch($linkedObjectId); + if ($result > 0) { + $linkedObject->fetch_optionals(); + + $objectName = ''; + $objectNameField = $linkableObject['name_field']; + + if (strstr($objectNameField, ',')) { + $nameFields = explode(', ', $objectNameField); + if (is_array($nameFields) && !empty($nameFields)) { + foreach ($nameFields as $subnameField) { + $objectName .= $linkedObject->$subnameField . ' '; + } + } + } else { + $objectName = $linkedObject->$objectNameField; + } + + print '
'; + print '
'; + print ''; + print $langs->transnoentities($linkableObject['langs']); + print '
'; + print '
'; + print $objectName . ' ' . img_picto('', $linkableObject['picto'], 'class="pictofixedwidth"'); + + if ($linkedObject->array_options['options_qc_frequency'] > 0) { + $objectQcFrequency = $linkedObject->array_options['options_qc_frequency']; + print '
'; + print $langs->transnoentities('QcFrequency') . ' : ' . $objectQcFrequency; + } + print '
'; + print '
'; + print '
'; + } + } + } + ?> +
+
+
+
trans('ControlDate'); ?>
+
date_creation, 'day'); ?>
+
+ next_control_date)) : ?> +
+
trans('NextControlDate'); ?>
+
next_control_date, 'day'); ?>
+
+
+
picto, 'class="pictofixedwidth"') . $langs->trans('NextControl'); ?>
+
next_control_date - dol_now())/(3600 * 24)) . ' ' . $langs->trans('Days'); ?>
+
+ +
+
+
+ + diff --git a/core/triggers/interface_99_modDigiQuali_DigiQualiTriggers.class.php b/core/triggers/interface_99_modDigiQuali_DigiQualiTriggers.class.php index 19f24ccd..6c8aae0a 100644 --- a/core/triggers/interface_99_modDigiQuali_DigiQualiTriggers.class.php +++ b/core/triggers/interface_99_modDigiQuali_DigiQualiTriggers.class.php @@ -212,7 +212,6 @@ public function runTrigger($action, $object, User $user, Translate $langs, Conf $actioncomm->note_private .= $langs->trans('Status') . ' : ' . $langs->trans('Locked') . '
'; $actioncomm->create($user); - $qcFrequency = 0; $actioncommID = 0; $elementArray = get_sheet_linkable_objects(); $object->fetchObjectLinked('', '', '', 'digiquali_control', 'OR', 1, 'sourcetype', 0); diff --git a/js/digiquali.min.js b/js/digiquali.min.js index 922ef37d..92d91289 100644 --- a/js/digiquali.min.js +++ b/js/digiquali.min.js @@ -1 +1 @@ -window.digiquali||(window.digiquali={},window.digiquali.scriptsLoaded=!1),window.digiquali.scriptsLoaded||(window.digiquali.init=function(){window.digiquali.load_list_script()},window.digiquali.load_list_script=function(){if(!window.digiquali.scriptsLoaded){var i=void 0,t=void 0;for(i in window.digiquali)for(t in window.digiquali[i].init&&window.digiquali[i].init(),window.digiquali[i])window.digiquali[i]&&window.digiquali[i][t]&&window.digiquali[i][t].init&&window.digiquali[i][t].init();window.digiquali.scriptsLoaded=!0}},window.digiquali.refresh=function(){var i=void 0,t=void 0;for(i in window.digiquali)for(t in window.digiquali[i].refresh&&window.digiquali[i].refresh(),window.digiquali[i])window.digiquali[i]&&window.digiquali[i][t]&&window.digiquali[i][t].refresh&&window.digiquali[i][t].refresh()},$(document).ready(window.digiquali.init)),window.digiquali.control={},window.digiquali.control.init=function(){window.digiquali.control.event()},window.digiquali.control.event=function(){$(document).on("click",".answer:not(.disable)",window.digiquali.control.selectAnswer),$(document).on("input",".input-answer:not(.disable)",window.digiquali.control.selectAnswer),$(document).on("keyup",".question-comment",window.digiquali.control.writeComment),$(document).on("change",".control-table.linked-objects select",window.digiquali.control.disableOtherSelectors),$(document).on("keyup",".question-comment",window.digiquali.control.showCommentUnsaved),$(document).on("click",".validateButton",window.digiquali.control.getAnswerCounter),$(document).on("change","#fk_sheet",window.digiquali.control.showSelectObjectLinked),$(document).on("click",".toggleControlInfo",window.digiquali.control.toggleControlInfo),$(document).on("click",".clipboard-copy",window.digiquali.control.copyToClipboard),$(document).on("change","#productId",window.digiquali.control.refreshLotSelector)},window.digiquali.control.selectAnswer=function(i){var t=$(this).hasClass("answer")?$(this).attr("value"):$(this).val();let o="";var e=$(this).closest(".select-answer.answer-cell");if($(this).closest(".table-cell").hasClass("select-answer")){if($(this).hasClass("multiple-answers")){$(this).closest("span").toggleClass("active");let i=[];e.find(".multiple-answers.active").each(function(){i.push($(this).attr("value"))}),o=i}else $(this).closest(".table-cell").find(".answer.active").css("background-color","#fff"),$(this).closest(".table-cell").find("span").removeClass("active"),$(this).closest("span").addClass("active"),o=t;$(this).hasClass("active")?(e=$(this).closest(".answer-cell").find(".answer-color-"+$(this).attr("value")).val(),$(this).attr("style",$(this).attr("style")+" background:"+e+";")):$(this).attr("style",$(this).attr("style")+" background:#fff;"),$(this).closest(".answer-cell").find(".question-answer").val(o)}window.digiquali.control.updateButtonsStatus()},window.digiquali.control.writeComment=function(i){var t=$(this).closest(".table-cell").find(".question-comment").attr("name"),o=$(this).closest(".table-cell").find(".question-comment").val();let e=$(this).closest(".tabBar").find(".validateButton").attr("href");e.match("&"+t+"=")&&(e=e.split("&"+t+"=")[0]),$(this).closest(".tabBar").find(".validateButton").attr("href",e+"&"+t+"="+o)},window.digiquali.control.disableOtherSelectors=function(i){var t=document.getElementById("createControlForm"),t=new FormData(t),o=$(this).attr("id");0<=t.get(o)?$(".control-table.linked-objects").find("select").not("#"+o).attr("disabled",1):$(".control-table.linked-objects").find("select").not("#"+o).removeAttr("disabled")},window.digiquali.control.showCommentUnsaved=function(i){$(this).hasClass("show-comment-unsaved-message")||($(this).after('

Commentaire non enregistré

'),$(this).addClass("show-comment-unsaved-message")),window.digiquali.control.updateButtonsStatus()},window.digiquali.control.updateButtonsStatus=function(){$("#saveButton").removeClass("butActionRefused"),$("#saveButton").addClass("butAction"),$("#saveButton").attr("onclick",'$("#saveControl").submit()'),$("#validateButton").removeClass("butAction"),$("#validateButton").addClass("butActionRefused")},window.digiquali.control.getAnswerCounter=function(i){let t=0;jQuery("#tablelines").children().each(function(){0<$(this).find(".answer.active").length&&(t+=1)}),document.cookie="answerCounter="+t},window.digiquali.control.showSelectObjectLinked=function(i){var t=document.getElementById("createControlForm"),t=new FormData(t),o=$(".id-container").find('input[name="token"]').val(),e=t.get("fk_sheet"),n=t.get("fk_user_controller"),t=t.get("fk_project"),e=(e=document.URL+(document.URL.match(/\?action=create/)?"":"?action=create")+"&fk_sheet="+e+"&token="+o)+("&fk_project="+t)+("&fk_user_controller="+n);window.saturne.loader.display($(".tabBar.tabBarWithBottom tbody")),$.ajax({url:e,type:"POST",processData:!1,contentType:!1,success:function(i){$(".tabBar.tabBarWithBottom tbody").html($(i).find(".tabBar.tabBarWithBottom tbody").children()),$(".wpeo-loader").removeClass("wpeo-loader")},error:function(){}})},window.digiquali.control.toggleControlInfo=function(i){$(this).hasClass("fa-minus-square")?($(this).removeClass("fa-minus-square").addClass("fa-caret-square-down"),$(this).closest(".fiche").find(".fichecenter.controlInfo").addClass("hidden")):($(this).removeClass("fa-caret-square-down").addClass("fa-minus-square"),$(this).closest(".fiche").find(".fichecenter.controlInfo").removeClass("hidden"))},window.digiquali.control.copyToClipboard=function(i){var t=$(".copy-to-clipboard").attr("value");navigator.clipboard.writeText(t).then(()=>{$(".clipboard-copy").animate({backgroundColor:"#59ed9c"},200,()=>{$(".clipboard-copy").attr("class","fas fa-check clipboard-copy"),$(this).tooltip({items:".clipboard-copy",content:$("#copyToClipboardTooltip").val()}),$(this).tooltip("open"),$(".clipboard-copy").attr("style","")})})},window.digiquali.control.refreshLotSelector=function(i){var t=document.getElementById("add_control_equipment"),t=new FormData(t),o=window.saturne.toolbox.getToken(),t=t.get("productId"),o=document.URL+"&token="+o;o+="&fk_product="+t,window.saturne.loader.display($(".product-lot")),$.ajax({url:o,type:"POST",processData:!1,contentType:!1,success:function(i){$(".product-lot").replaceWith($(i).find(".product-lot"))},error:function(){}})},window.digiquali.question={},window.digiquali.question.init=function(){window.digiquali.question.event()},window.digiquali.question.event=function(){$(document).on("click",".clicked-photo-preview",window.digiquali.question.previewPhoto),$(document).on("click",".ui-dialog-titlebar-close",window.digiquali.question.closePreviewPhoto),$(document).on("click","#show_photo",window.digiquali.question.showPhoto),$(document).on("click",".answer-picto .item, .wpeo-table .item",window.digiquali.question.selectAnswerPicto)},window.digiquali.question.previewPhoto=function(i){$(this).hasClass("photo-ok")?$("#dialogforpopup").attr("style","border: 10px solid #47e58e"):$(this).hasClass("photo-ko")&&$("#dialogforpopup").attr("style","border: 10px solid #e05353")},window.digiquali.question.closePreviewPhoto=function(i){$("#dialogforpopup").attr("style","border:")},window.digiquali.question.showPhoto=function(){var i=$(this).closest(".question-table").find(".linked-medias");i.hasClass("hidden")?(i.attr("style",""),i.removeClass("hidden")):(i.attr("style","display:none"),i.addClass("hidden"))},window.digiquali.question.selectAnswerPicto=function(i){var t=$(this).closest(".wpeo-dropdown");$(this).closest(".content").removeClass("active"),t.find(".dropdown-toggle span").hide(),t.find(".dropdown-toggle.button-picto").html($(this).closest(".wpeo-tooltip-event").html()),t.find(".input-hidden-picto").val($(this).data("label"))},window.digiquali.sheet={},window.digiquali.sheet.init=function(){window.digiquali.sheet.event()},window.digiquali.sheet.event=function(){}; \ No newline at end of file +window.digiquali||(window.digiquali={},window.digiquali.scriptsLoaded=!1),window.digiquali.scriptsLoaded||(window.digiquali.init=function(){window.digiquali.load_list_script()},window.digiquali.load_list_script=function(){if(!window.digiquali.scriptsLoaded){var i=void 0,o=void 0;for(i in window.digiquali)for(o in window.digiquali[i].init&&window.digiquali[i].init(),window.digiquali[i])window.digiquali[i]&&window.digiquali[i][o]&&window.digiquali[i][o].init&&window.digiquali[i][o].init();window.digiquali.scriptsLoaded=!0}},window.digiquali.refresh=function(){var i=void 0,o=void 0;for(i in window.digiquali)for(o in window.digiquali[i].refresh&&window.digiquali[i].refresh(),window.digiquali[i])window.digiquali[i]&&window.digiquali[i][o]&&window.digiquali[i][o].refresh&&window.digiquali[i][o].refresh()},$(document).ready(window.digiquali.init)),window.digiquali.control={},window.digiquali.control.init=function(){window.digiquali.control.event()},window.digiquali.control.event=function(){$(document).on("click",".answer:not(.disable)",window.digiquali.control.selectAnswer),$(document).on("input",".input-answer:not(.disable)",window.digiquali.control.selectAnswer),$(document).on("keyup",".question-comment",window.digiquali.control.writeComment),$(document).on("change",".control-table.linked-objects select",window.digiquali.control.disableOtherSelectors),$(document).on("keyup",".question-comment",window.digiquali.control.showCommentUnsaved),$(document).on("click",".validateButton",window.digiquali.control.getAnswerCounter),$(document).on("change","#fk_sheet",window.digiquali.control.showSelectObjectLinked),$(document).on("click",".toggleControlInfo",window.digiquali.control.toggleControlInfo),$(document).on("click",".clipboard-copy",window.digiquali.control.copyToClipboard),$(document).on("change","#productId",window.digiquali.control.refreshLotSelector),$(document).on("click",".switch-public-control-view",window.digiquali.control.switchPublicControlView)},window.digiquali.control.selectAnswer=function(i){var o=$(this).hasClass("answer")?$(this).attr("value"):$(this).val();let t="";var e=$(this).closest(".select-answer.answer-cell");if($(this).closest(".table-cell").hasClass("select-answer")){if($(this).hasClass("multiple-answers")){$(this).closest("span").toggleClass("active");let i=[];e.find(".multiple-answers.active").each(function(){i.push($(this).attr("value"))}),t=i}else $(this).closest(".table-cell").find(".answer.active").css("background-color","#fff"),$(this).closest(".table-cell").find("span").removeClass("active"),$(this).closest("span").addClass("active"),t=o;$(this).hasClass("active")?(e=$(this).closest(".answer-cell").find(".answer-color-"+$(this).attr("value")).val(),$(this).attr("style",$(this).attr("style")+" background:"+e+";")):$(this).attr("style",$(this).attr("style")+" background:#fff;"),$(this).closest(".answer-cell").find(".question-answer").val(t)}window.digiquali.control.updateButtonsStatus()},window.digiquali.control.writeComment=function(i){var o=$(this).closest(".table-cell").find(".question-comment").attr("name"),t=$(this).closest(".table-cell").find(".question-comment").val();let e=$(this).closest(".tabBar").find(".validateButton").attr("href");e.match("&"+o+"=")&&(e=e.split("&"+o+"=")[0]),$(this).closest(".tabBar").find(".validateButton").attr("href",e+"&"+o+"="+t)},window.digiquali.control.disableOtherSelectors=function(i){var o=document.getElementById("createControlForm"),o=new FormData(o),t=$(this).attr("id");0<=o.get(t)?$(".control-table.linked-objects").find("select").not("#"+t).attr("disabled",1):$(".control-table.linked-objects").find("select").not("#"+t).removeAttr("disabled")},window.digiquali.control.showCommentUnsaved=function(i){$(this).hasClass("show-comment-unsaved-message")||($(this).after('

Commentaire non enregistré

'),$(this).addClass("show-comment-unsaved-message")),window.digiquali.control.updateButtonsStatus()},window.digiquali.control.updateButtonsStatus=function(){$("#saveButton").removeClass("butActionRefused"),$("#saveButton").addClass("butAction"),$("#saveButton").attr("onclick",'$("#saveControl").submit()'),$("#validateButton").removeClass("butAction"),$("#validateButton").addClass("butActionRefused")},window.digiquali.control.getAnswerCounter=function(i){let o=0;jQuery("#tablelines").children().each(function(){0<$(this).find(".answer.active").length&&(o+=1)}),document.cookie="answerCounter="+o},window.digiquali.control.showSelectObjectLinked=function(i){var o=document.getElementById("createControlForm"),o=new FormData(o),t=$(".id-container").find('input[name="token"]').val(),e=o.get("fk_sheet"),n=o.get("fk_user_controller"),o=o.get("fk_project"),e=(e=document.URL+(document.URL.match(/\?action=create/)?"":"?action=create")+"&fk_sheet="+e+"&token="+t)+("&fk_project="+o)+("&fk_user_controller="+n);window.saturne.loader.display($(".tabBar.tabBarWithBottom tbody")),$.ajax({url:e,type:"POST",processData:!1,contentType:!1,success:function(i){$(".tabBar.tabBarWithBottom tbody").html($(i).find(".tabBar.tabBarWithBottom tbody").children()),$(".wpeo-loader").removeClass("wpeo-loader")},error:function(){}})},window.digiquali.control.toggleControlInfo=function(i){$(this).hasClass("fa-minus-square")?($(this).removeClass("fa-minus-square").addClass("fa-caret-square-down"),$(this).closest(".fiche").find(".fichecenter.controlInfo").addClass("hidden")):($(this).removeClass("fa-caret-square-down").addClass("fa-minus-square"),$(this).closest(".fiche").find(".fichecenter.controlInfo").removeClass("hidden"))},window.digiquali.control.copyToClipboard=function(i){var o=$(".copy-to-clipboard").attr("value");navigator.clipboard.writeText(o).then(()=>{$(".clipboard-copy").animate({backgroundColor:"#59ed9c"},200,()=>{$(".clipboard-copy").attr("class","fas fa-check clipboard-copy"),$(this).tooltip({items:".clipboard-copy",content:$("#copyToClipboardTooltip").val()}),$(this).tooltip("open"),$(".clipboard-copy").attr("style","")})})},window.digiquali.control.refreshLotSelector=function(i){var o=document.getElementById("add_control_equipment"),o=new FormData(o),t=window.saturne.toolbox.getToken(),o=o.get("productId"),t=document.URL+"&token="+t;t+="&fk_product="+o,window.saturne.loader.display($(".product-lot")),$.ajax({url:t,type:"POST",processData:!1,contentType:!1,success:function(i){$(".product-lot").replaceWith($(i).find(".product-lot"))},error:function(){}})},window.digiquali.control.switchPublicControlView=function(i){var o=$(".public-control-view").val(),t=window.saturne.toolbox.getToken(),t=document.URL+"&token="+t;t+="&show_last_control="+Math.abs(o-1),window.saturne.loader.display($(".signature-container")),$.ajax({url:t,type:"POST",processData:!1,contentType:!1,success:function(i){$("#publicControlHistory").replaceWith($(i).find("#publicControlHistory"))},error:function(){}})},window.digiquali.question={},window.digiquali.question.init=function(){window.digiquali.question.event()},window.digiquali.question.event=function(){$(document).on("click",".clicked-photo-preview",window.digiquali.question.previewPhoto),$(document).on("click",".ui-dialog-titlebar-close",window.digiquali.question.closePreviewPhoto),$(document).on("click","#show_photo",window.digiquali.question.showPhoto),$(document).on("click",".answer-picto .item, .wpeo-table .item",window.digiquali.question.selectAnswerPicto)},window.digiquali.question.previewPhoto=function(i){$(this).hasClass("photo-ok")?$("#dialogforpopup").attr("style","border: 10px solid #47e58e"):$(this).hasClass("photo-ko")&&$("#dialogforpopup").attr("style","border: 10px solid #e05353")},window.digiquali.question.closePreviewPhoto=function(i){$("#dialogforpopup").attr("style","border:")},window.digiquali.question.showPhoto=function(){var i=$(this).closest(".question-table").find(".linked-medias");i.hasClass("hidden")?(i.attr("style",""),i.removeClass("hidden")):(i.attr("style","display:none"),i.addClass("hidden"))},window.digiquali.question.selectAnswerPicto=function(i){var o=$(this).closest(".wpeo-dropdown");$(this).closest(".content").removeClass("active"),o.find(".dropdown-toggle span").hide(),o.find(".dropdown-toggle.button-picto").html($(this).closest(".wpeo-tooltip-event").html()),o.find(".input-hidden-picto").val($(this).data("label"))},window.digiquali.sheet={},window.digiquali.sheet.init=function(){window.digiquali.sheet.event()},window.digiquali.sheet.event=function(){}; \ No newline at end of file diff --git a/js/modules/control.js b/js/modules/control.js index bb9ce47e..56964261 100644 --- a/js/modules/control.js +++ b/js/modules/control.js @@ -38,6 +38,7 @@ window.digiquali.control.event = function() { $( document ).on( 'click', '.toggleControlInfo', window.digiquali.control.toggleControlInfo ); $( document ).on( 'click', '.clipboard-copy', window.digiquali.control.copyToClipboard ); $( document ).on( 'change', '#productId', window.digiquali.control.refreshLotSelector ); + $( document ).on( 'click', '.switch-public-control-view', window.digiquali.control.switchPublicControlView ); }; /** @@ -293,3 +294,35 @@ window.digiquali.control.refreshLotSelector = function( event ) { } }); }; + +/** + * Switch public control history mode + * + * @since 1.8.0 + * @version 1.8.0 + * + * @param {MouseEvent} event Les attributs lors du clic. + * @return {void} + */ +window.digiquali.control.switchPublicControlView = function( event ) { + + var publicControlViewMode = $('.public-control-view').val() + let token = window.saturne.toolbox.getToken(); + let urlToGo = document.URL + '&token=' + token + urlToGo += '&show_last_control=' + Math.abs(publicControlViewMode - 1) + + window.saturne.loader.display($('.signature-container')) + + $.ajax({ + url: urlToGo, + type: "POST", + processData: false, + contentType: false, + success: function ( resp ) { + $('#publicControlHistory').replaceWith($(resp).find('#publicControlHistory')) + }, + error: function ( ) { + } + }); +}; + diff --git a/langs/fr_FR/digiquali.lang b/langs/fr_FR/digiquali.lang index f7fdcb41..cf4c2fd1 100644 --- a/langs/fr_FR/digiquali.lang +++ b/langs/fr_FR/digiquali.lang @@ -295,6 +295,10 @@ DaysBeforeNextControl = Jours avant prochain contrôle SelectProductLots = Sélectionner un numéro de lot/série NoProductLot = Pas de numéro de lot/série ErrorEquipmentLink = L'équipement n'a pas pu être lié +LastControl = Dernier contrôle +ShowObjectControlHistory = Voir l'historique de contrôle +NoControlOnThisObject = Le contrôle initial n'a pas été réalisé, veuillez vous référer à la notice et contacter votre responsable qualité +ControlHistoryLink = Historique de contrôle # # ControlDet diff --git a/public/control/public_control.php b/public/control/public_control.php index 0e087428..9e1f6507 100644 --- a/public/control/public_control.php +++ b/public/control/public_control.php @@ -95,89 +95,8 @@ $elementArray = get_sheet_linkable_objects(); $object->fetchObjectLinked('', '', '', 'digiquali_control'); -?> - -
-
-
digiquali->multidir_output[$conf->entity] . '/' . $object->element . '/'. $object->ref . '/photos/', 'small', '', 0, 0, 0, 200, 200, 0, 0, 0, $object->element . '/'. $object->ref . '/photos/', $object, 'photo', 0, 0,0, 1); ?>
-
-
getNomUrl(1, 'nolink'); ?>
-
-
-
' . $langs->trans('Verdict'); ?>
-
verdict) ? $langs->transnoentities($object->fields['verdict']['arrayofkeyval'][$object->verdict]) : 'N/A'); ?>
-
-
-
- $linkableObject) { - if ($linkableObject['conf'] > 0 && (!empty($object->linkedObjectsIds[$linkableObject['link_name']]))) { - - $className = $linkableObject['className']; - $linkedObject = new $className($db); - - $linkedObjectKey = array_key_first($object->linkedObjectsIds[$linkableObject['link_name']]); - $linkedObjectId = $object->linkedObjectsIds[$linkableObject['link_name']][$linkedObjectKey]; - - - $result = $linkedObject->fetch($linkedObjectId); - if ($result > 0) { - $linkedObject->fetch_optionals(); - - $objectName = ''; - $objectNameField = $linkableObject['name_field']; - - if (strstr($objectNameField, ',')) { - $nameFields = explode(', ', $objectNameField); - if (is_array($nameFields) && !empty($nameFields)) { - foreach ($nameFields as $subnameField) { - $objectName .= $linkedObject->$subnameField . ' '; - } - } - } else { - $objectName = $linkedObject->$objectNameField; - } - - print '
'; - print '
'; - print ''; - print $langs->transnoentities($linkableObject['langs']); - print '
'; - print '
'; - print $objectName . ' ' . img_picto('', $linkableObject['picto'], 'class="pictofixedwidth"'); - - if ($linkedObject->array_options['options_qc_frequency'] > 0) { - $objectQcFrequency = $linkedObject->array_options['options_qc_frequency']; - print '
'; - print $langs->transnoentities('QcFrequency') . ' : ' . $objectQcFrequency; - } - print '
'; - print '
'; - print '
'; - } - } - } - ?> -
-
-
-
trans('ControlDate'); ?>
-
date_creation, 'day'); ?>
-
- next_control_date)) : ?> -
-
trans('NextControlDate'); ?>
-
next_control_date, 'day'); ?>
-
-
-
picto, 'class="pictofixedwidth"') . $langs->trans('NextControl'); ?>
-
next_control_date - dol_now())/(3600 * 24)) . ' ' . $langs->trans('Days'); ?>
-
- -
-
-
-
- -close(); diff --git a/public/control/public_control_history.php b/public/control/public_control_history.php new file mode 100644 index 00000000..600b0b6f --- /dev/null +++ b/public/control/public_control_history.php @@ -0,0 +1,194 @@ + + * + * This program 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. + * + * This program 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 this program. If not, see . + */ + +/** + * \file public/control/public_control.php + * \ingroup digiquali + * \brief Public page to view control. + */ + +if (!defined('NOREQUIREUSER')) { + define('NOREQUIREUSER', '1'); +} +if (!defined('NOTOKENRENEWAL')) { + define('NOTOKENRENEWAL', '1'); +} +if (!defined('NOREQUIREMENU')) { + define('NOREQUIREMENU', 1); +} +if (!defined('NOREQUIREHTML')) { + define('NOREQUIREHTML', '1'); +} +if (!defined('NOLOGIN')) { // This means this output page does not require to be logged. + define('NOLOGIN', '1'); +} +if (!defined('NOCSRFCHECK')) { // We accept to go on this page from external website. + define('NOCSRFCHECK', '1'); +} +if (!defined('NOIPCHECK')) { // Do not check IP defined into conf $dolibarr_main_restrict_ip. + define('NOIPCHECK', '1'); +} +if (!defined('NOBROWSERNOTIF')) { + define('NOBROWSERNOTIF', '1'); +} + +// Load DigiQuali environment. +if (file_exists('../../digiquali.main.inc.php')) { + require_once __DIR__ . '/../../digiquali.main.inc.php'; +} elseif (file_exists('../../../digiquali.main.inc.php')) { + require_once __DIR__ . '/../../../digiquali.main.inc.php'; +} else { + die('Include of digiquali main fails'); +} + +// Load Dolibarr libraries. +require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/product/stock/class/productlot.class.php'; +require_once DOL_DOCUMENT_ROOT . '/user/class/user.class.php'; +require_once DOL_DOCUMENT_ROOT . '/projet/class/project.class.php'; + +// Load DigiQuali libraries. +require_once __DIR__ . '/../../../digiquali/class/control.class.php'; +require_once __DIR__ . '/../../../digiquali/class/sheet.class.php'; +require_once __DIR__ . '/../../../digiquali/lib/digiquali_sheet.lib.php'; + +// Global variables definitions. +global $conf, $db, $hookmanager, $langs; + +// Load translation files required by the page. +saturne_load_langs(['bills', 'contracts', 'orders', 'products', 'projects', 'companies']); + +// Get parameters. +$track_id = GETPOST('track_id', 'alpha'); + +// Initialize technical objects. +$object = new Control($db); +$user = new User($db); +$project = new Project($db); +$sheet = new Sheet($db); + +$hookmanager->initHooks(['publiccontrol']); // Note that conf->hooks_modules contains array. + +// Load object. +$objectDataJson = base64_decode($track_id); +$objectData = json_decode($objectDataJson); + +$objectType = $objectData->type; +$objectId = $objectData->id; + +$objectLinked = new $objectType($db); +$objectLinked->fetch($objectId); + +$linkedObjects = get_sheet_linkable_objects(); + +$linkedObjectsData = $linkedObjects[$objectType]; +/* + * View + */ + +$title = $langs->trans('PublicControl'); + +$conf->dol_hide_topmenu = 1; +$conf->dol_hide_leftmenu = 1; + +saturne_header(0, '', $title); + +$elementArray = get_sheet_linkable_objects(); + + +$objectControlList = $object->fetchAllWithLeftJoin('','',GETPOST('show_last_control') == 1,0, ['customsql' => 't.rowid = je.fk_target'], 'AND', true, 'LEFT JOIN llx_element_element as je on je.sourcetype = "' . $linkedObjectsData['link_name'] . '" AND je.fk_source = ' . $objectId . ' AND je.targettype = "digiquali_control" AND je.fk_target = t.rowid' ); + + +if (is_array($objectControlList) && !empty($objectControlList)) { + print '
'; + print '
'; + print '
'; + print $langs->trans('ControlList'); + print '
'; + print ' '; + print '
'; + print $langs->trans('LastControl'); + print '
'; + print '
'; + + print ''; + print ''; + + if (GETPOST('show_last_control') == 1) { + $object = array_shift($objectControlList); + $object->fetchObjectLinked('', '', '', 'digiquali_control'); + require_once __DIR__ . '/../../core/tpl/digiquali_public_control.tpl.php'; + } else { + + print '
'; + print load_fiche_titre($langs->trans('ControlList'), $objectLinked->getNomUrl(1, 'nolink'), $object->picto); + print ''; + print ''; + print ''; + + foreach($objectControlList as $objectControl) { + $verdictColor = $objectControl->verdict == 1 ? 'green' : ($objectControl->verdict == 2 ? 'red' : 'grey'); + + $user->fetch($objectControl->fk_user_controller); + $project->fetch($objectControl->projectid); + $sheet->fetch($objectControl->fk_sheet); + + print ''; + print ''; + } + print '
'; + print $langs->trans('Ref'); + print ''; + print $langs->trans('Controller'); + print ''; + print $langs->trans('Project'); + print ''; + print $langs->trans('Sheet'); + print ''; + print $langs->trans('DateCreation'); + print ''; + print $langs->trans('Verdict'); + print ''; + print $langs->trans('Status'); + print '
'; + print $objectControl->getNomUrl(1, 'nolink'); + print ''; + print $user->getNomUrl(1, 'nolink'); + print ''; + print $project->getNomUrl(1, 'nolink'); + print ''; + print $sheet->getNomUrl(1, 'nolink'); + print ''; + print dol_print_date($objectControl->date_creation); + print ''; + print '
' . $objectControl->fields['verdict']['arrayofkeyval'][(!empty($objectControl->verdict)) ?: 3] . '
'; + print '
'; + print $objectControl->getLibStatut(5); + print '
'; + print '
'; + } + print '
'; +} else { + print '
'; + print load_fiche_titre($langs->trans('ControlList'), $objectLinked->getNomUrl(1, 'nolink'), $object->picto); + print $langs->trans('NoControlOnThisObject'); + print '
'; +} + +llxFooter('', 'public'); +$db->close();