Skip to content

Commit

Permalink
Update activity log title by using a decorator
Browse files Browse the repository at this point in the history
  • Loading branch information
Kizr committed Jan 31, 2025
1 parent 3a65501 commit 8aa9d39
Show file tree
Hide file tree
Showing 23 changed files with 317 additions and 147 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ def index
@pagy, @claim_activities = pagy(Claims::ClaimActivity.order(created_at: :desc))

authorize [:claims, @claim_activities]

@claim_activities = @claim_activities.decorate
end

def show
Expand All @@ -11,6 +13,8 @@ def show
end

authorize [:claims, claim_activity]

@claim_activity = claim_activity.decorate
end

def resend_payer_email
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def update
@claim.status = :paid
@claim.save!

Claims::ClaimActivity.create!(action: :sampling_approved_manually, user: current_user, record: @claim)
Claims::ClaimActivity.create!(action: :provider_approved_audit, user: current_user, record: @claim)

redirect_to claims_support_claims_samplings_path, flash: {
heading: t(".success_heading"),
Expand Down
36 changes: 36 additions & 0 deletions app/decorators/claims/claim_activity_decorator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
class Claims::ClaimActivityDecorator < Draper::Decorator
delegate_all

def title
case action
when "payment_request_delivered"
I18n.t("#{translation_path}.payment_request_delivered", count: record.claims.count)
when "payment_response_uploaded"
I18n.t("#{translation_path}.payment_response_uploaded")
when "sampling_uploaded"
I18n.t("#{translation_path}.sampling_uploaded", count: record.claims.count)
when "sampling_response_uploaded"
I18n.t("#{translation_path}.sampling_response_uploaded", count: record.claims.count)
when "clawback_request_delivered"
I18n.t("#{translation_path}.clawback_request_delivered", count: record.claims.count)
when "clawback_response_uploaded"
I18n.t("#{translation_path}.clawback_response_uploaded", count: record.claims.count)
when "provider_approved_audit"
I18n.t("#{translation_path}.provider_approved_audit", provider_name: record.provider_name, claim_reference: record.reference)
when "rejected_by_provider"
I18n.t("#{translation_path}.rejected_by_provider", provider_name: record.provider_name, claim_reference: record.reference)
when "rejected_by_school"
I18n.t("#{translation_path}.rejected_by_school", school_name: record.school_name, claim_reference: record.reference)
when "approved_by_school"
I18n.t("#{translation_path}.approved_by_school", school_name: record.school_name, claim_reference: record.reference)
when "clawback_requested"
I18n.t("#{translation_path}.clawback_requested", claim_reference: record.reference)
end
end

private

def translation_path
"activerecord.attributes.claims/claim_activity/action"
end
end
5 changes: 3 additions & 2 deletions app/models/claims/claim_activity.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,16 @@ class Claims::ClaimActivity < ApplicationRecord
sampling_response_uploaded: "sampling_response_uploaded",
clawback_request_delivered: "clawback_request_delivered",
clawback_response_uploaded: "clawback_response_uploaded",
sampling_approved_manually: "sampling_approved_manually",
provider_approved_audit: "provider_approved_audit",
rejected_by_provider: "rejected_by_provider",
rejected_by_school: "rejected_by_school",
approved_by_school: "approved_by_school",
clawback_requested: "clawback_requested",
}, validate: true

delegate :full_name, to: :user, prefix: true, allow_nil: true

PAYMENT_AND_CLAWBACK_ACTIONS = %w[payment_request_delivered clawback_request_delivered clawback_response_uploaded].freeze
SAMPLING_ACTIONS = %w[sampling_uploaded sampling_response_uploaded].freeze
MANUAL_ACTIONS = %w[sampling_approved_manually rejected_by_provider rejected_by_school clawback_requested].freeze
MANUAL_ACTIONS = %w[provider_approved_audit rejected_by_provider rejected_by_school clawback_requested].freeze
end
1 change: 1 addition & 0 deletions app/models/claims/sampling.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@
#
class Claims::Sampling < ApplicationRecord
has_many :provider_samplings
has_many :claims, through: :provider_samplings
end
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<div class="app-timeline__item">
<div class="app-timeline__header">
<h3 class="app-timeline__title">
<%= Claims::ClaimActivity.human_attribute_name("action.#{claim_activity.action}") %>
<%= claim_activity.title %>
</h3>

