class DashboardController < ApplicationController def index # Raft allocation by crop type # @raft_data = raft_data_series @nutrient_profiles = NutrientProfile.order(:name) # Nutrient target table # @latest_measurement = NutrientMeasurement.order(measured_on: :desc, created_at: :desc).first # @target = TargetNutrientCalculator.call # Measurement history table @measurements = NutrientMeasurement.order(measured_on: :desc).limit(10) @npk_measurement_data = NutrientMeasurement.data_series_for(:nno3, :p, :k) @ammonium_measurement_data = NutrientMeasurement.data_series_for(:nnh4) @weighted = Target.first.weighted_requirements # => { "nno3"=>..., "p"=>..., ... } last = NutrientMeasurement.order(measured_on: :desc, created_at: :desc).first @latest_measurements = {} if last # Use the same keys as NutrientProfile to keep naming consistent. keys = (NutrientProfile::NUTRIENT_KEYS rescue []).map(&:to_s) keys.each do |k| @latest_measurements[k] = last.send(k) if last.respond_to?(k) end end end private def raft_data_series data_series = [] counts = Raft.left_outer_joins(:crop) .group("crops.name", "crops.crop_type") .count counts.each do |(crop_name, crop_type), count| name = (crop_name || "unassigned").titleize type = (crop_type || "unassigned").titleize data = { type => count } data_series << { name:, data: } end unassigned, assigned = data_series.partition { |s| s[:name].casecmp("unassigned").zero? } assigned + unassigned end end