Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Control] add: control reminder functionnality #1072

Merged
merged 7 commits into from
Jul 4, 2023
118 changes: 118 additions & 0 deletions admin/control.php
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,17 @@
dolibarr_set_const($db, $constforval, $value, 'chaine', 0, '', $conf->entity);
}

if ($action == 'update_control_reminder') {
$reminderFrequency = GETPOST('ControlReminderFrequency');
$reminderType = GETPOST('ControlReminderType');

dolibarr_set_const($db, 'DOLISMQ_CONTROL_REMINDER_FREQUENCY', $reminderFrequency, 'chaine', 0, '', $conf->entity);
dolibarr_set_const($db, 'DOLISMQ_CONTROL_REMINDER_TYPE', $reminderType, 'chaine', 0, '', $conf->entity);

setEventMessage('SavedConfig');
}


/*
* View
*/
Expand Down Expand Up @@ -343,6 +354,113 @@

print '</table>';

//Control data
print load_fiche_titre($langs->trans('ConfigData', $langs->transnoentities('ControlsMin')), '', '');

print '<table class="noborder centpercent">';
print '<tr class="liste_titre">';
print '<td>' . $langs->trans('Name') . '</td>';
print '<td>' . $langs->trans('Description') . '</td>';
print '<td class="center">' . $langs->trans('Status') . '</td>';
print '</tr>';

//Display medias conf
print '<tr><td>';
print $langs->trans('DisplayMedias');
print '</td><td>';
print $langs->trans('DisplayMediasDescription');
print '</td>';

print '<td class="center">';
print ajax_constantonoff('DOLISMQ_CONTROL_DISPLAY_MEDIAS');
print '</td>';
print '</tr>';

//Use large size media in gallery
print '<tr><td>';
print $langs->trans('UseLargeSizeMedia');
print '</td><td>';
print $langs->trans('UseLargeSizeMediaDescription');
print '</td>';

print '<td class="center">';
print ajax_constantonoff('DOLISMQ_CONTROL_USE_LARGE_MEDIA_IN_GALLERY');
print '</td>';
print '</tr>';
print '</table>';

print load_fiche_titre($langs->trans('ControlReminder'), '', '');

print '<form method="POST" action="' . $_SERVER['PHP_SELF'] . '">';
print '<input type="hidden" name="token" value="' . newToken() . '">';
print '<input type="hidden" name="action" value="update_control_reminder">';
print '<table class="noborder centpercent">';
print '<tr class="liste_titre">';
print '<td>' . $langs->trans('Name') . '</td>';
print '<td>' . $langs->trans('Description') . '</td>';
print '<td class="center">' . $langs->trans('Value') . '</td>';
print '</tr>';

print '<tr class="oddeven"><td>';
print $langs->trans('ControlReminder');
print '</td><td>';
print $langs->trans('ControlReminderDescription');
print '</td>';

print '<td class="center">';
print ajax_constantonoff('DOLISMQ_CONTROL_REMINDER_ENABLED');
print '</td></tr>';

print '<tr class="oddeven"><td>';
print $langs->trans('ControlReminderFrequency');
print '</td><td>';
print $langs->trans('ControlReminderFrequencyDescription');
print '</td>';

print '<td class="center">';
print '<input type="text" name="ControlReminderFrequency" value="' . $conf->global->DOLISMQ_CONTROL_REMINDER_FREQUENCY . '">';
print '</td></tr>';

print '<tr class="oddeven"><td>';
print $langs->trans('ControlReminderType');
print '</td><td>';
print $langs->trans('ControlReminderTypeDescription');
print '</td>';

print '<td class="center">';
$controlReminderType = ['browser' => 'Browser', 'email' => 'Email', 'sms' => 'SMS'];
print Form::selectarray('ControlReminderType', $controlReminderType, (!empty($conf->global->DOLISMQ_CONTROL_REMINDER_TYPE) ? $conf->global->DOLISMQ_CONTROL_REMINDER_TYPE : $controlReminderType[0]), 0, 0, 0, '', 1);
print '</td></tr>';

print '</table>';
print '<div class="tabsAction"><input type="submit" class="butAction" name="save" value="' . $langs->trans('Save') . '"></div>';
print '</form>';
print '</table>';

//Extrafields control management
print load_fiche_titre($langs->trans('ExtrafieldsControlManagement'), '', '');

require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php';

// Buttons
if ($action != 'create' && $action != 'edit') {
print '<div class="tabsAction">';
print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=create">'.$langs->trans('NewAttribute').'</a></div>';
print '</div>';
}

