app/controllers/schools/meters_controller.rb
module Schools
class MetersController < ApplicationController
include CsvDownloader
load_and_authorize_resource :school
load_and_authorize_resource through: :school
before_action :set_breadcrumbs
def index
load_meters
@meter = @school.meters.new
@pending_reviews = meters_need_review?
@enough_data_for_targets = enough_data_for_targets?
respond_to do |format|
format.html
format.csv { send_data readings_to_csv(AmrValidatedReading.download_query_for_school(@school), AmrValidatedReading::CSV_HEADER_FOR_SCHOOL), filename: "school-amr-readings-#{@school.name.parameterize}.csv" }
end
end
def show
set_n3rgy_status
respond_to do |format|
format.html
format.csv { send_data readings_to_csv(AmrValidatedReading.download_query_for_meter(@meter), AmrValidatedReading::CSV_HEADER_FOR_METER), filename: "meter-amr-readings-#{@meter.mpan_mprn}.csv" }
end
end
def create
manager = MeterManagement.new(@meter)
if @meter.save
manager.process_creation!
redirect_to school_meters_path(@school)
else
load_meters
render :index
end
end
def edit
end
def update
@meter.attributes = meter_params
manager = MeterManagement.new(@meter)
if @meter.save
if @meter.mpan_mprn_previously_changed?
manager.process_mpan_mpnr_change!
end
redirect_to school_meters_path(@school), notice: 'Meter updated'
else
render :edit
end
end
def inventory
@inventory = Meters::N3rgyMeteringService.new(@meter).inventory
render :inventory
rescue => e
flash[:error] = e
render :inventory
end
def deactivate
MeterManagement.new(@meter).deactivate_meter!
redirect_to school_meters_path(@school), notice: 'Meter deactivated'
end
def activate
MeterManagement.new(@meter).activate_meter!
redirect_to school_meters_path(@school), notice: 'Meter activated'
end
def destroy
MeterManagement.new(@meter).delete_meter!
redirect_to school_meters_path(@school)
end
private
def set_n3rgy_status
return unless can?(:view_dcc_data, @school)
service = Meters::N3rgyMeteringService.new(@meter)
@known_to_n3rgy = service.available?
if @known_to_n3rgy && @meter.dcc_meter
@n3rgy_status = service.status
@n3rgy_consent_confirmed = service.consented?
@available_cache_range = service.available_data if @n3rgy_consent_confirmed
end
end
def set_breadcrumbs
@breadcrumbs = [{ name: I18n.t('manage_school_menu.manage_meters') }]
end
def enough_data_for_targets?
return nil unless can?(:view_target_data, @school)
Targets::SchoolTargetService.new(@school).enough_data?
end
def meters_need_review?
@school.meters.unreviewed_dcc_meter.any?
end
def load_meters
@meters ||= @school.meters
@active_meters = @meters.active.real.order(:mpan_mprn)
@inactive_meters = @meters.inactive.real.order(:mpan_mprn)
@active_pseudo_meters = @meters.active.pseudo.order(:mpan_mprn)
@inactive_pseudo_meters = @meters.inactive.pseudo.order(:mpan_mprn)
@invalid_mpan = @active_meters.select(&:electricity?).reject(&:correct_mpan_check_digit?)
end
def meter_params
params.require(:meter).permit(:mpan_mprn, :meter_type, :name, :meter_serial_number, :dcc_meter, :data_source_id, :procurement_route_id, :admin_meter_statuses_id, :meter_system)
end
end
end