Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rilutham/fe89a5f7ce4e54ec9126f7278ee63b87 to your computer and use it in GitHub Desktop.
Save rilutham/fe89a5f7ce4e54ec9126f7278ee63b87 to your computer and use it in GitHub Desktop.
calculate_payroll_scheme_user_adjustments.rb
class CalculatePayrollSchemeUserAdjustments
include Interactor
def call
context.fail!(message: I18n.t("admin.user_adjustments.e.payroll_scheme_nil")) if context.payroll_scheme.blank?
context.fail!(message: I18n.t("admin.user_adjustments.e.payroll_scheme_users_nil")) if context.payroll_scheme.users.blank?
payroll_scheme = context.payroll_scheme
users = payroll_scheme.users
start_date = payroll_scheme.current_period_start_date
end_date = payroll_scheme.period_end.present? ? payroll_scheme.period_end : payroll_scheme.current_period_end_date
context.failed_items_all = []
ActiveRecord::Base.transaction do
users.each do |user|
payslip = Payslip.create!(
payroll_scheme_id: payroll_scheme.id,
user_id: user.id,
start_date: start_date,
end_date: end_date
)
before_gross_ac = payroll_scheme.adjustment_conditions.reject(&:is_after_gross)
after_gross_ac = payroll_scheme.adjustment_conditions.select(&:is_after_gross)
gross_value = 0
failed_items = []
before_gross_ac.each do |ac|
interactor = CalculateUserAdjustment.call(
payroll_scheme: payroll_scheme,
email: user.email,
start_date: start_date,
end_date: end_date,
payslip: payslip,
adjustment_condition: ac
)
if interactor.failure?
failed_items << { email: user.email, adjustment_condition: ac, message: interactor.message }
else
gross_value += interactor.adjustment_item_value
end
end
if after_gross_ac.present? && failed_items.blank? && gross_value.abs > 0
after_gross_ac.each do |ac|
interactor = CalculateUserAdjustment.call(
payroll_scheme: payroll_scheme,
email: user.email,
start_date: start_date,
end_date: end_date,
payslip: payslip,
adjustment_condition: ac,
gross_value: gross_value
)
if interactor.failure?
failed_items << { email: user.email, adjustment_condition: ac, message: interactor.message }
end
end
end
context.failed_items_all += failed_items
end
context.fail!(message: I18n.t("admin.user_adjustments.e.failed_items_present")) if context.failed_items_all.present?
rescue StandardError => e
context.fail!(message: e.message)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment