diff --git a/.github/.gitkeep b/.github/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..3f86e091a --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [equalframework] \ No newline at end of file diff --git a/lib/equal/access/AccessController.class.php b/lib/equal/access/AccessController.class.php index fd9597fb4..26dd021a2 100644 --- a/lib/equal/access/AccessController.class.php +++ b/lib/equal/access/AccessController.class.php @@ -18,6 +18,8 @@ class AccessController extends Service { + private $is_request_compliant; + private $permissionsTable; private $groupsTable; @@ -30,6 +32,7 @@ class AccessController extends Service { * This method cannot be called directly (should be invoked through Singleton::getInstance). */ protected function __construct(Container $container) { + $this->is_request_compliant = false; $this->permissionsTable = array(); $this->groupsTable = array(); $this->usersTable = array(); @@ -614,6 +617,10 @@ public function canPerform($user_id, $action, $object_class, $object_ids) { } public function isRequestCompliant($user_id, $ip_address) { + // if compliance has already been evaluated to true, do not re-run the process + if($this->is_request_compliant) { + return true; + } $result = true; $time = time(); @@ -640,10 +647,13 @@ public function isRequestCompliant($user_id, $ip_address) { foreach($values as $value) { switch($rule['policy_rule_type']) { case 'ip_address': - $is_match = self::validateIpAddress($ip_address, $value['value']); + $is_match = $this->validateIpAddress($ip_address, $value['value']); break; case 'time_range': - $is_match = self::validateTimeRange($time, $value['value']); + $is_match = $this->validateTimeRange($time, $value['value']); + break; + case 'user_group': + $is_match = $this->validateUserGroup($user_id, $value['value']); break; } // request match with one of the value of the rule @@ -665,13 +675,18 @@ public function isRequestCompliant($user_id, $ip_address) { } } } + $this->is_request_compliant = $result; return $result; } + private function validateUserGroup($user_id, $group) { + return $this->hasGroup($group, $user_id); + } + /** * tests: 192.168.1.123, 192.168.1.0/24, 192.168.*.* */ - private static function validateIpAddress($ip, $pattern) { + private function validateIpAddress($ip, $pattern) { if(strpos($pattern, '*') !== false) { $pattern = str_replace(['.', '*'], ['\.', '[0-9]+'], $pattern); if(preg_match('/^' . $pattern . '$/', $ip)) { @@ -699,7 +714,7 @@ private static function validateIpAddress($ip, $pattern) { * var_dump(validate_time_range(1719925622, 'mon@09:00-mon@11:00')); // false * var_dump(validate_time_range(1719925622, 'tue@13:00-tue@14:00')); // true */ - private static function validateTimeRange($time, $pattern) { + private function validateTimeRange($time, $pattern) { list($hours, $minutes) = explode(':', date('H:i', $time)); $time_of_day = ($hours * 3600) + ($minutes * 60); diff --git a/packages/core/apps/app/version b/packages/core/apps/app/version index 8e8449bf1..62a9802a0 100644 --- a/packages/core/apps/app/version +++ b/packages/core/apps/app/version @@ -1 +1 @@ -053bbb953267581e4d7ec81cdfbf6401 +f4df4f2244e13b43c802d55eb9d12a4b diff --git a/packages/core/apps/app/web.app b/packages/core/apps/app/web.app index fac7be49d..2d603ebf4 100644 Binary files a/packages/core/apps/app/web.app and b/packages/core/apps/app/web.app differ diff --git a/packages/core/apps/apps/version b/packages/core/apps/apps/version index 01713ad6e..c8b61c31e 100644 --- a/packages/core/apps/apps/version +++ b/packages/core/apps/apps/version @@ -1 +1 @@ -f6e02e9deeff421e0946277e3ec079a3 +3259247aafc763abdbb52639061536cb diff --git a/packages/core/apps/apps/web.app b/packages/core/apps/apps/web.app index 800f43fac..92d26add1 100644 Binary files a/packages/core/apps/apps/web.app and b/packages/core/apps/apps/web.app differ diff --git a/packages/core/apps/settings/version b/packages/core/apps/settings/version index 4895bbff0..5cde3b55b 100644 --- a/packages/core/apps/settings/version +++ b/packages/core/apps/settings/version @@ -1 +1 @@ -fdce1bc93d370cd012e91789631d69eb +d774a26460bc9591c407a6868fe36eff diff --git a/packages/core/apps/settings/web.app b/packages/core/apps/settings/web.app index 21075501d..3de2c6e5d 100644 Binary files a/packages/core/apps/settings/web.app and b/packages/core/apps/settings/web.app differ diff --git a/packages/core/apps/workbench/version b/packages/core/apps/workbench/version index 17de6184c..8f8b7e98a 100644 --- a/packages/core/apps/workbench/version +++ b/packages/core/apps/workbench/version @@ -1 +1 @@ -a9c3e541d1d5650a19556ebc9a76737b +d85e1ea1561f68f47fa57aad8707abec diff --git a/packages/core/apps/workbench/web.app b/packages/core/apps/workbench/web.app index 53eefc667..95a7bafd5 100644 Binary files a/packages/core/apps/workbench/web.app and b/packages/core/apps/workbench/web.app differ diff --git a/packages/core/classes/security/SecurityPolicyRule.class.php b/packages/core/classes/security/SecurityPolicyRule.class.php index 750b1063d..84edacc5c 100644 --- a/packages/core/classes/security/SecurityPolicyRule.class.php +++ b/packages/core/classes/security/SecurityPolicyRule.class.php @@ -54,7 +54,7 @@ public static function getColumns() { 'user_login', 'time_range' ], - 'dependents' => ['description'], + 'dependents' => ['name', 'description'], 'description' => 'Type of rule (kind of test to perform).' ], @@ -97,23 +97,37 @@ public static function calcDescription($self) { $self->read(['policy_rule_type']); foreach($self as $id => $rule) { - switch($rule['policy_rule_type']) { - case 'ip_address': - $result[$id] = 'Request IP address match against one or more values.'; - break; - case 'location': - $result[$id] = 'Request geo-location matching one value against a set of cities or regions.'; - break; - case 'user_group': - $result[$id] = 'User belonging to at least one of the listed groups.'; - break; - case 'user_login': - $result[$id] = 'User login (email) matching a given pattern.'; - break; - case 'time_range': - $result[$id] = 'Time of Request included in at least one the listed time ranges.'; - break; - } + $result[$id] = self::computeDescription($rule['policy_rule_type']); + } + return $result; + } + + public static function onchange($event) { + $result = []; + if(isset($event['policy_rule_type'])) { + $result['role'] = self::computeDescription($event['policy_rule_type']); + } + return $result; + } + + public static function computeDescription($rule_type) { + $result = ''; + switch($rule_type) { + case 'ip_address': + $result = 'Request IP address match against one or more values.'; + break; + case 'location': + $result = 'Request geo-location matching one value against a set of cities or regions.'; + break; + case 'user_group': + $result = 'User belonging to at least one of the listed groups.'; + break; + case 'user_login': + $result = 'User login (email) matching a given pattern.'; + break; + case 'time_range': + $result = 'Time of Request included in at least one the listed time ranges.'; + break; } return $result; } diff --git a/packages/core/classes/setting/Setting.class.php b/packages/core/classes/setting/Setting.class.php index e9ce8ff2d..93ef9ecce 100644 --- a/packages/core/classes/setting/Setting.class.php +++ b/packages/core/classes/setting/Setting.class.php @@ -86,7 +86,7 @@ public static function getColumns() { 'is_sequence' => [ 'type' => 'boolean', 'description' => "Marks the setting as a numeric sequence.", - 'help' => "Some settings must have a numeric value, meant to be incremented, and that must match a numeric SQL field in the related table. For tht reason, we use a distinct entity `SettingSequence` for which the `value` field/column is an integer.", + 'help' => "Some settings must have a numeric value, meant to be incremented, and that must match a numeric SQL field in the related table. For tht reason, we use a distinct entity `SettingSequence` for which the `value` field/column is an integer.", 'default' => false ], @@ -118,10 +118,8 @@ public static function getColumns() { 'input', 'textarea' ], - 'usage' => 'text/plain', 'description' => 'Way in which the form is presented to the User.', 'default' => 'input', - 'multilang' => true, 'visible' => ['is_sequence', '=', false] ], diff --git a/packages/core/views/menu.workbench.left.json b/packages/core/views/menu.workbench.left.json index 685954a53..c037d8cb8 100755 --- a/packages/core/views/menu.workbench.left.json +++ b/packages/core/views/menu.workbench.left.json @@ -8,26 +8,31 @@ "layout": { "items": [ { + "id": "components", "type": "entry", "label": "Components", "icon": "category", - "context": [], - "children": [] + "route": "/" }, { - "id": "uml.drawer", + "id": "pipelines", + "type": "entry", + "label": "Pipelines", + "icon": "insights", + "route": "/pipelines" + }, + { + "id": "uml", "type": "parent", "label": "UML", "icon": "schema", - "context": [], "children": [ { - "id": "uml", + "id": "uml.erd", "type": "entry", "label": "ERD", "icon": "account_tree", - "context": [], - "children": [] + "route": "/uml" } ] } diff --git a/public/assets/i18n/en.json b/public/assets/i18n/en.json deleted file mode 100644 index a5e36cc43..000000000 --- a/public/assets/i18n/en.json +++ /dev/null @@ -1,158 +0,0 @@ -{ - - "SB_DIALOG_ACCEPT": "Accept", - "SB_DIALOG_SEND": "Ok", - "SB_DIALOG_CANCEL": "Cancel", - - "SB_PURPOSE_CREATE": "Create", - "SB_PURPOSE_UPDATE": "Update", - "SB_PURPOSE_SELECT": "Select", - "SB_PURPOSE_ADD": "Add", - - "SB_FILTERS_ADD_CUSTOM_FILTER": "Add a custom filter", - "SB_FILTERS_DIALOG_FIELD": "Field", - "SB_FILTERS_DIALOG_OPERATOR": "Operator", - "SB_FILTERS_DIALOG_VALUE": "Value", - "SB_FILTERS_SEARCH": "Search", - "SB_FILTERS_SEARCH_ON_NAME": "Search on name", - - "SB_ACTIONS_BUTTON_CREATE": "Create", - "SB_ACTIONS_BUTTON_SAVE": "Save", - "SB_ACTIONS_BUTTON_SAVE_AND_CLOSE": "Save & close", - "SB_ACTIONS_BUTTON_SAVE_AND_EDIT": "Save & edit", - "SB_ACTIONS_BUTTON_SAVE_AND_CONTINUE": "Save & continue", - "SB_ACTIONS_BUTTON_SAVE_AND_VIEW": "Save & see", - "SB_ACTIONS_BUTTON_UPDATE": "Update", - "SB_ACTIONS_BUTTON_EXPORT": "Export", - "SB_ACTIONS_BUTTON_INLINE_UPDATE": "Inline edit", - "SB_ACTIONS_BUTTON_BULK_ASSIGN": "Mass update", - "SB_ACTIONS_BUTTON_ARCHIVE": "Archive", - "SB_ACTIONS_BUTTON_CLONE": "Clone", - "SB_ACTIONS_BUTTON_DELETE": "Delete", - "SB_ACTIONS_BUTTON_CANCEL": "Cancel", - "SB_ACTIONS_BUTTON_SELECT": "Select", - "SB_ACTIONS_BUTTON_ADD": "Add", - "SB_ACTIONS_BUTTON_REMOVE": "Remove", - "SB_ACTIONS_BUTTON_SELECTED": "selected", - - "SB_ACTIONS_CONFIRM": "Confirm action", - "SB_ACTIONS_PROVIDE_PARAMS": "Action parameters", - - "SB_ACTIONS_ARCHIVE_CONFIRM": "Confirm archiving", - "SB_ACTIONS_ARCHIVE_DIALOG_MESSAGE": "Items will be archived and you might no longer be able to access those. Do you confirm?", - - "SB_ACTIONS_DELETION_CONFIRM": "Confirm removal", - "SB_ACTIONS_DELETION_DIALOG_I_CONFIRM": "Yes, remove items.", - "SB_ACTIONS_DELETION_DIALOG_IS_PERMANENT": "Remove permanently?", - - "SB_ACTIONS_NOTIFY_CHANGES_SAVED": "Changes saved.", - "SB_ACTIONS_NOTIFY_ACTION_SENT": "Action request sent.", - - "SB_ACTIONS_MESSAGE_ABANDON_CHANGE": "Updates have been made and will be lost. Do you confirm?", - "SB_ACTIONS_MESSAGE_ERASE_CONUCRRENT_CHANGES": "Another user has made changes on this item while you were editing. Those changes might be overwritten by yours. Do you still want to save?", - - "SB_EXPORTS_AS_PDF": "Print as PDF", - "SB_EXPORTS_AS_XLS": "Export as XLS", - - "SB_WIDGETS_MANY2ONE_ADVANCED_SEARCH": "Advanced search...", - - "SB_ERROR_ERROR": "Erreur", - "SB_ERROR_UNKNOWN": "An unknown error occured.", - "SB_ERROR_SQL_ERROR": "An error at database level prevents the operation (duplicate?).", - "SB_ERROR_UNKNOWN_OBJECT": "Call on an unknown Object.", - "SB_ERROR_CONFLICT_OBJECT": "A conflict prevents this operation.", - "SB_ERROR_DUPLICATE_VALUE": "This value must be unique but already exists.", - "SB_ERROR_DUPLICATE_INDEX": "An entry is duplicated.", - "SB_ERROR_NOT_ALLOWED": "Vous n'avez pas les autorisations pour cette opération.", - "SB_ERROR_NON_EDITABLE": "The item cannot be updated in its current state.", - "SB_ERROR_NON_REMOVABLE": "The item cannot be deleted in its current state.", - "SB_ERROR_CONFIG_MISSING_PARAM": "Erreur de configuration: paramètre manquant.", - "SB_ERROR_MISSING_MANDATORY": "Mandatory field.", - "SB_ERROR_MISSING_PARAM": "Missing mandatory field.", - "SB_ERROR_INVALID_PARAM": "Invalid param(s). Some changes couldn't be stored.", - "SB_ERROR_INVALID_STATUS": "Status of the item prevents its update.", - "SB_ERROR_MAXIMUM_SIZE_EXCEEDED": "Size exceeding maximum allowed.", - "SB_ERROR_BROKEN_CONSTRAINT": "Invalid value (broke at least one constrainst).", - "SB_ERROR_ONUPDATE_DENIED": "Object rejected the update.", - - "SB_VIEW_UNKNOWN_OBJECT": "Requested object is unknown or missing (it might have been deleted).", - - "AUTH_SIGNIN_TITLE": "Connection", - "AUTH_SIGNIN_SIGNIN": "Sign in", - "AUTH_SIGNIN_USERNAME": "Username or email address", - "AUTH_SIGNIN_PASSWORD": "Password", - "AUTH_SIGNIN_ACTION_LOGIN": "Connect", - "AUTH_SIGNIN_ACTION_RECOVER": "Recover password", - "AUTH_SIGNIN_ACTION_REGISTER": "Create a new account", - "AUTH_SIGNUP_TITLE": "New Account", - "AUTH_SIGNUP_SIGNUP": "Sign up", - "AUTH_SIGNUP_USERNAME": "Username", - "AUTH_SIGNUP_EMAIL": "Email", - "AUTH_SIGNUP_PASSWORD": "Password", - "AUTH_SIGNUP_CONFIRM": "Confirmation", - "AUTH_SIGNUP_ACTION_SIGNUP": "Sign up", - "AUTH_SIGNUP_SENT_TITLE": "Account creation", - "AUTH_SIGNUP_SENT_SIGNUP": "Confirmation request has been sent", - "AUTH_SIGNUP_SENT_MESSAGE": "A message with a verification link has been sent to your email address. Please click on the link of that message in order to continue the registration process. If you have not reveived the verification email, please check your \"Spam\" or \"Bulk Email\" folder. You can also click the resend button below to have another email sent to you.", - "AUTH_SIGNUP_SENT_ACTION_RESEND": "Resend confirmation message", - "AUTH_RECOVER_MESSAGE_SUBMITTED": "If the email address matches a known account, instructions for password recovery have been sent to it.", - "AUTH_RECOVER_TITLE": "Reset password", - "AUTH_RECOVER_SUBTITLE": "Forgot password?", - "AUTH_RECOVER_EMAIL": "Email address", - "AUTH_RECOVER_ACTION_RECOVER": "Recover", - "AUTH_RECOVER_ACTION_SIGNIN": "Sign in", - "AUTH_RESET_TITLE" : "New password", - "AUTH_RESET_SUBTITLE": "Define a new password", - "AUTH_RESET_PASSWORD": "Password", - "AUTH_RESET_CONFIRM": "Confirm", - "AUTH_RESET_ACTION_SUBMIT": "Reset", - "AUTH_RESET_ACTION_SIGNIN": "Sign in", - "AUTH_ERROR_MISSING_USERNAME": "Username is mandatory", - "AUTH_ERROR_INVALID_USERNAME": "Invalid username (min 6 chars)", - "AUTH_ERROR_MISSING_EMAIL": "Email is mandatory", - "AUTH_ERROR_INVALID_EMAIL": "Invalid email address", - "AUTH_ERROR_MISSING_PASSWORD": "Password is mandatory", - "AUTH_ERROR_INVALID_PASSWORD": "Invalid password (min 8 chars)", - "AUTH_ERROR_CONFIRM_MISMATCH": "Password and confirmation mismatch", - "AUTH_ERROR_INVALID_USERNAME_OR_PASSWORD": "Invalid username or password.", - "AUTH_ERROR_EXISTING_USERNAME_OR_LOGIN": "An account already exists with email or username.", - "AUTH_ERROR_SERVER_ERROR": "A server error occurred. Please try later or contact support.", - - "APPS_APP_BOOKING": "Bookings", - "APPS_APP_POS": "Point of Sale", - "APPS_APP_ACCOUNTING": "Accounting", - "APPS_APP_SALES": "Sales", - "APPS_APP_SETTINGS": "Configuration", - "APPS_APP_DOCUMENTS": "Documents", - "APPS_APP_STATS": "Statistics", - - "SETTINGS_LIST_SETTING": "Settings", - "SETTINGS_LIST_CORE": "General", - "SETTINGS_LIST_SALE": "Sale", - "SETTINGS_LIST_PERMISSION": "Permissions", - "SETTINGS_LIST_FINANCE": "Finance", - - "DOCS_LIST_DOCUMENT": "Documents", - "DOCS_LIST_IMPORT": "Import", - "DOCS_ERRORS_FAILED_UPLOAD": "Download of the file failed", - "DOCS_ERROR_BAD_FORMAT": "File format not allowed.", - "DOCS_DROP_TITLE": "Choose or Drop your files here !", - "DOCS_DROP_NAME": "Name", - "DOCS_DROP_TYPE": "Type", - "DOCS_DROP_SIZE": "Size", - "DOCS_DROP_ACTION_VIEWDOC": "Display the document", - "DOCS_DROP_ACTION_DELETEDOC": "Delete the document", - "DOCS_DROP_ACTION_CONFIRMATION": "Are you sure you want to delete the document?", - "DOCS_DROP_ACTION_RENAMEDOC": "Renommer le document", - "DOCS_DIALOG_CONTENT_RENAME": "This assistant allows you to modify the name of your document", - "DOCS_DIALOG_ACTION_BUTTON_RENAME": "Rename", - "DOCS_DIALOG_ACTION_BUTTON_CANCEL": "Cancel", - "DOCS_DIALOG_ACTION_BUTTON_VALIDATE": "Delete", - "DOCS_DIALOG_CONTENT_DELETE":"Are you sure you want to delete the document ?", - - - "BOOKING_PLANNING_HEADER_TODAY": "Today", - - - "empty_booking": "The booking is empty." -} \ No newline at end of file diff --git a/public/assets/i18n/fr.json b/public/assets/i18n/fr.json deleted file mode 100644 index d7d07e7ae..000000000 --- a/public/assets/i18n/fr.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - - "SB_DIALOG_ACCEPT": "Valider", - "SB_DIALOG_SEND": "Ok", - "SB_DIALOG_CANCEL": "Annuler", - - "SB_PURPOSE_CREATE": "Création", - "SB_PURPOSE_UPDATE": "Modification", - "SB_PURPOSE_SELECT": "Sélection", - "SB_PURPOSE_ADD": "Ajout", - - "SB_FILTERS_ADD_CUSTOM_FILTER": "Ajouter un filtre personnalisé", - "SB_FILTERS_DIALOG_FIELD": "Champ", - "SB_FILTERS_DIALOG_OPERATOR": "Opérateur", - "SB_FILTERS_DIALOG_VALUE": "Valeur", - "SB_FILTERS_SEARCH": "Recherche", - "SB_FILTERS_SEARCH_ON_NAME": "Recherche sur le nom", - - "SB_ACTIONS_BUTTON_CREATE": "Créer", - "SB_ACTIONS_BUTTON_SAVE": "Sauver", - "SB_ACTIONS_BUTTON_SAVE_AND_CLOSE": "Sauver & fermer", - "SB_ACTIONS_BUTTON_SAVE_AND_EDIT": "Sauver & editer", - "SB_ACTIONS_BUTTON_SAVE_AND_CONTINUE": "Sauver & continuer", - "SB_ACTIONS_BUTTON_SAVE_AND_VIEW": "Sauver & voir", - "SB_ACTIONS_BUTTON_UPDATE": "Modifier", - "SB_ACTIONS_BUTTON_EXPORT": "Exporter", - "SB_ACTIONS_BUTTON_INLINE_UPDATE": "Éditer en ligne", - "SB_ACTIONS_BUTTON_BULK_ASSIGN": "Modification de masse", - "SB_ACTIONS_BUTTON_ARCHIVE": "Archiver", - "SB_ACTIONS_BUTTON_CLONE": "Dupliquer", - "SB_ACTIONS_BUTTON_DELETE": "Supprimer", - "SB_ACTIONS_BUTTON_CANCEL": "Annuler", - "SB_ACTIONS_BUTTON_SELECT": "Sélectionner", - "SB_ACTIONS_BUTTON_ADD": "Ajouter", - "SB_ACTIONS_BUTTON_REMOVE": "Retirer", - "SB_ACTIONS_BUTTON_SELECTED": "sélectionnés", - - "SB_ACTIONS_CONFIRM": "Confirmer l'action", - "SB_ACTIONS_PROVIDE_PARAMS": "Paramètres de l'action", - - "SB_ACTIONS_ARCHIVE_CONFIRM": "Confirmer l'archivage", - "SB_ACTIONS_ARCHIVE_DIALOG_MESSAGE": "Les éléments seront archivés et vous n'y aurez peut-être plus accès. Voulez-vous continuer ?", - - "SB_ACTIONS_DELETION_CONFIRM": "Confirmer la suppression", - "SB_ACTIONS_DELETION_DIALOG_I_CONFIRM": "Oui, supprimer les éléments.", - "SB_ACTIONS_DELETION_DIALOG_IS_PERMANENT": "Supprimer définitivement ?", - - "SB_ACTIONS_NOTIFY_CHANGES_SAVED": "Modifications enregistrées.", - "SB_ACTIONS_NOTIFY_ACTION_SENT": "Demande d'action envoyée.", - - "SB_ACTIONS_MESSAGE_ABANDON_CHANGE": "Des modifications ont été apportées et vont être perdues. Voulez-vous continuer ?", - "SB_ACTIONS_MESSAGE_ERASE_CONCURRENT_CHANGES": "Un autre utilisateur a apporté des modifications sur cette fiche pendant que vous l'éditiez. Ces modifications risquent d'être écrasées par les vôtres. Voulez-vous sauver tout de même ?", - - "SB_EXPORTS_AS_PDF": "Imprimer en PDF", - "SB_EXPORTS_AS_XLS": "Exporter en XLS", - - "SB_WIDGETS_MANY2ONE_ADVANCED_SEARCH": "Recherche avancée ...", - - "SB_ERROR_ERROR": "Erreur", - "SB_ERROR_UNKNOWN": "Une erreur non identifiée est survenue.", - "SB_ERROR_SQL_ERROR": "Une erreur au niveau de la base de données empêche l'opération (doublon?).", - "SB_ERROR_UNKNOWN_OBJECT": "Appel sur un Objet inconnu.", - "SB_ERROR_CONFLICT_OBJECT": "Un conflit empêche cette opération.", - "SB_ERROR_DUPLICATE_VALUE": "Cette valeur doit être unique mais existe déjà.", - "SB_ERROR_DUPLICATE_INDEX": "Un doublon est présent.", - "SB_ERROR_NOT_ALLOWED": "Non permis. Vous n'avez pas les droits ou l'état de l'objet ne le permet pas.", - "SB_ERROR_NON_EDITABLE": "L'élement ne peut pas être modifié dans son état actuel.", - "SB_ERROR_NON_REMOVABLE": "L'élement ne peut pas être supprimé dans son état actuel.", - "SB_ERROR_CONFIG_MISSING_PARAM": "Paramètre(s) ou section(s) manquant(es):", - "SB_ERROR_MISSING_MANDATORY": "Champ obligatoire.", - "SB_ERROR_MISSING_PARAM": "Champ obligatoire manquant.", - "SB_ERROR_INVALID_PARAM": "Paramètre(s) invalide(s). Certains changements n'ont pas pu être enregistrés.", - "SB_ERROR_INVALID_STATUS": "L'état de l'objet ne permet pas cette modification.", - "SB_ERROR_MAXIMUM_SIZE_EXCEEDED": "Taille supérieure au maximum autorisé.", - "SB_ERROR_BROKEN_CONSTRAINT": "Valeur invalide (au moins une contrainte non respectée).", - "SB_ERROR_ONUPDATE_DENIED": "L'objet n'accepte pas la sauvegarde avec les valeurs actuelles.", - - "SB_VIEW_UNKNOWN_OBJECT": "L'object demandé est inconnu ou manquant (il peut avoir été supprimé).", - - "AUTH_SIGNIN_TITLE": "Connexion", - "AUTH_SIGNIN_SIGNIN": "S'identifier", - "AUTH_SIGNIN_USERNAME": "Nom d'utilisateur ou Adresse email", - "AUTH_SIGNIN_PASSWORD": "Mot de passe", - "AUTH_SIGNIN_ACTION_LOGIN": "Connexion", - "AUTH_SIGNIN_ACTION_RECOVER": "Mot de passe oublié ?", - "AUTH_SIGNIN_ACTION_REGISTER": "Créer un nouveau compte", - "AUTH_SIGNUP_TITLE": "Nouveau compte", - "AUTH_SIGNUP_SIGNUP": "S'inscrire", - "AUTH_SIGNUP_USERNAME": "Nom d'utilisateur", - "AUTH_SIGNUP_PASSWORD": "Mot de passe", - "AUTH_SIGNUP_CONFIRM": "Confirmation", - "AUTH_SIGNUP_ACTION_SIGNUP": "S'inscrire", - "AUTH_SIGNUP_SENT_TITLE": "Création de compte", - "AUTH_SIGNUP_SENT_SIGNUP": "Demande de confirmation envoyée", - "AUTH_SIGNUP_SENT_MESSAGE": "Un message contenant un lien de verification a été envoyé à votre adresse email. Veuillez cliquer sur le lien de ce message pour continuer la création de votre compte.", - "AUTH_SIGNUP_SENT_ACTION_RESEND": "Renvoyer le message de confirmation", - "AUTH_RECOVER_MESSAGE_SUBMITTED": "Si l'adresse email correspond à un compte connu, les instructions de récupération de mot de passe y ont été envoyées.", - "AUTH_RECOVER_TITLE": "Réinitialiser le mot de passe", - "AUTH_RECOVER_SUBTITLE": "Mot de passe oublié ?", - "AUTH_RECOVER_EMAIL": "Adresse email", - "AUTH_RECOVER_ACTION_RECOVER": "Réinitialiser", - "AUTH_RECOVER_ACTION_SIGNIN": "S'identifer", - "AUTH_RESET_TITLE" : "Nouveau mot de passe", - "AUTH_RESET_SUBTITLE": "Définir un nouveau mot de passe", - "AUTH_RESET_PASSWORD": "Mot de passe", - "AUTH_RESET_CONFIRM": "Confirmation", - "AUTH_RESET_ACTION_SUBMIT": "Réinitialiser", - "AUTH_RESET_ACTION_SIGNIN": "S'identifier", - "AUTH_ERROR_MISSING_USERNAME": "Nom d'utilisateur requis", - "AUTH_ERROR_INVALID_USERNAME": "Nom d'utilisateur invalide (min 6 car.)", - "AUTH_ERROR_MISSING_EMAIL": "Adresse email requise", - "AUTH_ERROR_INVALID_EMAIL": "Adresse email invalide", - "AUTH_ERROR_MISSING_PASSWORD": "Mot de passe requis", - "AUTH_ERROR_INVALID_PASSWORD": "Mot de passe invalide (min 8 car.)", - "AUTH_ERROR_CONFIRM_MISMATCH": "Confirmation différente du mot de passe", - "AUTH_ERROR_INVALID_USERNAME_OR_PASSWORD": "Nom d'utilisateur ou mot de passe invalide.", - "AUTH_ERROR_EXISTING_USERNAME_OR_LOGIN": "Un compte existe déjà avec ce nom d'utilisateur ou cette adresse email.", - "AUTH_ERROR_SERVER_ERROR": "Une erreur s'est produite au niveau du serveur. Veuillez réessayer dans quelques minutes.", - - "APPS_APP_BOOKING": "Réservations", - "APPS_APP_POS": "Point de vente", - "APPS_APP_ACCOUNTING": "Compta", - "APPS_APP_SALES": "Ventes", - "APPS_APP_SETTINGS": "Configuration", - "APPS_APP_DOCUMENTS": "Documents", - "APPS_APP_STATS": "Statistiques", - - "SETTINGS_LIST_SETTING": "Paramètres", - "SETTINGS_LIST_CORE": "Général", - "SETTINGS_LIST_PERMISSION": "Permissions", - "SETTINGS_LIST_PERMISSION_UPDATE": "Édition", - - "DOCS_LIST_DOCUMENT": "Documents", - "DOCS_LIST_IMPORT": "Importer", - "DOCS_ERRORS_FAILED_UPLOAD": "Échec du téléchargement du fichier", - "DOCS_ERROR_BAD_FORMAT": "Format du fichier non autorisé.", - "DOCS_DROP_TITLE": "Choisissez ou déposez vos fichiers ici !", - "DOCS_DROP_NAME": "Nom", - "DOCS_DROP_TYPE": "Type", - "DOCS_DROP_SIZE": "Taille", - "DOCS_DROP_ACTION_VIEWDOC": "Afficher le document", - "DOCS_DROP_ACTION_DELETEDOC": "Supprimer le document", - "DOCS_DROP_ACTION_CONFIRMATION": "Êtes-vous sûr de vouloir supprimer ce document ?", - "DOCS_DROP_ACTION_RENAMEDOC": "Renommer le document", - "DOCS_DIALOG_CONTENT_RENAME": "Cet assistant vous permet de modifier le nom de votre document.", - "DOCS_DIALOG_ACTION_BUTTON_RENAME": "Renommer", - "DOCS_DIALOG_ACTION_BUTTON_CANCEL": "Annuler", - "DOCS_DIALOG_ACTION_BUTTON_VALIDATE": "Valider", - "DOCS_DIALOG_CONTENT_DELETE":"Êtes-vous sûr de vouloir supprimer le document ?", - - - "BOOKING_PLANNING_HEADER_TODAY": "Aujourd'hui", - - - "empty_booking": "La réservation est vide." -} \ No newline at end of file