diff --git a/class/actions_dolimeet.class.php b/class/actions_dolimeet.class.php index 87bddf4..078cf16 100644 --- a/class/actions_dolimeet.class.php +++ b/class/actions_dolimeet.class.php @@ -152,6 +152,17 @@ public function addHtmlHeader(array $parameters): int $this->resprints = $out; } + if (preg_match('/thirdpartycontact/', $parameters['context'])) { + $resourcesRequired = [ + 'js' => '/custom/dolimeet/js/dolimeet.min.js' + ]; + + $out .= ''; + $out .= ''; + + $this->resprints = $out; + } + return 0; // or return 1 to replace standard code } @@ -166,9 +177,14 @@ public function formObjectOptions(array $parameters, $object, $action): int { global $conf, $extrafields, $form, $langs; - require_once __DIR__ . '/../../saturne/lib/object.lib.php'; + if (!isset($conf->cache['objectsMetadata']) || empty($conf->cache['objectsMetadata'])) { + require_once __DIR__ . '/../../saturne/lib/object.lib.php'; + $objectsMetadata = saturne_get_objects_metadata(); + $conf->cache['objectsMetadata'] = $objectsMetadata; + } else { + $objectsMetadata = $conf->cache['objectsMetadata']; + } - $objectsMetadata = saturne_get_objects_metadata(); foreach($objectsMetadata as $objectMetadata) { if ($objectMetadata['link_name'] != $object->element) { continue; @@ -230,11 +246,16 @@ public function formObjectOptions(array $parameters, $object, $action): int */ public function printFieldListOption(array $parameters): int { - global $extrafields, $langs, $object; + global $conf, $extrafields, $langs, $object; - require_once __DIR__ . '/../../saturne/lib/object.lib.php'; + if (!isset($conf->cache['objectsMetadata']) || empty($conf->cache['objectsMetadata'])) { + require_once __DIR__ . '/../../saturne/lib/object.lib.php'; + $objectsMetadata = saturne_get_objects_metadata(); + $conf->cache['objectsMetadata'] = $objectsMetadata; + } else { + $objectsMetadata = $conf->cache['objectsMetadata']; + } - $objectsMetadata = saturne_get_objects_metadata(); foreach($objectsMetadata as $objectMetadata) { if ($objectMetadata['link_name'] != $object->element) { continue; @@ -652,6 +673,36 @@ function fillTable(data) { } } + + if (strpos($parameters['context'], 'thirdpartycontact')) { + + require_once __DIR__ . '/../../saturne/class/saturnesignature.class.php'; + + $signatory = new SaturneSignature($db); + + $sql = "SELECT t.rowid"; + $sql .= " FROM ".MAIN_DB_PREFIX."socpeople as t"; + $sql .= " WHERE t.fk_soc = ".GETPOSTINT('socid'); + $result = $db->query($sql); + $num = $db->num_rows($result); + + $contactIds = []; + $i = 0; + while ($i < $num) { + $obj = $db->fetch_object($result); + $filter = ['customsql' => 'status > 0 AND object_type="trainingsession" AND element_type="socpeople" AND element_id='.$obj->rowid]; + $signatories = $signatory->fetchAll('', '', 0, 0, $filter); + $contactIds[$obj->rowid] = count($signatories); + $i++; + } + + ?> + + cache['signatoriesInDictionary'] ?? []; + $isSignatoryColumn = false; + + foreach ($signatoriesInDictionary as $signatoryInDictionary) { + if ($signatoryInDictionary->ref === $key) { + $isSignatoryColumn = true; + break; + } + } + + if (!$isSignatoryColumn && $key !== 'society_attendants') { + return 0; + } + + if ($isSignatoryColumn) { + $signatories = $conf->cache['signatories'] ?? []; + $users = $conf->cache['user'] ?? []; + $contacts = $conf->cache['contact'] ?? []; - $signatoriesInDictionary = $conf->cache['signatoriesInDictionary']; - if (is_array($signatoriesInDictionary) && !empty($signatoriesInDictionary)) { - $users = $conf->cache['user']; - $contacts = $conf->cache['contact']; - $signatories = $conf->cache['signatories']; foreach ($signatoriesInDictionary as $signatoryInDictionary) { - if ($parameters['key'] == $signatoryInDictionary->ref) { - if (is_array($signatories) && !empty($signatories)) { - $out[$parameters['key']] = ''; - foreach ($signatories as $signatory) { - if ($signatory->role != $signatoryInDictionary->ref) { - continue; - } - switch ($signatory->attendance) { - case 1: - break; - $cssButton = '#0d8aff'; - $userIcon = 'fa-user-clock'; - break; - case 2: - $cssButton = '#e05353'; - $userIcon = 'fa-user-slash'; - break; - default: - $cssButton = '#47e58e'; - $userIcon = 'fa-user'; - break; - } - if (is_array($users[$signatory->role]) && !empty($users[$signatory->role]) && $users[$signatory->role][$signatory->id] instanceof User) { - $out[$parameters['key']] .= $users[$signatory->role][$signatory->id]->getNomUrl(1, '', 0, 0, 24, 1); - } - if (is_array($contacts[$signatory->role]) && !empty($contacts[$signatory->role]) && $contacts[$signatory->role][$signatory->id] instanceof Contact) { - $out[$parameters['key']] .= $contacts[$signatory->role][$signatory->id]->getNomUrl(1); - } - if ((is_array($users[$signatory->role]) && !empty($users[$signatory->role])) || (is_array($contacts[$signatory->role]) && !empty($contacts[$signatory->role]))) { - $out[$parameters['key']] .= ' ' . $signatory->getLibStatut(3); - $out[$parameters['key']] .= '
'; - } - } + if ($signatoryInDictionary->ref !== $key) { + continue; + } + + foreach ($signatories as $signatory) { + if ($signatory->role != $signatoryInDictionary->ref) { + continue; } + + $role = $signatory->role; + $user = $users[$role][$signatory->id] ?? null; + $contact = $contacts[$role][$signatory->id] ?? null; + + if (!$user instanceof User && !$contact instanceof Contact) { + continue; + } + + if ($user instanceof User) { + $out[$key] .= $user->getNomUrl(1, '', 0, 0, 24, 1); + } + if ($contact instanceof Contact) { + $out[$key] .= $contact->getNomUrl(1); + } + + switch ((int) $signatory->attendance) { + case 1: + $cssButton = '#0d8aff'; + $userIcon = 'fa-user-clock'; + break; + case 2: + $cssButton = '#e05353'; + $userIcon = 'fa-user-slash'; + break; + default: + $cssButton = '#47e58e'; + $userIcon = 'fa-user'; + } + + $out[$key] .= ' ' . $signatory->getLibStatut(3); + $out[$key] .= '
'; } + + break; } } - if ($parameters['key'] == 'society_attendants') { - $thirdparties = $conf->cache['thirdparty']; - if (is_array($thirdparties) && !empty($thirdparties)) { - $alreadyAddedThirdParties = []; - foreach ($thirdparties as $thirdparty) { - if (!empty($thirdparty->id) && !in_array($thirdparty->id, $alreadyAddedThirdParties)) { - $out[$parameters['key']] .= $thirdparty->getNomUrl(1) . '
'; - } - $alreadyAddedThirdParties[] = $thirdparty->id; + if ($key === 'society_attendants') { + $thirdParties = $conf->cache['thirdparty'] ?? []; + $alreadyAdded = []; + + foreach ($thirdParties as $thirdParty) { + if (empty($thirdParty->id) || isset($alreadyAdded[$thirdParty->id])) { + continue; } + + $out[$key] .= $thirdParty->getNomUrl(1) . '
'; + $alreadyAdded[$thirdParty->id] = true; } } diff --git a/core/modules/dolimeet/dolimeetdocuments/trainingsessiondocument/pdf_completioncertificatedocument.modules.php b/core/modules/dolimeet/dolimeetdocuments/trainingsessiondocument/pdf_completioncertificatedocument.modules.php index dfcecc1..53caf17 100644 --- a/core/modules/dolimeet/dolimeetdocuments/trainingsessiondocument/pdf_completioncertificatedocument.modules.php +++ b/core/modules/dolimeet/dolimeetdocuments/trainingsessiondocument/pdf_completioncertificatedocument.modules.php @@ -187,12 +187,6 @@ public function write_file($objectDocument, Translate $outputLangs, string $srcT $object = $moreParam['object']; - $uploadDir = getMultidirOutput($object, $this->module); - if (!$uploadDir) { - $this->error = $langs->transnoentities('ErrorCanNotCreateDir'); - return -1; - } - $attendantFullname = dol_strtoupper($moreParam['attendant']->lastname) . ' ' . dol_ucfirst($moreParam['attendant']->firstname); if (!empty($moreParam['attendant'])) { $moreParam['documentName'] = $attendantFullname . '_'; @@ -201,7 +195,7 @@ public function write_file($objectDocument, Translate $outputLangs, string $srcT } $moreParam['hideTemplateName'] = 1; - $file = $this->buildDocumentFilename($objectDocument, $outputLangs, $object, $uploadDir, $moreParam); + $file = $this->buildDocumentFilename($objectDocument, $outputLangs, $object, $moreParam); if ($file < 0) { $this->error = $langs->transnoentities('ErrorFileNameCanNotBeBuilt'); return -1; diff --git a/js/dolimeet.min.js b/js/dolimeet.min.js index f81f9e6..2d42518 100644 --- a/js/dolimeet.min.js +++ b/js/dolimeet.min.js @@ -1,7 +1,7 @@ -window.dolimeet||(window.dolimeet={},window.dolimeet.scriptsLoaded=!1),window.dolimeet.scriptsLoaded||(window.dolimeet.init=function(){window.dolimeet.load_list_script()},window.dolimeet.load_list_script=function(){if(!window.dolimeet.scriptsLoaded){let e=void 0,t=void 0;for(e in window.dolimeet)for(t in window.dolimeet[e].init&&window.dolimeet[e].init(),window.dolimeet[e])window.dolimeet[e]&&window.dolimeet[e][t]&&window.dolimeet[e][t].init&&window.dolimeet[e][t].init();window.dolimeet.scriptsLoaded=!0}},window.dolimeet.refresh=function(){let e=void 0,t=void 0;for(e in window.dolimeet)for(t in window.dolimeet[e].refresh&&window.dolimeet[e].refresh(),window.dolimeet[e])window.dolimeet[e]&&window.dolimeet[e][t]&&window.dolimeet[e][t].refresh&&window.dolimeet[e][t].refresh()},$(document).ready(window.dolimeet.init)),window.dolimeet.publicContact={},window.dolimeet.publicContact.init=function(){window.dolimeet.publicContact.event()},window.dolimeet.publicContact.event=function(){$(document).on("click","#addContact",window.dolimeet.publicContact.addContactRow),$(document).on("click",".remove-btn",window.dolimeet.publicContact.removeContactRow),$(document).on("input",".firstname, .lastname, .email",window.dolimeet.publicContact.updateButtonState)},window.dolimeet.publicContact.addContactRow=function(){$("#contactsList").append(` +window.dolimeet||(window.dolimeet={},window.dolimeet.scriptsLoaded=!1),window.dolimeet.scriptsLoaded||(window.dolimeet.init=function(){window.dolimeet.load_list_script()},window.dolimeet.load_list_script=function(){if(!window.dolimeet.scriptsLoaded){let e=void 0,t=void 0;for(e in window.dolimeet)for(t in window.dolimeet[e].init&&window.dolimeet[e].init(),window.dolimeet[e])window.dolimeet[e]&&window.dolimeet[e][t]&&window.dolimeet[e][t].init&&window.dolimeet[e][t].init();window.dolimeet.scriptsLoaded=!0}},window.dolimeet.refresh=function(){let e=void 0,t=void 0;for(e in window.dolimeet)for(t in window.dolimeet[e].refresh&&window.dolimeet[e].refresh(),window.dolimeet[e])window.dolimeet[e]&&window.dolimeet[e][t]&&window.dolimeet[e][t].refresh&&window.dolimeet[e][t].refresh()},$(document).ready(window.dolimeet.init)),window.dolimeet.contactList={},window.dolimeet.contactList.init=function(){window.dolimeet.contactList.event()},window.dolimeet.contactList.event=function(){},window.dolimeet.contactList.insertData=function(t,e){$table=$(".div-table-responsive"),$listTitle=$table.find("tr.liste_titre").last(),$tableLines=$table.find("tr.oddeven"),$table.find("tr.liste_titre").first().find("td").eq(1).after(''),$listTitle.find("th").eq(1).after(""+e+""),$tableLines.each(function(){$this=$(this);var e=new URL($this.find("td a").eq(1)[0].href).searchParams.get("id"),e=void 0!==t[e]?t[e]:0;$this.find("td").eq(1).after(''+e+"")})},window.dolimeet.publicContact={},window.dolimeet.publicContact.init=function(){window.dolimeet.publicContact.event()},window.dolimeet.publicContact.event=function(){$(document).on("click","#addContact",window.dolimeet.publicContact.addContactRow),$(document).on("click",".remove-btn",window.dolimeet.publicContact.removeContactRow),$(document).on("input",".firstname, .lastname, .email",window.dolimeet.publicContact.updateButtonState)},window.dolimeet.publicContact.addContactRow=function(){$("#contactsList").append(`
-
`)},window.dolimeet.publicContact.removeContactRow=function(){var e=$(this);1<$("#contactsList .contact-row").length&&e.closest(".contact-row").remove()},window.dolimeet.publicContact.updateButtonState=function(){let n=!0;$(".contact-row").each(function(){var e=$.trim($(this).find(".firstname").val()),t=$.trim($(this).find(".lastname").val()),o=$.trim($(this).find(".email").val());if(""===e||""===t||""===o)return n=!1}),$(".btn-save").prop("disabled",!n),n?$(".btn-save").removeClass("button-disable").prop("disabled",!1):$(".btn-save").addClass("button-disable").prop("disabled",!0)},window.dolimeet.session={},window.dolimeet.session.init=function(){window.dolimeet.session.event()},window.dolimeet.session.event=function(){$(document).on("change","#fk_soc",window.dolimeet.session.reloadField),$(document).on("change","#model",window.dolimeet.session.reloadFieldModel),$(document).on("change","#element_type",window.dolimeet.session.reloadFieldElementType),$("#date_start, #date_starthour, #date_startmin, #date_end, #date_endhour, #date_endmin").change(function(){setTimeout(function(){window.dolimeet.session.getDiffTimestamp()},100)})},window.dolimeet.session.reloadField=function(){var e=document.getElementById("session_form"),e=new FormData(e),t=window.saturne.toolbox.getToken(),o=window.saturne.toolbox.getQuerySeparator(document.URL);let n=e.get("fk_soc"),i=(-1==n&&(n=0),"");document.URL.match("action=")||("add"==(e=e.get("action"))?i="&action=create":"update"==e&&(i="&action=edit")),$.ajax({url:document.URL+o+"fk_soc="+n+"&token="+t+i,type:"POST",processData:!1,contentType:!1,success:function(e){$(".field_fk_project").replaceWith($(e).find(".field_fk_project")),$(".field_fk_contrat").replaceWith($(e).find(".field_fk_contrat"))},error:function(){}})},window.dolimeet.session.reloadFieldModel=function(){var e=window.saturne.toolbox.getToken(),t=window.saturne.toolbox.getQuerySeparator(document.URL),o=this.checked?"on":"off";$.ajax({url:document.URL+t+"model="+o+"&token="+e,type:"POST",processData:!1,contentType:!1,success:function(e){$(".fiche").replaceWith($(e).find(".fiche"))},error:function(){}})},window.dolimeet.session.reloadFieldElementType=function(){var e=window.saturne.toolbox.getToken(),t=window.saturne.toolbox.getQuerySeparator(document.URL),o=$(this).val(),n=$("#model").is(":checked")?"on":"off";window.saturne.loader.display($(".field_element_type")),window.saturne.loader.display($(".field_fk_element")),$.ajax({url:document.URL+t+"model="+n+"&element_type="+o+"&token="+e,type:"POST",processData:!1,contentType:!1,success:function(e){$(".field_element_type").replaceWith($(e).find(".field_element_type")),$(".field_fk_element").replaceWith($(e).find(".field_fk_element"))},error:function(){}})},window.dolimeet.session.getDiffTimestamp=function(){var e=$("#date_startday").val(),t=$("#date_startmonth").val(),o=$("#date_startyear").val(),n=0<$("#date_starthour").val()?$("#date_starthour").val():0,i=0<$("#date_startmin").val()?$("#date_startmin").val():0,d=$("#date_endday").val(),a=$("#date_endmonth").val(),l=$("#date_endyear").val(),s=0<$("#date_endhour").val()?$("#date_endhour").val():0,c=0<$("#date_endmin").val()?$("#date_endmin").val():0;""!==o&&""!==t&&""!==e&&""!==l&&""!==a&&""!==d&&(o=new Date(o,t-1,e,n,i),e=((t=new Date(l,a-1,d,s,c)).getTime()-o.getTime())/36e5,n=(t.getTime()-o.getTime())/6e4,0`)},window.dolimeet.publicContact.removeContactRow=function(){var e=$(this);1<$("#contactsList .contact-row").length&&e.closest(".contact-row").remove()},window.dolimeet.publicContact.updateButtonState=function(){let o=!0;$(".contact-row").each(function(){var e=$.trim($(this).find(".firstname").val()),t=$.trim($(this).find(".lastname").val()),i=$.trim($(this).find(".email").val());if(""===e||""===t||""===i)return o=!1}),$(".btn-save").prop("disabled",!o),o?$(".btn-save").removeClass("button-disable").prop("disabled",!1):$(".btn-save").addClass("button-disable").prop("disabled",!0)},window.dolimeet.session={},window.dolimeet.session.init=function(){window.dolimeet.session.event()},window.dolimeet.session.event=function(){$(document).on("change","#fk_soc",window.dolimeet.session.reloadField),$(document).on("change","#model",window.dolimeet.session.reloadFieldModel),$(document).on("change","#element_type",window.dolimeet.session.reloadFieldElementType),$("#date_start, #date_starthour, #date_startmin, #date_end, #date_endhour, #date_endmin").change(function(){setTimeout(function(){window.dolimeet.session.getDiffTimestamp()},100)})},window.dolimeet.session.reloadField=function(){var e=document.getElementById("session_form"),e=new FormData(e),t=window.saturne.toolbox.getToken(),i=window.saturne.toolbox.getQuerySeparator(document.URL);let o=e.get("fk_soc"),n=(-1==o&&(o=0),"");document.URL.match("action=")||("add"==(e=e.get("action"))?n="&action=create":"update"==e&&(n="&action=edit")),$.ajax({url:document.URL+i+"fk_soc="+o+"&token="+t+n,type:"POST",processData:!1,contentType:!1,success:function(e){$(".field_fk_project").replaceWith($(e).find(".field_fk_project")),$(".field_fk_contrat").replaceWith($(e).find(".field_fk_contrat"))},error:function(){}})},window.dolimeet.session.reloadFieldModel=function(){var e=window.saturne.toolbox.getToken(),t=window.saturne.toolbox.getQuerySeparator(document.URL),i=this.checked?"on":"off";$.ajax({url:document.URL+t+"model="+i+"&token="+e,type:"POST",processData:!1,contentType:!1,success:function(e){$(".fiche").replaceWith($(e).find(".fiche"))},error:function(){}})},window.dolimeet.session.reloadFieldElementType=function(){var e=window.saturne.toolbox.getToken(),t=window.saturne.toolbox.getQuerySeparator(document.URL),i=$(this).val(),o=$("#model").is(":checked")?"on":"off";window.saturne.loader.display($(".field_element_type")),window.saturne.loader.display($(".field_fk_element")),$.ajax({url:document.URL+t+"model="+o+"&element_type="+i+"&token="+e,type:"POST",processData:!1,contentType:!1,success:function(e){$(".field_element_type").replaceWith($(e).find(".field_element_type")),$(".field_fk_element").replaceWith($(e).find(".field_fk_element"))},error:function(){}})},window.dolimeet.session.getDiffTimestamp=function(){var e=$("#date_startday").val(),t=$("#date_startmonth").val(),i=$("#date_startyear").val(),o=0<$("#date_starthour").val()?$("#date_starthour").val():0,n=0<$("#date_startmin").val()?$("#date_startmin").val():0,d=$("#date_endday").val(),a=$("#date_endmonth").val(),l=$("#date_endyear").val(),s=0<$("#date_endhour").val()?$("#date_endhour").val():0,c=0<$("#date_endmin").val()?$("#date_endmin").val():0;""!==i&&""!==t&&""!==e&&""!==l&&""!==a&&""!==d&&(i=new Date(i,t-1,e,o,n),e=((t=new Date(l,a-1,d,s,c)).getTime()-i.getTime())/36e5,o=(t.getTime()-i.getTime())/6e4,0 + * + * 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 js/modules/contactList.js + * \ingroup dolimeet + * \brief JavaScript public contact file + */ + +'use strict'; + +/** + * Init public contact JS + * + * @since 22.0.0 + * @version 22.0.0 + */ +window.dolimeet.contactList = {}; + +/** + * Public contact init + * + * @since 22.0.0 + * @version 22.0.0 + * + * @return {void} + */ +window.dolimeet.contactList.init = function init() { + window.dolimeet.contactList.event(); +}; + +/** + * Public contact event initialization. Binds all necessary event listeners + * + * @since 22.0.0 + * @version 22.0.0 + * + * @return {void} + */ +window.dolimeet.contactList.event = function initializeEvents() { +}; + +/** + * Function to insert data into contact list + * + * @since 22.0.0 + * @version 22.0.0 + * + * @return {void} + */ +window.dolimeet.contactList.insertData = function(contactIds, formationLangTrans) { + $table = $('.div-table-responsive') + $listTitle = $table.find('tr.liste_titre').last() + $tableLines = $table.find('tr.oddeven') + + $table.find('tr.liste_titre').first().find('td').eq(1).after('') + $listTitle.find('th').eq(1).after(''+formationLangTrans+'') + + $tableLines.each(function() { + $this = $(this) + let url = new URL($this.find('td a').eq(1)[0].href) + let id = url.searchParams.get('id') + + let nb = contactIds[id] !== undefined ? contactIds[id] : 0 + + $this.find('td').eq(1).after(''+ nb +'') + }); +}; \ No newline at end of file diff --git a/view/session/session_list.php b/view/session/session_list.php index 2b28dcb..81e58b8 100644 --- a/view/session/session_list.php +++ b/view/session/session_list.php @@ -156,7 +156,6 @@ $search['search_external_attendants'] = $fromID; break; case 'contrat' : - $objectLinked->element = 'contract'; $search['fk_contrat'] = $fromID; if ($object->element == 'trainingsession') { $sortfield = 't.date_start';