# frozen_string_literal: true require 'work_day' require 'active_support' require 'active_support/core_ext/date' module ROI class GrossProfit attr_reader :start_date, :end_date, :rentabilities def initialize(rentabilities, start_date, end_date) @rentabilities = rentabilities @start_date = start_date @end_date = end_date end def current_month scope_start = WorkDay.next_after(end_date.beginning_of_month, 0) format_gross_profit(scope_start, end_date) end def months(amount) scope_start = (end_date - amount.months + 1.month).beginning_of_month check_gaps_and_format(scope_start, end_date) end def current_year scope_start = WorkDay.next_after(end_date.beginning_of_year, 0) format_gross_profit(scope_start, end_date) end def years_ago(amount) scope_end = (end_date - amount.year).end_of_year scope_start = scope_end.beginning_of_year format_gross_profit(scope_start, scope_end) end def portfolio format_gross_profit(start_date, end_date) end private def scoped_rentabilities(scope_start, scope_end) rentabilities.values.select.each do |line| line.reference_date.between?(scope_start, scope_end) end end def format_gross_profit(scope_start, scope_end) return unless scope_start && scope_end total = scoped_rentabilities(scope_start, scope_end).sum do |line| line.try(:gross_profit) || 0 end.round(2) total.zero? ? nil : total end def check_gaps_and_format(scope_start, scope_end) return unless scope_start >= start_date scoped_rentabilities(scope_start, scope_end).each do |line| return nil if line.try(:have_position) == false end format_gross_profit(scope_start, scope_end) end end end