diff --git a/app/controllers/ribs_controller.rb b/app/controllers/ribs_controller.rb index 367f3cb1c..dbb08ee5c 100644 --- a/app/controllers/ribs_controller.rb +++ b/app/controllers/ribs_controller.rb @@ -150,10 +150,9 @@ def rib_is_readonly redirect_to student_path(@student), alert: t("flash.ribs.readonly", name: @student.full_name) end - # TODO: Factoriser avec 'retry_incomplete_payment_request!' de 'schoolings_controller' ? def retry_rejected_or_unpaid_payment_request! @student.pfmps.in_state(:validated).each do |pfmp| - if pfmp.latest_payment_request&.eligible_for_auto_retry? + if pfmp.latest_payment_request&.eligible_for_rejected_or_unpaid_auto_retry? p_r = PfmpManager.new(pfmp).create_new_payment_request! p_r.mark_ready! end diff --git a/app/controllers/schoolings_controller.rb b/app/controllers/schoolings_controller.rb index 460c645ea..faee68d8c 100644 --- a/app/controllers/schoolings_controller.rb +++ b/app/controllers/schoolings_controller.rb @@ -72,7 +72,7 @@ def set_classe def retry_incomplete_payment_request! @schooling.pfmps.in_state(:validated).each do |pfmp| payment_request = pfmp.latest_payment_request - payment_request.mark_ready! if payment_request&.eligible_for_auto_retry? + payment_request.mark_ready! if payment_request&.eligible_for_incomplete_retry? end end diff --git a/app/models/asp/payment_request.rb b/app/models/asp/payment_request.rb index 2784a6d51..36eaac394 100644 --- a/app/models/asp/payment_request.rb +++ b/app/models/asp/payment_request.rb @@ -117,19 +117,9 @@ def active? !terminated? end - def eligible_for_auto_retry? - if in_state?(:incomplete) - eligible_for_incomplete_retry? - elsif in_state?(:rejected) || in_state?(:unpaid) - eligible_for_rejected_or_unpaid_auto_retry? - else - false - end - end - - private - def eligible_for_incomplete_retry? + return false unless in_state?(:incomplete) + retryable_messages = RETRYABLE_INCOMPLETE_VALIDATION_TYPES.map do |r| I18n.t("activerecord.errors.models.asp/payment_request.attributes.ready_state_validation.#{r}") end @@ -137,6 +127,8 @@ def eligible_for_incomplete_retry? end def eligible_for_rejected_or_unpaid_auto_retry? + return false unless in_state?(:rejected) || in_state?(:unpaid) + decorator = ActiveDecorator::Decorator.instance.decorate(self) message = in_state?(:rejected) ? decorator.rejected_reason : decorator.unpaid_reason %w[RIB BIC PAIEMENT].any? { |word| message.upcase.include?(word) } diff --git a/spec/models/asp/payment_request_spec.rb b/spec/models/asp/payment_request_spec.rb index aba221e9b..7929d5883 100644 --- a/spec/models/asp/payment_request_spec.rb +++ b/spec/models/asp/payment_request_spec.rb @@ -133,8 +133,7 @@ end end - # rubocop:disable RSpec/MultipleMemoizedHelpers - describe "eligible_for_auto_retry?" do + describe "eligible_for_incomplete_retry?" do let(:p_r_incomplete_for_abrogation) do create(:asp_payment_request, :incomplete, incomplete_reason: :needs_abrogated_attributive_decision) end @@ -147,56 +146,57 @@ end let(:p_r_ready) { create(:asp_payment_request, :ready) } - let(:p_r_rejected) { create(:asp_payment_request, :rejected) } - let(:p_r_rejected_rib) do - create(:asp_payment_request, :rejected, reason: "Test d'une raison de blocage d'un paiement bancaire") - end - let(:p_r_unpaid) { create(:asp_payment_request, :unpaid) } - let(:p_r_unpaid_rib) do - create(:asp_payment_request, :unpaid, reason: "Test d'une raison de blocage d'un paiement bancaire") - end - context "when the payment request is in 'incomplete' state with the abrogation specific error message" do it "returns true" do - expect(p_r_incomplete_for_abrogation.eligible_for_auto_retry?).to be true + expect(p_r_incomplete_for_abrogation.eligible_for_incomplete_retry?).to be true end end context "when the payment request is in 'incomplete' state with the missing DA specific error message" do it "returns true" do - expect(p_r_incomplete_for_missing_da.eligible_for_auto_retry?).to be true + expect(p_r_incomplete_for_missing_da.eligible_for_incomplete_retry?).to be true end end context "when the payment request is not in 'incomplete' state" do it "returns false" do - expect(p_r_ready.eligible_for_auto_retry?).to be false + expect(p_r_ready.eligible_for_incomplete_retry?).to be false end end + end + + describe "eligible_for_rejected_or_unpaid_auto_retry?" do + let(:p_r_rejected) { create(:asp_payment_request, :rejected) } + let(:p_r_rejected_rib) do + create(:asp_payment_request, :rejected, reason: "Test d'une raison de blocage d'un paiement bancaire") + end + let(:p_r_unpaid) { create(:asp_payment_request, :unpaid) } + let(:p_r_unpaid_rib) do + create(:asp_payment_request, :unpaid, reason: "Test d'une raison de blocage d'un paiement bancaire") + end context "when the payment request is in 'rejected' state without a RIB reason" do it "returns false" do - expect(p_r_rejected.eligible_for_auto_retry?).to be false + expect(p_r_rejected.eligible_for_rejected_or_unpaid_auto_retry?).to be false end end context "when the payment request is in 'rejected' state with a RIB reason" do it "returns true" do - expect(p_r_rejected_rib.eligible_for_auto_retry?).to be true + expect(p_r_rejected_rib.eligible_for_rejected_or_unpaid_auto_retry?).to be true end end context "when the payment request is in 'unpaid' state without a RIB reason" do it "returns false" do - expect(p_r_unpaid.eligible_for_auto_retry?).to be false + expect(p_r_unpaid.eligible_for_rejected_or_unpaid_auto_retry?).to be false end end context "when the payment request is in 'unpaid' state with a RIB reason" do it "returns true" do - expect(p_r_unpaid_rib.eligible_for_auto_retry?).to be true + expect(p_r_unpaid_rib.eligible_for_rejected_or_unpaid_auto_retry?).to be true end end end - # rubocop:enable RSpec/MultipleMemoizedHelpers end