# frozen_string_literal: true # A single line inside an invoice. Can be a subscription or a reservation class InvoiceItem < Footprintable belongs_to :invoice has_one :invoice_item # associates invoice_items of an invoice to invoice_items of an Avoir has_one :payment_gateway_object, as: :item belongs_to :object, polymorphic: true belongs_to :reservation, foreign_type: 'Reservation', foreign_key: 'object_id' belongs_to :subscription, foreign_type: 'Subscription', foreign_key: 'object_id' belongs_to :wallet_transaction, foreign_type: 'WalletTransaction', foreign_key: 'object_id' belongs_to :offer_day, foreign_type: 'OfferDay', foreign_key: 'object_id' belongs_to :statistic_profile_prepaid_pack, foreign_type: 'StatisticProfilePrepaidPack', foreign_key: 'object_id' after_create :chain_record after_update :log_changes def amount_after_coupon # deduct coupon discount coupon_service = CouponService.new coupon_service.ventilate(invoice.total, amount, invoice.coupon) end # return the item amount, coupon discount deducted, if any, and VAT excluded, if applicable def net_amount # deduct VAT vat_service = VatHistoryService.new vat_rate = vat_service.invoice_vat(invoice) Rational(amount_after_coupon / (vat_rate / 100.00 + 1)).round.to_f end # return the VAT amount for this item def vat amount_after_coupon - net_amount end private def log_changes return if Rails.env.test? return unless changed? puts "WARNING: InvoiceItem update triggered [ id: #{id}, invoice reference: #{invoice.reference} ]" puts '---------- changes ----------' puts changes puts '---------------------------------' end end