mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2025-02-20 14:54:15 +01:00
Merge branch 'dev' for release 5.1.9
This commit is contained in:
commit
d107dd543a
@ -1,5 +1,11 @@
|
|||||||
# Changelog Fab-manager
|
# Changelog Fab-manager
|
||||||
|
|
||||||
|
## v5.1.9 2021 September 21
|
||||||
|
|
||||||
|
- Add a setting for the purchase and use of a prepaid pack is only possible for the user with a valid subscription
|
||||||
|
- Fix a bug: unable to show plan name in calendar reservations
|
||||||
|
- Fix a bug: book overlapping slot setting labal name
|
||||||
|
|
||||||
## v5.1.8 2021 September 13
|
## v5.1.8 2021 September 13
|
||||||
|
|
||||||
- Improved stripe 3D secure payment on payment schedules
|
- Improved stripe 3D secure payment on payment schedules
|
||||||
|
@ -9,6 +9,8 @@ import MachineAPI from '../../api/machine';
|
|||||||
import { Machine } from '../../models/machine';
|
import { Machine } from '../../models/machine';
|
||||||
import { User } from '../../models/user';
|
import { User } from '../../models/user';
|
||||||
import { IApplication } from '../../models/application';
|
import { IApplication } from '../../models/application';
|
||||||
|
import SettingAPI from '../../api/setting';
|
||||||
|
import { SettingName } from '../../models/setting';
|
||||||
|
|
||||||
declare const Application: IApplication;
|
declare const Application: IApplication;
|
||||||
|
|
||||||
@ -36,11 +38,17 @@ const ReserveButtonComponent: React.FC<ReserveButtonProps> = ({ currentUser, mac
|
|||||||
const [pendingTraining, setPendingTraining] = useState<boolean>(false);
|
const [pendingTraining, setPendingTraining] = useState<boolean>(false);
|
||||||
const [trainingRequired, setTrainingRequired] = useState<boolean>(false);
|
const [trainingRequired, setTrainingRequired] = useState<boolean>(false);
|
||||||
const [proposePacks, setProposePacks] = useState<boolean>(false);
|
const [proposePacks, setProposePacks] = useState<boolean>(false);
|
||||||
|
const [isPackOnlyForSubscription, setIsPackOnlyForSubscription] = useState<boolean>(true);
|
||||||
|
|
||||||
// handle login from an external process
|
// handle login from an external process
|
||||||
useEffect(() => setUser(currentUser), [currentUser]);
|
useEffect(() => setUser(currentUser), [currentUser]);
|
||||||
// check the trainings after we retrieved the machine data
|
// check the trainings after we retrieved the machine data
|
||||||
useEffect(() => checkTraining(), [machine]);
|
useEffect(() => checkTraining(), [machine]);
|
||||||
|
useEffect(() => {
|
||||||
|
SettingAPI.get(SettingName.PackOnlyForSubscription)
|
||||||
|
.then(data => setIsPackOnlyForSubscription(data.value === 'true'))
|
||||||
|
.catch(error => onError(error));
|
||||||
|
}, []);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback triggered when the user clicks on the 'reserve' button.
|
* Callback triggered when the user clicks on the 'reserve' button.
|
||||||
@ -136,8 +144,9 @@ const ReserveButtonComponent: React.FC<ReserveButtonProps> = ({ currentUser, mac
|
|||||||
*/
|
*/
|
||||||
const checkPrepaidPack = (): void => {
|
const checkPrepaidPack = (): void => {
|
||||||
// if the customer has already bought a pack or if there's no active packs for this machine,
|
// if the customer has already bought a pack or if there's no active packs for this machine,
|
||||||
|
// or customer has not any subscription if admin active pack only for subscription option
|
||||||
// let the customer reserve
|
// let the customer reserve
|
||||||
if (machine.current_user_has_packs || !machine.has_prepaid_packs_for_current_user) {
|
if (machine.current_user_has_packs || !machine.has_prepaid_packs_for_current_user || (isPackOnlyForSubscription && !currentUser.subscribed_plan)) {
|
||||||
return onReserveMachine(machine);
|
return onReserveMachine(machine);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,11 +36,15 @@ const PacksSummaryComponent: React.FC<PacksSummaryProps> = ({ item, itemType, cu
|
|||||||
const [userPacks, setUserPacks] = useState<Array<UserPack>>(null);
|
const [userPacks, setUserPacks] = useState<Array<UserPack>>(null);
|
||||||
const [threshold, setThreshold] = useState<number>(null);
|
const [threshold, setThreshold] = useState<number>(null);
|
||||||
const [packsModal, setPacksModal] = useState<boolean>(false);
|
const [packsModal, setPacksModal] = useState<boolean>(false);
|
||||||
|
const [isPackOnlyForSubscription, setIsPackOnlyForSubscription] = useState<boolean>(true);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
SettingAPI.get(SettingName.RenewPackThreshold)
|
SettingAPI.get(SettingName.RenewPackThreshold)
|
||||||
.then(data => setThreshold(parseFloat(data.value)))
|
.then(data => setThreshold(parseFloat(data.value)))
|
||||||
.catch(error => onError(error));
|
.catch(error => onError(error));
|
||||||
|
SettingAPI.get(SettingName.PackOnlyForSubscription)
|
||||||
|
.then(data => setIsPackOnlyForSubscription(data.value === 'true'))
|
||||||
|
.catch(error => onError(error));
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -127,13 +131,32 @@ const PacksSummaryComponent: React.FC<PacksSummaryProps> = ({ item, itemType, cu
|
|||||||
if (_.isEmpty(customer)) return <div />;
|
if (_.isEmpty(customer)) return <div />;
|
||||||
// prevent component rendering if ths customer have no packs and there are no packs available
|
// prevent component rendering if ths customer have no packs and there are no packs available
|
||||||
if (totalHours() === 0 && packs?.length === 0) return <div/>;
|
if (totalHours() === 0 && packs?.length === 0) return <div/>;
|
||||||
|
// render remaining hours and a warning if customer has not any subscription if admin active pack only for subscription option
|
||||||
|
if (totalHours() > 0) {
|
||||||
|
return (
|
||||||
|
<div className="packs-summary">
|
||||||
|
<h3>{t('app.logged.packs_summary.prepaid_hours')}</h3>
|
||||||
|
<div className="content">
|
||||||
|
<span className="remaining-hours">
|
||||||
|
{t('app.logged.packs_summary.remaining_HOURS', { HOURS: totalHours(), ITEM: itemType })}
|
||||||
|
{isPackOnlyForSubscription && !customer.subscribed_plan &&
|
||||||
|
<div className="alert alert-warning m-t m-b">
|
||||||
|
{t('app.logged.packs_summary.unable_to_use_pack_for_subsription_is_expired')}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// prevent component rendering buy pack button if customer has not any subscription if admin active pack only for subscription option
|
||||||
|
if (isPackOnlyForSubscription && !customer.subscribed_plan) return <div/>;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="packs-summary">
|
<div className="packs-summary">
|
||||||
<h3>{t('app.logged.packs_summary.prepaid_hours')}</h3>
|
<h3>{t('app.logged.packs_summary.prepaid_hours')}</h3>
|
||||||
<div className="content">
|
<div className="content">
|
||||||
<span className="remaining-hours">
|
<span className="remaining-hours">
|
||||||
{totalHours() > 0 && t('app.logged.packs_summary.remaining_HOURS', { HOURS: totalHours(), ITEM: itemType })}
|
|
||||||
{totalHours() === 0 && t('app.logged.packs_summary.no_hours', { ITEM: itemType })}
|
{totalHours() === 0 && t('app.logged.packs_summary.no_hours', { ITEM: itemType })}
|
||||||
</span>
|
</span>
|
||||||
{shouldDisplayButton() && <div className="button-wrapper">
|
{shouldDisplayButton() && <div className="button-wrapper">
|
||||||
|
@ -956,14 +956,14 @@ Application.Controllers.controller('CreateEventModalController', ['$scope', '$ui
|
|||||||
});
|
});
|
||||||
$scope.tagsName = localizedList(tags);
|
$scope.tagsName = localizedList(tags);
|
||||||
if ($scope.isOnlySubscriptions && $scope.selectedPlans.length > 0) {
|
if ($scope.isOnlySubscriptions && $scope.selectedPlans.length > 0) {
|
||||||
$scope.plansName = localizedList($scope.selectedPlans);
|
$scope.plansName = localizedList($scope.selectedPlans, 'base_name');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const localizedList = function (items) {
|
const localizedList = function (items, attr = 'name') {
|
||||||
if (items.length === 0) return `<span class="text-gray text-italic">${_t('app.admin.calendar.none')}</span>`;
|
if (items.length === 0) return `<span class="text-gray text-italic">${_t('app.admin.calendar.none')}</span>`;
|
||||||
|
|
||||||
const names = items.map(function (i) { return $sce.trustAsHtml(`<strong>${i.name}</strong>`); });
|
const names = items.map(function (i) { return $sce.trustAsHtml(`<strong>${i[attr]}</strong>`); });
|
||||||
if (items.length > 1) return names.slice(0, -1).join(', ') + ` ${_t('app.admin.calendar.and')} ` + names[names.length - 1];
|
if (items.length > 1) return names.slice(0, -1).join(', ') + ` ${_t('app.admin.calendar.and')} ` + names[names.length - 1];
|
||||||
|
|
||||||
return names[0];
|
return names[0];
|
||||||
|
@ -110,6 +110,7 @@ export enum SettingName {
|
|||||||
PayZenCurrency = 'payzen_currency',
|
PayZenCurrency = 'payzen_currency',
|
||||||
PublicAgendaModule = 'public_agenda_module',
|
PublicAgendaModule = 'public_agenda_module',
|
||||||
RenewPackThreshold = 'renew_pack_threshold',
|
RenewPackThreshold = 'renew_pack_threshold',
|
||||||
|
PackOnlyForSubscription = 'pack_only_for_subscription',
|
||||||
}
|
}
|
||||||
|
|
||||||
export type SettingValue = string|boolean|number;
|
export type SettingValue = string|boolean|number;
|
||||||
|
@ -1080,7 +1080,7 @@ angular.module('application.router', ['ui.router'])
|
|||||||
"'reminder_delay', 'visibility_yearly', 'visibility_others', 'wallet_module', 'trainings_module', " +
|
"'reminder_delay', 'visibility_yearly', 'visibility_others', 'wallet_module', 'trainings_module', " +
|
||||||
"'display_name_enable', 'machines_sort_by', 'fab_analytics', 'statistics_module', 'address_required', " +
|
"'display_name_enable', 'machines_sort_by', 'fab_analytics', 'statistics_module', 'address_required', " +
|
||||||
"'link_name', 'home_content', 'home_css', 'phone_required', 'upcoming_events_shown', 'public_agenda_module'," +
|
"'link_name', 'home_content', 'home_css', 'phone_required', 'upcoming_events_shown', 'public_agenda_module'," +
|
||||||
"'renew_pack_threshold']"
|
"'renew_pack_threshold', 'pack_only_for_subscription']"
|
||||||
}).$promise;
|
}).$promise;
|
||||||
}],
|
}],
|
||||||
privacyDraftsPromise: ['Setting', function (Setting) { return Setting.get({ name: 'privacy_draft', history: true }).$promise; }],
|
privacyDraftsPromise: ['Setting', function (Setting) { return Setting.get({ name: 'privacy_draft', history: true }).$promise; }],
|
||||||
|
@ -115,7 +115,7 @@
|
|||||||
<div class="font-sbold">{{::g.name}}</div>
|
<div class="font-sbold">{{::g.name}}</div>
|
||||||
<ul class="m-n" ng-repeat="plan in g.plans">
|
<ul class="m-n" ng-repeat="plan in g.plans">
|
||||||
<li>
|
<li>
|
||||||
{{::plan.name}}
|
{{::plan.base_name}}
|
||||||
<span class="btn btn-warning btn-xs" ng-click="removePlan(plan)" ><i class="fa fa-times red"></i></span>
|
<span class="btn btn-warning btn-xs" ng-click="removePlan(plan)" ><i class="fa fa-times red"></i></span>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -149,7 +149,7 @@
|
|||||||
<div ng-repeat="group in plansClassifiedByGroup">
|
<div ng-repeat="group in plansClassifiedByGroup">
|
||||||
<div class="text-center font-sbold">{{::group.name}}</div>
|
<div class="text-center font-sbold">{{::group.name}}</div>
|
||||||
<label class="checkbox m-l-md" ng-repeat="plan in group.plans">
|
<label class="checkbox m-l-md" ng-repeat="plan in group.plans">
|
||||||
<input type="checkbox" ng-click="toggleSelectPlan(plan)" ng-model="selectedPlansBinding[plan.id]"> {{::plan.name}}</span>
|
<input type="checkbox" ng-click="toggleSelectPlan(plan)" ng-model="selectedPlansBinding[plan.id]"> {{::plan.base_name}}</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -87,7 +87,7 @@
|
|||||||
<h3 class="m-l m-t-lg" translate>{{ 'app.admin.settings.book_overlapping_slots_info' }}</h3>
|
<h3 class="m-l m-t-lg" translate>{{ 'app.admin.settings.book_overlapping_slots_info' }}</h3>
|
||||||
<boolean-setting name="book_overlapping_slots"
|
<boolean-setting name="book_overlapping_slots"
|
||||||
settings="allSettings"
|
settings="allSettings"
|
||||||
label="app.admin.settings.prevent_booking"
|
label="app.admin.settings.allow_booking"
|
||||||
classes="m-l">
|
classes="m-l">
|
||||||
</boolean-setting>
|
</boolean-setting>
|
||||||
</div>
|
</div>
|
||||||
@ -169,5 +169,14 @@
|
|||||||
step="0.01">
|
step="0.01">
|
||||||
</number-setting>
|
</number-setting>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<h3 class="m-l" translate>{{ 'app.admin.settings.pack_only_for_subscription_info' }}</h3>
|
||||||
|
<p class="alert alert-warning m-h-md" ng-bind-html="'app.admin.settings.pack_only_for_subscription_info_html' | translate"></p>
|
||||||
|
<boolean-setting name="pack_only_for_subscription"
|
||||||
|
settings="allSettings"
|
||||||
|
label="app.admin.settings.pack_only_for_subscription"
|
||||||
|
classes="m-l">
|
||||||
|
</boolean-setting>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
<div ng-repeat="group in slot.plansGrouped">
|
<div ng-repeat="group in slot.plansGrouped">
|
||||||
<div class="font-sbold">{{::group.name}}</div>
|
<div class="font-sbold">{{::group.name}}</div>
|
||||||
<ul class="m-n" ng-repeat="plan in group.plans">
|
<ul class="m-n" ng-repeat="plan in group.plans">
|
||||||
<li>{{::plan.name}}</li>
|
<li>{{::plan.base_name}}</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
<div ng-repeat="group in slot.plansGrouped">
|
<div ng-repeat="group in slot.plansGrouped">
|
||||||
<div class="font-sbold">{{::group.name}}</div>
|
<div class="font-sbold">{{::group.name}}</div>
|
||||||
<ul class="m-n" ng-repeat="plan in group.plans">
|
<ul class="m-n" ng-repeat="plan in group.plans">
|
||||||
<li>{{::plan.name}}</li>
|
<li>{{::plan.base_name}}</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -24,7 +24,7 @@ class CartItem::Subscription < CartItem::BaseItem
|
|||||||
end
|
end
|
||||||
|
|
||||||
def name
|
def name
|
||||||
@plan.name
|
@plan.base_name
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_object
|
def to_object
|
||||||
|
@ -132,6 +132,6 @@ class Plan < ApplicationRecord
|
|||||||
end
|
end
|
||||||
|
|
||||||
def update_gateway_product
|
def update_gateway_product
|
||||||
PaymentGatewayService.new.create_or_update_product(Plan.name, id)
|
PaymentGatewayService.new.create_or_update_product(Plan.base_name, id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -119,7 +119,8 @@ class Setting < ApplicationRecord
|
|||||||
payzen_hmac
|
payzen_hmac
|
||||||
payzen_currency
|
payzen_currency
|
||||||
public_agenda_module
|
public_agenda_module
|
||||||
renew_pack_threshold] }
|
renew_pack_threshold
|
||||||
|
pack_only_for_subscription] }
|
||||||
# WARNING: when adding a new key, you may also want to add it in app/policies/setting_policy.rb#public_whitelist
|
# WARNING: when adding a new key, you may also want to add it in app/policies/setting_policy.rb#public_whitelist
|
||||||
|
|
||||||
def value
|
def value
|
||||||
|
@ -57,7 +57,7 @@ class Subscription < ApplicationRecord
|
|||||||
operator_profile_id: operator_profile_id,
|
operator_profile_id: operator_profile_id,
|
||||||
total: 0
|
total: 0
|
||||||
)
|
)
|
||||||
invoice.invoice_items.push InvoiceItem.new(amount: 0, description: plan.name, object: od)
|
invoice.invoice_items.push InvoiceItem.new(amount: 0, description: plan.base_name, object: od)
|
||||||
invoice.save
|
invoice.save
|
||||||
|
|
||||||
if save
|
if save
|
||||||
|
@ -39,7 +39,8 @@ class SettingPolicy < ApplicationPolicy
|
|||||||
tracking_id book_overlapping_slots slot_duration events_in_calendar spaces_module plans_module invoicing_module
|
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
|
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
|
online_payment_module stripe_public_key confirmation_required wallet_module trainings_module address_required
|
||||||
payment_gateway payzen_endpoint payzen_public_key public_agenda_module renew_pack_threshold statistics_module]
|
payment_gateway payzen_endpoint payzen_public_key public_agenda_module renew_pack_threshold statistics_module
|
||||||
|
pack_only_for_subscription]
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
|
@ -175,7 +175,7 @@ class InvoicesService
|
|||||||
|
|
||||||
invoice.invoice_items.push InvoiceItem.new(
|
invoice.invoice_items.push InvoiceItem.new(
|
||||||
amount: payment_details[:elements][:plan],
|
amount: payment_details[:elements][:plan],
|
||||||
description: subscription.plan.name,
|
description: subscription.plan.base_name,
|
||||||
object: subscription,
|
object: subscription,
|
||||||
main: main
|
main: main
|
||||||
)
|
)
|
||||||
|
@ -249,7 +249,7 @@ class PaymentScheduleService
|
|||||||
|
|
||||||
invoice.invoice_items.push InvoiceItem.new(
|
invoice.invoice_items.push InvoiceItem.new(
|
||||||
amount: payment_details[:subscription],
|
amount: payment_details[:subscription],
|
||||||
description: subscription.plan.name,
|
description: subscription.plan.base_name,
|
||||||
object: subscription,
|
object: subscription,
|
||||||
main: main
|
main: main
|
||||||
)
|
)
|
||||||
|
@ -61,6 +61,11 @@ class PrepaidPackService
|
|||||||
|
|
||||||
## Total number of prepaid minutes available
|
## Total number of prepaid minutes available
|
||||||
def minutes_available(user, priceable)
|
def minutes_available(user, priceable)
|
||||||
|
is_pack_only_for_subscription = Setting.find_by(name: "pack_only_for_subscription")&.value
|
||||||
|
if is_pack_only_for_subscription == 'true' && !user.subscribed_plan
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
user_packs = user_packs(user, priceable)
|
user_packs = user_packs(user, priceable)
|
||||||
total_available = user_packs.map { |up| up.prepaid_pack.minutes }.reduce(:+) || 0
|
total_available = user_packs.map { |up| up.prepaid_pack.minutes }.reduce(:+) || 0
|
||||||
total_used = user_packs.map(&:minutes_used).reduce(:+) || 0
|
total_used = user_packs.map(&:minutes_used).reduce(:+) || 0
|
||||||
|
@ -57,6 +57,7 @@ json.array!(@members) do |member|
|
|||||||
json.plan do
|
json.plan do
|
||||||
json.id member.subscription.plan.id
|
json.id member.subscription.plan.id
|
||||||
json.name member.subscription.plan.name
|
json.name member.subscription.plan.name
|
||||||
|
json.base_name member.subscription.plan.base_name
|
||||||
json.interval member.subscription.plan.interval
|
json.interval member.subscription.plan.interval
|
||||||
json.amount member.subscription.plan.amount ? (member.subscription.plan.amount / 100.0) : 0
|
json.amount member.subscription.plan.amount ? (member.subscription.plan.amount / 100.0) : 0
|
||||||
end
|
end
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
json.title notification.notification_type
|
json.title notification.notification_type
|
||||||
json.description t('.subscription_PLAN_has_been_subscribed_by_USER_html',
|
json.description t('.subscription_PLAN_has_been_subscribed_by_USER_html',
|
||||||
PLAN: notification.attached_object.plan.name,
|
PLAN: notification.attached_object.plan.base_name,
|
||||||
USER: notification.attached_object.user&.profile&.full_name || t('api.notifications.deleted_user'))
|
USER: notification.attached_object.user&.profile&.full_name || t('api.notifications.deleted_user'))
|
||||||
|
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
json.title notification.notification_type
|
json.title notification.notification_type
|
||||||
json.description _t('.subscription_PLAN_of_the_member_USER_has_been_extended_FREE_until_DATE_html',
|
json.description _t('.subscription_PLAN_of_the_member_USER_has_been_extended_FREE_until_DATE_html',
|
||||||
{
|
{
|
||||||
PLAN: notification.attached_object.plan.name,
|
PLAN: notification.attached_object.plan.base_name,
|
||||||
USER: notification.attached_object.user&.profile&.full_name || t('api.notifications.deleted_user'),
|
USER: notification.attached_object.user&.profile&.full_name || t('api.notifications.deleted_user'),
|
||||||
FREE: notification.get_meta_data(:free_days).to_s,
|
FREE: notification.get_meta_data(:free_days).to_s,
|
||||||
DATE: I18n.l(notification.attached_object.expired_at.to_date)
|
DATE: I18n.l(notification.attached_object.expired_at.to_date)
|
||||||
}) # messageFormat
|
}) # messageFormat
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
json.title notification.notification_type
|
json.title notification.notification_type
|
||||||
json.description t('.you_have_subscribed_to_PLAN_html',
|
json.description t('.you_have_subscribed_to_PLAN_html',
|
||||||
PLAN: notification.attached_object.plan.name)
|
PLAN: notification.attached_object.plan.base_name)
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
json.title notification.notification_type
|
json.title notification.notification_type
|
||||||
json.description t('.your_subscription_PLAN_was_successfully_cancelled_html',
|
json.description t('.your_subscription_PLAN_was_successfully_cancelled_html',
|
||||||
PLAN: notification.attached_object.plan.name)
|
PLAN: notification.attached_object.plan.base_name)
|
||||||
|
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
json.title notification.notification_type
|
json.title notification.notification_type
|
||||||
json.description _t('.your_subscription_PLAN_has_been_extended_FREE_until_DATE_html',
|
json.description _t('.your_subscription_PLAN_has_been_extended_FREE_until_DATE_html',
|
||||||
{
|
{
|
||||||
PLAN: notification.attached_object.plan.name,
|
PLAN: notification.attached_object.plan.base_name,
|
||||||
FREE: notification.get_meta_data(:free_days).to_s,
|
FREE: notification.get_meta_data(:free_days).to_s,
|
||||||
DATE: I18n.l(notification.attached_object.expired_at.to_date)
|
DATE: I18n.l(notification.attached_object.expired_at.to_date)
|
||||||
}) # messageFormat
|
}) # messageFormat
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
json.title notification.notification_type
|
json.title notification.notification_type
|
||||||
json.description t('.subscription_partner_PLAN_has_been_subscribed_by_USER_html',
|
json.description t('.subscription_partner_PLAN_has_been_subscribed_by_USER_html',
|
||||||
{
|
{
|
||||||
PLAN: notification.attached_object.plan.name,
|
PLAN: notification.attached_object.plan.base_name,
|
||||||
USER: notification.attached_object.user&.profile&.full_name || t('api.notifications.deleted_user')
|
USER: notification.attached_object.user&.profile&.full_name || t('api.notifications.deleted_user')
|
||||||
}) # messageFormat
|
}) # messageFormat
|
||||||
|
|
||||||
|
@ -1155,6 +1155,7 @@ de:
|
|||||||
an_error_occurred_saving_the_setting: "Beim Speichern der Einstellung ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut."
|
an_error_occurred_saving_the_setting: "Beim Speichern der Einstellung ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut."
|
||||||
book_overlapping_slots_info: "Erlauben / Verhindern der Reservierung von überlappenden Slots"
|
book_overlapping_slots_info: "Erlauben / Verhindern der Reservierung von überlappenden Slots"
|
||||||
prevent_booking: "Buchungen verhindern"
|
prevent_booking: "Buchungen verhindern"
|
||||||
|
allow_booking: "Allow booking"
|
||||||
default_slot_duration: "Standarddauer für Slots"
|
default_slot_duration: "Standarddauer für Slots"
|
||||||
duration_minutes: "Dauer (in Minuten)"
|
duration_minutes: "Dauer (in Minuten)"
|
||||||
default_slot_duration_info: "Die Verfügbarkeit von Maschinen und Räumen ist in mehrere Slots dieser Dauer aufgeteilt. Dieser Wert kann je Verfügbarkeit überschrieben werden."
|
default_slot_duration_info: "Die Verfügbarkeit von Maschinen und Räumen ist in mehrere Slots dieser Dauer aufgeteilt. Dieser Wert kann je Verfügbarkeit überschrieben werden."
|
||||||
@ -1208,6 +1209,9 @@ de:
|
|||||||
display_invite_to_renew_pack: "Display the invite to renew prepaid-packs"
|
display_invite_to_renew_pack: "Display the invite to renew prepaid-packs"
|
||||||
packs_threshold_info_html: "You can define under how many hours the user will be invited to buy a new prepaid-pack, if his stock of prepaid hours is under this threshold.<br/>You can set a <strong>number of hours</strong> (<em>eg. 5</em>) or a <strong>percentage</strong> of his current pack pack (<em>eg. 0.05 means 5%</em>)."
|
packs_threshold_info_html: "You can define under how many hours the user will be invited to buy a new prepaid-pack, if his stock of prepaid hours is under this threshold.<br/>You can set a <strong>number of hours</strong> (<em>eg. 5</em>) or a <strong>percentage</strong> of his current pack pack (<em>eg. 0.05 means 5%</em>)."
|
||||||
renew_pack_threshold: "threshold for packs renewal"
|
renew_pack_threshold: "threshold for packs renewal"
|
||||||
|
pack_only_for_subscription_info_html: "If this option is activated, the purchase and use of a prepaid pack is only possible for the user with a valid subscription."
|
||||||
|
pack_only_for_subscription: "Subscription valid for purchase and use of a prepaid pack"
|
||||||
|
pack_only_for_subscription_info: "Make subscription mandatory for prepaid packs"
|
||||||
general:
|
general:
|
||||||
general: "Allgemein"
|
general: "Allgemein"
|
||||||
title: "Titel"
|
title: "Titel"
|
||||||
|
@ -1155,6 +1155,7 @@ en:
|
|||||||
an_error_occurred_saving_the_setting: "An error occurred while saving the setting. Please try again later."
|
an_error_occurred_saving_the_setting: "An error occurred while saving the setting. Please try again later."
|
||||||
book_overlapping_slots_info: "Allow / prevent the reservation of overlapping slots"
|
book_overlapping_slots_info: "Allow / prevent the reservation of overlapping slots"
|
||||||
prevent_booking: "Prevent booking"
|
prevent_booking: "Prevent booking"
|
||||||
|
allow_booking: "Allow booking"
|
||||||
default_slot_duration: "Default duration for slots"
|
default_slot_duration: "Default duration for slots"
|
||||||
duration_minutes: "Duration (in minutes)"
|
duration_minutes: "Duration (in minutes)"
|
||||||
default_slot_duration_info: "Machine and space availabilities are divided in multiple slots of this duration. This value can be overridden per availability."
|
default_slot_duration_info: "Machine and space availabilities are divided in multiple slots of this duration. This value can be overridden per availability."
|
||||||
@ -1208,6 +1209,9 @@ en:
|
|||||||
display_invite_to_renew_pack: "Display the invite to renew prepaid-packs"
|
display_invite_to_renew_pack: "Display the invite to renew prepaid-packs"
|
||||||
packs_threshold_info_html: "You can define under how many hours the user will be invited to buy a new prepaid-pack, if his stock of prepaid hours is under this threshold.<br/>You can set a <strong>number of hours</strong> (<em>eg. 5</em>) or a <strong>percentage</strong> of his current pack pack (<em>eg. 0.05 means 5%</em>)."
|
packs_threshold_info_html: "You can define under how many hours the user will be invited to buy a new prepaid-pack, if his stock of prepaid hours is under this threshold.<br/>You can set a <strong>number of hours</strong> (<em>eg. 5</em>) or a <strong>percentage</strong> of his current pack pack (<em>eg. 0.05 means 5%</em>)."
|
||||||
renew_pack_threshold: "threshold for packs renewal"
|
renew_pack_threshold: "threshold for packs renewal"
|
||||||
|
pack_only_for_subscription_info_html: "If this option is activated, the purchase and use of a prepaid pack is only possible for the user with a valid subscription."
|
||||||
|
pack_only_for_subscription: "Subscription valid for purchase and use of a prepaid pack"
|
||||||
|
pack_only_for_subscription_info: "Make subscription mandatory for prepaid packs"
|
||||||
general:
|
general:
|
||||||
general: "General"
|
general: "General"
|
||||||
title: "Title"
|
title: "Title"
|
||||||
|
@ -1155,6 +1155,7 @@ es:
|
|||||||
an_error_occurred_saving_the_setting: "An error occurred while saving the setting. Please try again later."
|
an_error_occurred_saving_the_setting: "An error occurred while saving the setting. Please try again later."
|
||||||
book_overlapping_slots_info: "Allow / prevent the reservation of overlapping slots"
|
book_overlapping_slots_info: "Allow / prevent the reservation of overlapping slots"
|
||||||
prevent_booking: "Impedir reservas"
|
prevent_booking: "Impedir reservas"
|
||||||
|
allow_booking: "Allow booking"
|
||||||
default_slot_duration: "Default duration for slots"
|
default_slot_duration: "Default duration for slots"
|
||||||
duration_minutes: "Duration (in minutes)"
|
duration_minutes: "Duration (in minutes)"
|
||||||
default_slot_duration_info: "Machine and space availabilities are divided in multiple slots of this duration. This value can be overridden per availability."
|
default_slot_duration_info: "Machine and space availabilities are divided in multiple slots of this duration. This value can be overridden per availability."
|
||||||
@ -1208,6 +1209,9 @@ es:
|
|||||||
display_invite_to_renew_pack: "Display the invite to renew prepaid-packs"
|
display_invite_to_renew_pack: "Display the invite to renew prepaid-packs"
|
||||||
packs_threshold_info_html: "You can define under how many hours the user will be invited to buy a new prepaid-pack, if his stock of prepaid hours is under this threshold.<br/>You can set a <strong>number of hours</strong> (<em>eg. 5</em>) or a <strong>percentage</strong> of his current pack pack (<em>eg. 0.05 means 5%</em>)."
|
packs_threshold_info_html: "You can define under how many hours the user will be invited to buy a new prepaid-pack, if his stock of prepaid hours is under this threshold.<br/>You can set a <strong>number of hours</strong> (<em>eg. 5</em>) or a <strong>percentage</strong> of his current pack pack (<em>eg. 0.05 means 5%</em>)."
|
||||||
renew_pack_threshold: "threshold for packs renewal"
|
renew_pack_threshold: "threshold for packs renewal"
|
||||||
|
pack_only_for_subscription_info_html: "If this option is activated, the purchase and use of a prepaid pack is only possible for the user with a valid subscription."
|
||||||
|
pack_only_for_subscription: "Subscription valid for purchase and use of a prepaid pack"
|
||||||
|
pack_only_for_subscription_info: "Make subscription mandatory for prepaid packs"
|
||||||
general:
|
general:
|
||||||
general: "General"
|
general: "General"
|
||||||
title: "Title"
|
title: "Title"
|
||||||
|
@ -1155,6 +1155,7 @@ fr:
|
|||||||
an_error_occurred_saving_the_setting: "Une erreur est survenue pendant l'enregistrement du paramètre. Veuillez réessayer plus tard."
|
an_error_occurred_saving_the_setting: "Une erreur est survenue pendant l'enregistrement du paramètre. Veuillez réessayer plus tard."
|
||||||
book_overlapping_slots_info: "Autoriser / empêcher la réservation de créneaux qui se chevauchent"
|
book_overlapping_slots_info: "Autoriser / empêcher la réservation de créneaux qui se chevauchent"
|
||||||
prevent_booking: "Empêcher la réservation"
|
prevent_booking: "Empêcher la réservation"
|
||||||
|
allow_booking: "Autoriser la réservation"
|
||||||
default_slot_duration: "Durée par défaut pour les créneaux"
|
default_slot_duration: "Durée par défaut pour les créneaux"
|
||||||
duration_minutes: "Durée (en minutes)"
|
duration_minutes: "Durée (en minutes)"
|
||||||
default_slot_duration_info: "Les disponibilités des machines et des espaces sont divisées en plusieurs créneaux de cette durée. Cette valeur peur être changée pour chaque disponibilité."
|
default_slot_duration_info: "Les disponibilités des machines et des espaces sont divisées en plusieurs créneaux de cette durée. Cette valeur peur être changée pour chaque disponibilité."
|
||||||
@ -1208,6 +1209,9 @@ fr:
|
|||||||
display_invite_to_renew_pack: "Afficher l'invitation à renouveler les packs prépayés"
|
display_invite_to_renew_pack: "Afficher l'invitation à renouveler les packs prépayés"
|
||||||
packs_threshold_info_html: "Vous pouvez définir le nombre d'heures en dessous duquel l'utilisateur sera invité à acheter un nouveau pack prépayé, si son stock d'heures prépayées est inférieur à ce seuil.<br/>Vous pouvez définir un <strong>nombre d'heures</strong> (<em>par exemple. 5</em>) ou un <strong>pourcentage</strong> de son pack actuel (<em>par exemple 0,05 signifie 5%</em>)."
|
packs_threshold_info_html: "Vous pouvez définir le nombre d'heures en dessous duquel l'utilisateur sera invité à acheter un nouveau pack prépayé, si son stock d'heures prépayées est inférieur à ce seuil.<br/>Vous pouvez définir un <strong>nombre d'heures</strong> (<em>par exemple. 5</em>) ou un <strong>pourcentage</strong> de son pack actuel (<em>par exemple 0,05 signifie 5%</em>)."
|
||||||
renew_pack_threshold: "seuil de renouvellement des packs"
|
renew_pack_threshold: "seuil de renouvellement des packs"
|
||||||
|
pack_only_for_subscription_info_html: "Si cette option est activée, l'achat et l'utilisation d'un pack prépayé est seulement possible pour l'utilisateur possédant un abonnement en cours de validité."
|
||||||
|
pack_only_for_subscription: "Abonnement valide pour achat et utilisation d'un pack prépayé"
|
||||||
|
pack_only_for_subscription_info: "Rendre obligatoire l'abonnement pour les packs prépayés"
|
||||||
general:
|
general:
|
||||||
general: "Général"
|
general: "Général"
|
||||||
title: "Titre"
|
title: "Titre"
|
||||||
|
@ -1208,6 +1208,9 @@
|
|||||||
display_invite_to_renew_pack: "Vis invitasjonen til å fornye forhånds-pakker"
|
display_invite_to_renew_pack: "Vis invitasjonen til å fornye forhånds-pakker"
|
||||||
packs_threshold_info_html: "Du kan definere under hvor mange timer brukeren vil bli invitert til å kjøpe en ny prepaid-pakke, hvis hans beholdning av forhåndsbetalte timer er under denne grensen.<br/>Du kan angi <strong>antall timer</strong> (<em>f. eks. 5</em>) eller en <strong>prosentenhet</strong> i sin nåværende pakningspakke<em>f. eks. 0,05 betyr 5 %</em>)."
|
packs_threshold_info_html: "Du kan definere under hvor mange timer brukeren vil bli invitert til å kjøpe en ny prepaid-pakke, hvis hans beholdning av forhåndsbetalte timer er under denne grensen.<br/>Du kan angi <strong>antall timer</strong> (<em>f. eks. 5</em>) eller en <strong>prosentenhet</strong> i sin nåværende pakningspakke<em>f. eks. 0,05 betyr 5 %</em>)."
|
||||||
renew_pack_threshold: "terskel for fornyelse av pakker"
|
renew_pack_threshold: "terskel for fornyelse av pakker"
|
||||||
|
pack_only_for_subscription_info_html: "If this option is activated, the purchase and use of a prepaid pack is only possible for the user with a valid subscription."
|
||||||
|
pack_only_for_subscription: "Subscription valid for purchase and use of a prepaid pack"
|
||||||
|
pack_only_for_subscription_info: "Make subscription mandatory for prepaid packs"
|
||||||
general:
|
general:
|
||||||
general: "Generelt"
|
general: "Generelt"
|
||||||
title: "Tittel"
|
title: "Tittel"
|
||||||
|
@ -1155,6 +1155,7 @@ pt:
|
|||||||
an_error_occurred_saving_the_setting: "Ocorreu um erro ao salvar a configuração. Por favor, tente novamente mais tarde."
|
an_error_occurred_saving_the_setting: "Ocorreu um erro ao salvar a configuração. Por favor, tente novamente mais tarde."
|
||||||
book_overlapping_slots_info: "Permitir / impedir a reserva de slots sobrepostos"
|
book_overlapping_slots_info: "Permitir / impedir a reserva de slots sobrepostos"
|
||||||
prevent_booking: "Prevent booking"
|
prevent_booking: "Prevent booking"
|
||||||
|
allow_booking: "Allow booking"
|
||||||
default_slot_duration: "Duração padrão para slots"
|
default_slot_duration: "Duração padrão para slots"
|
||||||
duration_minutes: "Duração (em minutos)"
|
duration_minutes: "Duração (em minutos)"
|
||||||
default_slot_duration_info: "Máquina e espaço disponíveis são divididos em vários slots desta duração. Esse valor pode ser substituído por disponibilidade."
|
default_slot_duration_info: "Máquina e espaço disponíveis são divididos em vários slots desta duração. Esse valor pode ser substituído por disponibilidade."
|
||||||
@ -1208,6 +1209,9 @@ pt:
|
|||||||
display_invite_to_renew_pack: "Display the invite to renew prepaid-packs"
|
display_invite_to_renew_pack: "Display the invite to renew prepaid-packs"
|
||||||
packs_threshold_info_html: "You can define under how many hours the user will be invited to buy a new prepaid-pack, if his stock of prepaid hours is under this threshold.<br/>You can set a <strong>number of hours</strong> (<em>eg. 5</em>) or a <strong>percentage</strong> of his current pack pack (<em>eg. 0.05 means 5%</em>)."
|
packs_threshold_info_html: "You can define under how many hours the user will be invited to buy a new prepaid-pack, if his stock of prepaid hours is under this threshold.<br/>You can set a <strong>number of hours</strong> (<em>eg. 5</em>) or a <strong>percentage</strong> of his current pack pack (<em>eg. 0.05 means 5%</em>)."
|
||||||
renew_pack_threshold: "threshold for packs renewal"
|
renew_pack_threshold: "threshold for packs renewal"
|
||||||
|
pack_only_for_subscription_info_html: "If this option is activated, the purchase and use of a prepaid pack is only possible for the user with a valid subscription."
|
||||||
|
pack_only_for_subscription: "Subscription valid for purchase and use of a prepaid pack"
|
||||||
|
pack_only_for_subscription_info: "Make subscription mandatory for prepaid packs"
|
||||||
general:
|
general:
|
||||||
general: "Geral"
|
general: "Geral"
|
||||||
title: "Título"
|
title: "Título"
|
||||||
|
@ -1155,6 +1155,7 @@ zu:
|
|||||||
an_error_occurred_saving_the_setting: "crwdns20380:0crwdne20380:0"
|
an_error_occurred_saving_the_setting: "crwdns20380:0crwdne20380:0"
|
||||||
book_overlapping_slots_info: "crwdns20642:0crwdne20642:0"
|
book_overlapping_slots_info: "crwdns20642:0crwdne20642:0"
|
||||||
prevent_booking: "crwdns21478:0crwdne21478:0"
|
prevent_booking: "crwdns21478:0crwdne21478:0"
|
||||||
|
allow_booking: "Allow booking"
|
||||||
default_slot_duration: "crwdns20646:0crwdne20646:0"
|
default_slot_duration: "crwdns20646:0crwdne20646:0"
|
||||||
duration_minutes: "crwdns20648:0crwdne20648:0"
|
duration_minutes: "crwdns20648:0crwdne20648:0"
|
||||||
default_slot_duration_info: "crwdns20650:0crwdne20650:0"
|
default_slot_duration_info: "crwdns20650:0crwdne20650:0"
|
||||||
@ -1208,6 +1209,9 @@ zu:
|
|||||||
display_invite_to_renew_pack: "crwdns22000:0crwdne22000:0"
|
display_invite_to_renew_pack: "crwdns22000:0crwdne22000:0"
|
||||||
packs_threshold_info_html: "crwdns22030:0crwdne22030:0"
|
packs_threshold_info_html: "crwdns22030:0crwdne22030:0"
|
||||||
renew_pack_threshold: "crwdns22004:0crwdne22004:0"
|
renew_pack_threshold: "crwdns22004:0crwdne22004:0"
|
||||||
|
pack_only_for_subscription_info_html: "If this option is activated, the purchase and use of a prepaid pack is only possible for the user with a valid subscription."
|
||||||
|
pack_only_for_subscription: "Subscription valid for purchase and use of a prepaid pack"
|
||||||
|
pack_only_for_subscription_info: "Make subscription mandatory for prepaid packs"
|
||||||
general:
|
general:
|
||||||
general: "crwdns20726:0crwdne20726:0"
|
general: "crwdns20726:0crwdne20726:0"
|
||||||
title: "crwdns20728:0crwdne20728:0"
|
title: "crwdns20728:0crwdne20728:0"
|
||||||
|
@ -196,6 +196,7 @@ de:
|
|||||||
remaining_HOURS: "You have {HOURS} prepaid hours remaining for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
remaining_HOURS: "You have {HOURS} prepaid hours remaining for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
||||||
no_hours: "You don't have any prepaid hours for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
no_hours: "You don't have any prepaid hours for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
||||||
buy_a_new_pack: "Buy a new pack"
|
buy_a_new_pack: "Buy a new pack"
|
||||||
|
unable_to_use_pack_for_subsription_is_expired: "You must have a valid subscription to use your remaining hours."
|
||||||
#book a training
|
#book a training
|
||||||
trainings_reserve:
|
trainings_reserve:
|
||||||
trainings_planning: "Schulungsplanung"
|
trainings_planning: "Schulungsplanung"
|
||||||
|
@ -196,6 +196,7 @@ en:
|
|||||||
remaining_HOURS: "You have {HOURS} prepaid hours remaining for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
remaining_HOURS: "You have {HOURS} prepaid hours remaining for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
||||||
no_hours: "You don't have any prepaid hours for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
no_hours: "You don't have any prepaid hours for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
||||||
buy_a_new_pack: "Buy a new pack"
|
buy_a_new_pack: "Buy a new pack"
|
||||||
|
unable_to_use_pack_for_subsription_is_expired: "You must have a valid subscription to use your remaining hours."
|
||||||
#book a training
|
#book a training
|
||||||
trainings_reserve:
|
trainings_reserve:
|
||||||
trainings_planning: "Trainings planning"
|
trainings_planning: "Trainings planning"
|
||||||
|
@ -196,6 +196,7 @@ es:
|
|||||||
remaining_HOURS: "You have {HOURS} prepaid hours remaining for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
remaining_HOURS: "You have {HOURS} prepaid hours remaining for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
||||||
no_hours: "You don't have any prepaid hours for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
no_hours: "You don't have any prepaid hours for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
||||||
buy_a_new_pack: "Buy a new pack"
|
buy_a_new_pack: "Buy a new pack"
|
||||||
|
unable_to_use_pack_for_subsription_is_expired: "You must have a valid subscription to use your remaining hours."
|
||||||
#book a training
|
#book a training
|
||||||
trainings_reserve:
|
trainings_reserve:
|
||||||
trainings_planning: "Plan de curso"
|
trainings_planning: "Plan de curso"
|
||||||
|
@ -196,6 +196,7 @@ fr:
|
|||||||
remaining_HOURS: "Il vous reste {HOURS} heures prépayées pour {ITEM, select, Machine{cette machine} Space{cet espace} other{}}."
|
remaining_HOURS: "Il vous reste {HOURS} heures prépayées pour {ITEM, select, Machine{cette machine} Space{cet espace} other{}}."
|
||||||
no_hours: "Vous n'avez aucune heure prépayée pour {ITEM, select, Machine{cette machine} Space{cet espace} other{}}."
|
no_hours: "Vous n'avez aucune heure prépayée pour {ITEM, select, Machine{cette machine} Space{cet espace} other{}}."
|
||||||
buy_a_new_pack: "Acheter un nouveau pack"
|
buy_a_new_pack: "Acheter un nouveau pack"
|
||||||
|
unable_to_use_pack_for_subsription_is_expired: "Vous devez avoir un abonnement en cours de validité pour consommer vos heures restantes."
|
||||||
#book a training
|
#book a training
|
||||||
trainings_reserve:
|
trainings_reserve:
|
||||||
trainings_planning: "Planning formations"
|
trainings_planning: "Planning formations"
|
||||||
|
@ -196,6 +196,7 @@
|
|||||||
remaining_HOURS: "Du har {HOURS} forhåndsbetalte timer igjen for denne {ITEM, select, Machine{maskinen} Space{plassen/rommet} other{}}."
|
remaining_HOURS: "Du har {HOURS} forhåndsbetalte timer igjen for denne {ITEM, select, Machine{maskinen} Space{plassen/rommet} other{}}."
|
||||||
no_hours: "Du har ikke noen forhåndsbetalt timer for {ITEM, select, Machine{maskinen} Space{plass/rom} other{}}."
|
no_hours: "Du har ikke noen forhåndsbetalt timer for {ITEM, select, Machine{maskinen} Space{plass/rom} other{}}."
|
||||||
buy_a_new_pack: "Kjøp en ny pakke"
|
buy_a_new_pack: "Kjøp en ny pakke"
|
||||||
|
unable_to_use_pack_for_subsription_is_expired: "You must have a valid subscription to use your remaining hours."
|
||||||
#book a training
|
#book a training
|
||||||
trainings_reserve:
|
trainings_reserve:
|
||||||
trainings_planning: "Planlegging, opplæring og kurs"
|
trainings_planning: "Planlegging, opplæring og kurs"
|
||||||
|
@ -196,6 +196,7 @@ pt:
|
|||||||
remaining_HOURS: "You have {HOURS} prepaid hours remaining for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
remaining_HOURS: "You have {HOURS} prepaid hours remaining for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
||||||
no_hours: "You don't have any prepaid hours for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
no_hours: "You don't have any prepaid hours for this {ITEM, select, Machine{machine} Space{space} other{}}."
|
||||||
buy_a_new_pack: "Buy a new pack"
|
buy_a_new_pack: "Buy a new pack"
|
||||||
|
unable_to_use_pack_for_subsription_is_expired: "You must have a valid subscription to use your remaining hours."
|
||||||
#book a training
|
#book a training
|
||||||
trainings_reserve:
|
trainings_reserve:
|
||||||
trainings_planning: "Planos de treinamento"
|
trainings_planning: "Planos de treinamento"
|
||||||
|
@ -196,6 +196,7 @@ zu:
|
|||||||
remaining_HOURS: "crwdns21934:0HOURS={HOURS}crwdnd21934:0ITEM={ITEM}crwdne21934:0"
|
remaining_HOURS: "crwdns21934:0HOURS={HOURS}crwdnd21934:0ITEM={ITEM}crwdne21934:0"
|
||||||
no_hours: "crwdns21936:0ITEM={ITEM}crwdne21936:0"
|
no_hours: "crwdns21936:0ITEM={ITEM}crwdne21936:0"
|
||||||
buy_a_new_pack: "crwdns21938:0crwdne21938:0"
|
buy_a_new_pack: "crwdns21938:0crwdne21938:0"
|
||||||
|
unable_to_use_pack_for_subsription_is_expired: "You must have a valid subscription to use your remaining hours."
|
||||||
#book a training
|
#book a training
|
||||||
trainings_reserve:
|
trainings_reserve:
|
||||||
trainings_planning: "crwdns8767:0crwdne8767:0"
|
trainings_planning: "crwdns8767:0crwdne8767:0"
|
||||||
|
@ -899,6 +899,8 @@ Setting.set('public_agenda_module', true) unless Setting.find_by(name: 'public_a
|
|||||||
|
|
||||||
Setting.set('renew_pack_threshold', 0.2) unless Setting.find_by(name: 'renew_pack_threshold').try(:value)
|
Setting.set('renew_pack_threshold', 0.2) unless Setting.find_by(name: 'renew_pack_threshold').try(:value)
|
||||||
|
|
||||||
|
Setting.set('pack_only_for_subscription', true) unless Setting.find_by(name: 'pack_only_for_subscription').try(:value)
|
||||||
|
|
||||||
if StatisticCustomAggregation.count.zero?
|
if StatisticCustomAggregation.count.zero?
|
||||||
# available reservations hours for machines
|
# available reservations hours for machines
|
||||||
machine_hours = StatisticType.find_by(key: 'hour', statistic_index_id: 2)
|
machine_hours = StatisticType.find_by(key: 'hour', statistic_index_id: 2)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "fab-manager",
|
"name": "fab-manager",
|
||||||
"version": "5.1.8",
|
"version": "5.1.9",
|
||||||
"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.",
|
"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": [
|
"keywords": [
|
||||||
"fablab",
|
"fablab",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user