1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2024-11-29 10:24:20 +01:00

Merge branch 'dev' for release 6.0.7

This commit is contained in:
Du Peng 2023-06-20 15:27:39 +02:00
commit a23de67bd5
8 changed files with 120 additions and 45 deletions

View File

@ -1,5 +1,12 @@
# Changelog Fab-manager
## v6.0.7 2023 June 20
- Fix a bug: OpenAPI accounting gateway_object_id missing error
- Fix a bug: unable to modify the price of prepaid pack
- Fix a bug: notification type missing
- Fix critical bug: Incorrect amount calculation when paying monthly subcription with a wallet for PayZen
## v6.0.6 2023 May 4
- Fix a bug: invalid duration for machine/spaces reservations in statistics, when using slots of not 1 hour

View File

@ -115,17 +115,17 @@ export const ConfigurePacksButton: React.FC<ConfigurePacksButtonProps> = ({ pack
itemId={p.id}
itemType={t('app.admin.configure_packs_button.pack')}
destroy={PrepaidPackAPI.destroy}/>
<FabModal isOpen={isOpen}
toggleModal={toggleModal}
title={t('app.admin.configure_packs_button.edit_pack')}
className="edit-pack-modal"
closeButton
confirmButton={t('app.admin.configure_packs_button.confirm_changes')}
onConfirmSendFormId="edit-pack">
{packData && <PackForm formId="edit-pack" onSubmit={handleUpdate} pack={packData} />}
</FabModal>
</li>)}
</ul>
<FabModal isOpen={isOpen}
toggleModal={toggleModal}
title={t('app.admin.configure_packs_button.edit_pack')}
className="edit-pack-modal"
closeButton
confirmButton={t('app.admin.configure_packs_button.confirm_changes')}
onConfirmSendFormId="edit-pack">
{packData && <PackForm formId="edit-pack" onSubmit={handleUpdate} pack={packData} />}
</FabModal>
{packs?.length === 0 && <span>{t('app.admin.configure_packs_button.no_packs')}</span>}
</FabPopover>}
</div>

View File

@ -20,7 +20,7 @@ class Footprintable < ApplicationRecord
return false unless persisted?
reload
footprint_children.map(&:check_footprint).all? && !chained_element.corrupted?
footprint_children.map(&:check_footprint).all? && chained_element && !chained_element.corrupted?
end
# @return [ChainedElement]

View File

@ -175,8 +175,8 @@ class Invoice < PaymentDocument
if paid_by_card?
{
payment_mean: mean,
gateway_object_id: payment_gateway_object.gateway_object_id,
gateway_object_type: payment_gateway_object.gateway_object_type
gateway_object_id: payment_gateway_object&.gateway_object_id,
gateway_object_type: payment_gateway_object&.gateway_object_type
}
end
when :wallet

View File

@ -14,8 +14,8 @@ if payment_schedule.operator_profile
end
end
json.main_object do
json.type payment_schedule.main_object.object_type
json.id payment_schedule.main_object.object_id
json.type payment_schedule.main_object&.object_type
json.id payment_schedule.main_object&.object_id
end
if payment_schedule.gateway_subscription
# this attribute is used to known which gateway should we interact with, in the front-end

View File

