From 569be57a1fc46fe9040bf8a8f9c5d05d381089f1 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Mon, 14 Jun 2021 16:53:52 +0200 Subject: [PATCH 01/27] [bug] a message tells that creating a new plan fails, but it worked --- CHANGELOG.md | 2 ++ app/controllers/api/plans_controller.rb | 8 ++++---- app/services/plans_service.rb | 5 +---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59ad4a677..d71278269 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog Fab-manager +- Fix a bug: a message tells that creating a new plan fails, but it worked + ## v5.0.3 2021 June 14 - Updated user's manual for v5 diff --git a/app/controllers/api/plans_controller.rb b/app/controllers/api/plans_controller.rb index 072c07389..8f3ebde7e 100644 --- a/app/controllers/api/plans_controller.rb +++ b/app/controllers/api/plans_controller.rb @@ -26,11 +26,11 @@ class API::PlansController < API::ApiController type = plan_params[:type] partner = params[:plan][:partner_id].empty? ? nil : User.find(params[:plan][:partner_id]) - res = PlansService.create(type, partner, plan_params) - if res.errors - render json: res.errors, status: :unprocessable_entity + plan = PlansService.create(type, partner, plan_params) + if plan.errors.keys.count.positive? + render json: plan.errors, status: :unprocessable_entity else - render json: res, status: :created + render json: plan, status: :created end end diff --git a/app/services/plans_service.rb b/app/services/plans_service.rb index d936c580e..df1a90335 100644 --- a/app/services/plans_service.rb +++ b/app/services/plans_service.rb @@ -14,11 +14,8 @@ class PlansService plan = type.constantize.new(params) if plan.save partner&.add_role :partner, plan - plan - else - puts plan.errors - { errors: plan.errors } end + plan end rescue PaymentGatewayError => e { errors: e.message } From 72be638869cc1a6c4fde0117ed6684eb394347b4 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 09:22:41 +0200 Subject: [PATCH 02/27] [bug] unable to select no category in plan creation/edition after a category selection Also: Display the category in the plans list instead of the plan type --- CHANGELOG.md | 3 +++ Procfile | 2 +- .../src/javascript/controllers/admin/plans.js | 4 ++++ .../javascript/controllers/admin/pricing.js | 22 +++++++++++-------- app/frontend/src/javascript/router.js | 3 ++- .../admin/pricing/subscriptions.html | 4 ++-- config/locales/app.admin.en.yml | 4 +--- config/locales/app.admin.fr.yml | 4 +--- 8 files changed, 27 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d71278269..ed0d1e73d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # Changelog Fab-manager +- Display the category in the plans list +- Do not display the type in the plans list - Fix a bug: a message tells that creating a new plan fails, but it worked +- Fix a bug: unable to select no category in plan creation/edition after a category selection ## v5.0.3 2021 June 14 diff --git a/Procfile b/Procfile index bbda6f44f..e68a73938 100644 --- a/Procfile +++ b/Procfile @@ -1,4 +1,4 @@ -#web: bundle exec rails server puma -p $PORT +web: bundle exec rails server puma -p $PORT worker: bundle exec sidekiq -C ./config/sidekiq.yml wp-client: bin/webpack-dev-server wp-server: SERVER_BUNDLE_ONLY=yes bin/webpack --watch diff --git a/app/frontend/src/javascript/controllers/admin/plans.js b/app/frontend/src/javascript/controllers/admin/plans.js index 48cf70b04..57364ede2 100644 --- a/app/frontend/src/javascript/controllers/admin/plans.js +++ b/app/frontend/src/javascript/controllers/admin/plans.js @@ -87,6 +87,8 @@ Application.Controllers.controller('NewPlanController', ['$scope', '$uibModal', // list of all plan categories $scope.planCategories = planCategories; + // we add an empty element to let the user select 'no category' + $scope.planCategories.unshift({ id: null, name: '' }); // prices bindings $scope.prices = { @@ -239,6 +241,8 @@ Application.Controllers.controller('EditPlanController', ['$scope', 'groups', 'p // list of all plan categories $scope.planCategories = planCategories; + // we add an empty element to let the user select 'no category' + $scope.planCategories.unshift({ id: null, name: '' }); // current form is used for edition mode $scope.mode = 'edition'; diff --git a/app/frontend/src/javascript/controllers/admin/pricing.js b/app/frontend/src/javascript/controllers/admin/pricing.js index da31903eb..3eaf3eed6 100644 --- a/app/frontend/src/javascript/controllers/admin/pricing.js +++ b/app/frontend/src/javascript/controllers/admin/pricing.js @@ -18,8 +18,8 @@ /** * Controller used in the prices edition page */ -Application.Controllers.controller('EditPricingController', ['$scope', '$state', '$uibModal', '$filter', 'TrainingsPricing', 'Credit', 'Pricing', 'Plan', 'Coupon', 'plans', 'groups', 'growl', 'machinesPricesPromise', 'Price', 'dialogs', 'trainingsPricingsPromise', 'trainingsPromise', 'machineCreditsPromise', 'machinesPromise', 'trainingCreditsPromise', 'couponsPromise', 'spacesPromise', 'spacesPricesPromise', 'spacesCreditsPromise', 'settingsPromise', '_t', 'Member', 'uiTourService', - function ($scope, $state, $uibModal, $filter, TrainingsPricing, Credit, Pricing, Plan, Coupon, plans, groups, growl, machinesPricesPromise, Price, dialogs, trainingsPricingsPromise, trainingsPromise, machineCreditsPromise, machinesPromise, trainingCreditsPromise, couponsPromise, spacesPromise, spacesPricesPromise, spacesCreditsPromise, settingsPromise, _t, Member, uiTourService) { +Application.Controllers.controller('EditPricingController', ['$scope', '$state', '$uibModal', '$filter', 'TrainingsPricing', 'Credit', 'Pricing', 'Plan', 'Coupon', 'plans', 'groups', 'growl', 'machinesPricesPromise', 'Price', 'dialogs', 'trainingsPricingsPromise', 'trainingsPromise', 'machineCreditsPromise', 'machinesPromise', 'trainingCreditsPromise', 'couponsPromise', 'spacesPromise', 'spacesPricesPromise', 'spacesCreditsPromise', 'settingsPromise', '_t', 'Member', 'uiTourService', 'planCategories', + function ($scope, $state, $uibModal, $filter, TrainingsPricing, Credit, Pricing, Plan, Coupon, plans, groups, growl, machinesPricesPromise, Price, dialogs, trainingsPricingsPromise, trainingsPromise, machineCreditsPromise, machinesPromise, trainingCreditsPromise, couponsPromise, spacesPromise, spacesPricesPromise, spacesCreditsPromise, settingsPromise, _t, Member, uiTourService, planCategories) { /* PUBLIC SCOPE */ // List of machines prices (not considering any plan) @@ -36,6 +36,9 @@ Application.Controllers.controller('EditPricingController', ['$scope', '$state', $scope.groups = groups.filter(function (g) { return g.slug !== 'admins'; }); $scope.enabledGroups = groups.filter(function (g) { return (g.slug !== 'admins') && !g.disabled; }); + // List of all plan-categories + $scope.planCategories = planCategories; + // Associate free machine hours with subscriptions $scope.machineCredits = machineCreditsPromise; @@ -433,14 +436,15 @@ Application.Controllers.controller('EditPricingController', ['$scope', '$state', }; /** - * If the plan does not have a type, return a default value for display purposes - * @param type {string|undefined|null} plan's type (eg. 'partner') - * @returns {string} + * Return the name of the plan-category, from its ID + * @param id {number|undefined} plan-category's id + * @returns {string} the name */ - $scope.getPlanType = function (type) { - if (type === 'PartnerPlan') { - return _t('app.admin.pricing.partner'); - } else { return _t('app.admin.pricing.standard'); } + $scope.getPlanCategory = function (id) { + const cat = $scope.planCategories.find(c => c.id === id); + if (cat) { + return cat.name; + } }; /** diff --git a/app/frontend/src/javascript/router.js b/app/frontend/src/javascript/router.js index 6625b81c1..a82b2d777 100644 --- a/app/frontend/src/javascript/router.js +++ b/app/frontend/src/javascript/router.js @@ -780,7 +780,8 @@ angular.module('application.router', ['ui.router']) spacesPromise: ['Space', function (Space) { return Space.query().$promise; }], spacesPricesPromise: ['Price', function (Price) { return Price.query({ priceable_type: 'Space', plan_id: 'null' }).$promise; }], spacesCreditsPromise: ['Credit', function (Credit) { return Credit.query({ creditable_type: 'Space' }).$promise; }], - settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: "['feature_tour_display', 'slot_duration']" }).$promise; }] + settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: "['feature_tour_display', 'slot_duration']" }).$promise; }], + planCategories: ['PlanCategory', function (PlanCategory) { return PlanCategory.query().$promise; }] } }) diff --git a/app/frontend/templates/admin/pricing/subscriptions.html b/app/frontend/templates/admin/pricing/subscriptions.html index f6e4050de..72fefcc09 100644 --- a/app/frontend/templates/admin/pricing/subscriptions.html +++ b/app/frontend/templates/admin/pricing/subscriptions.html @@ -23,10 +23,10 @@ - + @@ -36,10 +36,10 @@ - + diff --git a/config/locales/app.admin.en.yml b/config/locales/app.admin.en.yml index 238d820b7..fed821fe9 100644 --- a/config/locales/app.admin.en.yml +++ b/config/locales/app.admin.en.yml @@ -300,12 +300,10 @@ en: list_of_the_subscription_plans: "List of the subscription plans" disabled_plans_info_html: "

Warning: the subscriptions are disabled on this application.

You can still create some, but they won't be available until the activation of the plans module, from the « Customization » section.

" add_a_new_subscription_plan: "Add a new subscription plan" - type: "Type" - partner: "Partner" - standard: "Standard" name: "Name" duration: "Duration" group: "Group" + category: "Category" prominence: "Prominence" price: "Price" machine_hours: "Machine slots" diff --git a/config/locales/app.admin.fr.yml b/config/locales/app.admin.fr.yml index 2a337ce0b..68cf49b0e 100644 --- a/config/locales/app.admin.fr.yml +++ b/config/locales/app.admin.fr.yml @@ -300,12 +300,10 @@ fr: list_of_the_subscription_plans: "Liste des formules d'abonnements" disabled_plans_info_html: "

Attention : les abonnements sont désactivés sur cette application.

Vous pouvez tout de même en créer mais ils ne seront disponibles qu'après l'activation du module abonnements depuis la section « Personnalisation ».

" add_a_new_subscription_plan: "Ajouter une nouvelle formule d'abonnement" - type: "Type" - partner: "Partenaire" - standard: "Standard" name: "Nom" duration: "Durée" group: "Groupe" + category: "Catégorie" prominence: "Importance" price: "Prix" machine_hours: "Créneaux machines" From fd5f097dbf62907485cb2f93055c1b3801b39c47 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 09:27:00 +0200 Subject: [PATCH 03/27] New translations app.admin.en.yml (Portuguese) --- config/locales/app.admin.pt.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/config/locales/app.admin.pt.yml b/config/locales/app.admin.pt.yml index 83bc0dd17..9c0333875 100755 --- a/config/locales/app.admin.pt.yml +++ b/config/locales/app.admin.pt.yml @@ -300,12 +300,10 @@ pt: list_of_the_subscription_plans: "Lista dos planos de assinatura" disabled_plans_info_html: "

