diff --git a/.gitflow b/.gitflow new file mode 100644 index 0000000000..44adde7837 --- /dev/null +++ b/.gitflow @@ -0,0 +1,9 @@ +[gitflow "branch"] +master = master +develop = develop +[gitflow "prefix"] +feature = feature/ +release = release/ +hotfix = hotfix/ +versiontag = +support = support/ \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..e68d15f7c5 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/.idea/** \ No newline at end of file diff --git a/datamodel.combodo-notify-on-expiration.xml b/datamodel.combodo-notify-on-expiration.xml index 16193c7807..021eaed4e6 100644 --- a/datamodel.combodo-notify-on-expiration.xml +++ b/datamodel.combodo-notify-on-expiration.xml @@ -1,5 +1,9 @@ + cmdbAbstractObject @@ -25,12 +29,12 @@ false - - description - - true - html - + + description + + true + html + class @@ -282,7 +286,7 @@ $oBlock->Display($oPage, 'rel_preview_rule_'.$this->GetKey(), $aParams); }]]> - + diff --git a/de.dict.combodo-notify-on-expiration.php b/de.dict.combodo-notify-on-expiration.php index 408b273cbc..2b5f444a9d 100644 --- a/de.dict.combodo-notify-on-expiration.php +++ b/de.dict.combodo-notify-on-expiration.php @@ -1,78 +1,66 @@ - - * @author Romain Quetiez - * @author Denis Flaven - * @author Guillaume Lajarige - * @author Vincent Dumas - * @license http://www.opensource.org/licenses/gpl-3.0.html LGPL - */ - -// ExpirationRule -Dict::Add('DE DE', 'German', 'Deutsch', array( - // Class - 'Class:ExpirationRule/Name' => '%1$s~~', - 'Class:ExpirationRule' => 'Expiration rule~~', - 'Class:ExpirationRule+' => '~~', - 'Class:ExpirationRule/Attribute:name' => 'Name~~', - 'Class:ExpirationRule/Attribute:name+' => '~~', - 'Class:ExpirationRule/Attribute:class' => 'Class~~', - 'Class:ExpirationRule/Attribute:class+' => '~~', - 'Class:ExpirationRule/Attribute:description' => 'Description', - 'Class:ExpirationRule/Attribute:description+' => '', - 'Class:ExpirationRule/Attribute:status' => 'Status~~', - 'Class:ExpirationRule/Attribute:status+' => '~~', - 'Class:ExpirationRule/Attribute:status/Value:active' => 'Active~~', - 'Class:ExpirationRule/Attribute:status/Value:inactive' => 'Inactive~~', - 'Class:ExpirationRule/Attribute:type' => 'Applied option~~', - 'Class:ExpirationRule/Attribute:type+' => 'Which option will be used regarding the filled fields. If both are filled, advanced option is applied~~', - 'Class:ExpirationRule/Attribute:type/Value:simple' => 'Simple~~', - 'Class:ExpirationRule/Attribute:type/Value:advanced' => 'Advanced~~', - 'Class:ExpirationRule/Attribute:date_to_check_att' => 'Date to check~~', - 'Class:ExpirationRule/Attribute:date_to_check_att+' => 'Attribute code of the date to check~~', - 'Class:ExpirationRule/Attribute:term_of_notice' => 'Term of notice~~', - 'Class:ExpirationRule/Attribute:term_of_notice+' => 'Number of days before the date to check, to trigger the notification~~', - 'Class:ExpirationRule/Attribute:oql_scope' => 'OQL scope~~', - 'Class:ExpirationRule/Attribute:oql_scope+' => 'OQL query to define which objects are concerned by this rule.~~', - - // Integrity errors - 'Class:ExpirationRule/Error:ClassNotValid' => 'Class must be a valid class from datamodel, "%1$s" given~~', - 'Class:ExpirationRule/Error:AttributeNotValid' => '"%2$s" is not a valid attribute for class "%1$s"~~', - 'Class:ExpirationRule/Error:AttributeMustBeDate' => '"%2$s" must be a date attribute of class "%1$s"~~', - 'Class:ExpirationRule/Error:NoOptionFilled' => 'Either option 1 or option 2 must be filled~~', - 'Class:ExpirationRule/Error:OptionOneMissingField' => 'All fields of option 1 must be filled~~', - - // Presentation - 'ExpirationRule:general' => 'General informations~~', - 'ExpirationRule:simple' => 'Fill either option 1 (simple) ...~~', - 'ExpirationRule:advanced' => '... or option 2 (advanced)~~', - - // Menus - 'Menu:ExpirationRule' => 'Expiration rules~~', - 'Menu:ExpirationRule+' => 'Expiration rules~~', - - // Tabs - 'UI:AutocloseTicket:Preview' => 'Preview~~', - 'UI:AutocloseTicket:Title' => '%1$s reach their term of notice today~~', - - 'Class:TriggerOnExpirationRule' => 'Trigger (on expiration)~~', - 'Class:TriggerOnExpirationRule+' => 'Trigger activated when an object is in scope of an expiration rule~~', - -)); + + * @author Romain Quetiez + * @author Denis Flaven + * @author Guillaume Lajarige + * @author Vincent Dumas + */ + +// ExpirationRule +Dict::Add('DE DE', 'German', 'Deutsch', array( + // Class + 'Class:ExpirationRule/Name' => '%1$s~~', + 'Class:ExpirationRule' => 'Expiration rule~~', + 'Class:ExpirationRule+' => '~~', + 'Class:ExpirationRule/Attribute:name' => 'Name~~', + 'Class:ExpirationRule/Attribute:name+' => '~~', + 'Class:ExpirationRule/Attribute:class' => 'Class~~', + 'Class:ExpirationRule/Attribute:class+' => '~~', + 'Class:ExpirationRule/Attribute:description' => 'Description', + 'Class:ExpirationRule/Attribute:description+' => '', + 'Class:ExpirationRule/Attribute:status' => 'Status~~', + 'Class:ExpirationRule/Attribute:status+' => '~~', + 'Class:ExpirationRule/Attribute:status/Value:active' => 'Active~~', + 'Class:ExpirationRule/Attribute:status/Value:inactive' => 'Inactive~~', + 'Class:ExpirationRule/Attribute:type' => 'Applied option~~', + 'Class:ExpirationRule/Attribute:type+' => 'Which option will be used regarding the filled fields. If both are filled, advanced option is applied~~', + 'Class:ExpirationRule/Attribute:type/Value:simple' => 'Simple~~', + 'Class:ExpirationRule/Attribute:type/Value:advanced' => 'Advanced~~', + 'Class:ExpirationRule/Attribute:date_to_check_att' => 'Date to check~~', + 'Class:ExpirationRule/Attribute:date_to_check_att+' => 'Attribute code of the date to check~~', + 'Class:ExpirationRule/Attribute:term_of_notice' => 'Term of notice~~', + 'Class:ExpirationRule/Attribute:term_of_notice+' => 'Number of days before the date to check, to trigger the notification~~', + 'Class:ExpirationRule/Attribute:oql_scope' => 'OQL scope~~', + 'Class:ExpirationRule/Attribute:oql_scope+' => 'OQL query to define which objects are concerned by this rule.~~', + + // Integrity errors + 'Class:ExpirationRule/Error:ClassNotValid' => 'Class must be a valid class from datamodel, "%1$s" given~~', + 'Class:ExpirationRule/Error:AttributeNotValid' => '"%2$s" is not a valid attribute for class "%1$s"~~', + 'Class:ExpirationRule/Error:AttributeMustBeDate' => '"%2$s" must be a date attribute of class "%1$s"~~', + 'Class:ExpirationRule/Error:NoOptionFilled' => 'Either option 1 or option 2 must be filled~~', + 'Class:ExpirationRule/Error:OptionOneMissingField' => 'All fields of option 1 must be filled~~', + + // Presentation + 'ExpirationRule:general' => 'General informations~~', + 'ExpirationRule:simple' => 'Fill either option 1 (simple) ...~~', + 'ExpirationRule:advanced' => '... or option 2 (advanced)~~', + + // Menus + 'Menu:ExpirationRule' => 'Expiration rules~~', + 'Menu:ExpirationRule+' => 'Expiration rules~~', + + // Tabs + 'UI:AutocloseTicket:Preview' => 'Preview~~', + 'UI:AutocloseTicket:Title' => '%1$s reach their term of notice today~~', + + 'Class:TriggerOnExpirationRule' => 'Trigger (on expiration)~~', + 'Class:TriggerOnExpirationRule+' => 'Trigger activated when an object is in scope of an expiration rule~~', + +)); diff --git a/en.dict.combodo-notify-on-expiration.php b/en.dict.combodo-notify-on-expiration.php index d9f0ae5f41..eff13c0db4 100644 --- a/en.dict.combodo-notify-on-expiration.php +++ b/en.dict.combodo-notify-on-expiration.php @@ -1,78 +1,66 @@ - - * @author Romain Quetiez - * @author Denis Flaven - * @author Guillaume Lajarige - * @author Vincent Dumas - * @license http://www.opensource.org/licenses/gpl-3.0.html LGPL - */ - -// ExpirationRule -Dict::Add('EN US', 'English', 'English', array( - // Class - 'Class:ExpirationRule/Name' => '%1$s', - 'Class:ExpirationRule' => 'Expiration rule', - 'Class:ExpirationRule+' => '', - 'Class:ExpirationRule/Attribute:name' => 'Name', - 'Class:ExpirationRule/Attribute:name+' => '', - 'Class:ExpirationRule/Attribute:class' => 'Class', - 'Class:ExpirationRule/Attribute:class+' => '', - 'Class:ExpirationRule/Attribute:description' => 'Description', - 'Class:ExpirationRule/Attribute:description+' => '', - 'Class:ExpirationRule/Attribute:status' => 'Status', - 'Class:ExpirationRule/Attribute:status+' => '', - 'Class:ExpirationRule/Attribute:status/Value:active' => 'Active', - 'Class:ExpirationRule/Attribute:status/Value:inactive' => 'Inactive', - 'Class:ExpirationRule/Attribute:type' => 'Applied option', - 'Class:ExpirationRule/Attribute:type+' => 'Which option will be used regarding the filled fields. If both are filled, advanced option is applied', - 'Class:ExpirationRule/Attribute:type/Value:simple' => 'Simple', - 'Class:ExpirationRule/Attribute:type/Value:advanced' => 'Advanced', - 'Class:ExpirationRule/Attribute:date_to_check_att' => 'Date to check', - 'Class:ExpirationRule/Attribute:date_to_check_att+' => 'Attribute code of the date to check', - 'Class:ExpirationRule/Attribute:term_of_notice' => 'Term of notice', - 'Class:ExpirationRule/Attribute:term_of_notice+' => 'Number of days before the date to check, to trigger the notification', - 'Class:ExpirationRule/Attribute:oql_scope' => 'OQL scope', - 'Class:ExpirationRule/Attribute:oql_scope+' => 'OQL query to define which objects are concerned by this rule (stimulus to apply). Note that the OQL will automatically be restricted to the states in which the stimulus is available.', - - // Integrity errors - 'Class:ExpirationRule/Error:ClassNotValid' => 'Class must be a valid class from datamodel, "%1$s" given', - 'Class:ExpirationRule/Error:AttributeNotValid' => '"%2$s" is not a valid attribute for class "%1$s"', - 'Class:ExpirationRule/Error:AttributeMustBeDate' => '"%2$s" must be a date attribute of class "%1$s"', - 'Class:ExpirationRule/Error:NoOptionFilled' => 'Either option 1 or option 2 must be filled', - 'Class:ExpirationRule/Error:OptionOneMissingField' => 'All fields of option 1 must be filled', - - // Presentation - 'ExpirationRule:general' => 'General informations', - 'ExpirationRule:simple' => 'Fill either option 1 (simple) ...', - 'ExpirationRule:advanced' => '... or option 2 (advanced)', - - // Menus - 'Menu:ExpirationRule' => 'Expiration rules', - 'Menu:ExpirationRule+' => 'Expiration rules', - - // Tabs - 'UI:ExpiredObject:Preview' => 'Preview', - 'UI:ExpiredObject:Title' => '%1$s will enter their term of notice today', - - 'Class:TriggerOnExpirationRule' => 'Trigger (on expiration)', - 'Class:TriggerOnExpirationRule+' => 'Trigger activated when an object is in scope of an expiration rule', - -)); + + * @author Romain Quetiez + * @author Denis Flaven + * @author Guillaume Lajarige + * @author Vincent Dumas + */ + +// ExpirationRule +Dict::Add('EN US', 'English', 'English', array( + // Class + 'Class:ExpirationRule/Name' => '%1$s', + 'Class:ExpirationRule' => 'Expiration rule', + 'Class:ExpirationRule+' => '', + 'Class:ExpirationRule/Attribute:name' => 'Name', + 'Class:ExpirationRule/Attribute:name+' => '', + 'Class:ExpirationRule/Attribute:class' => 'Class', + 'Class:ExpirationRule/Attribute:class+' => '', + 'Class:ExpirationRule/Attribute:description' => 'Description', + 'Class:ExpirationRule/Attribute:description+' => '', + 'Class:ExpirationRule/Attribute:status' => 'Status', + 'Class:ExpirationRule/Attribute:status+' => '', + 'Class:ExpirationRule/Attribute:status/Value:active' => 'Active', + 'Class:ExpirationRule/Attribute:status/Value:inactive' => 'Inactive', + 'Class:ExpirationRule/Attribute:type' => 'Applied option', + 'Class:ExpirationRule/Attribute:type+' => 'Which option will be used regarding the filled fields. If both are filled, advanced option is applied', + 'Class:ExpirationRule/Attribute:type/Value:simple' => 'Simple', + 'Class:ExpirationRule/Attribute:type/Value:advanced' => 'Advanced', + 'Class:ExpirationRule/Attribute:date_to_check_att' => 'Date to check', + 'Class:ExpirationRule/Attribute:date_to_check_att+' => 'Attribute code of the date to check', + 'Class:ExpirationRule/Attribute:term_of_notice' => 'Term of notice', + 'Class:ExpirationRule/Attribute:term_of_notice+' => 'Number of days before the date to check, to trigger the notification', + 'Class:ExpirationRule/Attribute:oql_scope' => 'OQL scope', + 'Class:ExpirationRule/Attribute:oql_scope+' => 'OQL query to define which objects are concerned by this rule (stimulus to apply). Note that the OQL will automatically be restricted to the states in which the stimulus is available.', + + // Integrity errors + 'Class:ExpirationRule/Error:ClassNotValid' => 'Class must be a valid class from datamodel, "%1$s" given', + 'Class:ExpirationRule/Error:AttributeNotValid' => '"%2$s" is not a valid attribute for class "%1$s"', + 'Class:ExpirationRule/Error:AttributeMustBeDate' => '"%2$s" must be a date attribute of class "%1$s"', + 'Class:ExpirationRule/Error:NoOptionFilled' => 'Either option 1 or option 2 must be filled', + 'Class:ExpirationRule/Error:OptionOneMissingField' => 'All fields of option 1 must be filled', + + // Presentation + 'ExpirationRule:general' => 'General informations', + 'ExpirationRule:simple' => 'Fill either option 1 (simple) ...', + 'ExpirationRule:advanced' => '... or option 2 (advanced)', + + // Menus + 'Menu:ExpirationRule' => 'Expiration rules', + 'Menu:ExpirationRule+' => 'Expiration rules', + + // Tabs + 'UI:ExpiredObject:Preview' => 'Preview', + 'UI:ExpiredObject:Title' => '%1$s will enter their term of notice today', + + 'Class:TriggerOnExpirationRule' => 'Trigger (on expiration)', + 'Class:TriggerOnExpirationRule+' => 'Trigger activated when an object is in scope of an expiration rule', + +)); diff --git a/fr.dict.combodo-notify-on-expiration.php b/fr.dict.combodo-notify-on-expiration.php index 9916c99c31..b6c8db9351 100644 --- a/fr.dict.combodo-notify-on-expiration.php +++ b/fr.dict.combodo-notify-on-expiration.php @@ -1,78 +1,66 @@ - - * @author Romain Quetiez - * @author Denis Flaven - * @author Guillaume Lajarige - * @author Vincent Dumas - * @license http://www.opensource.org/licenses/gpl-3.0.html LGPL - */ - -// ClosingRule -Dict::Add('FR FR', 'French', 'Français', array( - // Class - 'Class:ExpirationRule/Name' => '%1$s', - 'Class:ExpirationRule' => 'Régle de Préavis', - 'Class:ExpirationRule+' => '', - 'Class:ExpirationRule/Attribute:name' => 'Nom', - 'Class:ExpirationRule/Attribute:name+' => '', - 'Class:ExpirationRule/Attribute:class' => 'Classe', - 'Class:ExpirationRule/Attribute:class+' => '', - 'Class:ExpirationRule/Attribute:description' => 'Description', - 'Class:ExpirationRule/Attribute:description+' => '', - 'Class:ExpirationRule/Attribute:status' => 'Statut', - 'Class:ExpirationRule/Attribute:status+' => '', - 'Class:ExpirationRule/Attribute:status/Value:active' => 'Active', - 'Class:ExpirationRule/Attribute:status/Value:inactive' => 'Inactive', - 'Class:ExpirationRule/Attribute:type' => 'Option retenue', - 'Class:ExpirationRule/Attribute:type+' => 'Quelle option sera utilisée au regard des champs remplis. Si les 2 options sont remplies, l\'option avancée sera appliquée', - 'Class:ExpirationRule/Attribute:type/Value:simple' => 'Simple', - 'Class:ExpirationRule/Attribute:type/Value:advanced' => 'Avancée', - 'Class:ExpirationRule/Attribute:date_to_check_att' => 'Date à utiliser', - 'Class:ExpirationRule/Attribute:date_to_check_att+' => 'Code du champ date à controler', - 'Class:ExpirationRule/Attribute:term_of_notice' => 'Préavis en jours', - 'Class:ExpirationRule/Attribute:term_of_notice+' => 'Nombre de jours avant la date pour déclencher la notification', - 'Class:ExpirationRule/Attribute:oql_scope' => 'Périmêtre en OQL', - 'Class:ExpirationRule/Attribute:oql_scope+' => 'Requête OQL définissant les objets concernés par cette règle (trigger à déclencher).', - - // Integrity errors - 'Class:ExpirationRule/Error:ClassNotValid' => 'La classe doit faire partie du modèle de données, "%1$s" donnée', - 'Class:ExpirationRule/Error:AttributeNotValid' => '"%2$s" n\'est pas un attribut valide pour la classe "%1$s"', - 'Class:ExpirationRule/Error:AttributeMustBeDate' => '"%2$s" doit être un attribut de type date pour la classe "%1$s"', - 'Class:ExpirationRule/Error:NoOptionFilled' => 'Une des 2 options doit être remplie', - 'Class:ExpirationRule/Error:OptionOneMissingField' => 'Tous les champs de l\'option 1 doivent être remplis', - - // Presentation - 'ExpirationRule:general' => 'Informations générales', - 'ExpirationRule:simple' => 'Remplir l\'option (simple) ...', - 'ExpirationRule:advanced' => '... oo l\'option 2 (avancée)', - - // Menus - 'Menu:ExpirationRule' => 'Régles de préavis', - 'Menu:ExpirationRule+' => 'Régles de préavis', - - // Tabs - 'UI:ExpiredObject:Preview' => 'Aperçu', - 'UI:ExpiredObject:Title' => '%1$s ont leur préavis qui démarre aujourd\'hui', - - 'Class:TriggerOnExpirationRule' => 'Déclencheur sur préavis atteint', - 'Class:TriggerOnExpirationRule+' => 'Déclencheur activé lorsqu\'une régle de préavis est applicable à l\'objet', + + * @author Romain Quetiez + * @author Denis Flaven + * @author Guillaume Lajarige + * @author Vincent Dumas + */ + +// ClosingRule +Dict::Add('FR FR', 'French', 'Français', array( + // Class + 'Class:ExpirationRule/Name' => '%1$s', + 'Class:ExpirationRule' => 'Régle de Préavis', + 'Class:ExpirationRule+' => '', + 'Class:ExpirationRule/Attribute:name' => 'Nom', + 'Class:ExpirationRule/Attribute:name+' => '', + 'Class:ExpirationRule/Attribute:class' => 'Classe', + 'Class:ExpirationRule/Attribute:class+' => '', + 'Class:ExpirationRule/Attribute:description' => 'Description', + 'Class:ExpirationRule/Attribute:description+' => '', + 'Class:ExpirationRule/Attribute:status' => 'Statut', + 'Class:ExpirationRule/Attribute:status+' => '', + 'Class:ExpirationRule/Attribute:status/Value:active' => 'Active', + 'Class:ExpirationRule/Attribute:status/Value:inactive' => 'Inactive', + 'Class:ExpirationRule/Attribute:type' => 'Option retenue', + 'Class:ExpirationRule/Attribute:type+' => 'Quelle option sera utilisée au regard des champs remplis. Si les 2 options sont remplies, l\'option avancée sera appliquée', + 'Class:ExpirationRule/Attribute:type/Value:simple' => 'Simple', + 'Class:ExpirationRule/Attribute:type/Value:advanced' => 'Avancée', + 'Class:ExpirationRule/Attribute:date_to_check_att' => 'Date à utiliser', + 'Class:ExpirationRule/Attribute:date_to_check_att+' => 'Code du champ date à controler', + 'Class:ExpirationRule/Attribute:term_of_notice' => 'Préavis en jours', + 'Class:ExpirationRule/Attribute:term_of_notice+' => 'Nombre de jours avant la date pour déclencher la notification', + 'Class:ExpirationRule/Attribute:oql_scope' => 'Périmêtre en OQL', + 'Class:ExpirationRule/Attribute:oql_scope+' => 'Requête OQL définissant les objets concernés par cette règle (trigger à déclencher).', + + // Integrity errors + 'Class:ExpirationRule/Error:ClassNotValid' => 'La classe doit faire partie du modèle de données, "%1$s" donnée', + 'Class:ExpirationRule/Error:AttributeNotValid' => '"%2$s" n\'est pas un attribut valide pour la classe "%1$s"', + 'Class:ExpirationRule/Error:AttributeMustBeDate' => '"%2$s" doit être un attribut de type date pour la classe "%1$s"', + 'Class:ExpirationRule/Error:NoOptionFilled' => 'Une des 2 options doit être remplie', + 'Class:ExpirationRule/Error:OptionOneMissingField' => 'Tous les champs de l\'option 1 doivent être remplis', + + // Presentation + 'ExpirationRule:general' => 'Informations générales', + 'ExpirationRule:simple' => 'Remplir l\'option (simple) ...', + 'ExpirationRule:advanced' => '... oo l\'option 2 (avancée)', + + // Menus + 'Menu:ExpirationRule' => 'Régles de préavis', + 'Menu:ExpirationRule+' => 'Régles de préavis', + + // Tabs + 'UI:ExpiredObject:Preview' => 'Aperçu', + 'UI:ExpiredObject:Title' => '%1$s ont leur préavis qui démarre aujourd\'hui', + + 'Class:TriggerOnExpirationRule' => 'Déclencheur sur préavis atteint', + 'Class:TriggerOnExpirationRule+' => 'Déclencheur activé lorsqu\'une régle de préavis est applicable à l\'objet', -)); +)); diff --git a/license.combodo-notify-on-expiration.xml b/license.combodo-notify-on-expiration.xml new file mode 100644 index 0000000000..054cbab8ea --- /dev/null +++ b/license.combodo-notify-on-expiration.xml @@ -0,0 +1,27 @@ + + + + Notify on expiration + 2010-2019 Combodo SARL + Combodo Software License + Combodo Software License +