@ -1,33 +1,89 @@
# frozen_string_literal: true
unless NotificationType.find_by(name: 'notify_member_training_authorization_expired')
NotificationType.create!(
name: 'notify_member_training_authorization_expired',
category: 'trainings',
is_configurable: false
)
end
NOTIFICATIONS_TYPES = [
{ name: 'notify_admin_when_project_published', category: 'projects', is_configurable: true },
{ name: 'notify_project_collaborator_to_valid', category: 'projects', is_configurable: false },
{ name: 'notify_project_author_when_collaborator_valid', category: 'projects', is_configurable: true },
{ name: 'notify_user_training_valid', category: 'trainings', is_configurable: false },
{ name: 'notify_member_subscribed_plan', category: 'subscriptions', is_configurable: false },
{ name: 'notify_member_create_reservation', category: 'agenda', is_configurable: false },
{ name: 'notify_member_subscribed_plan_is_changed', category: 'deprecated', is_configurable: false },
{ name: 'notify_admin_member_create_reservation', category: 'agenda', is_configurable: true },
{ name: 'notify_member_slot_is_modified', category: 'agenda', is_configurable: false },
{ name: 'notify_admin_slot_is_modified', category: 'agenda', is_configurable: true },
unless NotificationType.find_by(name: 'notify_member_training_invalidated')
NotificationType.create!(
name: 'notify_member_training_invalidated',
category: 'trainings',
is_configurable: false
)
end
{ name: 'notify_admin_when_user_is_created', category: 'users_accounts', is_configurable: true },
{ name: 'notify_admin_subscribed_plan', category: 'subscriptions', is_configurable: true },
{ name: 'notify_user_when_invoice_ready', category: 'payments', is_configurable: true },
{ name: 'notify_member_subscription_will_expire_in_7_days', category: 'subscriptions', is_configurable: false },
{ name: 'notify_member_subscription_is_expired', category: 'subscriptions', is_configurable: false },
{ name: 'notify_admin_subscription_will_expire_in_7_days', category: 'subscriptions', is_configurable: true },
{ name: 'notify_admin_subscription_is_expired', category: 'subscriptions', is_configurable: true },
{ name: 'notify_admin_subscription_canceled', category: 'subscriptions', is_configurable: true },
{ name: 'notify_member_subscription_canceled', category: 'subscriptions', is_configurable: false },
{ name: 'notify_user_when_avoir_ready', category: 'wallet', is_configurable: false },
unless NotificationType.find_by(name: 'notify_admin_order_is_paid')
NotificationType.create!(
name: 'notify_admin_order_is_paid',
category: 'shop',
is_configurable: true
)
end
{ name: 'notify_member_slot_is_canceled', category: 'agenda', is_configurable: false },
{ name: 'notify_admin_slot_is_canceled', category: 'agenda', is_configurable: true },
{ name: 'notify_partner_subscribed_plan', category: 'subscriptions', is_configurable: false },
{ name: 'notify_member_subscription_extended', category: 'subscriptions', is_configurable: false },
{ name: 'notify_admin_subscription_extended', category: 'subscriptions', is_configurable: true },
{ name: 'notify_admin_user_group_changed', category: 'users_accounts', is_configurable: true },
{ name: 'notify_user_user_group_changed', category: 'users_accounts', is_configurable: false },
{ name: 'notify_admin_when_user_is_imported', category: 'users_accounts', is_configurable: true },
{ name: 'notify_user_profile_complete', category: 'users_accounts', is_configurable: false },
{ name: 'notify_user_auth_migration', category: 'user', is_configurable: false },
{ name: 'notify_admin_user_merged', category: 'users_accounts', is_configurable: true },
{ name: 'notify_admin_profile_complete', category: 'users_accounts', is_configurable: true },
{ name: 'notify_admin_abuse_reported', category: 'projects', is_configurable: true },
{ name: 'notify_admin_invoicing_changed', category: 'deprecated', is_configurable: false },
{ name: 'notify_user_wallet_is_credited', category: 'wallet', is_configurable: false },
{ name: 'notify_admin_user_wallet_is_credited', category: 'wallet', is_configurable: true },
{ name: 'notify_admin_export_complete', category: 'exports', is_configurable: false },
{ name: 'notify_member_about_coupon', category: 'agenda', is_configurable: false },
{ name: 'notify_member_reservation_reminder', category: 'agenda', is_configurable: false },
{ name: 'notify_admin_free_disk_space', category: 'app_management', is_configurable: false },
{ name: 'notify_admin_close_period_reminder', category: 'accountings', is_configurable: true },
{ name: 'notify_admin_archive_complete', category: 'accountings', is_configurable: true },
{ name: 'notify_privacy_policy_changed', category: 'app_management', is_configurable: false },
{ name: 'notify_admin_import_complete', category: 'app_management', is_configurable: false },
{ name: 'notify_admin_refund_created', category: 'wallet', is_configurable: true },
{ name: 'notify_admins_role_update', category: 'users_accounts', is_configurable: true },
{ name: 'notify_user_role_update', category: 'users_accounts', is_configurable: false },
{ name: 'notify_admin_objects_stripe_sync', category: 'payments', is_configurable: false },
{ name: 'notify_user_when_payment_schedule_ready', category: 'payments', is_configurable: false },
{ name: 'notify_admin_payment_schedule_failed', category: 'payments', is_configurable: true },
{ name: 'notify_member_payment_schedule_failed', category: 'payments', is_configurable: false },
{ name: 'notify_admin_payment_schedule_check_deadline', category: 'payments', is_configurable: true },
{ name: 'notify_admin_payment_schedule_transfer_deadline', category: 'payments', is_configurable: true },
{ name: 'notify_admin_payment_schedule_error', category: 'payments', is_configurable: true },
{ name: 'notify_member_payment_schedule_error', category: 'payments', is_configurable: false },
{ name: 'notify_admin_payment_schedule_gateway_canceled', category: 'payments', is_configurable: true },
{ name: 'notify_member_payment_schedule_gateway_canceled', category: 'payments', is_configurable: false },
{ name: 'notify_admin_user_supporting_document_files_created', category: 'supporting_documents', is_configurable: true },
{ name: 'notify_admin_user_supporting_document_files_updated', category: 'supporting_documents', is_configurable: true },
{ name: 'notify_user_is_validated', category: 'users_accounts', is_configurable: false },
{ name: 'notify_user_is_invalidated', category: 'users_accounts', is_configurable: false },
{ name: 'notify_user_supporting_document_refusal', category: 'supporting_documents', is_configurable: false },
{ name: 'notify_admin_user_supporting_document_refusal', category: 'supporting_documents', is_configurable: true },
{ name: 'notify_user_order_is_ready', category: 'shop', is_configurable: false },
{ name: 'notify_user_order_is_canceled', category: 'shop', is_configurable: false },
{ name: 'notify_user_order_is_refunded', category: 'shop', is_configurable: false },
{ name: 'notify_admin_low_stock_threshold', category: 'shop', is_configurable: true },
{ name: 'notify_admin_training_auto_cancelled', category: 'trainings', is_configurable: true },
{ name: 'notify_member_training_auto_cancelled', category: 'trainings', is_configurable: false }
].freeze
NOTIFICATIONS_TYPES.each do |notification_type|
next if NotificationType.find_by(name: notification_type[:name])
unless NotificationType.find_by(name: 'notify_member_reservation_limit_reached')
NotificationType.create!(
name: 'notify_member_reservation_limit_reached',
category: 'agenda',
is_configurable: false
name: notification_type[:name],
category: notification_type[:category],
is_configurable: notification_type[:is_configurable]
)
end