Aviso: as assinaturas estão desativadas nesta aplicação.

Você ainda pode criar algumas, mas eles não estarão disponíveis até a ativação dos módulos de planos, na seção « Personalização».

" add_a_new_subscription_plan: "Adicionar novo plano de assinatura" - type: "Tipo" - partner: "Parceiro" - standard: "Padrão" name: "Nome" duration: "Duração" group: "Grupo" + category: "Category" prominence: "Relevância" price: "Preço" machine_hours: "Slots de máquina" From 8abf77aa54b4d00e572aabd3a9c5017f10860ede Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 09:27:09 +0200 Subject: [PATCH 04/27] New translations app.admin.en.yml (Zulu) --- config/locales/app.admin.zu.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/config/locales/app.admin.zu.yml b/config/locales/app.admin.zu.yml index 86c65e270..259b3ccb8 100644 --- a/config/locales/app.admin.zu.yml +++ b/config/locales/app.admin.zu.yml @@ -300,12 +300,10 @@ zu: list_of_the_subscription_plans: "crwdns7121:0crwdne7121:0" disabled_plans_info_html: "crwdns20566:0crwdne20566:0" add_a_new_subscription_plan: "crwdns7129:0crwdne7129:0" - type: "crwdns7131:0crwdne7131:0" - partner: "crwdns7133:0crwdne7133:0" - standard: "crwdns7135:0crwdne7135:0" name: "crwdns7137:0crwdne7137:0" duration: "crwdns7139:0crwdne7139:0" group: "crwdns7141:0crwdne7141:0" + category: "crwdns21864:0crwdne21864:0" prominence: "crwdns7143:0crwdne7143:0" price: "crwdns7145:0crwdne7145:0" machine_hours: "crwdns7147:0crwdne7147:0" From 6b18ec9523b3d4bc1952bf13a78654dad4af0915 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 09:27:13 +0200 Subject: [PATCH 05/27] New translations app.admin.en.yml (Spanish) --- config/locales/app.admin.es.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/config/locales/app.admin.es.yml b/config/locales/app.admin.es.yml index 7f4d6dae8..986b33971 100644 --- a/config/locales/app.admin.es.yml +++ b/config/locales/app.admin.es.yml @@ -300,12 +300,10 @@ es: list_of_the_subscription_plans: "Lista de los planes de suscripción" disabled_plans_info_html: "

Warning: the subscriptions are disabled on this application.

You can still create some, but they won't be available until the activation of the plans module, from the « Customization » section.

" add_a_new_subscription_plan: "Agregar un nuevo plan de suscripción" - type: "Tipo" - partner: "Socio" - standard: "Estándar" name: "Nombre" duration: "Duración" group: "Grupo" + category: "Category" prominence: "Prominencia" price: "Precio" machine_hours: "Machine slots" From ddb17b503bfe6d4b56dd3c30f0b888961ba7a9a9 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 09:27:15 +0200 Subject: [PATCH 06/27] New translations app.admin.en.yml (French) --- config/locales/app.admin.fr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/app.admin.fr.yml b/config/locales/app.admin.fr.yml index 68cf49b0e..16ccf5d3e 100644 --- a/config/locales/app.admin.fr.yml +++ b/config/locales/app.admin.fr.yml @@ -303,7 +303,7 @@ fr: name: "Nom" duration: "Durée" group: "Groupe" - category: "Catégorie" + category: "Category" prominence: "Importance" price: "Prix" machine_hours: "Créneaux machines" From 2258d1f8cdc7a5af27f1c00bca782088583c92fe Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 09:27:24 +0200 Subject: [PATCH 07/27] New translations app.admin.en.yml (German) --- config/locales/app.admin.de.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/config/locales/app.admin.de.yml b/config/locales/app.admin.de.yml index af0195c47..93f4516c0 100644 --- a/config/locales/app.admin.de.yml +++ b/config/locales/app.admin.de.yml @@ -300,12 +300,10 @@ de: list_of_the_subscription_plans: "Liste der Abonnement-Pläne" disabled_plans_info_html: "

Warnung: die Abonnements sind in dieser Anwendung deaktiviert.

Sie können Abonnements erstellen, aber sie werden erst mit der Aktivierung des Planungsmoduls im Abschnitt « Anpassen » verfügbar.

