Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Agnes/lg 13018 billing report v2 #10613

Merged
merged 22 commits into from
May 13, 2024
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
020c14f
lg-13013-initial commit for branch name change
colter-nattrass Apr 30, 2024
c26711d
lg-13013-fixed branch naming
colter-nattrass Apr 30, 2024
5b9042d
lg-13013-checking-in-for-samatha
colter-nattrass May 1, 2024
b49e218
lg-13013-fixed branch naming
colter-nattrass Apr 30, 2024
715dd3e
lg-13013 updated specs and unqui_counts_by_partner helper
samathad2023 May 2, 2024
28120fe
lg-13013 removing unwanted updates
samathad2023 May 3, 2024
fdd7b60
lg-13013-modifying sql statements to bring in verification by year sums
colter-nattrass May 3, 2024
4f73153
lg-13013 completed modifications to counts_by_partner module, working…
colter-nattrass May 7, 2024
06c27ea
lg-13013- implemented changes from feedback
colter-nattrass May 9, 2024
e108978
lg-13013 stage everything for samatha, will remove binding.pry statem…
colter-nattrass May 9, 2024
1a7c78d
lg-13013 adding changes to counts by partner class definition and spe…
colter-nattrass May 10, 2024
7acaf2c
lg-13013 indentation lint fixes
colter-nattrass May 10, 2024
9126824
lg-13018 created new billingv2 report
samathad2023 May 11, 2024
2e69293
lg-13018 combined invoice report v2 with partner
samathad2023 May 13, 2024
3755c9c
Remove Rubocop lint disabling by adding appropriate associations
zachmargolis May 13, 2024
649b70d
PR comments
samathad2023 May 13, 2024
7c6b6cd
lint fix
samathad2023 May 13, 2024
882b8f7
Update service_provider.rb
ThatSpaceGuy May 13, 2024
c71217d
Update app/jobs/reports/combined_invoice_supplement_report_v2.rb
ThatSpaceGuy May 13, 2024
723868e
Config cron run updates
samathad2023 May 13, 2024
2f42fb2
Update combined_invoice_supplement_report_v2_spec.rb
ThatSpaceGuy May 13, 2024
d5268fe
Merge remote-tracking branch 'origin/main' into agnes/lg-13018-billin…
samathad2023 May 13, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
158 changes: 158 additions & 0 deletions app/jobs/reports/combined_invoice_supplement_report_v2.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
# frozen_string_literal: true

require 'csv'

module Reports
class CombinedInvoiceSupplementReportV2 < BaseReport
REPORT_NAME = 'combined-invoice-supplement-report-v2'

def perform(_date)
csv = build_csv(IaaReportingHelper.iaas, IaaReportingHelper.partner_accounts)
save_report(REPORT_NAME, csv, extension: 'csv')
end

# @param [Array<IaaReportingHelper::IaaConfig>] iaas
# @param [Array<IaaReportingHelper::PartnerConfig>] partner_accounts
# @return [String] CSV report
def build_csv(iaas, partner_accounts)
by_iaa_results = iaas.flat_map do |iaa|
Db::MonthlySpAuthCount::UniqueMonthlyAuthCountsByIaa.call(
key: iaa.key,
issuers: iaa.issuers,
start_date: iaa.start_date,
end_date: iaa.end_date,
)
end

by_issuer_results = iaas.flat_map do |iaa|
iaa.issuers.flat_map do |issuer|
Db::MonthlySpAuthCount::TotalMonthlyAuthCountsWithinIaaWindow.call(
issuer: issuer,
iaa_start_date: iaa.start_date,
iaa_end_date: iaa.end_date,
iaa: iaa.key,
)
end
end

by_partner_results = partner_accounts.flat_map do |partner_account|
Db::MonthlySpAuthCount::NewUniqueMonthlyUserCountsByPartner.call(
partner: partner_account.partner,
issuers: partner_account.issuers,
start_date: partner_account.start_date,
end_date: partner_account.end_date,
)
end

combine_by_iaa_month(
by_iaa_results: by_iaa_results,
by_issuer_results: by_issuer_results,
by_partner_results: by_partner_results,
)
end

def combine_by_iaa_month(by_iaa_results:, by_issuer_results:, by_partner_results:)
by_iaa_and_year_month = by_iaa_results.group_by do |result|
[result[:key], result[:year_month]]
end

by_issuer_iaa_issuer_year_months = by_issuer_results.
group_by { |r| r[:iaa] }.
transform_values do |iaa|
iaa.group_by { |r| r[:issuer] }.
transform_values { |issuer| issuer.group_by { |r| r[:year_month] } }
end

# rubocop:disable Metrics/BlockLength
CSV.generate do |csv|
csv << [
'iaa_order_number',
'partner',
'iaa_start_date',
'iaa_end_date',

'issuer',
'friendly_name',

'year_month',
'year_month_readable',

'iaa_ial1_unique_users',
'iaa_ial2_unique_users',
'iaa_ial1_plus_2_unique_users',
'partner_ial2_new_unique_users_year1',
'partner_ial2_new_unique_users_year2',
'partner_ial2_new_unique_users_year3',
'partner_ial2_new_unique_users_year4',
'partner_ial2_new_unique_users_year5',
'partner_ial2_new_unique_users_year_greater_than_5',
'partner_ial2_new_unique_users_year_unknown',

'issuer_ial1_total_auth_count',
'issuer_ial2_total_auth_count',
'issuer_ial1_plus_2_total_auth_count',

'issuer_ial1_unique_users',
'issuer_ial2_unique_users',
'issuer_ial1_plus_2_unique_users',
'issuer_ial2_new_unique_users',
]
by_issuer_iaa_issuer_year_months.each do |iaa_key, issuer_year_months|
issuer_year_months.each do |issuer, year_months_data|
friendly_name = ServiceProvider.find_by(issuer: issuer).friendly_name
year_months = year_months_data.keys.sort