View File

@ -25,8 +25,15 @@ class PayZen::Service < Payment::Service
order_id: order_id
}
unless first_item.details['adjustment']&.zero? && first_item.details['other_items']&.zero?
params[:initial_amount] = payzen_amount(first_item.amount)
params[:initial_amount_number] = 1
initial_amount = first_item.amount
initial_amount -= payment_schedule.wallet_amount if payment_schedule.wallet_amount
if initial_amount.zero?
params[:effect_date] = (first_item.due_date + 1.month).iso8601
params[:rrule] = rrule(payment_schedule, -1)
else
params[:initial_amount] = payzen_amount(initial_amount)
params[:initial_amount_number] = 1
end
end
pz_subscription = client.create_subscription(**params)
@ -123,16 +130,21 @@ class PayZen::Service < Payment::Service
private
def rrule(payment_schedule)
def rrule(payment_schedule, offset = 0)
count = payment_schedule.payment_schedule_items.count
"RRULE:FREQ=MONTHLY;COUNT=#{count}"
"RRULE:FREQ=MONTHLY;COUNT=#{count + offset}"
end
# check if the given transaction matches the given PaymentScheduleItem
def transaction_matches?(transaction, payment_schedule_item)
transaction_date = Time.zone.parse(transaction['creationDate']).to_date
transaction['amount'] == payment_schedule_item.amount &&
amount = payment_schedule_item.amount
if !payment_schedule_item.details['adjustment']&.zero? && payment_schedule_item.payment_schedule.wallet_amount
amount -= payment_schedule_item.payment_schedule.wallet_amount
end
transaction['amount'] == amount &&
transaction_date >= payment_schedule_item.due_date.to_date &&
transaction_date <= payment_schedule_item.due_date.to_date + 7.days
end

View File

@ -1,6 +1,6 @@
{
"name": "fab-manager",
"version": "6.0.6",
"version": "6.0.7",
"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",