" add_a_new_subscription_plan: "Neues Abonnement hinzufügen" - type: "Typ" - partner: "Partner" - standard: "Standard" name: "Name" duration: "Dauer" group: "Gruppe" + category: "Category" prominence: "Hervorhebung" price: "Preis" machine_hours: "Maschinen-Slots" From 7f823d6e9392ae04cee474605f233eaae1722e75 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 09:29:44 +0200 Subject: [PATCH 08/27] New translations app.admin.en.yml (Portuguese) --- config/locales/app.admin.pt.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/app.admin.pt.yml b/config/locales/app.admin.pt.yml index 9c0333875..cbac9aa53 100755 --- a/config/locales/app.admin.pt.yml +++ b/config/locales/app.admin.pt.yml @@ -303,7 +303,7 @@ pt: name: "Nome" duration: "Duração" group: "Grupo" - category: "Category" + category: "Categoria" prominence: "Relevância" price: "Preço" machine_hours: "Slots de máquina" From 12af5822807340001c862216064ab9eddb7f78cf Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 09:29:53 +0200 Subject: [PATCH 09/27] New translations app.admin.en.yml (Spanish) --- config/locales/app.admin.es.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/locales/app.admin.es.yml b/config/locales/app.admin.es.yml index 986b33971..f3f1f4c5b 100644 --- a/config/locales/app.admin.es.yml +++ b/config/locales/app.admin.es.yml @@ -303,7 +303,7 @@ es: name: "Nombre" duration: "Duración" group: "Grupo" - category: "Category" + category: "Categoría" prominence: "Prominencia" price: "Precio" machine_hours: "Machine slots" @@ -1296,8 +1296,8 @@ es: name: "Name" significance: "Significance" create_plan_category: - new_category: "New category" - name: "Name" + new_category: "Nueva categoría" + name: "Nombre" significance: "Significance" significance_info: "Categories will be shown ordered by signifiance. The higher you set the significance, the first the category will be shown." confirm_create: "Create the category" @@ -1305,15 +1305,15 @@ es: unable_to_create: "Unable to create the category: " edit_plan_category: edit_category: "Edit the category" - name: "Name" + name: "Nombre" significance: "Significance" - confirm_edition: "Validate" + confirm_edition: "Validar" category_updated: "The category was successfully updated" unable_to_update: "Unable to update the category: " significance_info: "Categories will be shown ordered by signifiance. The higher you set the significance, the first the category will be shown." delete_plan_category: delete_category: "Delete a category" - confirm_delete: "Delete" + confirm_delete: "Borrar" delete_confirmation: "Are you sure you want to delete this category? If you do, the plans associated with this category won't be sorted anymore." category_deleted: "The category was successfully deleted" unable_to_delete: "Unable to delete the category: " From 8c2a55840d731e4aafa297bb394f0ea9c5b8a1cc Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 09:29:55 +0200 Subject: [PATCH 10/27] New translations app.admin.en.yml (French) --- config/locales/app.admin.fr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/app.admin.fr.yml b/config/locales/app.admin.fr.yml index 16ccf5d3e..68cf49b0e 100644 --- a/config/locales/app.admin.fr.yml +++ b/config/locales/app.admin.fr.yml @@ -303,7 +303,7 @@ fr: name: "Nom" duration: "Durée" group: "Groupe" - category: "Category" + category: "Catégorie" prominence: "Importance" price: "Prix" machine_hours: "Créneaux machines" From d1568c61803fa95467dd7b539b85930c63d7e5db Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 09:30:04 +0200 Subject: [PATCH 11/27] New translations app.admin.en.yml (German) --- config/locales/app.admin.de.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/app.admin.de.yml b/config/locales/app.admin.de.yml index 93f4516c0..78f19cfe6 100644 --- a/config/locales/app.admin.de.yml +++ b/config/locales/app.admin.de.yml @@ -303,7 +303,7 @@ de: name: "Name" duration: "Dauer" group: "Gruppe" - category: "Category" + category: "Kategorie" prominence: "Hervorhebung" price: "Preis" machine_hours: "Maschinen-Slots" From f91ee24639d48456e9557652d93c01fe7bd72530 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 10:18:14 +0200 Subject: [PATCH 12/27] [bug] the training validation modal shows cancelled trainings --- CHANGELOG.md | 1 + app/controllers/api/trainings_controller.rb | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed0d1e73d..4192cd0b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Do not display the type in the plans list - Fix a bug: a message tells that creating a new plan fails, but it worked - Fix a bug: unable to select no category in plan creation/edition after a category selection +- Fix a bug: the training validation modal shows cancelled trainings ## v5.0.3 2021 June 14 diff --git a/app/controllers/api/trainings_controller.rb b/app/controllers/api/trainings_controller.rb index c0ba04b19..af36f907b 100644 --- a/app/controllers/api/trainings_controller.rb +++ b/app/controllers/api/trainings_controller.rb @@ -60,7 +60,8 @@ class API::TrainingsController < API::ApiController @training = Training.find(params[:id]) @availabilities = @training.availabilities .includes(slots: { reservations: { statistic_profile: [:trainings, user: [:profile]] } }) - .order('start_at DESC') + .where('slots.canceled_at': nil) + .order('availabilities.start_at DESC') end private From 5f598b7a609470c83b6449a93be2da3eef8c5096 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 11:36:14 +0200 Subject: [PATCH 13/27] Updated medium-editor to v5 and angular-medium-editor accordingly --- CHANGELOG.md | 1 + package.json | 4 ++-- yarn.lock | 15 ++++++++------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4192cd0b1..aab2b57d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ - Display the category in the plans list - Do not display the type in the plans list +- Updated medium-editor to v5 and angular-medium-editor accordingly - Fix a bug: a message tells that creating a new plan fails, but it worked - Fix a bug: unable to select no category in plan creation/edition after a category selection - Fix a bug: the training validation modal shows cancelled trainings diff --git a/package.json b/package.json index 1ea208922..4c219aa05 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "angular-growl-v2": "https://github.com/JanStevens/angular-growl-2.git#0.7.9", "angular-i18n": "1.7", "angular-loading-bar": "^0.9.0", - "angular-medium-editor": "https://github.com/thijsw/angular-medium-editor.git#0.1.1", + "angular-medium-editor": "^1.2.1", "angular-minicolors": "https://github.com/kaihenzler/angular-minicolors.git#0.0.5", "angular-moment": "1.3", "angular-recaptcha": "^4.2.0", @@ -93,7 +93,7 @@ "jasny-bootstrap": "3.1", "jquery": ">=3.5.0", "jquery-ujs": "^1.2.2", - "medium-editor": "4.4.0", + "medium-editor": "^5.23.3", "moment": "2.22", "moment-timezone": "0.5", "ng-caps-lock": "https://github.com/FabioMR/ng-caps-lock.git#1.0.3", diff --git a/yarn.lock b/yarn.lock index 20d416ed2..46bb0a892 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1488,9 +1488,10 @@ angular-loading-bar@^0.9.0: resolved "https://registry.yarnpkg.com/angular-loading-bar/-/angular-loading-bar-0.9.0.tgz#37ef52c25f102c216e7b3cdfd2fc5a5df9628e45" integrity sha1-N+9Swl8QLCFuezzf0vxaXflijkU= -"angular-medium-editor@https://github.com/thijsw/angular-medium-editor.git#0.1.1": - version "0.1.1" - resolved "https://github.com/thijsw/angular-medium-editor.git#1683d0f4ada6e4e0011c4372335c702df9680fde" +angular-medium-editor@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/angular-medium-editor/-/angular-medium-editor-1.2.1.tgz#3f336d0fffb26f0948e49b6cf50682f8b90d68fa" + integrity sha1-PzNtD/+ybwlI5Jts9QaC+LkNaPo= "angular-minicolors@https://github.com/kaihenzler/angular-minicolors.git#0.0.5": version "0.0.0" @@ -5240,10 +5241,10 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -medium-editor@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/medium-editor/-/medium-editor-4.4.0.tgz#ef188cc9cc5cba87177da8cb657a885dfbbe5760" - integrity sha1-7xiMycxcuocXfajLZXqIXfu+V2A= +medium-editor@^5.23.3: + version "5.23.3" + resolved "https://registry.yarnpkg.com/medium-editor/-/medium-editor-5.23.3.tgz#6fb638759ae2fc76c423feb056f346d9c518d3b7" + integrity sha512-he9/TdjX8f8MGdXGfCs8AllrYnqXJJvjNkDKmPg3aPW/uoIrlRqtkFthrwvmd+u4QyzEiadhCCM0EwTiRdUCJw== memoize-one@^5.0.0: version "5.2.1" From 11579fede44ad1585d785efa8269a4d0833a1ef1 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 11:57:43 +0200 Subject: [PATCH 14/27] ability to disable the public agenda --- CHANGELOG.md | 2 ++ .../src/javascript/controllers/main_nav.js | 15 +++++++++------ app/frontend/src/javascript/models/setting.ts | 3 ++- app/frontend/src/javascript/router.js | 6 ++++-- .../templates/admin/settings/general.html | 8 ++++++++ app/models/setting.rb | 3 ++- app/policies/setting_policy.rb | 2 +- app/views/application/index.html.erb | 1 + config/locales/app.admin.en.yml | 4 ++++ config/locales/app.admin.fr.yml | 4 ++++ config/locales/en.yml | 1 + db/seeds.rb | 2 ++ 12 files changed, 40 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aab2b57d2..92d25d1be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,13 @@ # Changelog Fab-manager +- Ability to disable the public agenda - Display the category in the plans list - Do not display the type in the plans list - Updated medium-editor to v5 and angular-medium-editor accordingly - Fix a bug: a message tells that creating a new plan fails, but it worked - Fix a bug: unable to select no category in plan creation/edition after a category selection - Fix a bug: the training validation modal shows cancelled trainings +- [TODO DEPLOY] `rails db:seed` ## v5.0.3 2021 June 14 diff --git a/app/frontend/src/javascript/controllers/main_nav.js b/app/frontend/src/javascript/controllers/main_nav.js index 3479d4223..04d3f4d97 100644 --- a/app/frontend/src/javascript/controllers/main_nav.js +++ b/app/frontend/src/javascript/controllers/main_nav.js @@ -23,12 +23,6 @@ Application.Controllers.controller('MainNavController', ['$scope', function ($sc class: 'home-link' }, { class: 'menu-spacer' }, - { - state: 'app.public.calendar', - linkText: 'app.public.common.public_calendar', - linkIcon: 'calendar', - class: 'public-calendar-link' - }, { state: 'app.public.machines_list', linkText: 'app.public.common.reserve_a_machine', @@ -79,6 +73,15 @@ Application.Controllers.controller('MainNavController', ['$scope', function ($sc }); } + if ($scope.$root.modules.publicAgenda) { + $scope.navLinks.splice(2, 0, { + state: 'app.public.calendar', + linkText: 'app.public.common.public_calendar', + linkIcon: 'calendar', + class: 'public-calendar-link' + }); + } + Fablab.adminNavLinks = Fablab.adminNavLinks || []; const adminNavLinks = [ { diff --git a/app/frontend/src/javascript/models/setting.ts b/app/frontend/src/javascript/models/setting.ts index f836d2f18..3b3a2f52b 100644 --- a/app/frontend/src/javascript/models/setting.ts +++ b/app/frontend/src/javascript/models/setting.ts @@ -107,7 +107,8 @@ export enum SettingName { PayZenEndpoint = 'payzen_endpoint', PayZenPublicKey = 'payzen_public_key', PayZenHmacKey = 'payzen_hmac', - PayZenCurrency = 'payzen_currency' + PayZenCurrency = 'payzen_currency', + PublicAgendaModule = 'public_agenda_module' } export interface Setting { diff --git a/app/frontend/src/javascript/router.js b/app/frontend/src/javascript/router.js index a82b2d777..dc3742093 100644 --- a/app/frontend/src/javascript/router.js +++ b/app/frontend/src/javascript/router.js @@ -38,7 +38,7 @@ angular.module('application.router', ['ui.router']) logoFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'logo-file' }).$promise; }], logoBlackFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'logo-black-file' }).$promise; }], sharedTranslations: ['Translations', function (Translations) { return Translations.query(['app.shared', 'app.public.common']).$promise; }], - modulesPromise: ['Setting', function (Setting) { return Setting.query({ names: "['spaces_module', 'plans_module', 'invoicing_module', 'wallet_module', 'statistics_module', 'trainings_module']" }).$promise; }] + modulesPromise: ['Setting', function (Setting) { return Setting.query({ names: "['spaces_module', 'plans_module', 'invoicing_module', 'wallet_module', 'statistics_module', 'trainings_module', 'public_agenda_module']" }).$promise; }] }, onEnter: ['$rootScope', 'logoFile', 'logoBlackFile', 'modulesPromise', 'CSRF', function ($rootScope, logoFile, logoBlackFile, modulesPromise, CSRF) { // Retrieve Anti-CSRF tokens from cookies @@ -52,6 +52,7 @@ angular.module('application.router', ['ui.router']) trainings: (modulesPromise.trainings_module === 'true'), invoicing: (modulesPromise.invoicing_module === 'true'), wallet: (modulesPromise.wallet_module === 'true'), + publicAgenda: (modulesPromise.public_agenda_module === 'true'), statistics: (modulesPromise.statistics_module === 'true') }; }] @@ -570,6 +571,7 @@ angular.module('application.router', ['ui.router']) // global calendar (trainings, machines and events) .state('app.public.calendar', { url: '/calendar', + abstract: !Fablab.publicAgendaModule, views: { 'main@': { templateUrl: '/calendar/calendar.html', @@ -1078,7 +1080,7 @@ angular.module('application.router', ['ui.router']) "'fablab_name', 'name_genre', 'reminder_enable', 'plans_module', 'confirmation_required', " + "'reminder_delay', 'visibility_yearly', 'visibility_others', 'wallet_module', 'trainings_module', " + "'display_name_enable', 'machines_sort_by', 'fab_analytics', 'statistics_module', 'address_required', " + - "'link_name', 'home_content', 'home_css', 'phone_required', 'upcoming_events_shown']" + "'link_name', 'home_content', 'home_css', 'phone_required', 'upcoming_events_shown', 'public_agenda_module']" }).$promise; }], privacyDraftsPromise: ['Setting', function (Setting) { return Setting.get({ name: 'privacy_draft', history: true }).$promise; }], diff --git a/app/frontend/templates/admin/settings/general.html b/app/frontend/templates/admin/settings/general.html index 6948ffaae..0de4db60f 100644 --- a/app/frontend/templates/admin/settings/general.html +++ b/app/frontend/templates/admin/settings/general.html @@ -517,6 +517,14 @@ label="app.admin.settings.general.enable_wallet" classes="m-l"> +
+

{{ 'app.admin.settings.general.public_agenda' }}

+

+ +

{{ 'app.admin.settings.general.statistics' }}

diff --git a/app/models/setting.rb b/app/models/setting.rb index c85c42b06..42cce41fa 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -117,7 +117,8 @@ class Setting < ApplicationRecord payzen_endpoint payzen_public_key payzen_hmac - payzen_currency] } + payzen_currency + public_agenda_module] } # WARNING: when adding a new key, you may also want to add it in app/policies/setting_policy.rb#public_whitelist def value diff --git a/app/policies/setting_policy.rb b/app/policies/setting_policy.rb index 9dedbce66..420bc7662 100644 --- a/app/policies/setting_policy.rb +++ b/app/policies/setting_policy.rb @@ -39,7 +39,7 @@ class SettingPolicy < ApplicationPolicy tracking_id book_overlapping_slots slot_duration events_in_calendar spaces_module plans_module invoicing_module recaptcha_site_key feature_tour_display disqus_shortname allowed_cad_extensions openlab_app_id openlab_default online_payment_module stripe_public_key confirmation_required wallet_module trainings_module address_required - payment_gateway payzen_endpoint payzen_public_key] + payment_gateway payzen_endpoint payzen_public_key public_agenda_module] end ## diff --git a/app/views/application/index.html.erb b/app/views/application/index.html.erb index a3733660d..c032f52bc 100644 --- a/app/views/application/index.html.erb +++ b/app/views/application/index.html.erb @@ -36,6 +36,7 @@ Fablab.spacesModule = ('<%= Setting.get('spaces_module') %>' === 'true'); Fablab.trainingsModule = ('<%= Setting.get('trainings_module') %>' === 'true'); Fablab.walletModule = ('<%= Setting.get('wallet_module') %>' === 'true'); + Fablab.publicAgendaModule = ('<%= Setting.get('public_agenda_module') %>' === 'true'); Fablab.statisticsModule = ('<%= Setting.get('statistics_module') %>' === 'true'); Fablab.defaultHost = "<%= Rails.application.secrets.default_host %>"; Fablab.trackingId = "<%= Setting.get('tracking_id') %>"; diff --git a/config/locales/app.admin.en.yml b/config/locales/app.admin.en.yml index fed821fe9..ca918cd4c 100644 --- a/config/locales/app.admin.en.yml +++ b/config/locales/app.admin.en.yml @@ -1167,6 +1167,7 @@ en: confirmation_required_info: "Optionally, you can force the users to confirm their email address before being able to access Fab-manager." confirmation_is_required: "Confirmation required" wallet_module: "wallet module" + public_agenda_module: "public agenda module" statistics_module: "statistics module" upcoming_events_shown: "display limit for upcoming events" general: @@ -1205,6 +1206,9 @@ en: wallet: "Wallet" wallet_info_html: "

The virtual wallet allows you to allocate a sum of money to users. Then, can spend this money as they wish, in Fab-manager.

Members cannot credit their wallet themselves, it's a privilege of managers and administrators.

" enable_wallet: "Enable wallet" + public_agenda: "Public agenda" + public_agenda_info_html: "

The public agenda offers to members and visitors a general overview of the Fablab's planning.

Please note that, even logged, users won't be able to book a reservation or modify anything from this agenda: this is a read-only page.

" + enable_public_agenda: "Enable public agenda" statistics: "Statistics" statistics_info_html: "

Enable or disable the statistics module.

If enabled, every nights, the data of the day just passed will be consolidated in the database of a powerful analysis engine. Then, every administrators will be able to browse statistical charts and tables in the corresponding section.