<p class="app-timeline__byline">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<%= content_for :page_title, Claims::ClaimActivity.human_attribute_name("action.#{@claim_activity.action}") %>
<%= content_for :page_title, @claim_activity.title %>
<%= render "claims/support/primary_navigation", current: :claims %>

<% content_for(:before_content) do %>
Expand All @@ -7,7 +7,7 @@

<div class="govuk-width-container">
<p class="govuk-caption-l"><%= t(".page_caption") %></p>
<h1 class="govuk-heading-l"><%= Claims::ClaimActivity.human_attribute_name("action.#{@claim_activity.action}") %></h1>
<h1 class="govuk-heading-l"><%= @claim_activity.title %></h1>

<p class="govuk-body"><%= t(".byline", user: @claim_activity.user_full_name, time: l(@claim_activity.created_at, format: :date_at_time)) %></p>

Expand Down
25 changes: 20 additions & 5 deletions config/locales/en/activerecord.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,27 @@ en:
clawback_in_progress: Sent to payer for clawback
clawback_complete: Clawback complete
claims/claim_activity/action:
payment_request_delivered: Claims sent to payer for payment
approved_by_school: School %{school_name} approved audit for claim %{claim_reference}
clawback_requested: Clawback requested for claim %{claim_reference}
clawback_request_delivered:
one: 1 claim sent to payer for clawback
other: "%{count} claims sent to payer for clawback"
clawback_response_uploaded:
one: Payer clawback response uploaded for 1 claim
other: Payer clawback response uploaded for %{count} claims
payment_request_delivered:
one: 1 claim sent to payer for payment
other: "%{count} claims sent to payer for payment"
payment_response_uploaded: Payer payment response uploaded
sampling_uploaded: Audit data uploaded
sampling_response_uploaded: Provider audit response uploaded
clawback_request_delivered: Claims sent to payer for clawback
clawback_response_uploaded: Payer clawback response uploaded
rejected_by_provider: Provider %{provider_name} rejected audit for claim %{claim_reference}
rejected_by_school: School %{school_name} rejected audit for claim %{claim_reference}
provider_approved_audit: Provider %{provider_name} approved audit for claim %{claim_reference}
sampling_uploaded:
one: Audit data uploaded for 1 claim
other: Audit data uploaded for %{count} claims
sampling_response_uploaded:
one: Provider audit response uploaded for 1 claim
other: Provider audit response uploaded for %{count} claims
claims/claim_activity/document:
payment_request_delivered: Claims sent to payer
payment_response_uploaded: Payer payment response
Expand Down
214 changes: 214 additions & 0 deletions spec/decorators/claims/claim_activity_decorator_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
require "rails_helper"

RSpec.describe Claims::ClaimActivityDecorator do
describe "#title" do
context "when the claim activity action is payment_request_delivered" do
let(:claim_activity) { create(:claim_activity, :payment_request_delivered, record:) }
let(:decorated_claim_activity) { claim_activity.decorate }

context "when the claim activity has one claim" do
let(:record) { build(:claims_payment, claims: [build(:claim, :submitted)]) }

it "returns the translation for payment_request_delivered" do
expect(decorated_claim_activity.title).to eq("1 claim sent to payer for payment")
end
end

context "when the claim activity has more than one claim" do
let(:record) { build(:claims_payment, claims: build_list(:claim, 3, :submitted)) }

it "returns the translation for payment_request_delivered" do
expect(decorated_claim_activity.title).to eq("3 claims sent to payer for payment")
end
end

context "when the claim activity has no claims" do
let(:record) { build(:claims_payment, claims: []) }

it "returns the translation for payment_request_delivered" do
expect(decorated_claim_activity.title).to eq("0 claims sent to payer for payment")
end
end
end

context "when the claim activity action is payment_response_uploaded" do
let(:claim_activity) { create(:claim_activity, :payment_response_uploaded, record: create(:claims_payment)) }
let(:decorated_claim_activity) { claim_activity.decorate }

it "returns the translation for payment_response_uploaded" do
expect(decorated_claim_activity.title).to eq("Payer payment response uploaded")
end
end