Version 1.0

+

Copyright (c) 2018 Combodo SARL. All rights reserved.

+

Redistribution and use in source and binary forms, with or without modification, of this software is permitted provided that the following conditions are met:

+
    +
  1. Combodo grants you a non-exclusive, non-sublicensable and non-transferable license to install and use the software for your own business purposes, in accordance with this agreement, the documentation and all laws.
  2. +
  3. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  4. +
  5. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  6. +
  7. The redistribution of the software covered by this license is limited to the individual or the company who purchased the software and its affiliates.
  8. +
  9. You cannot rent, lease, distribute, sell, sublicense, or transfer the software.
  10. +
  11. The use of the software is limited to only one set of production data (i.e. only one instance of iTop managing production data).
  12. +
  13. In the context of this license, the interaction with the installed software across a computer network is not considered as a redistribution.
  14. +
  15. Combodo SARL may publish revised and/or new versions of the license from time to time. Each version will be given a distinguishing version number.
  16. +Once covered code has been published under a particular version of the license, you may always continue to use it under the terms of that version. You may also choose to use such covered code under the terms of any subsequent version of the license published by Combodo SARL. No one other than Combodo SARL has the right to modify the terms applicable to covered code created under this License. +
+

THIS SOFTWARE IS PROVIDED BY COMBODO SARL “AS IS” AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COMBODO SARL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +For more information on Combodo SARL, please see https://www.combodo.com.