" enable_statistics: "Enable statistics" diff --git a/config/locales/app.admin.fr.yml b/config/locales/app.admin.fr.yml index 68cf49b0e..88e4c32f8 100644 --- a/config/locales/app.admin.fr.yml +++ b/config/locales/app.admin.fr.yml @@ -1167,6 +1167,7 @@ fr: confirmation_required_info: "De manière optionnelle, vous pouvez forcer les utilisateurs à confirmer leur adresse électronique avant de pouvoir accéder à Fab-manager." confirmation_is_required: "Confirmation requise" wallet_module: "module porte-monnaie" + public_agenda_module: "module d'agenda public" statistics_module: "module de statistiques" upcoming_events_shown: "la limite d'affichage des événements à venir" general: @@ -1205,6 +1206,9 @@ fr: wallet: "Porte-monnaie" wallet_info_html: "

Le porte-monnaie virtuel vous permet d'allouer une certaine somme d'argent aux utilisateurs. Ils peuvent ensuite dépenser cet argent comment bon leur semble, dans Fab-manager.

Les membres ne peuvent pas créditer leur porte-monnaie eux-même, c'est un privilège des gestionnaires et des administrateurs.

" enable_wallet: "Activer le porte-monnaie" + public_agenda: "Agenda public" + public_agenda_info_html: "

L'agenda public aux membres et aux visiteurs une vue générale du planning du FabLab.

Veuillez noter que, même connectés, les utilisateurs ne pourront ni réserver ni modifier quoi que ce soit depuis cet agenda : c'est une page en lecture seule.

" + enable_public_agenda: "Activer l'agenda public" statistics: "Statistiques" statistics_info_html: "

Activer ou désactiver le module de statistiques.

Si activé, chaque nuit, les données de la journée qui vient de s'écouler seront consolidées dans la base de données d'un puissant moteur d'analyse. Ensuite, chaque administrateur pourra parcourir les tableaux et graphiques statistiques dans la section correspondante.

" enable_statistics: "Activer les statistiques" diff --git a/config/locales/en.yml b/config/locales/en.yml index 7528d7f9f..5a42aaea6 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -525,3 +525,4 @@ en: payzen_public_key: "PayZen client public key" payzen_hmac: "PayZen HMAC-SHA-256 key" payzen_currency: "PayZen currency" + public_agenda_module: "Public agenda module" diff --git a/db/seeds.rb b/db/seeds.rb index fe99e6b88..e7f917fbc 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -895,6 +895,8 @@ Setting.set('upcoming_events_shown', 'until_start') unless Setting.find_by(name: Setting.set('trainings_module', true) unless Setting.find_by(name: 'trainings_module').try(:value) +Setting.set('public_agenda_module', true) unless Setting.find_by(name: 'public_agenda_module').try(:value) + if StatisticCustomAggregation.count.zero? # available reservations hours for machines machine_hours = StatisticType.find_by(key: 'hour', statistic_index_id: 2) From 999e366a236eb2a3b736b577ba795654f7fed19a Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 11:58:23 +0200 Subject: [PATCH 15/27] New translations en.yml (French) --- config/locales/fr.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index f57333eea..909efd963 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -525,3 +525,4 @@ fr: payzen_public_key: "Clé publique du client PayZen" payzen_hmac: "Clef HMAC-SHA-256 PayZen" payzen_currency: "Devise PayZen" + public_agenda_module: "Public agenda module" From dd77dd5f9404b23a31de30a37c8e727f82ebfe98 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 11:58:25 +0200 Subject: [PATCH 16/27] New translations app.admin.en.yml (Portuguese) --- config/locales/app.admin.pt.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/locales/app.admin.pt.yml b/config/locales/app.admin.pt.yml index cbac9aa53..1e2afacd5 100755 --- a/config/locales/app.admin.pt.yml +++ b/config/locales/app.admin.pt.yml @@ -1167,6 +1167,7 @@ pt: confirmation_required_info: "Opcionalmente, você pode forçar os usuários a confirmar o endereço de e-mail deles antes de poder acessar o Fab-manager." confirmation_is_required: "Confirmação obrigatória" wallet_module: "módulo de carteira" + public_agenda_module: "public agenda module" statistics_module: "módulo de estatísticas" upcoming_events_shown: "exibir limite para eventos futuros" general: @@ -1205,6 +1206,9 @@ pt: wallet: "Carteira" wallet_info_html: "

A carteira virtual permite alocar uma soma de dinheiro aos usuários. Em seguida, pode gastar esse dinheiro como quiserem, no Fab-manager.

Membros não podem creditar suas carteiras, é um privilégio de gerentes e administradores.

" enable_wallet: "Habilitar Carteira" + public_agenda: "Public agenda" + public_agenda_info_html: "

The public agenda offers to members and visitors a general overview of the Fablab's planning.

Please note that, even logged, users won't be able to book a reservation or modify anything from this agenda: this is a read-only page.

" + enable_public_agenda: "Enable public agenda" statistics: "Estatísticas" statistics_info_html: "

Ativar ou desativar módulo de estatísticas.

Se ativado, todas as noites, os dados do dia que acabou de ser passado serão consolidados na base de dados de um poderoso motor de análise. Então, todos os administradores poderão navegar em gráficos estatísticos e tabelas na seção correspondente.

" enable_statistics: "Habilitar estatísticas" From 5aec39e6b54fb872959673c5d762e4e4767c1a0b Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 11:58:29 +0200 Subject: [PATCH 17/27] New translations en.yml (Zulu) --- config/locales/zu.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/locales/zu.yml b/config/locales/zu.yml index 4fddd7d23..fcf8ab880 100644 --- a/config/locales/zu.yml +++ b/config/locales/zu.yml @@ -525,3 +525,4 @@ zu: payzen_public_key: "crwdns21846:0crwdne21846:0" payzen_hmac: "crwdns21848:0crwdne21848:0" payzen_currency: "crwdns21850:0crwdne21850:0" + public_agenda_module: "crwdns21874:0crwdne21874:0" From f22f87d6faec3bee97b1636a8491ae25cf9eae6f Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 11:58:30 +0200 Subject: [PATCH 18/27] New translations en.yml (Portuguese) --- config/locales/pt.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/locales/pt.yml b/config/locales/pt.yml index 0014b6677..81d5578c5 100755 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -525,3 +525,4 @@ pt: payzen_public_key: "PayZen client public key" payzen_hmac: "PayZen HMAC-SHA-256 key" payzen_currency: "PayZen currency" + public_agenda_module: "Public agenda module" From 9d14d22fc4ba6996664508a82201a6f910b60648 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 11:58:34 +0200 Subject: [PATCH 19/27] New translations app.admin.en.yml (Zulu) --- config/locales/app.admin.zu.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/locales/app.admin.zu.yml b/config/locales/app.admin.zu.yml index 259b3ccb8..398ebd872 100644 --- a/config/locales/app.admin.zu.yml +++ b/config/locales/app.admin.zu.yml @@ -1167,6 +1167,7 @@ zu: confirmation_required_info: "crwdns20720:0crwdne20720:0" confirmation_is_required: "crwdns20722:0crwdne20722:0" wallet_module: "crwdns20724:0crwdne20724:0" + public_agenda_module: "crwdns21866:0crwdne21866:0" statistics_module: "crwdns20864:0crwdne20864:0" upcoming_events_shown: "crwdns20898:0crwdne20898:0" general: @@ -1205,6 +1206,9 @@ zu: wallet: "crwdns20786:0crwdne20786:0" wallet_info_html: "crwdns20788:0crwdne20788:0" enable_wallet: "crwdns20790:0crwdne20790:0" + public_agenda: "crwdns21868:0crwdne21868:0" + public_agenda_info_html: "crwdns21870:0crwdne21870:0" + enable_public_agenda: "crwdns21872:0crwdne21872:0" statistics: "crwdns20866:0crwdne20866:0" statistics_info_html: "crwdns20868:0crwdne20868:0" enable_statistics: "crwdns20870:0crwdne20870:0" From 0d36668234ef8050950b0a61406a0f8f1eca8932 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 11:58:38 +0200 Subject: [PATCH 20/27] New translations app.admin.en.yml (Spanish) --- config/locales/app.admin.es.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/locales/app.admin.es.yml b/config/locales/app.admin.es.yml index f3f1f4c5b..d7ada6d0b 100644 --- a/config/locales/app.admin.es.yml +++ b/config/locales/app.admin.es.yml @@ -1167,6 +1167,7 @@ es: confirmation_required_info: "Optionally, you can force the users to confirm their email address before being able to access Fab-manager." confirmation_is_required: "Confirmation required" wallet_module: "wallet module" + public_agenda_module: "public agenda module" statistics_module: "statistics module" upcoming_events_shown: "display limit for upcoming events" general: @@ -1205,6 +1206,9 @@ es: wallet: "Wallet" wallet_info_html: "

The virtual wallet allows you to allocate a sum of money to users. Then, can spend this money as they wish, in Fab-manager.

Members cannot credit their wallet themselves, it's a privilege of managers and administrators.

" enable_wallet: "Enable wallet" + public_agenda: "Public agenda" + public_agenda_info_html: "

The public agenda offers to members and visitors a general overview of the Fablab's planning.

Please note that, even logged, users won't be able to book a reservation or modify anything from this agenda: this is a read-only page.

" + enable_public_agenda: "Enable public agenda" statistics: "Statistics" statistics_info_html: "

Enable or disable the statistics module.

If enabled, every nights, the data of the day just passed will be consolidated in the database of a powerful analysis engine. Then, every administrators will be able to browse statistical charts and tables in the corresponding section.

" enable_statistics: "Enable statistics" From a40ab1474e7c74f3f55adfd24b46089d87336678 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 11:58:40 +0200 Subject: [PATCH 21/27] New translations app.admin.en.yml (French) --- config/locales/app.admin.fr.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config/locales/app.admin.fr.yml b/config/locales/app.admin.fr.yml index 88e4c32f8..9663c9f4e 100644 --- a/config/locales/app.admin.fr.yml +++ b/config/locales/app.admin.fr.yml @@ -1167,7 +1167,7 @@ fr: confirmation_required_info: "De manière optionnelle, vous pouvez forcer les utilisateurs à confirmer leur adresse électronique avant de pouvoir accéder à Fab-manager." confirmation_is_required: "Confirmation requise" wallet_module: "module porte-monnaie" - public_agenda_module: "module d'agenda public" + public_agenda_module: "public agenda module" statistics_module: "module de statistiques" upcoming_events_shown: "la limite d'affichage des événements à venir" general: @@ -1206,9 +1206,9 @@ fr: wallet: "Porte-monnaie" wallet_info_html: "

Le porte-monnaie virtuel vous permet d'allouer une certaine somme d'argent aux utilisateurs. Ils peuvent ensuite dépenser cet argent comment bon leur semble, dans Fab-manager.

Les membres ne peuvent pas créditer leur porte-monnaie eux-même, c'est un privilège des gestionnaires et des administrateurs.

" enable_wallet: "Activer le porte-monnaie" - public_agenda: "Agenda public" - public_agenda_info_html: "

L'agenda public aux membres et aux visiteurs une vue générale du planning du FabLab.

Veuillez noter que, même connectés, les utilisateurs ne pourront ni réserver ni modifier quoi que ce soit depuis cet agenda : c'est une page en lecture seule.