context "when the claim activity action is sampling_uploaded" do
let(:claim_activity) { create(:claim_activity, :sampling_uploaded, record:) }
let(:decorated_claim_activity) { claim_activity.decorate }

context "when the claim activity has one claim" do
let(:provider_sampling) { build(:provider_sampling, provider_sampling_claims: [build(:claims_provider_sampling_claim)]) }
let(:record) { build(:claims_sampling, provider_samplings: [provider_sampling]) }

it "returns the translation for sampling_uploaded" do
expect(decorated_claim_activity.title).to eq("Audit data uploaded for 1 claim")
end
end

context "when the claim activity has more than one claim" do
let(:provider_sampling) { build(:provider_sampling, provider_sampling_claims: build_list(:claims_provider_sampling_claim, 3)) }
let(:record) { build(:claims_sampling, provider_samplings: [provider_sampling]) }

it "returns the translation for sampling_uploaded" do
expect(decorated_claim_activity.title).to eq("Audit data uploaded for 3 claims")
end
end

context "when the claim activity has no claims" do
let(:provider_sampling) { build(:provider_sampling, provider_sampling_claims: []) }
let(:record) { build(:claims_sampling, provider_samplings: [provider_sampling]) }

it "returns the translation for sampling_uploaded" do
expect(decorated_claim_activity.title).to eq("Audit data uploaded for 0 claims")
end
end
end

context "when the claim activity action is sampling_response_uploaded" do
let(:claim_activity) { create(:claim_activity, :sampling_response_uploaded, record:) }
let(:decorated_claim_activity) { claim_activity.decorate }

context "when the claim activity has one claim" do
let(:provider_sampling) { build(:provider_sampling, provider_sampling_claims: [build(:claims_provider_sampling_claim)]) }
let(:record) { build(:claims_sampling, provider_samplings: [provider_sampling]) }

it "returns the translation for sampling_response_uploaded" do
expect(decorated_claim_activity.title).to eq("Provider audit response uploaded for 1 claim")
end
end

context "when the claim activity has more than one claim" do
let(:provider_sampling) { build(:provider_sampling, provider_sampling_claims: build_list(:claims_provider_sampling_claim, 3)) }
let(:record) { build(:claims_sampling, provider_samplings: [provider_sampling]) }

it "returns the translation for sampling_response_uploaded" do
expect(decorated_claim_activity.title).to eq("Provider audit response uploaded for 3 claims")
end
end

context "when the claim activity has no claims" do
let(:provider_sampling) { build(:provider_sampling, provider_sampling_claims: []) }
let(:record) { build(:claims_sampling, provider_samplings: [provider_sampling]) }

it "returns the translation for sampling_response_uploaded" do
expect(decorated_claim_activity.title).to eq("Provider audit response uploaded for 0 claims")
end
end
end

context "when the claim activity action is clawback_request_delivered" do
let(:claim_activity) { create(:claim_activity, :clawback_request_delivered, record:) }
let(:decorated_claim_activity) { claim_activity.decorate }

context "when the claim activity has one claim" do
let(:record) { build(:claims_clawback, claims: [build(:claim, :submitted)]) }

it "returns the translation for clawback_request_delivered" do
expect(decorated_claim_activity.title).to eq("1 claim sent to payer for clawback")
end
end

context "when the claim activity has more than one claim" do
let(:record) { build(:claims_clawback, claims: build_list(:claim, 3, :submitted)) }

it "returns the translation for clawback_request_delivered" do
expect(decorated_claim_activity.title).to eq("3 claims sent to payer for clawback")
end
end

context "when the claim activity has no claims" do
let(:record) { build(:claims_clawback, claims: []) }

it "returns the translation for clawback_request_delivered" do
expect(decorated_claim_activity.title).to eq("0 claims sent to payer for clawback")
end
end
end

context "when the claim activity action is clawback_response_uploaded" do
let(:claim_activity) { create(:claim_activity, :clawback_response_uploaded, record:) }
let(:decorated_claim_activity) { claim_activity.decorate }

context "when the claim activity has one claim" do
let(:record) { build(:claims_clawback, claims: [build(:claim, :submitted)]) }

it "returns the translation for clawback_response_uploaded" do
expect(decorated_claim_activity.title).to eq("Payer clawback response uploaded for 1 claim")
end
end

