Power BIPower BI · Microsoft Fabric · Azure Data Explorer

Analytics & Reporting

8 report domains embedded within AquaMonitor MDA. Shared semantic model blending Dataverse, D365 OData, and Azure Data Explorer into one unified analytics layer.

8
Report Domains
14
DAX Measures
22
Data Sources
7
RLS Roles
▼ scroll

Power BI8 Power BI Reports

Dataverse (OData)
D365 F&O OData
ADX DirectQuery
01
Biomass & Population Dashboard
AQU-PBI-001
Overview by sitePopulation trendMortality breakdownMAB utilization
Sources: nha_biomass (DV) · nha_popjournal (DV) · nha_mortjournal (DV) · InventOnHand [VE] (D365)
Refresh: Real-time on Dataverse change. D365: 15-min.
Embedded in: AquaMonitor Home + Sea Operations screen
02
Feed & FCR Performance
AQU-PBI-002
FCR by site/pen/generationFeed cost/kgBarge utilizationFCR trend
Sources: nha_feedevent (DV) · nha_fcr (DV) · InventJournal (D365 OData) · PurchPO lines (D365)
Refresh: Hourly (IoT batch). D365: 4×/day.
Embedded in: Feed Management screen
03
Sea Lice & Treatment Analytics
AQU-PBI-003
Weekly lice count chartZone mapTreatment historyWithdrawal calendar
Sources: nha_licecount (DV) · nha_treatment (DV) · nha_withdrawal (DV) · BarentsWatch submission log
Refresh: On nha_licecount update.
Embedded in: Sea Lice screen
04
Environmental Monitoring
AQU-PBI-004
Real-time temperatureDissolved O₂ depth profileAnomaly alertsHistorical trend
Sources: Azure Data Explorer (DirectQuery, 15-min) · nha_envalert (DV)
Refresh: DirectQuery — live from ADX.
Embedded in: Site Management screen
05
Harvest & Production Report
AQU-PBI-005
Harvest volume by siteGrade distributionvs BudgetSlaughterhouse throughput
Sources: nha_harvestevent (DV) · ProdProductionOrder (D365) · InventTrans (D365) · SalesOrder (D365)
Refresh: Daily (D365 batch). DV: on event.
Embedded in: Harvest screen
06
Financial Performance per Generation
AQU-PBI-006
P&L by Fish Generation dimCost breakdownIAS 41 accrualsRevenue vs Plan
Sources: GL transactions with FishGeneration dim (D365) · ProdCostTrans (D365) · Budget (D365 · FinancialReporter
Refresh: Daily EOD (D365 batch).
Embedded in: Finance workspace in D365
07
Asset & Maintenance KPIs
AQU-PBI-007
Pen uptimeVessel availabilityWO completion rateMaintenance cost trend
Sources: EntAssetWorkOrder (D365) · EntAssetObject (D365) · MaintenanceBudget (D365)
Refresh: Every 4 hours.
Embedded in: Asset Management workspace (D365)
08
Executive Aquaculture Dashboard
AQU-PBI-008
Cross-site KPI boardTotal biomass vs MABFCR fleet-wideFinancial summaryRegulatory risk status
Sources: All 8 datasets via shared semantic model. Mobile-optimized layout.
Refresh: 3×/day for exec view.
Embedded in: AquaMonitor Home (director role)

Core DAX Measures

14 core measures used across the 8 reports. All measures live in the shared semantic model to ensure consistency across all report pages.

FCR (Feed Conversion Ratio)
-- kg feed consumed / kg biomass gained FCR = VAR FeedKg = SUMX( nha_feedevent, nha_feedevent[kg_dispensed] ) VAR BiomassGain = CALCULATE( [Total Biomass (kg)], DATESINPERIOD( Dates[Date], MAX(Dates[Date]), -1, MONTH ) ) - CALCULATE( [Total Biomass (kg)], DATESINPERIOD( Dates[Date], MAX(Dates[Date]), -2, MONTH ) ) RETURN DIVIDE( FeedKg, BiomassGain, 0 )
Relative Daily Mortality % (RDM)
-- Dead fish / standing population × 100 Mortality % = DIVIDE( SUM( nha_mortjournal[mortalities] ), AVERAGE( nha_popjournal[population] ), 0 ) * 100
Specific Growth Rate (SGR %/day)
-- SGR = (ln(W2) - ln(W1)) / days × 100 SGR = VAR W1 = FIRSTNONBLANK( nha_weightsample[mean_weight_g], 1 ) VAR W2 = LASTNONBLANK( nha_weightsample[mean_weight_g], 1 ) VAR Days = DATEDIFF( MIN( nha_weightsample[sample_date] ), MAX( nha_weightsample[sample_date] ), DAY ) RETURN DIVIDE( LN(W2) - LN(W1), Days, 0 ) * 100
MAB Utilisation %
-- Standing biomass / Maximum Allowed Biomass MAB Utilisation % = DIVIDE( [Total Biomass (kg)], MAX( nha_site[mab_kg] ), 0 ) * 100
Cost per kg Harvested (NOK)
-- Total production cost / kg rounds harvested Cost per kg = VAR TotalCost = CALCULATE( SUM( ProdCostTrans[Amount] ), ProdCostTrans[CostCategory] IN { "Feed", "Labour", "Chemical", "Smolt" } ) VAR HarvestKg = SUM( nha_harvestevent[certified_weight_kg] ) RETURN DIVIDE( TotalCost, HarvestKg, 0 )
Adult Female Lice (avg per fish)
-- Regulatory threshold: 0.2 af (treatment), 0.5 (zone) Avg Adult Female Lice = AVERAGEX( FILTER( nha_licecount, nha_licecount[count_week] = MAX( nha_licecount[count_week] ) ), nha_licecount[adult_female] )

22-Table Data Model

Three data source types unified in one shared semantic model. All reports consume from this single model — change a measure once and it updates across all 8 reports.

Dataverse (OData Import)
nha_site
nha_pen
nha_generation
nha_biomass
nha_popjournal
nha_mortjournal
nha_weightsample
nha_feedevent
nha_fcr
nha_licecount
nha_treatment
nha_harvestevent
D365 F&O (OData Import)
InventOnHand
ProdProductionOrder
ProdCostTrans
InventJournalTrans
SalesOrderHeader
LedgerJournalTrans
(Fish Gen dim filter)
EntAssetWorkOrder
BudgetTransactionHeader
Azure Data Explorer (DirectQuery)
SensorReadings
(15-min, temp/O₂/salinity)
SensorAlerts
(threshold breaches)
DirectQuery to ADX means no data copy — queries run live against Azure Data Explorer. Enables real-time environmental dashboards with sub-second query response.

Row-Level Security — 7 Roles

RoleFilter ScopeDAX Filter Expression
SiteManagerOwn site onlynha_site[site_id] = USERPRINCIPALNAME_SITE() — User's assigned site from AAD attribute
RegionManagerOwn region (multiple sites)nha_site[region] = LOOKUPVALUE(UserRegion[region], UserRegion[email], USERPRINCIPALNAME())
OperationsBiologistAll sites, no financialsAll biological tables visible. ProdCostTrans and LedgerJournalTrans tables blocked entirely.
FinanceControllerAll financial, aggregated bioFull D365 financial tables. Dataverse biological tables visible at site aggregate level only (no pen detail).
OperationsDirectorAll data, all sitesNo row-level filter — full access to all tables. Masters executive dashboard (AQU-PBI-008).
VeterinarianHealth & treatment tables onlynha_licecount, nha_treatment, nha_prescription visible. Financial and production hidden.
ExternalAuditorRegulatory submission log onlyOnly Flow submission records (BarentsWatch, Altinn receipts). No live business data.

See the rollout plan

Power BI development starts in Week 19. Explore the full 28-week deployment schedule and team allocation.