" - enable_public_agenda: "Activer l'agenda public" + public_agenda: "Public agenda" + public_agenda_info_html: "

The public agenda offers to members and visitors a general overview of the Fablab's planning.

Please note that, even logged, users won't be able to book a reservation or modify anything from this agenda: this is a read-only page.

" + enable_public_agenda: "Enable public agenda" statistics: "Statistiques" statistics_info_html: "

Activer ou désactiver le module de statistiques.

Si activé, chaque nuit, les données de la journée qui vient de s'écouler seront consolidées dans la base de données d'un puissant moteur d'analyse. Ensuite, chaque administrateur pourra parcourir les tableaux et graphiques statistiques dans la section correspondante.

" enable_statistics: "Activer les statistiques" From 3522c47c47d6570a009e04d294db29cb315dffa3 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 11:58:43 +0200 Subject: [PATCH 22/27] New translations en.yml (Spanish) --- config/locales/es.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/locales/es.yml b/config/locales/es.yml index 95b333695..c02eaba52 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -525,3 +525,4 @@ es: payzen_public_key: "PayZen client public key" payzen_hmac: "PayZen HMAC-SHA-256 key" payzen_currency: "PayZen currency" + public_agenda_module: "Public agenda module" From 560f046c3716ffdf861dc4190e03dc23dd8ae394 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 11:58:47 +0200 Subject: [PATCH 23/27] New translations en.yml (German) --- config/locales/de.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/locales/de.yml b/config/locales/de.yml index 52434a993..47d5c87a6 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -525,3 +525,4 @@ de: payzen_public_key: "PayZen client public key" payzen_hmac: "PayZen HMAC-SHA-256 key" payzen_currency: "PayZen currency" + public_agenda_module: "Public agenda module" From 78ca1a07ec644a5ed888554f69a062d2d26dc3c4 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 11:58:49 +0200 Subject: [PATCH 24/27] New translations app.admin.en.yml (German) --- config/locales/app.admin.de.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/locales/app.admin.de.yml b/config/locales/app.admin.de.yml index 78f19cfe6..935c89afa 100644 --- a/config/locales/app.admin.de.yml +++ b/config/locales/app.admin.de.yml @@ -1167,6 +1167,7 @@ de: confirmation_required_info: "Optional können Sie die Bestätigung der E-Mail-Adresse für Benutzer obligatorisch machen, bevor Sie Zugriff auf Fab-Manager bekommen." confirmation_is_required: "Bestätigung erforderlich" wallet_module: "Guthabenkonto-Modul" + public_agenda_module: "public agenda module" statistics_module: "Statistik-Modul" upcoming_events_shown: "Anzeigelimit für anstehende Termine" general: @@ -1205,6 +1206,9 @@ de: wallet: "Guthabenkonto" wallet_info_html: "

Mit dem Guthabenkonto können Sie Benutzern eine Geldsumme zuweisen. Diese können es nach Belieben im Fab-Manager ausgeben.

Mitglieder können ihr Guthabenkonto nicht selbst aufladen, das können nur Manager und Administratoren.

" enable_wallet: "Guthabenkonto aktivieren" + public_agenda: "Public agenda" + public_agenda_info_html: "

The public agenda offers to members and visitors a general overview of the Fablab's planning.

Please note that, even logged, users won't be able to book a reservation or modify anything from this agenda: this is a read-only page.

" + enable_public_agenda: "Enable public agenda" statistics: "Statistiken" statistics_info_html: "

Aktivieren oder deaktivieren Sie das Statistik-Modul.

Wenn aktiviert, konsolidiert das Modul die Tagesdaten in der Datenbank einer leistungsstarken Analyse-Engine. Administratoren können im entsprechenden Abschnitt die erstellten Diagramme und Tabellen durchsuchen.

" enable_statistics: "Statistik-Modul aktivieren" From a70474adc9e35af2a161e12832393a2b913d6195 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 12:02:03 +0200 Subject: [PATCH 25/27] New translations app.admin.en.yml (French) --- config/locales/app.admin.fr.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config/locales/app.admin.fr.yml b/config/locales/app.admin.fr.yml index 9663c9f4e..5186b7f25 100644 --- a/config/locales/app.admin.fr.yml +++ b/config/locales/app.admin.fr.yml @@ -1167,7 +1167,7 @@ fr: confirmation_required_info: "De manière optionnelle, vous pouvez forcer les utilisateurs à confirmer leur adresse électronique avant de pouvoir accéder à Fab-manager." confirmation_is_required: "Confirmation requise" wallet_module: "module porte-monnaie" - public_agenda_module: "public agenda module" + public_agenda_module: "module d'agenda public" statistics_module: "module de statistiques" upcoming_events_shown: "la limite d'affichage des événements à venir" general: @@ -1206,9 +1206,9 @@ fr: wallet: "Porte-monnaie" wallet_info_html: "

Le porte-monnaie virtuel vous permet d'allouer une certaine somme d'argent aux utilisateurs. Ils peuvent ensuite dépenser cet argent comment bon leur semble, dans Fab-manager.

Les membres ne peuvent pas créditer leur porte-monnaie eux-même, c'est un privilège des gestionnaires et des administrateurs.

" enable_wallet: "Activer le porte-monnaie" - public_agenda: "Public agenda" - public_agenda_info_html: "

The public agenda offers to members and visitors a general overview of the Fablab's planning.

Please note that, even logged, users won't be able to book a reservation or modify anything from this agenda: this is a read-only page.

" - enable_public_agenda: "Enable public agenda" + public_agenda: "Agenda public" + public_agenda_info_html: "

L'agenda public offre aux membres et aux visiteurs une vue générale du planning du FabLab.

Veuillez noter que, même connectés, les utilisateurs ne pourront ni réserver ni modifier quoi que ce soit depuis cet agenda : il s'agit d'une page en lecture seule.

" + enable_public_agenda: "Activer l'agenda public" statistics: "Statistiques" statistics_info_html: "

Activer ou désactiver le module de statistiques.

Si activé, chaque nuit, les données de la journée qui vient de s'écouler seront consolidées dans la base de données d'un puissant moteur d'analyse. Ensuite, chaque administrateur pourra parcourir les tableaux et graphiques statistiques dans la section correspondante.

" enable_statistics: "Activer les statistiques" From 8358826afc9ba1f871a3e92ce5d1e877c06c0b4e Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 12:19:12 +0200 Subject: [PATCH 26/27] added public_agenda_module to fixtures --- test/fixtures/history_values.yml | 163 ++++++++++++++++--------------- test/fixtures/settings.yml | 5 + 2 files changed, 91 insertions(+), 77 deletions(-) diff --git a/test/fixtures/history_values.yml b/test/fixtures/history_values.yml index bb58ffe2e..a6099c563 100644 --- a/test/fixtures/history_values.yml +++ b/test/fixtures/history_values.yml @@ -45,7 +45,7 @@ history_value_4: value: fab_manager created_at: '2018-12-17 11:23:01.572468' updated_at: '2021-05-31 15:00:35.718150' - footprint: bf38096a8a4223534da1b393c21866da6eabb951635b5575b9987f8a5983ae4b + footprint: 18bd852ed1070b3305fd2f45ae68688ffc8391b555778949dbf717aaee8f90dd invoicing_profile_id: 1 history_value_5: @@ -85,7 +85,7 @@ history_value_7: L''équipe du Fab Lab.

' created_at: '2018-12-17 11:23:01.588478' updated_at: '2021-05-31 15:00:35.767955' - footprint: 818f300cad937576887a0154584243803a0ddd25070e11f0d059f14b5ed291db + footprint: 5f680f87a44d7cf1f7cfedfcf235b0a99e44e30ab2cb413372366d8cab4d3d5e invoicing_profile_id: 1 history_value_9: @@ -94,7 +94,7 @@ history_value_9: value: iVBORw0KGgoAAAANSUhEUgAAAG0AAABZCAYAAAA0E6rtAAAACXBIWXMAAAsTAAALEwEAmpwYAAA57WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTctMDEtMDNUMTE6MTg6MTgrMDE6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNy0wNi0wNlQxNTo1NjoxMiswMjowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTctMDYtMDZUMTU6NTY6MTIrMDI6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6MmYwMTE5MTMtODI5NS0zOTQ0LWJmZjYtMTY5ZTNhZTQ5OThlPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6ZGU3ZGE1MmYtNGFiZi0xMWU3LTljODAtYWJjY2ZlM2JkNzdmPC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6YTE5NTAzOTAtOGQwOS0zMzQ3LWFkNGQtMzkyNDQ2YjRiNWJiPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOmExOTUwMzkwLThkMDktMzM0Ny1hZDRkLTM5MjQ0NmI0YjViYjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNy0wMS0wM1QxMToxODoxOCswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDoyZjAxMTkxMy04Mjk1LTM5NDQtYmZmNi0xNjllM2FlNDk5OGU8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTctMDYtMDZUMTU6NTY6MTIrMDI6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTA5PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjg5PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz7jSvdMAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAACL8SURBVHja7J15nB5Ftfe/VdXLsy8zk5lM9hASsrDKImgiuyCL7ILgq4KKu9flivuCiKjoFeWqCCoKQpTLIsiOrBqI5Bo2IQsJ2ZPJZPZn7ae7q94/+kkyQzIhExKSwVufT08mz3RX91Onzjm/86tTp4Vh+9oKYCFQA/YlThaHB+jlBmxuIcdyesmQQVAixELjYOPRSo25KDoJMdQ4mjTLKNFInBUENOGzEoc4vphEYnwVe4KNPdmgJoMeKxAjDSYnEAnABgSgo0cxZQNdINYJ9CqfcJmAxQaWpulZW0GZEI9RJHgcRYDmEKCIxQbKOLhoYF9COrDoJsQGRpNhPj20U+Xs+g0Ha712jKXpRhwdsrObhcAIQ61apeZ7xJXiQa+IxRvQNo5yWP/dABpDI8nRAn/mQcTfHmJN82GqTTjGECLw61fp+tn9ezObfhcIQAIKGwlIA2JlmRELfbz5LvajFeSTEJR0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 created_at: '2018-12-17 11:23:01.596760' updated_at: '2021-05-31 15:00:35.785632' - footprint: eb5786adc7ce35b66489a84a3c5e1fadbe473f68161e6417d27d5df38ed12e69 + footprint: 7c12bc5ef224719d5f2d1b70f6ae11ff1084e2827bd1a832ee33c492f5ba7903 invoicing_profile_id: 1 history_value_10: @@ -103,7 +103,7 @@ history_value_10: value: YYMMmmmX[/VL]R[/A] created_at: '2018-12-17 11:23:01.603733' updated_at: '2021-05-31 15:00:35.801133' - footprint: 415e133e7426ba4d442edc83b8091888c9c2a5350981e8c2be8fd84c3eb80e14 + footprint: 82424423a180ef69ffe18984abd33ac5e3b0017ffd15d7e22e17fd3ab0210865 invoicing_profile_id: 1 history_value_11: @@ -112,7 +112,7 @@ history_value_11: value: 'true' created_at: '2018-12-17 11:23:01.607174' updated_at: '2021-05-31 15:00:35.817977' - footprint: '06248f3ed99242d8b2588f97cbdc97732fa4e752912f601df70699f9f7a8919a' + footprint: c6aa1b83704e11c18d326f5df2349e9041de927cda49788d42cba893a48514b2 invoicing_profile_id: 1 history_value_12: @@ -121,7 +121,7 @@ history_value_12: value: INMEDFABLAB created_at: '2018-12-17 11:23:01.610103' updated_at: '2021-05-31 15:00:35.895060' - footprint: ea02f4452b07542799e576925ac9f9ee563cb5520de6e57861ba7be8a7cb3993 + footprint: f79a8336b722a3ac5a7bf59c1b0e9aa6aaa934ed898306c9c47a905bab61ddb6 invoicing_profile_id: 1 history_value_13: @@ -130,7 +130,7 @@ history_value_13: value: nnnnnn-MM-YY created_at: '2018-12-17 11:23:01.615671' updated_at: '2021-05-31 15:00:35.926928' - footprint: e090b8e07b36addc29f8d479b3d8e756aadbc12005cd6ad920175cbce1d37cf1 + footprint: 7a6264b7a419253548d01411b1a456db3a89c1126afd719f72c8beaf53c21c2d invoicing_profile_id: 1 history_value_14: @@ -139,7 +139,7 @@ history_value_14: value: 'false' created_at: '2018-12-17 11:23:01.618886' updated_at: '2021-05-31 15:00:35.951174' - footprint: a1681dc7ed8d92782d6ddba98ea6c80e726deff845bd40678b310b5bc63e0c58 + footprint: cf32967f739a60a462bd288d7a47cc2fc6ef693a28c900bbdff46ee9a9a07e11 invoicing_profile_id: 1 history_value_15: @@ -148,7 +148,7 @@ history_value_15: value: '20.0' created_at: '2018-12-17 11:23:01.625154' updated_at: '2021-05-31 15:00:35.967958' - footprint: 5f179582e43d783803d5f2ef2dce87253dd95341fa8bd2431cade4ca80200a46 + footprint: 803a61518d27513c0443a22279a769f412d41db1ffab6142d425abd0a8579d9f invoicing_profile_id: 1 history_value_16: @@ -157,7 +157,7 @@ history_value_16: value: Notre association n'est pas assujettie à la TVA created_at: '2018-12-17 11:23:01.632653' updated_at: '2021-05-31 15:00:35.984439' - footprint: 92b2e93fc98fe045de4d2d889068c162ee9806e1862e91c45e00e7184a73afe0 + footprint: 55e22dcd89691bffbfa95c265dd24ef35e07c62fac6e6f1840663c3e998503a7 invoicing_profile_id: 1 history_value_17: @@ -177,7 +177,7 @@ history_value_18: value: '1970-01-01 08:00:00' created_at: '2018-12-17 11:23:01.639995' updated_at: '2021-05-31 15:00:36.018287' - footprint: c69790b104c8c6eeac6f2a7a183f6fb9fbb6355b8338b91324cea23b5239d329 + footprint: 5905fc634b5cedc240c37dc18e62724d7d9abd575771c364863ab506fbcdf416 invoicing_profile_id: 1 history_value_19: @@ -186,7 +186,7 @@ history_value_19: value: '1970-01-01 23:59:59' created_at: '2018-12-17 11:23:01.643667' updated_at: '2021-05-31 15:00:36.035246' - footprint: 190dd6c99ee1fd3f63114837392903c8e7ca65398745df117cdfb7babd40fa7d + footprint: 143a551e8b8de5384c620274e831fced32b7b7d985ccf40d440b67549c13042e invoicing_profile_id: 1 history_value_20: @@ -195,7 +195,7 @@ history_value_20: value: 'true' created_at: '2018-12-17 11:23:01.647950' updated_at: '2021-05-31 15:00:36.051310' - footprint: 7d58f294c401985c3bcb29e874b62f3a50ebdc5621489dde78ff51dc800e9415 + footprint: 95501effa7a2073ffaca9e8ec407fc178988ba4499faea96cfd793e3f495fe0b invoicing_profile_id: 1 history_value_21: @@ -204,7 +204,7 @@ history_value_21: value: '24' created_at: '2018-12-17 11:23:01.650611' updated_at: '2021-05-31 15:00:36.068779' - footprint: c5aa44060b1581338ef85a7245fc738471bcbb0b675b3cdda9ca30f9baef1a2e + footprint: 46757a1c25a8229fbecb3b6ff82d8fc8da245cb5cb920405bb7cb50fd4196505 invoicing_profile_id: 1 history_value_22: @@ -213,7 +213,7 @@ history_value_22: value: 'false' created_at: '2018-12-17 11:23:01.653441' updated_at: '2021-05-31 15:00:36.084483' - footprint: e92ac2440ede19347cd455d1f81414e3271549ee7ab9872c47adf920984bfdc7 + footprint: 290e6d49ad1f96f64342b16dbb3a475deebef1088c301a0f8cb0df4528ed209d invoicing_profile_id: 1 history_value_23: @@ -222,7 +222,7 @@ history_value_23: value: '24' created_at: '2018-12-17 11:23:01.655971' updated_at: '2021-05-31 15:00:36.101131' - footprint: 83600acc4173c93e90a68bd38a9f747509ff6f987f90fec47eb6bf1434b305b0 + footprint: 1b55d6e3cf85d113ce2758f580b99bbb06be5135ad6d1e0d88d07ceb3b266910 invoicing_profile_id: 1 history_value_24: @@ -231,7 +231,7 @@ history_value_24: value: "#cb1117" created_at: '2018-12-17 11:23:01.658780' updated_at: '2021-05-31 15:00:36.119229' - footprint: e158df6fcc48f10fd6797a823759d7780fdf7099ddbccad591bd221b9a30c3e6 + footprint: bd9bf053e6c5808250ac1c3c52f294ce659826e794255c399087dd386331efaa invoicing_profile_id: 1 history_value_25: @@ -240,7 +240,7 @@ history_value_25: value: "#ffdd00" created_at: '2018-12-17 11:23:01.666698' updated_at: '2021-05-31 15:00:36.159487' - footprint: 4d7d4f2319f1f784adf5453558c1d4bd1c019eece27d3379df8e2192654634cc + footprint: 951d7020b222f864b93f5002a435415bc5e8f13ba29826998300c0807ba39a78 invoicing_profile_id: 1 history_value_26: @@ -260,7 +260,7 @@ history_value_27: value: Fab Lab de La Casemate created_at: '2018-12-17 11:23:01.724770' updated_at: '2021-05-31 15:00:36.196140' - footprint: 76f95e6a1ae7ecb43aef2075ce20d6d63316f709fd74964aa18b17c71215196f + footprint: 72ba74e249744233139251bfd9481ce3e44ab586d3424eacdfd8b4f1c042f9bb invoicing_profile_id: 1 history_value_28: @@ -269,7 +269,7 @@ history_value_28: value: male created_at: '2018-12-17 11:23:01.728465' updated_at: '2021-05-31 15:00:36.228419' - footprint: 590ffe38616993f19972b90be909845e99a49c45a252c039168c000e1395bd02 + footprint: d46f86b720fad7226072cb3f56281df70e4d78b620630ccb1440c7ed84346132 invoicing_profile_id: 1 history_value_29: @@ -278,7 +278,7 @@ history_value_29: value: created_at: '2018-12-17 11:23:01.724770' updated_at: '2021-05-31 15:00:36.296904' - footprint: c37769d58c7f9addfe4a06848a9018a979fb84d10b380dc49e8f8fe00cc120dc + footprint: 93e02e71a511d5a09f3c0fd2e2e0d29f9db3b2187ec65e39a02b667363f76c0f invoicing_profile_id: 1 history_value_30: @@ -287,7 +287,7 @@ history_value_30: value: '3' created_at: '2018-12-17 11:23:01.724770' updated_at: '2021-05-31 15:00:36.317666' - footprint: fdee0b4c6408345ab1fc0fab7d11533fa519c181941804d02e51ce968146131c + footprint: 37ba96352a0be161fd7f1b342c2de7ab6da21b8abfb1772856ddd5a00ee82517 invoicing_profile_id: 1 history_value_31: @@ -296,7 +296,7 @@ history_value_31: value: '1' created_at: '2018-12-17 11:23:01.724770' updated_at: '2021-05-31 15:00:36.343513' - footprint: b6277c53553c27bbd15a242adb1611fda19eb7d3dc049ff7b2c60cbb3e7662ba + footprint: d01369ca019e03aa1e83118cabb3bf0f1b8f2c3532865f1c8828d03c0dbcb428 invoicing_profile_id: 1 history_value_32: @@ -305,7 +305,7 @@ history_value_32: value: f created_at: '2018-12-17 11:23:01.724770' updated_at: '2021-05-31 15:00:36.361506' - footprint: 1b81675a112e1647267bde9452eb6aed2925f661b21c5319acb7b7a97dfbdafe + footprint: 0c23694d5590b3cdf6ed995476e3392dfee7e82eb4836e38e04266b05896e99c invoicing_profile_id: 1 history_value_33: @@ -314,7 +314,7 @@ history_value_33: value: default created_at: '2018-12-17 11:23:01.724770' updated_at: '2021-05-31 15:00:36.385235' - footprint: 4dcbc36dbaeb6c62000aaa5affae1e19cbb8a207cfde546fd4e1f054afd9b69a + footprint: 2bcaca605919534335d0032086b38bb31e7aadec39058d22d7e5f365871e11d7 invoicing_profile_id: 1 history_value_34: @@ -323,7 +323,7 @@ history_value_34: value: A propos de Fab-manager created_at: '2018-12-31 10:22:25.116369' updated_at: '2021-05-31 15:00:36.403791' - footprint: 8115a13fd79788da96e1c55875b4e1e7971baa938ace50e81e4e1e4cee186a60 + footprint: 7b96125008785cb8ce5c725083a3c20bfa1161243c53765382092285bb772b54 invoicing_profile_id: 1 history_value_35: @@ -333,7 +333,7 @@ history_value_35: d'emploi." created_at: '2018-12-31 10:22:25.116369' updated_at: '2021-05-31 15:00:36.417809' - footprint: 03f1e37492cd459b14143006941a3c6dd72a1d24f7367d46496da24a132f6b6d + footprint: 9bbdbe6835a9d5e4dcadd4222525f2fa0657b67f125592ee76179ecf45799f72 invoicing_profile_id: 1 history_value_36: @@ -342,7 +342,7 @@ history_value_36: value: t created_at: '2018-12-31 10:22:25.116369' updated_at: '2021-05-31 15:00:36.434827' - footprint: 1ced1c5fc617dac75fd3e1a94a8edc035470786c68b49da138cd9118723f8f0b + footprint: 74a9fea2124a6250d215499ed7d28f2ec54f8cbbc355cedc3ac13f1380ec0150 invoicing_profile_id: 1 history_value_37: @@ -351,7 +351,7 @@ history_value_37: value: '24' created_at: '2018-12-31 10:22:25.116369' updated_at: '2021-05-31 15:00:36.451189' - footprint: bd8211c3a8a63d397085d48bb0121bdc51b40b2c7e5824d58fd23f6feb414204 + footprint: 5ae4b7e440c917f38118f8a11d7d5934a63374983e7707f873555e59c58a8b22 invoicing_profile_id: 1 history_value_38: @@ -371,7 +371,7 @@ history_value_38: afin de prendre connaissance de ses éventuelles modifications.