+]]>
+
+
\ No newline at end of file diff --git a/main.combodo-notify-on-expiration.php b/main.combodo-notify-on-expiration.php index b28db9825d..5a705122f5 100644 --- a/main.combodo-notify-on-expiration.php +++ b/main.combodo-notify-on-expiration.php @@ -1,29 +1,15 @@ * @author Romain Quetiez * @author Denis Flaven * @author Guillaume Lajarige * @author Vincent Dumas - * @license http://www.opensource.org/licenses/gpl-3.0.html LGPL */ @@ -33,10 +19,11 @@ class NotifyOnExpiration implements iScheduledProcess { const MODULE_CODE = 'combodo-notify-on-expiration'; - const MODULE_SETTING_ENABLED = 'enabled'; - const MODULE_SETTING_DEBUG = 'debug'; - const MODULE_SETTING_WEEKDAYS = 'week_days'; - const MODULE_SETTING_TIME = 'time'; + + const KEY_MODULE_SETTING_ENABLED = 'enabled'; + const KEY_MODULE_SETTING_DEBUG = 'debug'; + const KEY_MODULE_SETTING_WEEKDAYS = 'week_days'; + const KEY_MODULE_SETTING_TIME = 'time'; const DEFAULT_MODULE_SETTING_ENABLED = true; const DEFAULT_MODULE_SETTING_DEBUG = false; @@ -50,17 +37,20 @@ class NotifyOnExpiration implements iScheduledProcess */ function __construct() { - $this->bDebug = (bool) MetaModel::GetModuleSetting(static::MODULE_CODE, static::MODULE_SETTING_DEBUG, static::DEFAULT_MODULE_SETTING_DEBUG); + $this->bDebug = (bool)MetaModel::GetModuleSetting(static::MODULE_CODE, static::KEY_MODULE_SETTING_DEBUG, + static::DEFAULT_MODULE_SETTING_DEBUG); } /** * Gives the exact time at which the process must be run next time * * @return \DateTime + * @throws \CoreUnexpectedValue */ public function GetNextOccurrence() { - $bEnabled = MetaModel::GetConfig()->GetModuleSetting(static::MODULE_CODE, static::MODULE_SETTING_ENABLED, static::DEFAULT_MODULE_SETTING_ENABLED); + $bEnabled = MetaModel::GetConfig()->GetModuleSetting(static::MODULE_CODE, static::KEY_MODULE_SETTING_ENABLED, + static::DEFAULT_MODULE_SETTING_ENABLED); if (!$bEnabled) { $oRet = new DateTime('3000-01-01'); @@ -73,14 +63,15 @@ class NotifyOnExpiration implements iScheduledProcess // 2nd - Find the next active week day // - $sRunTime = MetaModel::GetConfig()->GetModuleSetting(static::MODULE_CODE, static::MODULE_SETTING_TIME, static::DEFAULT_MODULE_SETTING_TIME); + $sRunTime = MetaModel::GetConfig()->GetModuleSetting(static::MODULE_CODE, static::KEY_MODULE_SETTING_TIME, + static::DEFAULT_MODULE_SETTING_TIME); if (!preg_match('/^([01]?\d|2[0-3]):[0-5]?\d(:[0-5]?\d)?$/', $sRunTime, $aMatches)) { - throw new Exception(static::MODULE_CODE.": wrong format for setting 'time' (found '$sRunTime')"); + throw new CoreUnexpectedValue(static::MODULE_CODE.": wrong format for setting 'time' (found '$sRunTime')"); } $oNow = new DateTime(); $iNextPos = false; - for ($iDay = $oNow->format('N') ; $iDay <= 7 ; $iDay++) + for ($iDay = $oNow->format('N'); $iDay <= 7; $iDay++) { $iNextPos = array_search($iDay, $aDays); if ($iNextPos !== false) @@ -111,13 +102,21 @@ class NotifyOnExpiration implements iScheduledProcess $oRet = clone $oNow; $oRet->modify('+'.$iMove.' days'); } - $oRet->setTime((int)$aMatches[1], (int) $aMatches[2]); + $oRet->setTime((int)$aMatches[1], (int)$aMatches[2]); } + return $oRet; } /** * @inheritdoc + * + * @throws \CoreException + * @throws \CoreUnexpectedValue + * @throws \MissingQueryArgument + * @throws \MySQLException + * @throws \MySQLHasGoneAwayException + * @throws \OQLException */ public function Process($iTimeLimit) { @@ -133,11 +132,11 @@ class NotifyOnExpiration implements iScheduledProcess $this->Trace('Processing '.$oRulesSet->Count().' active expiration rules...'); $iTotalProcessedObjectsCount = 0; - while($oRule = $oRulesSet->Fetch()) + while ($oRule = $oRulesSet->Fetch()) { $iRuleProcessedObjectsCount = 0; $this->Trace('Processing rule "'.$oRule->Get('friendlyname').'" (#'.$oRule->GetKey().')...'); - + try { // Retrieving rule's params @@ -149,32 +148,33 @@ class NotifyOnExpiration implements iScheduledProcess // Prepare the Rule information to be passed to the notification $aRuleContext = $oRule->ToArgs('rule'); - - // Get applicable Triggers for this object class + + // Get applicable Triggers for this object class $sClassList = implode("', '", MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL)); $oTriggerSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnExpirationRule AS t WHERE t.target_class IN ('$sClassList')")); - + $oSet = new DBObjectSet($oSearch); $this->Trace('|- Objects:'); - /** @var $oToTrigger DBObject */ + /** @var DBObject $oToTrigger */ while ((time() < $iTimeLimit) && $oToTrigger = $oSet->Fetch()) { // Catching exceptions so the process don't get stucked on this object try { $aReport['reached_deadline']++; - // + // // $aContext['ruleName'] = $oRule->Get('name'); // Combine the current object :this and :rule to be available in the notification $aContext = $oToTrigger->ToArgs('this'); $aContext = array_merge($aContext, $aRuleContext); + /** @var TriggerOnExpirationRule $oTrigger */ while ($oTrigger = $oTriggerSet->Fetch()) { $oTrigger->DoActivate($aContext); } - // The same set of Triggers is reused for each object returned by the Rule as they all belongs to the same class + // The same set of Triggers is reused for each object returned by the Rule as they all belongs to the same class $oTriggerSet->Rewind(); - + $iRuleProcessedObjectsCount++; $iTotalProcessedObjectsCount++; @@ -184,7 +184,7 @@ class NotifyOnExpiration implements iScheduledProcess } // Trigger was NOT applied because of an exception, which is NOT normal catch (Exception $e) { - $aReport['not_triggered'][] = $oToClose->Get('friendlyname'); + $aReport['not_triggered'][] = $oToTrigger->Get('friendlyname'); $this->Trace('| |- [KO] /!\\ '.$sClass.' #'.$oToTrigger->GetKey().' exception raised! Error message: '.$e->getMessage()); } @@ -197,14 +197,14 @@ class NotifyOnExpiration implements iScheduledProcess $this->Trace('Stopped because time limit exceeded!'); } } - catch(Exception $e) + catch (Exception $e) { $this->Trace('Skipping rule as there was an exception! ('.$e->getMessage().')'); } } // Report - if($aReport['reached_deadline'] === 0) + if ($aReport['reached_deadline'] === 0) { return 'No object to process'; } @@ -213,17 +213,18 @@ class NotifyOnExpiration implements iScheduledProcess $iClosedCount = count($aReport['triggered']); $iNotClosedCount = count($aReport['not_triggered']); - $sReport = $aReport['reached_deadline'] . " objects reached triggering date"; + $sReport = $aReport['reached_deadline']." objects reached triggering date"; $sReport .= " - ".$iClosedCount." were triggered"; - if($iClosedCount > 0) + if ($iClosedCount > 0) { $sReport .= " (".implode(", ", $aReport['triggered']).")"; } $sReport .= " - ".$iNotClosedCount." were not triggered"; - if($iNotClosedCount > 0) + if ($iNotClosedCount > 0) { $sReport .= " (".implode(", ", $aReport['not_triggered']).")"; } + return $sReport; } } @@ -234,12 +235,22 @@ class NotifyOnExpiration implements iScheduledProcess * Note: This comes from itop-backup scheduled task. * * @returns array of int (monday = 1) + * @throws \CoreUnexpectedValue */ public function InterpretWeekDays() { - static $aWEEKDAYTON = array('monday' => 1, 'tuesday' => 2, 'wednesday' => 3, 'thursday' => 4, 'friday' => 5, 'saturday' => 6, 'sunday' => 7); + static $aWEEKDAYTON = array( + 'monday' => 1, + 'tuesday' => 2, + 'wednesday' => 3, + 'thursday' => 4, + 'friday' => 5, + 'saturday' => 6, + 'sunday' => 7, + ); $aDays = array(); - $sWeekDays = MetaModel::GetConfig()->GetModuleSetting(static::MODULE_CODE, static::MODULE_SETTING_WEEKDAYS, static::DEFAULT_MODULE_SETTING_WEEKDAYS); + $sWeekDays = MetaModel::GetConfig()->GetModuleSetting(static::MODULE_CODE, static::KEY_MODULE_SETTING_WEEKDAYS, + static::DEFAULT_MODULE_SETTING_WEEKDAYS); if ($sWeekDays != '') { $aWeekDaysRaw = explode(',', $sWeekDays); @@ -252,16 +263,17 @@ class NotifyOnExpiration implements iScheduledProcess } else { - throw new Exception(static::MODULE_CODE.": wrong format for setting 'week_days' (found '$sWeekDay')"); + throw new CoreUnexpectedValue(static::MODULE_CODE.": wrong format for setting 'week_days' (found '$sWeekDay')"); } } } if (count($aDays) == 0) { - throw new Exception(static::MODULE_CODE.": missing setting 'week_days'"); + throw new CoreUnexpectedValue(static::MODULE_CODE.": missing setting 'week_days'"); } $aDays = array_unique($aDays); sort($aDays); + return $aDays; } diff --git a/module.combodo-notify-on-expiration.php b/module.combodo-notify-on-expiration.php index 2f09b61617..8c4e7b5c45 100644 --- a/module.combodo-notify-on-expiration.php +++ b/module.combodo-notify-on-expiration.php @@ -1,90 +1,81 @@ - 'Notify on expiration', - 'category' => 'business', - - // Setup - // - 'dependencies' => array( - - ), - 'mandatory' => false, - 'visible' => true, - 'installer' => 'NotifyOnExpirationInstaller', - - // Components - // - 'datamodel' => array( - 'model.combodo-notify-on-expiration.php', - 'main.combodo-notify-on-expiration.php', - 'triggerexpirationrule.class.inc.php', - ), - 'webservice' => array( - - ), - 'data.struct' => array( - // add your 'structure' definition XML files here, - ), - 'data.sample' => array( - // add your sample data XML files here, - ), - - // Documentation - // - 'doc.manual_setup' => '', // hyperlink to manual setup documentation, if any - 'doc.more_information' => '', // hyperlink to more information, if any - - // Default settings - // - 'settings' => array( - // Module specific settings go here, if any - 'time' => '03:00', - 'enabled' => true, - 'debug' => false - ), - ) -); - -if (!class_exists('NotifyOnExpirationInstaller')) -{ - // Module installation handler - // - class NotifyOnExpirationInstaller extends ModuleInstallerAPI - { - public static function BeforeWritingConfig(Config $oConfiguration) - { - return $oConfiguration; - } - - /** - * Handler called after the creation/update of the database schema - * @param $oConfiguration Config The new configuration of the application - * @param $sPreviousVersion string PRevious version number of the module (empty string in case of first install) - * @param $sCurrentVersion string Current version number of the module - */ - public static function AfterDatabaseCreation(Config $oConfiguration, $sPreviousVersion, $sCurrentVersion) - { - - } - } -} + 'Notify on expiration', + 'category' => 'business', + + // Setup + // + 'dependencies' => array( + + ), + 'mandatory' => false, + 'visible' => true, + 'installer' => 'NotifyOnExpirationInstaller', + + // Components + // + 'datamodel' => array( + 'main.combodo-notify-on-expiration.php', + 'triggerexpirationrule.class.inc.php', + ), + 'webservice' => array( + + ), + 'data.struct' => array( + // add your 'structure' definition XML files here, + ), + 'data.sample' => array( + // add your sample data XML files here, + ), + + // Documentation + // + 'doc.manual_setup' => '', // hyperlink to manual setup documentation, if any + 'doc.more_information' => '', // hyperlink to more information, if any + + // Default settings + // + 'settings' => array( + // Module specific settings go here, if any + 'time' => '03:00', + 'enabled' => true, + 'debug' => false + ), + ) +); + +if (!class_exists('NotifyOnExpirationInstaller')) +{ + // Module installation handler + // + class NotifyOnExpirationInstaller extends ModuleInstallerAPI + { + public static function BeforeWritingConfig(Config $oConfiguration) + { + return $oConfiguration; + } + + /** + * Handler called after the creation/update of the database schema + * @param $oConfiguration Config The new configuration of the application + * @param $sPreviousVersion string PRevious version number of the module (empty string in case of first install) + * @param $sCurrentVersion string Current version number of the module + */ + public static function AfterDatabaseCreation(Config $oConfiguration, $sPreviousVersion, $sCurrentVersion) + { + + } + } +} diff --git a/triggerexpirationrule.class.inc.php b/triggerexpirationrule.class.inc.php index 5a25608a51..2dc7a02344 100644 --- a/triggerexpirationrule.class.inc.php +++ b/triggerexpirationrule.class.inc.php @@ -1,21 +1,9 @@