From 9e1f1f7e1fd6a7d0dbd33e2a50f45dc59f39d7e7 Mon Sep 17 00:00:00 2001 From: Vincent Pochet Date: Fri, 3 Jan 2025 15:04:18 +0100 Subject: [PATCH] misc(fee): Delete zero amount finalized fees --- .../20250103124802_drop_zero_amount_fees.rb | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 db/migrate/20250103124802_drop_zero_amount_fees.rb diff --git a/db/migrate/20250103124802_drop_zero_amount_fees.rb b/db/migrate/20250103124802_drop_zero_amount_fees.rb new file mode 100644 index 00000000000..9cbfe31efe4 --- /dev/null +++ b/db/migrate/20250103124802_drop_zero_amount_fees.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +class DropZeroAmountFees < ActiveRecord::Migration[7.1] + disable_ddl_transaction! + + class FeesTax < ApplicationRecord; end + + class Fee < ApplicationRecord; end + + def change + sql = <<~SQL + SELECT fees.id FROM fees + INNER JOIN invoices ON fees.invoice_id = invoices.id + INNER JOIN organizations ON invoices.organization_id = organizations.id + WHERE + invoices.status IN (1, 2, 6) -- finalized, voided and closed + AND fees.fee_type = 0 -- charge + AND fees.amount_cents = 0 + AND fees.units = 0 + AND fees.pay_in_advance = false + AND fees.true_up_parent_fee_id IS NULL + AND fees.id NOT IN ( + SELECT f.true_up_parent_fee_id + FROM fees f + WHERE f.true_up_parent_fee_id IS NOT NULL + ) + AND fees.id NOT IN ( + SELECT fee_id + FROM adjusted_fees + WHERE adjusted_fees.fee_id IS NOT NULL + ) + AND NOT ('zero_amount_fees' = ANY(organizations.premium_integrations)) + LIMIT 1000 + SQL + + while (ids = ActiveRecord::Base.connection.select_all(sql).rows.map(&:first)).any? + FeesTax.where(fee_id: ids).delete_all + Fee.where(id: ids).delete_all + + puts "Deleted #{ids.size} fees - #{Time.current.iso8601}" # rubocop:disable Rails/Output + end + end +end