" created_at: '2018-12-31 10:22:25.116369' updated_at: '2021-05-31 15:00:36.468263' - footprint: 1c5f2f5f596e7a735e2ce1085cc51e41e20c250051ff7591b3e4232bff9bf679 + footprint: fc3895300ab141d1b3fc446e02b452cf5ebea06c6b810cefaba21e1309de8f39 invoicing_profile_id: 1 history_value_39: @@ -380,7 +380,7 @@ history_value_39: value: '530' created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.484622' - footprint: 6705cd67e864f65c5ed6c5e207a4d2267830b8ffb89a44f0a20ef02431342269 + footprint: 20878d5d457368686597fa041584130d603c828a873aca26a1b953b86e992f49 invoicing_profile_id: 1 history_value_40: @@ -389,7 +389,7 @@ history_value_40: value: '5801' created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.502632' - footprint: d53f5b5b4bb52d65d21ba105c71ae64f42d1193d49ba202c6dee6c672eefc15d + footprint: ede5cb6a44856ef2271110283094daa2b4a1656287f7888ca5a99fb9a2dff8bf invoicing_profile_id: 1 history_value_41: @@ -398,7 +398,7 @@ history_value_41: value: Client card created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.518127' - footprint: 371ade05448e6ba0d45288152cd8f04520203570a5b503072fe0fd98becd6274 + footprint: bad61ed94921d492052622f6da1e7b1611c8abee4d0e3260229f0bf23bc24f70 invoicing_profile_id: 1 history_value_42: @@ -407,7 +407,7 @@ history_value_42: value: '5802' created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.534681' - footprint: 9e9627351496aa3b81fcf9a2a186a1a244aa018c66690147dc77cb13110f0d17 + footprint: daffc10930507102df7bc0dedce9be773b0483ed7d7e1bf3524a6cb2408ca745 invoicing_profile_id: 1 history_value_43: @@ -416,7 +416,7 @@ history_value_43: value: Client wallet created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.553577' - footprint: ab8e9b3ded4bed5ac11f14e5d794519877e4887ac2f1c7e609406cf06f29f553 + footprint: 430cdf800a4e84f0385ebbdb7b48a107450c618b9c49b9b97016e80047407036 invoicing_profile_id: 1 history_value_44: @@ -425,7 +425,7 @@ history_value_44: value: '5803' created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.576371' - footprint: 3fc58d50393f9d178200abe5adfd2df72e312dc91339985b1d94edcf17a1804d + footprint: fc4dbe201e24a9f3a1150853b191d84b23d79ed043811387613ef30319551e76 invoicing_profile_id: 1 history_value_45: @@ -434,7 +434,7 @@ history_value_45: value: Client other created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.593026' - footprint: 76ec5b696c4537fd5af2d0906376479d56598b0f515d2c13397c7205c43b9793 + footprint: 383ef2b5ad5aaa5e014893e0ca8f7bdcd13d565a3bfd97446e5543e8d0dca941 invoicing_profile_id: 1 history_value_46: @@ -443,7 +443,7 @@ history_value_46: value: '4091' created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.672119' - footprint: 1dad73d081d3df136530a6f45833d645c6185dfe3190a724c8f6d0fed88704cc + footprint: 160a865d5709e9b365b1e18fa930e9069cab3b4e3c23e7d79cd0fdeee758539b invoicing_profile_id: 1 history_value_47: @@ -452,7 +452,7 @@ history_value_47: value: Wallet credit created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.693696' - footprint: 3b55f0c50e8cd6728340ab6e146818ba800d4dd29aa5a6e95d5da2d984ebb377 + footprint: 5399df590335e6c3016dc156d70c0dba89c18c2638fd36912b9de2b469ee2096 invoicing_profile_id: 1 history_value_48: @@ -461,7 +461,7 @@ history_value_48: value: '445' created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.710257' - footprint: 3e10fbcf4fe7cf5eb112a1056865931bf46f24ac21da6313cb4400cb4b2dc391 + footprint: f585a1b670e6cb1632398360513793ce1f459f49884f971ca7f36594bb67fa70 invoicing_profile_id: 1 history_value_49: @@ -470,7 +470,7 @@ history_value_49: value: VAT created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.726521' - footprint: 63a66401804d8a4fbf3177a4eb426623c15608af7f9b09e80e0bbed9b1e1e3b2 + footprint: 39ce7d4f81ca7570444c28f1439a38ca4c3b7b7669202a9db7caa3dcf7d96c16 invoicing_profile_id: 1 history_value_50: @@ -479,7 +479,7 @@ history_value_50: value: '7061' created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.751938' - footprint: 89e852942f9b44775ee0c3b0e561c2d886b9dfc9ddb95b18c5a6137722d868e4 + footprint: a378c9f8b31b18f8e2263cc1cda13f5f36945faca5964b9267c605bb89f47805 invoicing_profile_id: 1 history_value_51: @@ -488,7 +488,7 @@ history_value_51: value: Subscription created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.838598' - footprint: 169403ba2131226cf53b2c06ef2cef29570c22eb955bc263af6112d051f06617 + footprint: c130333282240854ea012e308e6a7eab701fa49182b0066eb308cbe71d2f4746 invoicing_profile_id: 1 history_value_52: @@ -497,7 +497,7 @@ history_value_52: value: '7062' created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.872288' - footprint: 9612c3c2b51c32d8827f03dbf76211f1595ca940b92837cad1ecde00c35543a6 + footprint: 0ee671e962f92a3af95538fdd65a64ff410b208ab790c4e6f7b0a9f5a13dc1a2 invoicing_profile_id: 1 history_value_53: @@ -506,7 +506,7 @@ history_value_53: value: Machine reservation created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.904414' - footprint: 36dc3394e404aa37bb974a4c97945c6ba26a1721dbf12d269a48c7a94dc0490d + footprint: ad09bac8c58754444a9970108d613aefaeceed540609688f5668c68ca5c03531 invoicing_profile_id: 1 history_value_54: @@ -515,7 +515,7 @@ history_value_54: value: '7063' created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.930713' - footprint: 963edffba941ff733926b4cb6c5f439d9c348463fb4391bb6f0081f246eaa9bc + footprint: 89f17add783f9977c4b13bc22f5776d0427c3d9af8c83206af57de7c72c153b0 invoicing_profile_id: 1 history_value_55: @@ -524,7 +524,7 @@ history_value_55: value: Training reservation created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.955492' - footprint: f6fc678562339ce277e855f3e83ab624fc3d8ed36097323417dc460728b7efdc + footprint: f2e20f936e3fc917bc82e97adb321f957c2cd6ac992f3223ffe2be529ea1649f invoicing_profile_id: 1 history_value_56: @@ -533,7 +533,7 @@ history_value_56: value: '7064' created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.977369' - footprint: e26264ccf8cb9d99b4cda6df9924a73af3f85889b48b63e5c1571e4c3590985b + footprint: 5ce909aa92740dbd65647ff3a5d5fdc75ad6c2a02b5fa9bbeea1aa27f907416a invoicing_profile_id: 1 history_value_57: @@ -542,7 +542,7 @@ history_value_57: value: Event reservation created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.993279' - footprint: 8b59de6703a1c44be6016b465db5c62c0b879884c57d2abc467f0615240c1121 + footprint: ed7ecf389b9560728ce43257bef442a2404f463ebbc0fbaeaad05f113cca21df invoicing_profile_id: 1 history_value_58: @@ -551,7 +551,7 @@ history_value_58: value: '7065' created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:37.010029' - footprint: bd46083a2bcc46ce9a417bb25354df0cb137822a426c0c9ca20705d61bce8457 + footprint: 6a4d523d8c2dcde1e8022015231d1da44532323f707021fe13e0353c08846f97 invoicing_profile_id: 1 history_value_59: @@ -560,7 +560,7 @@ history_value_59: value: Space reservation created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:37.027157' - footprint: 236ec67c6b4ff1272e3c4a6dbbdc12a900c9ca62e9f408beb51814587b1f88ea + footprint: d92dcf0fa46d32c84c8ab6bdc66928d9e938d4f79a1e188eb5260b56f600f8db invoicing_profile_id: 1 history_value_60: @@ -588,7 +588,7 @@ history_value_60:
created_at: '2020-03-25 09:24:09.016676' updated_at: '2021-05-31 15:00:37.043394' - footprint: 9f5d5d9c0fc4bb54cebf6928821ef5e63b5151d9a65810314ac1ad665ed35d92 + footprint: 4e882aea02b7fdb3b1eae71f451513e7375118ae26ea709ffa09056ec249bb65 invoicing_profile_id: 1 history_value_61: @@ -597,7 +597,7 @@ history_value_61: value: '60' created_at: '2020-05-22 15:22:08.254410' updated_at: '2021-05-31 15:00:37.059981' - footprint: 675605fecc999596202a2f531453f42dedb3254bb91bcde5e0cba9a0f800ee93 + footprint: 57c0ed1d28d4b500ea05d732ab976f5aa95f9c15924b7a13fa6935f435be1909 invoicing_profile_id: 1 history_value_62: @@ -606,7 +606,7 @@ history_value_62: value: 'true' created_at: '2020-06-01 11:12:21.255550' updated_at: '2021-05-31 15:00:37.078041' - footprint: 804c83233f933d0928a67958a3a9fc8bacc435b46eabd9d755016132b86f2ff2 + footprint: 5f46debc9978342faa947bd6aa2849d887e391b281131c1cdc8cc71aee2fc405 invoicing_profile_id: 1 history_value_63: @@ -615,7 +615,7 @@ history_value_63: value: 'true' created_at: '2020-06-01 11:12:21.255550' updated_at: '2021-05-31 15:00:37.121791' - footprint: ff6251e103143d45bf911e444a1b084701d5f631389cf3cc855d228e245be390 + footprint: dad09e0bfae64911e10203395af0e95fdc50dde56fc38da38a65fbe3c03ba095 invoicing_profile_id: 1 history_value_64: @@ -624,7 +624,7 @@ history_value_64: value: once created_at: '2020-06-01 11:12:21.255550' updated_at: '2021-05-31 15:00:37.143385' - footprint: 93d86a4c99b9a33304e9b39266d96d2d048badd537bd443b92b9cfd6f03548a7 + footprint: 6db8d46c843db553945d339d3f113a14d814f2001168b67988a479154bb15252 invoicing_profile_id: 1 history_value_65: @@ -633,7 +633,7 @@ history_value_65: value: noreply@fab-manager.com created_at: '2020-06-01 11:12:21.255550' updated_at: '2021-05-31 15:00:37.163510' - footprint: 39b0af95095e06459166e6327f0a170698918f1b53aecbcb6960a599e9d6701d + footprint: d3084c6d7c6b28ead038f3573c73e4c4280d6f095cbba22d83604736ce51cc2c invoicing_profile_id: 1 history_value_66: @@ -642,7 +642,7 @@ history_value_66: value: 'true' created_at: '2020-06-08 17:12:16.846525' updated_at: '2021-05-31 15:00:37.193791' - footprint: 87f5dd83a6559d9e1ed8650342ce20bebe1c33bb51ed10098425316ec96e1efc + footprint: c05878daaa7a94c0cb37905bcb136a496cf0d164c051a5965a0167ad69bda425 invoicing_profile_id: 1 history_value_67: @@ -651,7 +651,7 @@ history_value_67: value: pk_test_aScrMu3y4AocfCN5XLJjGzmQ created_at: '2020-06-08 17:12:16.846525' updated_at: '2021-05-31 15:00:37.210049' - footprint: da7ee4f56775d9127303cf3b6867aeb90a663e85d0b607ff1e3738f12c72d01e + footprint: 4984215605d9f30ac4f9594bc0d552d6b5e280f650801399b698aa43188001a5 invoicing_profile_id: 1 history_value_68: @@ -660,7 +660,7 @@ history_value_68: value: sk_test_mGokO9TGtrVxMOyK4yZiktBE created_at: '2020-06-08 17:12:16.846525' updated_at: '2021-05-31 15:00:37.280668' - footprint: 394d64c697b4025410eb7c60286badf50e76b54c461a5734a41b65bd0734ec08 + footprint: 48db504877d3329e39d1e816b243629c44b47be9f2837e2e4af4f30ca7cbd3e8 invoicing_profile_id: 1 history_value_69: @@ -669,7 +669,7 @@ history_value_69: value: usd created_at: '2020-06-08 17:12:16.846525' updated_at: '2021-05-31 15:00:37.302102' - footprint: 7e721af60be5ca521dcc21dd1f687062deabbf90e5adc14158872da3b4b58bbe + footprint: 7211260d30ec9d95dd6a7ac8e7a838b2f5898de5968cec897d26bf0a56dfdc53 invoicing_profile_id: 1 history_value_70: @@ -678,7 +678,7 @@ history_value_70: value: FabManager_invoice created_at: '2020-06-15 10:04:06.216541' updated_at: '2021-05-31 15:00:37.318496' - footprint: 6da5b0623d0f4cc091e09ffb0af687e5693103069783de400d14fa7afc0b40ba + footprint: d124d5d58b2fbed18998fb1a7401a0539d75bc920dde8360743cf0dc08976ac5 invoicing_profile_id: 1 history_value_71: @@ -687,7 +687,7 @@ history_value_71: value: 'false' created_at: '2020-06-15 10:04:06.216541' updated_at: '2021-05-31 15:00:37.344188' - footprint: 903b26f65fe1b3180dd0d8b29c2c59eb04e569c0f8140d5e0f28d90cf3a47fe3 + footprint: 8c09996f01a428e949e4fa4bfae71c96d1c6b4c4a10d1902cc65812c7eb458b4 invoicing_profile_id: 1 history_value_72: @@ -696,7 +696,7 @@ history_value_72: value: 'true' created_at: '2020-06-15 10:04:06.216541' updated_at: '2021-05-31 15:00:37.363871' - footprint: 11da784cad45332300eb73c815c1d8d677835e5615eab8e8ad6ded065a2a8309 + footprint: 26f881c216c0a594cf374f80b69678286895b029a5fee6fbf8d7d659900a233d invoicing_profile_id: 1 history_value_73: @@ -705,7 +705,7 @@ history_value_73: value: 'true' created_at: '2020-06-17 10:48:19.002417' updated_at: '2021-05-31 15:00:37.393731' - footprint: e6359c30093db9ba8aeee8e6ca0b248b2de626e3e3f9feb87a41eda483f2a320 + footprint: 4164041cd3be3b4dab97e2e05a474268b3de72bae719b2bbcbe1bff00f8d171d invoicing_profile_id: 1 history_value_74: @@ -714,7 +714,7 @@ history_value_74: value: until_start created_at: '2020-04-15 14:38:40.000421' updated_at: '2021-05-31 15:00:37.410025' - footprint: 6acf15ed45264b89f24f2ae69083cb15267b39999333d3ead5e47eb6bf43d2a8 + footprint: c2fe239e922b92a3b43ec5e66abe3920df43ac7e0c4abc173f27f90402c5d69e invoicing_profile_id: 1 history_value_75: @@ -723,7 +723,7 @@ history_value_75: value: FabManager_paymentSchedule created_at: '2020-04-15 14:38:40.000421' updated_at: '2021-05-31 15:00:37.426690' - footprint: 14acebf5826eeacbbdc909b6493cfa6d3c54eec353a3afb6d3464763ad825235 + footprint: 49fd4ced3dc924d2a2f366be7e9c76eada6822926ea48174735c2308eb0a13e3 invoicing_profile_id: 1 history_value_76: @@ -732,7 +732,7 @@ history_value_76: value: 'true' created_at: '2020-04-15 14:38:40.000421' updated_at: '2021-05-31 15:00:37.443392' - footprint: 632ccda80572b2007a58348687c9c039c886fc546410b9d2ed42b88b67cc14d0 + footprint: 1ed04193b188b80f15fc661cbb18171085cd596d100af973080560d3507f008a invoicing_profile_id: 1 history_value_77: @@ -741,7 +741,7 @@ history_value_77: value: 'false' created_at: '2020-04-15 14:38:40.000421' updated_at: '2021-05-31 15:00:37.460191' - footprint: e20b25798f378ede57e81575f4e49a72381a02d7fb6704914e9eec4f2c4dc694 + footprint: c1c405081f2c5f18d8ee38c2932b44b04904b1deafc96f4412ee3e0dcb006a52 invoicing_profile_id: 1 history_value_78: @@ -750,7 +750,7 @@ history_value_78: value: stripe created_at: '2020-04-15 14:38:40.000421' updated_at: '2021-05-31 15:00:37.476925' - footprint: 5b41d5f35a871e35554b236ac7ea4257c104d18a33ae69e840fb5f4f60fe4907 + footprint: 4825ae0d2e6fe1146a16141e9deac8b61e22bea5fa4ce9c5f1490766781a9d6b invoicing_profile_id: 1 history_value_79: @@ -759,7 +759,7 @@ history_value_79: value: 69876357 created_at: '2020-04-15 14:38:40.000421' updated_at: '2021-05-31 15:00:37.503801' - footprint: 55d2a2354a3a12ed7bba0a3854f9f4559aed546c81040fbe35cd94d80b8bb811 + footprint: 86ef63d061ce61d9aff61c1ef912586b415a09a2fe7102616af29038cdfa1da4 invoicing_profile_id: 1 history_value_80: @@ -768,7 +768,7 @@ history_value_80: value: testpassword_DEMOPRIVATEKEY23G4475zXZQ2UA5x7M created_at: '2020-04-15 14:38:40.000421' updated_at: '2021-05-31 15:00:37.518625' - footprint: a0f076a64824b3473c60dacd18892da21d14830dedd7bb959c442faa59d1313d + footprint: 42c94550c236ffc7cf15dda0b6031b7c33c06b606e0cec00419e31a1d566c2f9 invoicing_profile_id: 1 history_value_81: @@ -777,7 +777,7 @@ history_value_81: value: https://api.payzen.eu created_at: '2020-04-15 14:38:40.000421' updated_at: '2021-05-31 15:00:37.535175' - footprint: 2d0d3090a7976a5b41fb4ccaa1e87e8ee61116813691280f3a2f19c574f0bea5 + footprint: 3fe3bf39caf3011b00cc00ce5b5d2a05ab1f16956704689dbf39f85a350a4fea invoicing_profile_id: 1 history_value_82: @@ -786,7 +786,7 @@ history_value_82: value: 69876357:testpublickey_DEMOPUBLICKEY95me92597fd28tGD4r5 created_at: '2020-04-15 14:38:40.000421' updated_at: '2021-05-31 15:00:37.551956' - footprint: 9fbe6418520003f7dc9e37c5a9a3256adc4963d7a5d2402ded929d4154d17a81 + footprint: 6757d18bcff2cb3bb832f57bc1c7078d982310065e367f580c4379ddf6caee91 invoicing_profile_id: 1 history_value_83: @@ -795,7 +795,7 @@ history_value_83: value: 83daf5e7b80d990f037407bab78dff9904aaf3c19 created_at: '2020-04-15 14:38:40.000421' updated_at: '2021-05-31 15:00:37.568426' - footprint: b0d7f03eff084c39cb87dbf01e3d05f217203d776b0e01ce002a55b426abfe23 + footprint: 881e9b272a657bb515312f625b5049248d7784eee24316c8490bf08be9d98bf0 invoicing_profile_id: 1 history_value_84: @@ -804,7 +804,7 @@ history_value_84: value: EUR created_at: '2020-04-15 14:38:40.000421' updated_at: '2021-05-31 15:00:37.593645' - footprint: 3545edef1b4367afd0d36742e30e35832e56c32882f3876dba76fc69211950db + footprint: 1e62d53c0704eeebf40caa8277b8bf491cd3e602f0689412d202105c6777d43e invoicing_profile_id: 1 history_value_85: @@ -813,5 +813,14 @@ history_value_85: value: YYMMmmmX[/VL]R[/A]S[/E] created_at: '2020-12-14 14:37:35.615124' updated_at: '2021-05-31 15:00:37.610104' - footprint: f67be79a6558146d67c1e14c7f7db4c248a2cb8effa7de41952dc3f92aa2bd8b + footprint: 424bda69956b6d082c5f0075f7f753bbb0a87a8b44b3e69b5fe9a20004be1585 + invoicing_profile_id: 1 + +history_value_86: + id: 86 + setting_id: 85 + value: true + created_at: '2021-06-15 12:05:21.513651' + updated_at: '2021-06-15 12:05:21.513651' + footprint: 350ca0033f3e65b6e8186dbb0545b55ecb3768e1a08501549b81d95e34809440 invoicing_profile_id: 1 diff --git a/test/fixtures/settings.yml b/test/fixtures/settings.yml index 804170395..ff21c31e7 100644 --- a/test/fixtures/settings.yml +++ b/test/fixtures/settings.yml @@ -497,3 +497,8 @@ setting_84: created_at: 2020-04-15 14:38:40.000421500 Z updated_at: 2020-04-15 14:38:40.000421500 Z +setting_85: + id: 85 + name: public_agenda_module + created_at: 2020-04-15 14:38:40.000421500 Z + updated_at: 2020-04-15 14:38:40.000421500 Z From 58c9927e653ce999b353a96b6a851ce0acdceb8a Mon Sep 17 00:00:00 2001 From: Sylvain Date: Tue, 15 Jun 2021 12:23:39 +0200 Subject: [PATCH 27/27] Version 5.0.4 --- CHANGELOG.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92d25d1be..a6597900b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog Fab-manager +## v5.0.4 2021 June 15 + - Ability to disable the public agenda - Display the category in the plans list - Do not display the type in the plans list diff --git a/package.json b/package.json index 4c219aa05..757730363 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fab-manager", - "version": "5.0.3", + "version": "5.0.4", "description": "Fab-manager is the FabLab management solution. It provides a comprehensive, web-based, open-source tool to simplify your administrative tasks and your marker's projects.", "keywords": [ "fablab",
{{ 'app.admin.pricing.type' | translate }} {{ 'app.admin.pricing.name' | translate }} {{ 'app.admin.pricing.duration' | translate }} {{ 'app.admin.pricing.group' | translate }} {{ 'app.admin.pricing.category' | translate }} {{ 'app.admin.pricing.price' | translate }}
{{getPlanType(plan.type)}} {{plan.base_name}} {{ plan.interval | planIntervalFilter:plan.interval_count }} {{group.name}}{{getPlanCategory(plan.plan_category_id)}} {{plan.amount | currency}}