1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2025-02-01 21:52:19 +01:00

Merge branch 'pre_inscription' into staging

This commit is contained in:
Du Peng 2023-06-29 10:05:23 +02:00
commit b82d91f537
25 changed files with 150 additions and 42 deletions

View File

@ -100,6 +100,9 @@ export const EventForm: React.FC<EventFormProps> = ({ action, event, onError, on
* Callback triggered when the user validates the machine form: handle create or update
*/
const onSubmit: SubmitHandler<Event> = (data: Event) => {
if (data.pre_registration_end_date.toString() === 'Invalid Date') {
data.pre_registration_end_date = null;
}
if (action === 'update') {
if (event?.recurrence_events?.length > 0) {
setUpdatingEvent(data);

View File

@ -116,6 +116,7 @@ export const ChildForm: React.FC<ChildFormProps> = ({ child, onSubmit, supportin
defaultFile={sf as FileType}
id={`supporting_document_files_attributes.${index}`}
accept="application/pdf"
rules={{ required: true }}
setValue={setValue}
label={getSupportingDocumentsTypeName(sf.supporting_document_type_id)}
showRemoveButton={false}

View File

@ -28,14 +28,15 @@ export const ChildModal: React.FC<ChildModalProps> = ({ child, isOpen, toggleMod
* Save the child to the API
*/
const handleSaveChild = async (data: Child): Promise<void> => {
let c: Child = data;
try {
if (child?.id) {
await ChildAPI.update(data);
c = await ChildAPI.update(data);
} else {
await ChildAPI.create(data);
c = await ChildAPI.create(data);
}
toggleModal();
onSuccess(data, '');
onSuccess(c, '');
} catch (error) {
onError(error);
}
@ -56,7 +57,7 @@ export const ChildModal: React.FC<ChildModalProps> = ({ child, isOpen, toggleMod
onSubmit={handleSaveChild}
supportingDocumentsTypes={supportingDocumentsTypes}
operator={operator}
onSuccess={onSuccess}
onSuccess={(msg) => onSuccess(child, msg)}
onError={onError}
/>
</FabModal>

View File

@ -9,7 +9,7 @@ import { TDateISO } from '../../typings/date-iso';
interface ChildValidationProps {
child: Child
onSuccess: (message: string) => void,
onSuccess: (child: Child, msg: string) => void;
onError: (message: string) => void,
}
@ -37,8 +37,8 @@ export const ChildValidation: React.FC<ChildValidationProps> = ({ child, onSucce
_child.validated_at = null;
}
ChildAPI.validate(_child)
.then(() => {
onSuccess(t(`app.admin.child_validation.${_value ? 'validate' : 'invalidate'}_child_success`));
.then((c) => {
onSuccess(c, t(`app.admin.child_validation.${_value ? 'validate' : 'invalidate'}_child_success`));
}).catch(err => {
setValue(!_value);
onError(t(`app.admin.child_validation.${_value ? 'validate' : 'invalidate'}_child_error`) + err);

View File

@ -30,8 +30,15 @@ export const MembersListItem: React.FC<MembersListItemProps> = ({ member, onErro
window.location.href = `/#!/admin/members/${memberId}/edit`;
};
/**
* member and all his children are validated
*/
const memberIsValidated = (): boolean => {
return member.validated_at && member.children.every((child) => child.validated_at);
};
return (
<div key={member.id} className={`members-list-item ${member.validated_at ? 'is-validated' : ''} ${member.need_completion ? 'is-incomplet' : ''}`}>
<div key={member.id} className={`members-list-item ${memberIsValidated() ? 'is-validated' : ''} ${member.need_completion ? 'is-incomplet' : ''}`}>
<div className="left-col">
<div className='status'>
{(member.children.length > 0)

View File

@ -609,10 +609,11 @@ Application.Controllers.controller('ShowEventReservationsController', ['$scope',
if (r.id === reservation.id) {
return reservation;
}
growl.success(_t('app.admin.event_reservations.reservation_was_successfully_paid'));
return r;
});
}, function () {
$log.info('Pay reservation modal dismissed at: ' + new Date());
console.log('Pay reservation modal dismissed at: ' + new Date());
});
};
}]);

View File

@ -322,7 +322,6 @@ Application.Controllers.controller('AdminMembersController', ['$scope', '$sce',
}
return c;
});
console.log(member.children);
return member;
}
return member;

View File

@ -303,7 +303,8 @@ Application.Controllers.controller('ShowEventController', ['$scope', '$state', '
$scope.now.isBefore($scope.eventEndDateTime) &&
helpers.isUserValidatedByType($scope.ctrl.member, $scope.settings, 'event');
if ($scope.event.pre_registration) {
return bookable && $scope.event.pre_registration_end_date && $scope.now.isSameOrBefore($scope.event.pre_registration_end_date, 'day');
const endDate = $scope.event.pre_registration_end_date || $scope.event.end_date
return bookable && $scope.now.isSameOrBefore(endDate, 'day');
} else {
return bookable;
}

View File

@ -50,10 +50,10 @@
</td>
<td>
<span ng-if="event.event_type === 'standard'" class="v-middle badge text-base bg-stage" translate="">{{ 'app.admin.events.event_type.standard' }}</span>
<span ng-if="event.event_type === 'nominative'" class="v-middle badge text-base bg-event" translate="">{{ 'app.admin.events.event_type.nominative' }}</span>
<span ng-if="event.event_type === 'family'" class="v-middle badge text-base bg-atelier" translate="">{{ 'app.admin.events.event_type.family' }}</span>
<span ng-if="event.pre_registration" class="v-middle badge text-base bg-info" translate="">{{ 'app.admin.events.pre_registration' }}</span>
<span ng-if="event.event_type === 'standard'" class="v-middle badge text-sm bg-stage" translate="">{{ 'app.admin.events.event_type.standard' }}</span>
<span ng-if="event.event_type === 'nominative'" class="v-middle badge text-sm bg-event" translate="">{{ 'app.admin.events.event_type.nominative' }}</span>
<span ng-if="event.event_type === 'family'" class="v-middle badge text-sm bg-atelier" translate="">{{ 'app.admin.events.event_type.family' }}</span>
<span ng-if="event.pre_registration" class="v-middle badge text-sm bg-info" translate="">{{ 'app.admin.events.pre_registration' }}</span>
</td>
<td style="vertical-align:middle">

View File

@ -46,10 +46,10 @@
<span ng-repeat="ticket in reservation.tickets_attributes">{{ticket.event_price_category.price_category.name}} : {{ticket.booked}}</span>
</td>
<td ng-if="event.pre_registration">
<span ng-if="!isValidated(reservation) && !isCancelled(reservation) && !reservation.is_paid" class="v-middle badge text-base bg-info" translate="">{{ 'app.admin.event_reservations.event_status.pre_registered' }}</span>
<span ng-if="isValidated(reservation) && !isCancelled(reservation) && !reservation.is_paid" class="v-middle badge text-base bg-stage" translate="">{{ 'app.admin.event_reservations.event_status.to_pay' }}</span>
<span ng-if="reservation.is_paid && !isCancelled(reservation)" class="v-middle badge text-base bg-success" translate="">{{ 'app.admin.event_reservations.event_status.paid' }}</span>
<span ng-if="isCancelled(reservation)" class="v-middle badge text-base bg-event" translate="">{{ 'app.admin.event_reservations.event_status.canceled' }}</span>
<span ng-if="!isValidated(reservation) && !isCancelled(reservation) && !reservation.is_paid" class="v-middle badge text-sm bg-info" translate="">{{ 'app.admin.event_reservations.event_status.pre_registered' }}</span>
<span ng-if="isValidated(reservation) && !isCancelled(reservation) && !reservation.is_paid" class="v-middle badge text-sm bg-stage" translate="">{{ 'app.admin.event_reservations.event_status.to_pay' }}</span>
<span ng-if="reservation.is_paid && !isCancelled(reservation)" class="v-middle badge text-sm bg-success" translate="">{{ 'app.admin.event_reservations.event_status.paid' }}</span>
<span ng-if="isCancelled(reservation)" class="v-middle badge text-sm bg-event" translate="">{{ 'app.admin.event_reservations.event_status.canceled' }}</span>
</td>
<td ng-if="event.pre_registration">
<button class="btn btn-default" ng-click="validateReservation(reservation)" ng-if="!isValidated(reservation) && !isCancelled(reservation) && !reservation.is_paid" translate>

View File

@ -73,8 +73,9 @@
<div class="panel-content wrapper">
<div>
<span ng-if="event.event_type === 'nominative'" class="v-middle badge text-base bg-event" translate="">{{ 'app.public.events_show.event_type.nominative' }}</span>
<span ng-if="event.event_type === 'family'" class="v-middle badge text-base bg-event" translate="">{{ 'app.public.events_show.event_type.family' }}</span>
<span ng-if="event.event_type === 'nominative'" class="v-middle badge text-xs bg-event" translate="">{{ 'app.public.events_show.event_type.nominative' }}</span>
<span ng-if="event.event_type === 'family'" class="v-middle badge text-xs bg-event" translate="">{{ 'app.public.events_show.event_type.family' }}</span>
<span ng-if="event.pre_registration" class="v-middle badge text-xs bg-info" translate="">{{ 'app.public.events_show.pre_registration' }}</span>
</div>
<dl class="text-sm">
@ -90,7 +91,7 @@
<dd ng-if="event.all_day"><span translate>{{ 'app.public.events_show.all_day' }}</span></dd>
<dd ng-if="!event.all_day">{{ 'app.public.events_show.from_time' | translate }} <span class="text-u-l">{{event.start_time}}</span> {{ 'app.public.events_show.to_time' | translate }} <span class="text-u-l">{{event.end_time}}</span></dd>
<dt ng-if="event.pre_registration_end_date"><i class="fa fa-calendar" aria-hidden="true"></i> {{ 'app.public.events_show.pre_registration_end_date' | translate }}</dt>
<dd ng-if="event.pre_registration_end_date">{{ 'app.public.events_show.ending' | translate }} <span class="text-u-l">{{event.pre_registration_end_date | amDateFormat:'L'}}</span></dd>
<dd ng-if="event.pre_registration_end_date"><span class="text-u-l">{{event.pre_registration_end_date | amDateFormat:'L'}}</span></dd>
</dl>
<div class="text-sm" ng-if="event.amount">
@ -221,7 +222,7 @@
{{ 'app.public.events_show.you_can_find_your_reservation_s_details_on_your_' | translate }} <a ui-sref="app.logged.dashboard.invoices" translate>{{ 'app.public.events_show.dashboard' }}</a>
</div>
<div ng-if="reserveSuccess && event.pre_registration" class="alert alert-success">{{ 'app.public.events_show.thank_you_your_pre_registration_has_been_successfully_saved' | translate }}<br>
{{ 'app.public.events_show.you_can_find_your_reservation_s_details_on_your_' | translate }} <a ui-sref="app.logged.dashboard.invoices" translate>{{ 'app.public.events_show.dashboard' }}</a>
{{ 'app.public.events_show.informed_by_email_your_pre_registration' | translate }}
</div>
<div class="m-t-sm" ng-if="reservations && !reserve.toReserve" ng-repeat="reservation in reservations">
<div ng-hide="isCancelled(reservation)" class="well well-warning">

View File

@ -131,15 +131,27 @@ class Reservation < ApplicationRecord
end
def notify_member_create_reservation
NotificationCenter.call type: 'notify_member_create_reservation',
receiver: user,
attached_object: self
if reservable_type == 'Event' && reservable.pre_registration?
NotificationCenter.call type: 'notify_member_pre_booked_reservation',
receiver: user,
attached_object: self
else
NotificationCenter.call type: 'notify_member_create_reservation',
receiver: user,
attached_object: self
end
end
def notify_admin_member_create_reservation
NotificationCenter.call type: 'notify_admin_member_create_reservation',
receiver: User.admins_and_managers,
attached_object: self
if reservable_type == 'Event' && reservable.pre_registration?
NotificationCenter.call type: 'notify_admin_member_pre_booked_reservation',
receiver: User.admins_and_managers,
attached_object: self
else
NotificationCenter.call type: 'notify_admin_member_create_reservation',
receiver: User.admins_and_managers,
attached_object: self
end
end
def notify_member_limitation_reached

View File

@ -0,0 +1,5 @@
json.title notification.notification_type
json.description t('.a_RESERVABLE_reservation_was_made_by_USER_html',
RESERVABLE: notification.attached_object.reservable.name,
USER: notification.attached_object.user&.profile&.full_name || t('api.notifications.deleted_user'))

View File

@ -0,0 +1,3 @@
json.title notification.notification_type
json.description t('.your_reservation_RESERVABLE_was_successfully_saved_html',
RESERVABLE: notification.attached_object.reservable.name)

View File

@ -0,0 +1,19 @@
<%= render 'notifications_mailer/shared/hello', recipient: @recipient %>
<p>
<%= t('.body.member_reserved_html',
NAME: @attached_object.user&.profile&.full_name || t('api.notifications.deleted_user'),
RESERVABLE: @attached_object.reservable.name) %>
</p>
<p><%= t('.body.reserved_slots') %></p>
<ul>
<% @attached_object.slots.each do |slot| %>
<% if @attached_object.reservable_type == 'Event' %>
<% (slot.start_at.to_date..slot.end_at.to_date).each do |d| %>
<li><%= "#{I18n.l d, format: :long} #{I18n.l slot.start_at, format: :hour_minute} - #{I18n.l slot.end_at, format: :hour_minute}" %></li>
<% end %>
<% else %>
<li><%= "#{I18n.l slot.start_at, format: :long} - #{I18n.l slot.end_at, format: :hour_minute}" %></li>
<% end %>
<% end %>
</ul>

View File

@ -0,0 +1,16 @@
<%= render 'notifications_mailer/shared/hello', recipient: @recipient %>
<p><%= t('.body.reservation_saved_html', RESERVATION: @attached_object.reservable.name) %></p>
<p><%= t('.body.your_reserved_slots') %> </p>
<ul>
<% @attached_object.slots.each do |slot| %>
<% if @attached_object.reservable_type == 'Event' %>
<% (slot.start_at.to_date..slot.end_at.to_date).each do |d| %>
<li><%= "#{I18n.l d, format: :long} #{I18n.l slot.start_at, format: :hour_minute} - #{I18n.l slot.end_at, format: :hour_minute}" %></li>
<% end %>
<% else %>
<li><%= "#{I18n.l slot.start_at, format: :long} - #{I18n.l slot.end_at, format: :hour_minute}" %></li>
<% end %>
<% end %>
</ul>

View File

@ -656,6 +656,7 @@ en:
confirm_payment_of_html: "{ROLE, select, admin{Cash} other{Pay}}: {AMOUNT}" #(contexte : validate a payment of $20,00)
offer_this_reservation: "I offer this reservation"
i_have_received_the_payment: "I have received the payment"
reservation_was_successfully_paid: "Reservation was successfully paid."
events_settings:
title: "Settings"
generic_text_block: "Editorial text block"
@ -1823,8 +1824,9 @@ en:
public_registrations: "Public registrations"
show_username_in_admin_list: "Show the username in the list"
family_account: "family account"
family_account_info_html: "By activating this option, you offer your members the possibility to add their child(ren) to their own account. You can also request proof if you wish to validate them."
family_account_info_html: "The Family account allows your members to add their children under 18 years old to their own account and directly register them for Family events. You can also request supporting documents for each child and validate their account."
enable_family_account: "Enable the Family Account option"
child_validation_required: "the account validation option for children"
child_validation_required_label: "Activate the account validation option for children"
overlapping_options:
training_reservations: "Trainings"

View File

@ -656,6 +656,7 @@ fr:
confirm_payment_of_html: "{ROLE, select, admin{Encaisser} other{Payer}} : {AMOUNT}" #(contexte : validate a payment of $20,00)
offer_this_reservation: "J'offre cette réservation"
i_have_received_the_payment: "J'ai reçu le paiement"
reservation_was_successfully_paid: "La réservation a bien été payée."
events_settings:
title: "Paramètres"
generic_text_block: "Bloc de texte rédactionnel"
@ -1815,8 +1816,9 @@ fr:
public_registrations: "Inscriptions publiques"
show_username_in_admin_list: "Afficher le nom d'utilisateur dans la liste"
family_account: "Compte famille"
family_account_info_html: "En activant cette option, vous offrez à vos membres la possibilité d'ajouter sur leur propre compte leur(s) enfants. Vous pouvez aussi demander un justificatif si vous souhaitez les valider."
family_account_info_html: "Le compte Famille permet à vos membres d'ajouter leurs enfants de moins de 18 ans sur leur propre compte et de les inscrire directement aux évènements de type Famille. Vous pouvez aussi demander des justificatifs pour chaque enfant et valider leur compte."
enable_family_account: "Activer l'option Compte Famille"
child_validation_required: "l'option de validation des comptes enfants"
child_validation_required_label: "Activer l'option de validation des comptes enfants"
overlapping_options:
training_reservations: "Formations"

View File

@ -332,9 +332,10 @@ en:
thank_you_your_payment_has_been_successfully_registered: "Thank you. Your payment has been successfully registered!"
thank_you_your_pre_registration_has_been_successfully_saved: "Thank you. Your pre-registration has been successfully saved!"
you_can_find_your_reservation_s_details_on_your_: "You can find your reservation's details on your"
informed_by_email_your_pre_registration: "You will be kept informed by email of the progress made regarding your pre-registration."
dashboard: "dashboard"
you_booked_DATE: "You booked ({DATE}):"
you_pre_booked_DATE: "You pre-booked ({DATE}):"
you_pre_booked_DATE: "Your pre-registration ({DATE}):"
canceled_reservation_SEATS: "Reservation canceled ({SEATS} seats)"
book: "Book"
confirm_and_pay: "Confirm and pay"
@ -364,7 +365,8 @@ en:
share_on_twitter: "Share on Twitter"
last_name_and_first_name: "Last name and first name"
pre_book: "Pre-book"
pre_registration_end_date: "Pre-registration end date"
pre_registration_end_date: "Deadline for pre-registration"
pre_registration: "Pre-registration"
#public calendar
calendar:
calendar: "Calendar"
@ -492,7 +494,7 @@ en:
edit_child: "Edit child"
new_child: "New child"
child_form:
child_form_info: "Please note that you can only add a child under the age of 18. Supporting documents are requested by your administrator, they will be useful to validate your child's account and authorize the reservation of events."
child_form_info: "Only children under 18 years old can be added to your Family account. Supporting documents may be requested to validate your child's account and allow you to register them for events."
first_name: "First name"
last_name: "Last name"
birthday: "Birthday"

View File

@ -330,11 +330,12 @@ fr:
ticket: "{NUMBER, plural, =0{place} one{place} other{places}}"
make_a_gift_of_this_reservation: "Offrir cette réservation"
thank_you_your_payment_has_been_successfully_registered: "Merci. Votre paiement a bien été pris en compte !"
thank_you_your_pre_registration_has_been_successfully_saved: "Merci. Votre pré-inscription a bien été pris en compte !"
thank_you_your_pre_registration_has_been_successfully_saved: "Merci. Votre demande a bien été pris en compte !"
you_can_find_your_reservation_s_details_on_your_: "Vous pouvez retrouver le détail de votre réservation sur votre"
informed_by_email_your_pre_registration: "vous serez tenu informé par email de la suite donnée à votre pré-inscription"
dashboard: "tableau de bord"
you_booked_DATE: "Vous avez réservé ({DATE}) :"
you_pre_booked_DATE: "Vous avez pré-réservé ({DATE}) :"
you_pre_booked_DATE: "Votre pré-inscription ({DATE}) :"
canceled_reservation_SEATS: "Réservation annulée ({SEATS} places)"
book: "Réserver"
confirm_and_pay: "Valider et payer"
@ -363,8 +364,9 @@ fr:
share_on_facebook: "Partager sur Facebook"
share_on_twitter: "Partager sur Twitter"
last_name_and_first_name: "Nom et prénom"
pre_book: "Pré-réserver"
pre_registration_end_date: "Date de fin de pré-réservation"
pre_book: "Pré-inscrire"
pre_registration_end_date: "Date limite de pré-inscription"
pre_registration: "Pré-réservation"
#public calendar
calendar:
calendar: "Calendrier"
@ -485,13 +487,14 @@ fr:
select_a_member: "Sélectionnez un membre"
start_typing: "Commencez à écrire..."
children_dashboard:
heading: "Mes enfants"
heading: "Enfants"
member_heading: "Mes enfants"
add_child: "Ajouter un enfant"
child_modal:
edit_child: "Modifier un enfant"
new_child: "Ajouter un enfant"
child_form:
child_form_info: "Notez que vous ne pouvez ajouter que vos enfants de moins de 18 ans. Des pièces justificatives sont demandés par votre administrateur, elles lui seront utiles pour valider le compte de votre enfant et ainsi autoriser la réservation d'événements."
child_form_info: "Seuls les enfants de moins de 18 ans peuvent être ajoutés au sein de votre compte Famille. Des justificatifs peuvent être demandés afin de valider le compte de votre enfant et de vous permettre ensuite de l'inscrire à des évènements."
first_name: "Prénom"
last_name: "Nom"
birthday: "Date de naissance"

View File

@ -286,6 +286,8 @@ en:
an_abuse_was_reported_on_TYPE_ID_NAME_html: "An abuse was reported on <strong>%{TYPE} %{ID}: <em>%{NAME}</em></strong>."
notify_admin_member_create_reservation:
a_RESERVABLE_reservation_was_made_by_USER_html: "A <strong><em>%{RESERVABLE}</em></strong> reservation was made by <strong><em>%{USER}</em></strong>."
notify_admin_member_pre_booked_reservation:
a_RESERVABLE_reservation_was_made_by_USER_html: "A <strong><em>%{RESERVABLE}</em></strong> pre-registration was made by <strong><em>%{USER}</em></strong>."
notify_admin_profile_complete:
account_imported_from_PROVIDER_UID_has_completed_its_information_html: "Account imported from <strong><em>%{PROVIDER}</strong> (%{UID})</em> has completed its information."
notify_admin_slot_is_canceled:
@ -320,6 +322,8 @@ en:
a_new_user_account_has_been_imported_from_PROVIDER_UID_html: "A new user account has been imported from: <strong><em>%{PROVIDER}</strong> (%{UID})</em>."
notify_member_create_reservation:
your_reservation_RESERVABLE_was_successfully_saved_html: "Your reservation <strong><em>%{RESERVABLE}</em></strong> was successfully saved."
notify_member_pre_booked_reservation:
your_reservation_RESERVABLE_was_successfully_saved_html: "Your pre-registration <strong><em>%{RESERVABLE}</em></strong> was successfully saved."
notify_member_reservation_reminder:
reminder_you_have_a_reservation_RESERVABLE_to_be_held_on_DATE_html: "Reminder: You have a reservation <strong>%{RESERVABLE}</strong> to be held on <em>%{DATE}</em>"
notify_member_slot_is_canceled:

View File

@ -286,6 +286,8 @@ fr:
an_abuse_was_reported_on_TYPE_ID_NAME_html: "Un abus a été signalé sur <strong>%{TYPE} %{ID} : <em>%{NAME}</em></strong>."
notify_admin_member_create_reservation:
a_RESERVABLE_reservation_was_made_by_USER_html: "Une réservation <strong><em>%{RESERVABLE}</em></strong> a été effectuée par <strong><em>%{USER}</em></strong>."
notify_admin_member_pre_booked_reservation:
a_RESERVABLE_reservation_was_made_by_USER_html: "Une pre-inscription <strong><em>%{RESERVABLE}</em></strong> a été effectuée par <strong><em>%{USER}</em></strong>."
notify_admin_profile_complete:
account_imported_from_PROVIDER_UID_has_completed_its_information_html: "Le compte importé depuis <strong><em>%{PROVIDER}</strong> (%{UID})</em> a complété ses informations."
notify_admin_slot_is_canceled:
@ -315,11 +317,13 @@ fr:
notify_admin_when_user_is_created:
a_new_user_account_has_been_created_NAME_EMAIL_html: "Un nouveau compte utilisateur vient d'être créé : <strong><em>%{NAME} &lt;%{EMAIL}&gt;</strong></em>."
notify_admin_child_created:
a_new_child_has_been_created_NAME_html: "Un nouveau enfant vient d'être créé : <strong><em>%{NAME}</em></strong>."
a_new_child_has_been_created_NAME_html: "Un nouvel enfant vient d'être créé : <strong><em>%{NAME}</em></strong>."
notify_admin_when_user_is_imported:
a_new_user_account_has_been_imported_from_PROVIDER_UID_html: "Un nouveau compte utilisateur vient d'être importé depuis : <strong><em>%{PROVIDER}</strong> (%{UID})</em>."
notify_member_create_reservation:
your_reservation_RESERVABLE_was_successfully_saved_html: "Votre réservation <strong><em>%{RESERVABLE}</em></strong> a bien été enregistrée."
notify_member_pre_booked_reservation:
your_reservation_RESERVABLE_was_successfully_saved_html: "Votre pré-inscription <strong><em>%{RESERVABLE}</em></strong> a bien été pris en compte."
notify_member_reservation_reminder:
reminder_you_have_a_reservation_RESERVABLE_to_be_held_on_DATE_html: "Rappel : Vous avez une réservation <strong>%{RESERVABLE}</strong> qui aura lieu le <em>%{DATE}</em>"
notify_member_slot_is_canceled:

View File

@ -78,6 +78,11 @@ en:
body:
reservation_saved_html: "You reservation <strong><em>%{RESERVATION}</em></strong> has been successfully saved"
your_reserved_slots: "Your reserved slots are:"
notify_member_pre_booked_reservation:
subject: "Your pre-registration has been successfully saved"
body:
reservation_saved_html: "You pre-registration <strong><em>%{RESERVATION}</em></strong> has been successfully saved"
your_reserved_slots: "Your pre-booked slots are:"
notify_member_subscribed_plan_is_changed:
subject: "Your subscription has been updated"
body:
@ -87,6 +92,11 @@ en:
body:
member_reserved_html: "User %{NAME} has reserved <strong><em>%{RESERVABLE}</em></strong>."
reserved_slots: "Reserved slots are:"
notify_admin_member_pre_booked_reservation:
subject: "New pre-registration"
body:
member_reserved_html: "User %{NAME} has pre-reserved <strong><em>%{RESERVABLE}</em></strong>."
reserved_slots: "Pre-reserved slots are:"
notify_member_slot_is_modified:
subject: "Your reservation slot has been successfully changed"
body:

View File

@ -78,6 +78,11 @@ fr:
body:
reservation_saved_html: "Votre réservation <strong><em>%{RESERVATION}</em></strong> a bien été enregistrée."
your_reserved_slots: "Les créneaux que vous avez réservés sont :"
notify_member_pre_booked_reservation:
subject: "Votre pré-inscription a bien été pris en compte"
body:
reservation_saved_html: "Votre réservation <strong><em>%{RESERVATION}</em></strong> a bien été pris en compte."
your_reserved_slots: "Les créneaux que vous avez pré-inscrit sont :"
notify_member_subscribed_plan_is_changed:
subject: "Votre abonnement a été mis à jour"
body:
@ -87,6 +92,11 @@ fr:
body:
member_reserved_html: "Le membre %{NAME} a réservé <strong><em>%{RESERVABLE}</em></strong>."
reserved_slots: "Les créneaux réservés sont :"
notify_admin_member_pre_booked_reservation:
subject: "Nouvelle pre-inscription"
body:
member_reserved_html: "Le membre %{NAME} a pre-inscrit <strong><em>%{RESERVABLE}</em></strong>."
reserved_slots: "Les créneaux pre-inscrit sont :"
notify_member_slot_is_modified:
subject: "Votre créneau de réservation a bien été modifié"
body:

View File

@ -90,7 +90,9 @@ NOTIFICATIONS_TYPES = [
{ name: 'notify_admin_user_child_supporting_document_files_created', category: 'supporting_documents', is_configurable: true },
{ name: 'notify_member_reservation_validated', category: 'agenda', is_configurable: false },
{ name: 'notify_admin_reservation_validated', category: 'agenda', is_configurable: true }
{ name: 'notify_admin_reservation_validated', category: 'agenda', is_configurable: true },
{ name: 'notify_member_pre_booked_reservation', category: 'agenda', is_configurable: false },
{ name: 'notify_admin_member_pre_booked_reservation', category: 'agenda', is_configurable: true }
].freeze
NOTIFICATIONS_TYPES.each do |notification_type|