// Creation of an optional field
if ($action == 'create') {
print load_fiche_titre($langs->trans('NewAttribute'));
require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_add.tpl.php';
}

// Edition of an optional field
if ($action == 'edit' && !empty($attrname)) {
print load_fiche_titre($langs->trans('FieldEdition', $attrname));
require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_edit.tpl.php';
}

// Page end
print dol_get_fiche_end();
llxFooter();
Expand Down
2 changes: 1 addition & 1 deletion admin/setup.php
Original file line number Diff line number Diff line change
Expand Up @@ -191,8 +191,8 @@
print '</td></tr>';

print '</table>';

print $form->buttonsSaveCancel('Save', '');
print '</form>';

// Page end
print dol_get_fiche_end();
Expand Down
66 changes: 60 additions & 6 deletions class/control.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -492,7 +492,7 @@ public function isLinkedToOtherObjects() {
*/
public function createFromClone(User $user, int $fromID, array $options): int
{
global $conf;
global $conf, $langs;

dol_syslog(__METHOD__, LOG_DEBUG);

Expand Down Expand Up @@ -553,15 +553,69 @@ public function createFromClone(User $user, int $fromID, array $options): int
// Add objects linked.
$linkableElements = get_sheet_linkable_objects();

if (is_array($linkableElements) && !empty($linkableElements)) {
if (!empty($linkableElements)) {
$qcFrequency = 0;
$actioncommID = 0;
foreach($linkableElements as $linkableElement) {
$linkName = $linkableElement['link_name'];
if (!empty($object->linkedObjectsIds[$linkName])) {
foreach($object->linkedObjectsIds[$linkName] as $linkedElementId) {
$objectFromClone->add_object_linked($linkName, $linkedElementId);
if ($linkableElement['conf'] > 0 && (!empty($object->linkedObjectsIds[$linkableElement['link_name']]))) {
foreach($object->linkedObjectsIds[$linkableElement['link_name']] as $linkedElementId) {
$objectFromClone->add_object_linked($linkableElement['link_name'], $linkedElementId);
}
$className = $linkableElement['className'];
$linkedObject = new $className($this->db);

$linkedObjectKey = array_key_first($object->linkedObjectsIds[$linkableElement['link_name']]);
$linkedObjectId = $object->linkedObjectsIds[$linkableElement['link_name']][$linkedObjectKey];

$result = $linkedObject->fetch($linkedObjectId);

if ($result > 0) {
$linkedObject->fetch_optionals();
if (!empty($linkedObject->array_options['options_qc_frequency'])) {
require_once DOL_DOCUMENT_ROOT . '/comm/action/class/actioncomm.class.php';
require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php';

$actioncomm = new ActionComm($this->db);

$now = dol_now();
$qcFrequency = $linkedObject->array_options['options_qc_frequency'];

$actioncomm->code = 'AC_' . strtoupper($object->element) . '_REMINDER';
$actioncomm->label = $langs->transnoentities('ControlReminderTrigger', $langs->transnoentities(ucfirst($linkedObject->element)) . ' ' . $linkedObject->ref, $qcFrequency);
$actioncomm->elementtype = $linkedObject->element;
$actioncomm->type_code = 'AC_OTH_AUTO';
$actioncomm->datep = dol_time_plus_duree($now, $qcFrequency, 'd');
$actioncomm->fk_element = $linkedObject->id;
$actioncomm->userownerid = $user->id;
$actioncomm->percentage = ActionComm::EVENT_TODO;
$actioncommID = $actioncomm->create($user);
}
}
}
}

// Create reminders.
if ($actioncommID > 0 && $qcFrequency > 0 && getDolGlobalInt('DOLISMQ_CONTROL_REMINDER_ENABLED') && (getDolGlobalString('AGENDA_REMINDER_BROWSER') || getDolGlobalString('AGENDA_REMINDER_EMAIL'))) {
require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php';

$actionCommReminder = new ActionCommReminder($this->db);

$actionCommReminder->status = ActionCommReminder::STATUS_TODO;
$actionCommReminder->fk_actioncomm = $actioncommID;
$actionCommReminder->fk_user = $user->id;

$reminderArray = explode(',' , getDolGlobalString('DOLISMQ_CONTROL_REMINDER_FREQUENCY'));
$nextControlDate = dol_time_plus_duree(dol_now('tzuser'), $qcFrequency, 'd');
foreach ($reminderArray as $reminder) {
$dateReminder = dol_time_plus_duree($nextControlDate, -$reminder, 'd');

$actionCommReminder->dateremind = $dateReminder;
$actionCommReminder->offsetvalue = $reminder;
$actionCommReminder->offsetunit = 'd';
$actionCommReminder->typeremind = getDolGlobalString('DOLISMQ_CONTROL_REMINDER_TYPE');
$actionCommReminder->create($user);
}
}
}

// Add Attendants.
Expand Down
6 changes: 6 additions & 0 deletions core/modules/modDoliSMQ.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,9 @@ public function __construct($db)
// CONST CONTROL
$i++ => ['DOLISMQ_CONTROL_ADDON', 'chaine', 'mod_control_standard', '', 0, 'current'],
$i++ => ['DOLISMQ_CONTROL_USE_LARGE_MEDIA_IN_GALLERY', 'integer', 1, '', 0, 'current'],
$i++ => ['DOLISMQ_CONTROL_REMINDER_ENABLED', 'integer', 1, '', 0, 'current'],
$i++ => ['DOLISMQ_CONTROL_REMINDER_FREQUENCY', 'chaine', '30,60,90', '', 0, 'current'],
$i++ => ['DOLISMQ_CONTROL_REMINDER_TYPE', 'chaine', 'browser', '', 0, 'current'],
$i++ => ['DOLISMQ_CONTROL_BACKWARD_COMPATIBILITY', 'integer', 0, '', 0, 'current'],
$i++ => ['PRODUCT_LOT_ENABLE_QUALITY_CONTROL', 'integer', 1, '', 0, 'current'],
$i++ => ['DOLISMQ_LOCK_CONTROL_OUTDATED_EQUIPMENT', 'integer', 0, '', 0, 'current'],
Expand Down Expand Up @@ -241,6 +244,9 @@ public function __construct($db)
$i++ => ['DOLISMQ_REDIRECT_AFTER_CONNECTION', 'integer', 0, '', 0, 'current'],
$i++ => ['DOLISMQ_ADVANCED_TRIGGER', 'integer', 1, '', 0, 'current'],

$i++ => ['AGENDA_REMINDER_BROWSER', 'integer', 1, '', 0, 'current'],
$i++ => ['AGENDA_REMINDER_EMAIL', 'integer', 1, '', 0, 'current'],

// CONST DOCUMENTS
$i++ => ['MAIN_ODT_AS_PDF', 'chaine', 'libreoffice', '', 0, 'current'],
];
Expand Down
70 changes: 65 additions & 5 deletions core/triggers/interface_99_modDoliSMQ_DoliSMQTriggers.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -134,11 +134,13 @@ public function runTrigger($action, $object, User $user, Translate $langs, Conf
break;

case 'CONTROL_CREATE' :
$elementArray = [];
$qcFrequency = 0;
$actioncommID = 0;
if ($object->context != 'createfromclone') {
$linkableElements = get_sheet_linkable_objects();

if (is_array($linkableElements) && !empty($linkableElements)) {
foreach ($linkableElements as $linkableElementType => $linkableElement) {
$elementArray = get_sheet_linkable_objects();
if (!empty($elementArray)) {
foreach ($elementArray as $linkableElementType => $linkableElement) {
if (!empty(GETPOST($linkableElement['post_name'])) && GETPOST($linkableElement['post_name']) > 0) {
$object->add_object_linked($linkableElement['link_name'], GETPOST($linkableElement['post_name']));
}
Expand All @@ -154,7 +156,65 @@ public function runTrigger($action, $object, User $user, Translate $langs, Conf

$actioncomm->code = 'AC_' . strtoupper($object->element) . '_CREATE';
$actioncomm->label = $langs->transnoentities('ObjectCreateTrigger', $langs->transnoentities(ucfirst($object->element) . ' ' . $object->ref));
$actioncomm->create($user);
$actioncomm->create($user);

if ($object->context != 'createfromclone') {
$object->fetchObjectLinked('', '', '', 'dolismq_control', 'OR', 1, 'sourcetype', 0);
if (!empty($elementArray)) {
foreach($elementArray as $linkableElementType => $linkableElement) {
if ($linkableElement['conf'] > 0 && (!empty($object->linkedObjectsIds[$linkableElement['link_name']]))) {
$className = $linkableElement['className'];
$linkedObject = new $className($this->db);

$linkedObjectKey = array_key_first($object->linkedObjectsIds[$linkableElement['link_name']]);
$linkedObjectId = $object->linkedObjectsIds[$linkableElement['link_name']][$linkedObjectKey];

$result = $linkedObject->fetch($linkedObjectId);

if ($result > 0) {
$linkedObject->fetch_optionals();
if (!empty($linkedObject->array_options['options_qc_frequency'])) {
require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php';

$qcFrequency = $linkedObject->array_options['options_qc_frequency'];

$actioncomm->code = 'AC_' . strtoupper($object->element) . '_REMINDER';
$actioncomm->label = $langs->transnoentities('ControlReminderTrigger', $langs->transnoentities(ucfirst($linkedObject->element)) . ' ' . $linkedObject->ref, $qcFrequency);
$actioncomm->elementtype = $linkedObject->element;
$actioncomm->datep = dol_time_plus_duree($now, $qcFrequency, 'd');
$actioncomm->fk_element = $linkedObject->id;
$actioncomm->userownerid = $user->id;
$actioncomm->percentage = ActionComm::EVENT_TODO;
$actioncommID = $actioncomm->create($user);
}
}
}
}
}

// Create reminders.
if ($actioncommID > 0 && $qcFrequency > 0 && getDolGlobalInt('DOLISMQ_CONTROL_REMINDER_ENABLED') && (getDolGlobalString('AGENDA_REMINDER_BROWSER') || getDolGlobalString('AGENDA_REMINDER_EMAIL'))) {
require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php';

$actionCommReminder = new ActionCommReminder($this->db);

$actionCommReminder->status = ActionCommReminder::STATUS_TODO;
$actionCommReminder->fk_actioncomm = $actioncommID;
$actionCommReminder->fk_user = $user->id;

$reminderArray = explode(',' , getDolGlobalString('DOLISMQ_CONTROL_REMINDER_FREQUENCY'));
$nextControlDate = dol_time_plus_duree(dol_now('tzuser'), $qcFrequency, 'd');
foreach ($reminderArray as $reminder) {
$dateReminder = dol_time_plus_duree($nextControlDate, -$reminder, 'd');

$actionCommReminder->dateremind = $dateReminder;
$actionCommReminder->offsetvalue = $reminder;
$actionCommReminder->offsetunit = 'd';
$actionCommReminder->typeremind = getDolGlobalString('DOLISMQ_CONTROL_REMINDER_TYPE');
$actionCommReminder->create($user);
}
}
}
break;

case 'QUESTION_MODIFY' :
Expand Down
10 changes: 8 additions & 2 deletions langs/fr_FR/dolismq.lang
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ ComputerScience = Informatique
ControlSetUserControllerTrigger = Changement du contrôleur par défaut par %s
ControlSetVerdictTrigger = Verdict défini sur %s
AnswerSaveTrigger = Réponses sauvergardées
ControlReminderTrigger = %s doit être controlé(e) dans %s jours au plus tard

# Data - Donnée
Control = Contrôle
Expand Down Expand Up @@ -246,7 +247,6 @@ NextControlDate = Prochaine date de contrôle
NextControl = Prochain contrôle
QuestionMustBeAnswered = Vous devez encore répondre à %s question(s) obligatoire(s)
NoControlAnswersPhoto = Pas de photos sur les réponses du contrôle
QuestionMustBeAnswered = Vous devez encore répondre à %s question(s) obligatoire(s)
ControlEquipment = Moyens de contrôle
ControlEquipmentList = Liste des moyens de contrôle utilisés
AddEquipmentLink = Moyen de contrôle ajouté :
Expand All @@ -263,7 +263,13 @@ RemainingDays = Jours avant expiration
NoEquipmentLinked = Aucun moyen de contrôle lié
NoControlAnswersPhoto = Pas de photos sur les réponses du contrôle
NeedObjectToControl = Vous devez sélectionner un objet à contrôler
NeedFkSheet = Vous devez sélectionner un modèle de contrôle
NeedFkSheet = Vous devez sélectionner une fiche modèle
ControlReminder = Rappel d'événement de contrôle
ControlReminderDescription = Activer le rappel d'événement de contrôle
ControlReminderFrequency = Fréquence de rappel d'évènement de contrôle
ControlReminderFrequencyDescription = Choisir la fréquence de rappel d'évènement de contrôle <br> (par défaut : Un rappel 30 jours, 60 jours et 90 jours avant le contrôle)
ControlReminderType = Type de rappel d'évènement de contrôle
ControlReminderTypeDescription = Choisir le type de rappel d'évènement de contrôle <br> (par défaut : navigateur)

#
# ControlDet
Expand Down