From 6c5b4d9595a0d92d11cec46314b419779a39b9ad Mon Sep 17 00:00:00 2001 From: Du Peng Date: Fri, 2 Jun 2023 18:33:07 +0200 Subject: [PATCH 1/6] (bug) OpenAPI accounting gateway_object_id missing error --- CHANGELOG.md | 2 ++ app/models/invoice.rb | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98e10f82e..188c8c221 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog Fab-manager +- Fix a bug: OpenAPI accounting gateway_object_id missing error + ## v6.0.6 2023 May 4 - Fix a bug: invalid duration for machine/spaces reservations in statistics, when using slots of not 1 hour diff --git a/app/models/invoice.rb b/app/models/invoice.rb index 2365559d8..b607fd08a 100644 --- a/app/models/invoice.rb +++ b/app/models/invoice.rb @@ -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 From 4fdbd4fcf15cde79efd2ecdaf39d1811b005f879 Mon Sep 17 00:00:00 2001 From: Du Peng Date: Thu, 8 Jun 2023 10:50:00 +0200 Subject: [PATCH 2/6] (bug) unable to modify the price of prepaid pack --- CHANGELOG.md | 1 + .../machines/configure-packs-button.tsx | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 188c8c221..4dcd8b2c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog Fab-manager - Fix a bug: OpenAPI accounting gateway_object_id missing error +- Fix a bug: unable to modify the price of prepaid pack ## v6.0.6 2023 May 4 diff --git a/app/frontend/src/javascript/components/pricing/machines/configure-packs-button.tsx b/app/frontend/src/javascript/components/pricing/machines/configure-packs-button.tsx index de1126bad..0f2eb7320 100644 --- a/app/frontend/src/javascript/components/pricing/machines/configure-packs-button.tsx +++ b/app/frontend/src/javascript/components/pricing/machines/configure-packs-button.tsx @@ -115,17 +115,17 @@ export const ConfigurePacksButton: React.FC = ({ pack itemId={p.id} itemType={t('app.admin.configure_packs_button.pack')} destroy={PrepaidPackAPI.destroy}/> - - {packData && } - )} + + {packData && } + {packs?.length === 0 && {t('app.admin.configure_packs_button.no_packs')}} } From 91fa1fcd85e85934839b97f8ec4f995e3bfe23c6 Mon Sep 17 00:00:00 2001 From: Du Peng Date: Thu, 15 Jun 2023 19:08:17 +0200 Subject: [PATCH 3/6] (bug) notification type missing --- CHANGELOG.md | 1 + db/seeds/notification_types.rb | 106 +++++++++++++++++++++++++-------- 2 files changed, 82 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4dcd8b2c4..feb19ba0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ - 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 ## v6.0.6 2023 May 4 diff --git a/db/seeds/notification_types.rb b/db/seeds/notification_types.rb index 8dbe8dc68..a181bd344 100644 --- a/db/seeds/notification_types.rb +++ b/db/seeds/notification_types.rb @@ -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 From 75259773d5098fcc80cdbfa41375d2594a950769 Mon Sep 17 00:00:00 2001 From: Du Peng Date: Mon, 19 Jun 2023 21:01:01 +0200 Subject: [PATCH 4/6] (bug) check object = nil --- app/models/footprintable.rb | 2 +- .../api/payment_schedules/_payment_schedule.json.jbuilder | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/footprintable.rb b/app/models/footprintable.rb index 18f17d1e5..33dc4774d 100644 --- a/app/models/footprintable.rb +++ b/app/models/footprintable.rb @@ -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] diff --git a/app/views/api/payment_schedules/_payment_schedule.json.jbuilder b/app/views/api/payment_schedules/_payment_schedule.json.jbuilder index 8875f10c0..73b5ecbbc 100644 --- a/app/views/api/payment_schedules/_payment_schedule.json.jbuilder +++ b/app/views/api/payment_schedules/_payment_schedule.json.jbuilder @@ -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 From 48ea7509cfda57c9e77a53ac86ffb697262da4aa Mon Sep 17 00:00:00 2001 From: Du Peng Date: Mon, 19 Jun 2023 21:09:26 +0200 Subject: [PATCH 5/6] (bug) Incorrect amount calculation when paying monthly subcription with a wallet --- CHANGELOG.md | 1 + lib/pay_zen/service.rb | 22 +++++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index feb19ba0d..9ba0521e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ - 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 diff --git a/lib/pay_zen/service.rb b/lib/pay_zen/service.rb index 2b5f096ce..f3b15be56 100644 --- a/lib/pay_zen/service.rb +++ b/lib/pay_zen/service.rb @@ -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 From 77035d81e291a429f41f0a07fd479d6a5155dff2 Mon Sep 17 00:00:00 2001 From: Du Peng Date: Tue, 20 Jun 2023 15:27:23 +0200 Subject: [PATCH 6/6] Version 6.0.7 --- CHANGELOG.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ba0521e5..53cfd1622 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # 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 diff --git a/package.json b/package.json index 38cad9cdb..1805174ea 100644 --- a/package.json +++ b/package.json @@ -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",