# frozen_string_literal: true module OrgDateRangeable def monthly_range(org:, start_date: nil, end_date: Date.today.end_of_month) query_string = "org_id = :org_id" query_hash = { org_id: org.id } unless start_date.nil? query_string += " and date >= :start_date" query_hash[:start_date] = start_date end unless end_date.nil? query_string += " and date <= :end_date" query_hash[:end_date] = end_date end where(query_string, query_hash) end class << self def split_months_from_creation(org, &block) starts_at = org.created_at ends_at = starts_at.end_of_month callable = block.nil? ? Proc.new {} : lambda { | start_date, end_date| block.call(start_date, end_date) } enumerable = [] while !(starts_at.future? || ends_at.future?) do callable.call(starts_at, ends_at) enumerable << { start_date: starts_at, end_date: ends_at } starts_at = starts_at.next_month.beginning_of_month ends_at = starts_at.end_of_month end enumerable end end end