year_months.each do |year_month|
iaa_results = by_iaa_and_year_month[ [iaa_key, year_month] ]
issuer_results = year_months_data[year_month]
year_month_start = Date.strptime(year_month, '%Y%m')
iaa_start_date = Date.parse(iaa_results.first[:iaa_start_date])
iaa_end_date = Date.parse(iaa_results.first[:iaa_end_date])

partner_results = by_partner_results.find do |result|
result[:year_month] == year_month && result[:issuers]&.include?(issuer)
end || {}
csv << [
iaa_key,
partner_results[:partner],
iaa_start_date,
iaa_end_date,

issuer,
friendly_name,

year_month,
year_month_start.strftime('%B %Y'),

(iaa_ial1_unique_users = extract(iaa_results, :unique_users, ial: 1)),
(iaa_ial2_unique_users = extract(iaa_results, :unique_users, ial: 2)),
iaa_ial1_unique_users + iaa_ial2_unique_users,
partner_results[:partner_ial2_new_unique_users_year1] || 0,
partner_results[:partner_ial2_new_unique_users_year2] || 0,
partner_results[:partner_ial2_new_unique_users_year3] || 0,
partner_results[:partner_ial2_new_unique_users_year4] || 0,
partner_results[:partner_ial2_new_unique_users_year5] || 0,
partner_results[:partner_ial2_new_unique_users_year_greater_than_5] || 0,
partner_results[:partner_ial2_new_unique_users_year_unknown] || 0,

(ial1_total_auth_count = extract(issuer_results, :total_auth_count, ial: 1)),
(ial2_total_auth_count = extract(issuer_results, :total_auth_count, ial: 2)),
ial1_total_auth_count + ial2_total_auth_count,

(issuer_ial1_unique_users = extract(issuer_results, :unique_users, ial: 1)),
(issuer_ial2_unique_users = extract(issuer_results, :unique_users, ial: 2)),
issuer_ial1_unique_users + issuer_ial2_unique_users,
extract(issuer_results, :new_unique_users, ial: 2),
]
end
end
end
end
# rubocop:enable Metrics/BlockLength
end

def extract(arr, key, ial:)
arr.find { |elem| elem[:ial] == ial && elem[key] }&.dig(key) || 0
end
end
end
2 changes: 1 addition & 1 deletion app/models/agreements/integration.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ class Agreements::Integration < ApplicationRecord

belongs_to :partner_account
belongs_to :integration_status
belongs_to :service_provider
belongs_to :service_provider, foreign_key: :issuer, primary_key: :issuer, inverse_of: :integration

has_many :integration_usages, dependent: :restrict_with_exception
has_many :iaa_orders, through: :integration_usages
Expand Down
9 changes: 8 additions & 1 deletion app/models/service_provider.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,14 @@ class ServiceProvider < ApplicationRecord
primary_key: 'issuer',
dependent: :destroy

# Do not define validations in this model.
has_one :integration,
inverse_of: :service_provider,
foreign_key: 'issuer',
primary_key: 'issuer',
class_name: 'Agreements::Integration',
dependent: nil

# Do not define validations in this model
# See https://github.com/18F/identity_validations
include IdentityValidations::ServiceProviderValidation

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@

module Db
module MonthlySpAuthCount
module UniqueMonthlyAuthCountsByPartner
module NewUniqueMonthlyUserCountsByPartner
extend Reports::QueryHelpers

module_function

# @param [String] key label for billing (Partner requesting agency)
# @param [String] partner label for billing (Partner requesting agency)
# @param [Array<String>] issuers issuers for the iaa
# @param [Date] start_date iaa start date
# @param [Date] end_date iaa end date
# @return [PG::Result, Array]
def call(key:, issuers:, start_date:, end_date:)
def call(partner:, issuers:, start_date:, end_date:)
date_range = start_date...end_date

return [] if !date_range || issuers.blank?
Expand Down Expand Up @@ -56,6 +56,7 @@ def call(key:, issuers:, start_date:, end_date:)
rows = []

prev_seen_users = Set.new
issuers_set = issuers.to_set
year_months = year_month_to_users_to_profile_age.keys.sort

# rubocop:disable Metrics/BlockLength
Expand All @@ -79,7 +80,8 @@ def call(key:, issuers:, start_date:, end_date:)
prev_seen_users |= this_month_users

rows << {
key: key,
partner: partner,
issuers: issuers_set,
year_month: year_month,
iaa_start_date: date_range.begin.to_s,
iaa_end_date: date_range.end.to_s,
Expand Down
6 changes: 6 additions & 0 deletions config/initializers/job_configurations.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
cron_12m = '0/12 * * * *'
cron_1h = '0 * * * *'
cron_24h = '0 0 * * *'
cron_24h_1am = '0 1 * * *' # 1am UTC is 8pm EST/9pm EDT
gpo_cron_24h = '0 10 * * *' # 10am UTC is 5am EST/6am EDT
cron_1w = '0 0 * * 0'

Expand Down Expand Up @@ -59,6 +60,11 @@
cron: cron_24h,
args: -> { [Time.zone.today] },
},
combined_invoice_supplement_report_v2: {
class: 'Reports::CombinedInvoiceSupplementReportV2',
cron: cron_24h_1am,
args: -> { [Time.zone.today] },
},
agreement_summary_report: {
class: 'Reports::AgreementSummaryReport',
cron: cron_24h,
Expand Down
Loading