context "when the claim activity has more than one claim" do
let(:record) { build(:claims_clawback, claims: build_list(:claim, 3, :submitted)) }

it "returns the translation for clawback_response_uploaded" do
expect(decorated_claim_activity.title).to eq("Payer clawback response uploaded for 3 claims")
end
end

context "when the claim activity has no claims" do
let(:record) { build(:claims_clawback, claims: []) }

it "returns the translation for clawback_response_uploaded" do
expect(decorated_claim_activity.title).to eq("Payer clawback response uploaded for 0 claims")
end
end
end

context "when the claim activity action is provider_approved_audit" do
let(:record) { create(:claim, reference: "12345678") }
let(:claim_activity) { create(:claim_activity, :provider_approved_audit, record:) }
let(:decorated_claim_activity) { claim_activity.decorate }

it "returns the translation for provider_approved_audit" do
expect(decorated_claim_activity.title).to eq("Provider #{record.provider_name} approved audit for claim 12345678")
end
end

context "when the claim activity action is rejected_by_provider" do
let(:record) { create(:claim, reference: "12345678") }
let(:claim_activity) { create(:claim_activity, :rejected_by_provider, record:) }
let(:decorated_claim_activity) { claim_activity.decorate }

it "returns the translation for rejected_by_provider" do
expect(decorated_claim_activity.title).to eq("Provider #{record.provider_name} rejected audit for claim 12345678")
end
end

context "when the claim activity action is rejected_by_school" do
let(:record) { create(:claim, reference: "12345678") }
let(:claim_activity) { create(:claim_activity, :rejected_by_school, record:) }
let(:decorated_claim_activity) { claim_activity.decorate }

it "returns the translation for rejected_by_school" do
expect(decorated_claim_activity.title).to eq("School #{record.school_name} rejected audit for claim 12345678")
end
end

context "when the claim activity action is approved_by_school" do
let(:record) { create(:claim, reference: "12345678") }
let(:claim_activity) { create(:claim_activity, :approved_by_school, record:) }
let(:decorated_claim_activity) { claim_activity.decorate }

it "returns the translation for approved_by_school" do
expect(decorated_claim_activity.title).to eq("School #{record.school_name} approved audit for claim 12345678")
end
end

context "when the claim activity action is clawback_requested" do
let(:claim_activity) { create(:claim_activity, :clawback_requested, record: build(:claim, reference: "12345678")) }
let(:decorated_claim_activity) { claim_activity.decorate }

it "returns the translation for clawback_requested" do
expect(decorated_claim_activity.title).to eq("Clawback requested for claim 12345678")
end
end
end
end
4 changes: 2 additions & 2 deletions spec/factories/claims/provider_sampling_claims.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
#
FactoryBot.define do
factory :claims_provider_sampling_claim, class: "Claims::ProviderSamplingClaim" do
association :claim, factory: :claims
association :provider_sampling, factory: :claims_provider_sampling
association :claim, factory: :claim
association :provider_sampling, factory: :provider_sampling
end
end
4 changes: 2 additions & 2 deletions spec/mailers/claims/provider_mailer_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@
expect(resend_sampling_checks_required_email.body.to_s.squish).to eq(<<~EMAIL.squish)
#{provider.name},
^ We are resending this email due to an internal issue. Please disregard any previous emails you may have received.
^ We are resending this email as requested. Please disregard any previous emails you may have received.
You are required by Department for Education (DfE) to complete quality assurance on funding claims associated with #{provider.name}.
Expand Down Expand Up @@ -296,7 +296,7 @@
expect(resend_sampling_checks_required_email.body.to_s.squish).to eq(<<~EMAIL.squish)
#{provider.name},
^ We are resending this email due to an internal issue. Please disregard any previous emails you may have received.
^ We are resending this email as requested. Please disregard any previous emails you may have received.
You are required by Department for Education (DfE) to complete quality assurance on funding claims associated with #{provider.name}.
Expand Down
1 change: 1 addition & 0 deletions spec/models/claims/sampling_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@
RSpec.describe Claims::Sampling, type: :model do
describe "associations" do
it { is_expected.to have_many(:provider_samplings) }
it { is_expected.to have_many(:claims).through(:provider_samplings) }
end
end
Loading

0 comments on commit 8aa9d39

Please sign in to comment.