1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2024-11-29 10:24:20 +01:00
fab-manager/app/services/invoices/label_service.rb

88 lines
3.1 KiB
Ruby

# frozen_string_literal: true
# module definition
module Invoices; end
# Build a label for the given invoice
class Invoices::LabelService
class << self
# @param invoice [Invoice]
# @return [String, nil]
def build(invoice)
username = Invoices::RecipientService.name(invoice)
if invoice.is_a?(Avoir)
avoir_label(invoice)
else
case invoice.main_item&.object_type
when 'Reservation'
reservation_invoice_label(invoice, username)
when 'Subscription'
subscription_label(invoice.main_item.object, username)
when 'OfferDay'
offer_day_label(invoice.main_item.object, username)
when 'Error'
invoice.main_item&.object_id&.zero? ? I18n.t('invoices.error_invoice') : invoice.main_item&.description
when 'StatisticProfilePrepaidPack'
I18n.t('invoices.prepaid_pack')
when 'OrderItem'
I18n.t('invoices.order')
else
Rails.logger.error "specified main_item.object_type type (#{invoice.main_item&.object_type}) is unknown"
nil
end
end
end
private
# @param invoice [Invoice]
# @return [String]
def avoir_label(invoice)
return I18n.t('invoices.wallet_credit') if invoice.main_item&.object_type == WalletTransaction.name
I18n.t('invoices.cancellation_of_invoice_REF', **{ REF: invoice.invoice.reference })
end
# @param invoice [Invoice]
# @param username [String]
# @return [String]
def reservation_invoice_label(invoice, username)
label = I18n.t('invoices.reservation_of_USER_on_DATE_at_TIME',
**{ USER: username,
DATE: I18n.l(invoice.main_item.object.slots[0].start_at.to_date),
TIME: I18n.l(invoice.main_item.object.slots[0].start_at, format: :hour_minute) })
invoice.invoice_items.each do |item|
next unless item.object_type == Subscription.name
subscription = item.object
cancellation = invoice.is_a?(Avoir) ? "#{I18n.t('invoices.cancellation')} - " : ''
label = "\n- #{label}\n- #{cancellation + subscription_label(subscription, username)}"
break
end
label
end
# @param subscription [Subscription]
# @param username [String]
# @return [String]
def subscription_label(subscription, username)
subscription_start_at = subscription.expired_at - subscription.plan.duration
duration_verbose = I18n.t("duration.#{subscription.plan.interval}", **{ count: subscription.plan.interval_count })
I18n.t('invoices.subscription_of_NAME_for_DURATION_starting_from_DATE',
**{ NAME: username,
DURATION: duration_verbose,
DATE: I18n.l(subscription_start_at.to_date) })
end
# @param offer_day [OfferDay]
# @param username [String]
# @return [String]
def offer_day_label(offer_day, username)
I18n.t('invoices.subscription_of_NAME_extended_starting_from_STARTDATE_until_ENDDATE',
**{ NAME: username,
STARTDATE: I18n.l(offer_day.start_at.to_date),
ENDDATE: I18n.l(offer_day.end_at.to_date) })
end
end
end