From e82683efa1174bfc49b2250decedd45d083d18d9 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 2 Sep 2026 11:02:41 +0000 Subject: [PATCH 1/4] Add NZC Audit dashboard, five audit reports, Winter '27 list views, and docs - NZC Audit dashboard with a Reporting Year filter: emissions per asset across years (matrix), footprints by stage and by year x stage for stationary and fleet, orphaned footprints - Five supporting reports on the existing standalone report types - Six list views, one per NZC object, in their own manifest (package-4-list-views.xml) for the Winter '27 list-view inline-editing settings; kept out of package.xml so they never gate the core deploy - README: product naming history, page-layout dependency in the inline editing limits, Winter '27 list view section, updated counts - docs/building-your-own.md: matrix and dashboard filter syntax, the year-over-year formula recipe, list view column name space - CI manifest check now covers every manifest/*.xml and ListView members Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01XsipTUqX7dcQDkvUkaFCuC --- .github/workflows/validate.yml | 40 ++-- README.md | 57 +++++- docs/building-your-own.md | 71 +++++++ .../NZC_Audit.dashboard-meta.xml | 173 ++++++++++++++++++ .../NZC_Footprints.listView-meta.xml | 12 ++ .../NZC_Energy_Uses.listView-meta.xml | 10 + .../listViews/NZC_Assets.listView-meta.xml | 11 ++ .../NZC_Fleet_Footprints.listView-meta.xml | 9 + .../NZC_Fleet_Assets.listView-meta.xml | 9 + .../NZC_Fleet_Energy_Uses.listView-meta.xml | 11 ++ ...missions_by_Asset_and_Year.report-meta.xml | 35 ++++ .../Fleet_Footprints_by_Stage.report-meta.xml | 27 +++ ...otprints_by_Year_and_Stage.report-meta.xml | 29 +++ .../Footprints_by_Stage.report-meta.xml | 27 +++ ...otprints_by_Year_and_Stage.report-meta.xml | 29 +++ manifest/package-2-reports.xml | 5 + manifest/package-3-dashboards.xml | 1 + manifest/package-4-list-views.xml | 19 ++ manifest/package.xml | 6 + 19 files changed, 561 insertions(+), 20 deletions(-) create mode 100644 force-app/main/default/dashboards/NZC_Dashboards/NZC_Audit.dashboard-meta.xml create mode 100644 force-app/main/default/objects/StnryAssetCrbnFtprnt/listViews/NZC_Footprints.listView-meta.xml create mode 100644 force-app/main/default/objects/StnryAssetEnrgyUse/listViews/NZC_Energy_Uses.listView-meta.xml create mode 100644 force-app/main/default/objects/StnryAssetEnvrSrc/listViews/NZC_Assets.listView-meta.xml create mode 100644 force-app/main/default/objects/VehicleAssetCrbnFtprnt/listViews/NZC_Fleet_Footprints.listView-meta.xml create mode 100644 force-app/main/default/objects/VehicleAssetEmssnSrc/listViews/NZC_Fleet_Assets.listView-meta.xml create mode 100644 force-app/main/default/objects/VehicleAssetEnrgyUse/listViews/NZC_Fleet_Energy_Uses.listView-meta.xml create mode 100644 force-app/main/default/reports/NZC_Reports/Emissions_by_Asset_and_Year.report-meta.xml create mode 100644 force-app/main/default/reports/NZC_Reports/Fleet_Footprints_by_Stage.report-meta.xml create mode 100644 force-app/main/default/reports/NZC_Reports/Fleet_Footprints_by_Year_and_Stage.report-meta.xml create mode 100644 force-app/main/default/reports/NZC_Reports/Footprints_by_Stage.report-meta.xml create mode 100644 force-app/main/default/reports/NZC_Reports/Footprints_by_Year_and_Stage.report-meta.xml create mode 100644 manifest/package-4-list-views.xml diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 6ea2a95..d2a42f1 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -37,10 +37,10 @@ jobs: - name: Convert source (validates SFDX project structure) run: sf project convert source --output-dir mdapi-out - - name: Verify manifest members exist in source + - name: Verify manifest members exist in source (all manifests) run: | python3 - <<'EOF' - import sys, xml.etree.ElementTree as ET + import glob, sys, xml.etree.ElementTree as ET from pathlib import Path NS = {'m': 'http://soap.sforce.com/2006/04/metadata'} @@ -54,20 +54,30 @@ jobs: 'Dashboard': '.dashboardFolder-meta.xml', } - tree = ET.parse('manifest/package.xml') + def candidates_for(kind, value): + if kind == 'ListView': + obj, _, name = value.partition('.') + return [Path('force-app/main/default/objects') / obj / 'listViews' / f'{name}.listView-meta.xml'] + if kind not in SUFFIX: + return None + base, suffix = SUFFIX[kind] + paths = [Path(base) / (value + suffix)] + if '/' not in value and kind in FOLDER_SUFFIX: + paths.append(Path(base) / (value + FOLDER_SUFFIX[kind])) + return paths + missing = [] - for t in tree.getroot().findall('m:types', NS): - name = t.find('m:name', NS).text - if name not in SUFFIX: - continue - base, suffix = SUFFIX[name] - for member in t.findall('m:members', NS): - value = member.text - candidates = [Path(base) / (value + suffix)] - if '/' not in value and name in FOLDER_SUFFIX: - candidates.append(Path(base) / (value + FOLDER_SUFFIX[name])) - if not any(c.is_file() for c in candidates): - missing.append(f'{name}: {value}') + for manifest in sorted(glob.glob('manifest/*.xml')): + tree = ET.parse(manifest) + for t in tree.getroot().findall('m:types', NS): + kind = t.find('m:name', NS).text + for member in t.findall('m:members', NS): + paths = candidates_for(kind, member.text) + if paths is None: + continue + if not any(p.is_file() for p in paths): + missing.append(f'{manifest}: {kind} {member.text}') + print(f'checked {manifest}') if missing: print('Manifest members with no matching source file:') print('\n'.join(missing)) diff --git a/README.md b/README.md index 4e7b9c5..7b55c0a 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,14 @@ [![Validate metadata](https://github.com/mshresponse/nzc-customreports/actions/workflows/validate.yml/badge.svg)](https://github.com/mshresponse/nzc-customreports/actions/workflows/validate.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) -**16 custom report types, 16 reports and 2 dashboards for Salesforce Net Zero Cloud** -(Agentforce Net Zero), using core Lightning reporting only. No CRM Analytics, no Einstein, -no managed package, no custom objects or fields. API 67.0. +**16 custom report types, 21 reports, 3 dashboards and 6 list views for Salesforce Net Zero +Cloud** (now sold as Agentforce Net Zero), using core Lightning reporting only. No CRM +Analytics, no Einstein, no managed package, no custom objects or fields. API 67.0. + +On the name: the product launched as Sustainability Cloud, became Net Zero Cloud in 2022 and +Agentforce Net Zero in 2025. Everything here is labelled `NZC:` because that is what the +object API names, the Setup menu and the developer guide still say — and because a report +type's API name can't be renamed in place, only deleted and recreated in every org that has it. The reports are laid out for **inline editing**, so a sustainability team can correct data in the report instead of raising a ticket for a CSV re-upload. @@ -77,11 +82,24 @@ nothing explains. **3 summaries** — Emissions by Reporting Year, Fuel Consumption by Fuel Type, Fleet Fuel by Fuel Type. +**5 audit reports** — the part of the CRM Analytics audit dashboard you can rebuild in core +Lightning. Emissions by Asset and Year is a matrix, one site per row and one year per +column, so a figure that jumped or collapsed between years stands out on a single screen. +Footprints by Stage and Footprints by Year and Stage (stationary and fleet) show how much of +each disclosure year is still draft or in progress — a number that could still change under +audit. + **16 report types** covering both stationary and fleet, in three shapes each — `with` (inner join), `with/without` (outer join), and standalone. Build your own reports on any of them; that's rather the point of shipping the source. -**2 dashboards** — NZC Data Quality and NZC Emissions Coverage. +**3 dashboards** — NZC Audit, NZC Data Quality and NZC Emissions Coverage. NZC Audit has a +**Reporting Year** filter across the top, so an admin can audit one disclosure year at a +time; the year list is 2023–2026 and is a one-minute edit in the dashboard builder. Every +component opens its report, and every report is editable inline where the record exists. + +**6 list views**, optional, for Winter '27 bulk editing — see +[List views for bulk edits](#list-views-for-bulk-edits-winter-27). --- @@ -121,6 +139,7 @@ The limits shaped the report layouts, so they're worth knowing before you promis | Grouping fields are not editable | Group by something you don't need to fix. | | A lookup that's null across the row can't be edited | You can't create a missing record from a report. | | FLS and validation rules still apply | A failing edit shows the rule's own message. | +| The field must be on the record's page layout, on the default tab | A column that's greyed out in the report is usually a field that's missing from the layout or sits on a second tab. Winter '27 lifts this for **list views only** (see below); reports still need the field on the layout. | That fourth row is why the **Missing** reports are upload worklists, not fix-it-here reports. If an asset has no footprint record, there's no footprint row to edit. Inline @@ -128,6 +147,34 @@ editing fixes what exists; it doesn't conjure records. --- + +## List views for bulk edits (Winter '27) + +Winter '27 adds two **User Interface** settings (Setup → User Interface), both off by +default: + +- **Make inline edits in list views with multiple record types** — a list mixing record + types used to turn editing off entirely. +- **Remove list view inline edit dependencies on page layout** — edit any field you have + edit access to, on the layout or not. + +With both on, a list view becomes the better bulk-edit surface: edit several rows, save +once, no refresh after every cell. The package ships one list view per Net Zero Cloud +object with the same narrow columns as the data-entry reports. They're in their own +manifest so they never gate the core deploy: + +```bash +sf project deploy start --manifest manifest/package-4-list-views.xml --target-org --dry-run +``` + +Honest caveat: list view column names are their own name space (see +[`docs/building-your-own.md`](docs/building-your-own.md)), and these six were written from +the pattern, not retrieved from an org. If the dry run rejects a column, build one list view +in the UI, retrieve it, and copy what Salesforce emitted — ten seconds, and it settles the +format for all six. + +--- + ## Orgs that work @@ -176,7 +223,7 @@ fuel, consumption and distance all live on `VehicleAssetEnrgyUse`. ## Continuous integration `.github/workflows/validate.yml` checks XML well-formedness, that `sf project convert -source` succeeds, and that manifest members have matching files. +source` succeeds, and that every member in every `manifest/*.xml` has a matching source file. **None of that can see a wrong object or field name.** A reference to an object that does not exist produces well-formed XML that converts cleanly and matches the manifest. This diff --git a/docs/building-your-own.md b/docs/building-your-own.md index 9a9db1f..a033305 100644 --- a/docs/building-your-own.md +++ b/docs/building-your-own.md @@ -101,3 +101,74 @@ report type is not a refinement here but the only way in. reports, dashboards, documents and email templates all require named folders. This wastes an afternoon roughly once per career. +## Matrix reports and dashboard filters + +The audit dashboard uses two constructs the rest of the package doesn't. + +**A matrix report** is a summary report with a second grouping axis. `groupingsDown` is the +row grouping, `groupingsAcross` the column grouping, and each `` entry with an +`aggregateTypes` becomes a cell value. Grouping on a lookup column (`…$StnryAssetEnvrSrc`) +groups by the parent's name, which is what you want for one-row-per-asset. + +**A dashboard filter** is declared once at the top of the dashboard: + +```xml + + + equals + 2025 + + Reporting Year + +``` + +and then each component names *its own* column for that filter, so components on different +report types can share one picker: + +```xml + + VehicleAssetCrbnFtprnt$ReportingYear + +``` + +The options are literal values, so the year list is hard-coded. Editing it in the dashboard +builder is faster than editing the XML. + +## Year-over-year change: build it in the UI + +The one audit signal deliberately not shipped as metadata is a **% change from the previous +year** column. It's a custom summary formula using `PREVGROUPVAL`, and its metadata form +references columns and groupings by internal keys that can only be confirmed by retrieving a +formula Salesforce itself emitted. Rather than ship a guess that would fail the all-or-nothing +deploy for everyone, add it in the report builder — it takes a minute: + +1. Open **Emissions by Reporting Year** → Edit. +2. Columns → **Add Summary Formula**. Name it `Scope 1 YoY change`, format Percent. +3. Formula (grouping level: Reporting Year): + + ``` + IF(ISBLANK(PREVGROUPVAL(StnryAssetCrbnFtprnt.TotScope1EmissionsInTco2e:SUM, StnryAssetCrbnFtprnt.ReportingYear)), 0, + (StnryAssetCrbnFtprnt.TotScope1EmissionsInTco2e:SUM + - PREVGROUPVAL(StnryAssetCrbnFtprnt.TotScope1EmissionsInTco2e:SUM, StnryAssetCrbnFtprnt.ReportingYear)) + / PREVGROUPVAL(StnryAssetCrbnFtprnt.TotScope1EmissionsInTco2e:SUM, StnryAssetCrbnFtprnt.ReportingYear)) + ``` + + The builder's insert-field picker will substitute the exact keys your org uses if these + differ. + +4. Save, then retrieve the report and commit the `` block Salesforce emitted. + +If you do that, please send it back as a pull request — it's the one thing this repo could +not verify without an org. + +## List views are a fourth name space + +List view `` entries are neither describe names nor report keys. Custom fields +use their API name; the record name column is `NAME`; and on the older core CRM objects +standard fields take legacy forms like `ACCOUNT.NAME`. The six list views in this package +use `NAME` plus plain field API names, which is the form the platform emits for objects +introduced after the classic CRM set — but it was written from the pattern, not retrieved. +That is exactly why they live in `manifest/package-4-list-views.xml` and not in +`package.xml`. If a column is rejected: build one list view in the UI, retrieve it, read +what came back, fix all six. + diff --git a/force-app/main/default/dashboards/NZC_Dashboards/NZC_Audit.dashboard-meta.xml b/force-app/main/default/dashboards/NZC_Dashboards/NZC_Audit.dashboard-meta.xml new file mode 100644 index 0000000..3e02ffc --- /dev/null +++ b/force-app/main/default/dashboards/NZC_Dashboards/NZC_Audit.dashboard-meta.xml @@ -0,0 +1,173 @@ + + + #FFFFFF + Diagonal + #FFFFFF + + + equals + 2023 + + + equals + 2024 + + + equals + 2025 + + + equals + 2026 + + Reporting Year + + LoggedInUser + Audit view of the emissions inventory in core Lightning, no CRM Analytics licence: emissions per asset across years to spot anomalies, how much of each year is still not complete, and orphaned records. Pick a Reporting Year at the top to audit one disclosure year at a time. + false + + Medium + + true + Auto + ColumnStacked + + StnryAssetCrbnFtprnt$ReportingYear + + Auto + false + false + true + true +
Anomalies
+ Bottom + NZC_Reports/Emissions_by_Asset_and_Year + false + false + false + RowLabelAscending + Scope 1 by Asset and Year (tCO2e) + false +
+ + true + Auto + Bar + + StnryAssetCrbnFtprnt$ReportingYear + + Auto + false + false + true + true +
Anomalies
+ Bottom + NZC_Reports/Orphaned_Carbon_Footprints + false + false + true + RowLabelAscending + Orphaned Footprints by Year + false +
+
+ + Medium + + true + Auto + Donut + + StnryAssetCrbnFtprnt$ReportingYear + + Auto + false + false + true + true +
Completeness
+ Bottom + NZC_Reports/Footprints_by_Stage + true + true + true + RowValueDescending + Stationary Footprints by Stage + false +
+ + true + Auto + ColumnStacked + + StnryAssetCrbnFtprnt$ReportingYear + + Auto + false + false + true + true +
Completeness
+ Bottom + NZC_Reports/Footprints_by_Year_and_Stage + false + false + true + RowLabelAscending + Stationary Footprints by Year and Stage + false +
+
+ + Medium + + true + Auto + Donut + + VehicleAssetCrbnFtprnt$ReportingYear + + Auto + false + false + true + true +
Fleet completeness
+ Bottom + NZC_Reports/Fleet_Footprints_by_Stage + true + true + true + RowValueDescending + Fleet Footprints by Stage + false +
+ + true + Auto + ColumnStacked + + VehicleAssetCrbnFtprnt$ReportingYear + + Auto + false + false + true + true +
Fleet completeness
+ Bottom + NZC_Reports/Fleet_Footprints_by_Year_and_Stage + false + false + true + RowLabelAscending + Fleet Footprints by Year and Stage + false +
+
+ #000000 + NZC Audit + #000000 + 18 +
diff --git a/force-app/main/default/objects/StnryAssetCrbnFtprnt/listViews/NZC_Footprints.listView-meta.xml b/force-app/main/default/objects/StnryAssetCrbnFtprnt/listViews/NZC_Footprints.listView-meta.xml new file mode 100644 index 0000000..8518a06 --- /dev/null +++ b/force-app/main/default/objects/StnryAssetCrbnFtprnt/listViews/NZC_Footprints.listView-meta.xml @@ -0,0 +1,12 @@ + + + NZC_Footprints + NAME + ReportingYear + FootprintStage + TotScope1EmissionsInTco2e + TotScope2LocBasedEmissions + TotScope2MktBasedEmissions + Everything + + diff --git a/force-app/main/default/objects/StnryAssetEnrgyUse/listViews/NZC_Energy_Uses.listView-meta.xml b/force-app/main/default/objects/StnryAssetEnrgyUse/listViews/NZC_Energy_Uses.listView-meta.xml new file mode 100644 index 0000000..10826ae --- /dev/null +++ b/force-app/main/default/objects/StnryAssetEnrgyUse/listViews/NZC_Energy_Uses.listView-meta.xml @@ -0,0 +1,10 @@ + + + NZC_Energy_Uses + NAME + FuelType + FuelConsumption + FuelConsumptionUnit + Everything + + diff --git a/force-app/main/default/objects/StnryAssetEnvrSrc/listViews/NZC_Assets.listView-meta.xml b/force-app/main/default/objects/StnryAssetEnvrSrc/listViews/NZC_Assets.listView-meta.xml new file mode 100644 index 0000000..2f4335f --- /dev/null +++ b/force-app/main/default/objects/StnryAssetEnvrSrc/listViews/NZC_Assets.listView-meta.xml @@ -0,0 +1,11 @@ + + + NZC_Assets + NAME + StationaryAssetType + BusinessRegion + City + Country + Everything + + diff --git a/force-app/main/default/objects/VehicleAssetCrbnFtprnt/listViews/NZC_Fleet_Footprints.listView-meta.xml b/force-app/main/default/objects/VehicleAssetCrbnFtprnt/listViews/NZC_Fleet_Footprints.listView-meta.xml new file mode 100644 index 0000000..8646605 --- /dev/null +++ b/force-app/main/default/objects/VehicleAssetCrbnFtprnt/listViews/NZC_Fleet_Footprints.listView-meta.xml @@ -0,0 +1,9 @@ + + + NZC_Fleet_Footprints + NAME + ReportingYear + FootprintStage + Everything + + diff --git a/force-app/main/default/objects/VehicleAssetEmssnSrc/listViews/NZC_Fleet_Assets.listView-meta.xml b/force-app/main/default/objects/VehicleAssetEmssnSrc/listViews/NZC_Fleet_Assets.listView-meta.xml new file mode 100644 index 0000000..2023480 --- /dev/null +++ b/force-app/main/default/objects/VehicleAssetEmssnSrc/listViews/NZC_Fleet_Assets.listView-meta.xml @@ -0,0 +1,9 @@ + + + NZC_Fleet_Assets + NAME + VehicleType + FleetVehicleType + Everything + + diff --git a/force-app/main/default/objects/VehicleAssetEnrgyUse/listViews/NZC_Fleet_Energy_Uses.listView-meta.xml b/force-app/main/default/objects/VehicleAssetEnrgyUse/listViews/NZC_Fleet_Energy_Uses.listView-meta.xml new file mode 100644 index 0000000..3f18ba8 --- /dev/null +++ b/force-app/main/default/objects/VehicleAssetEnrgyUse/listViews/NZC_Fleet_Energy_Uses.listView-meta.xml @@ -0,0 +1,11 @@ + + + NZC_Fleet_Energy_Uses + NAME + FuelType + FuelConsumption + FuelConsumptionUnit + Distance + Everything + + diff --git a/force-app/main/default/reports/NZC_Reports/Emissions_by_Asset_and_Year.report-meta.xml b/force-app/main/default/reports/NZC_Reports/Emissions_by_Asset_and_Year.report-meta.xml new file mode 100644 index 0000000..8a562ad --- /dev/null +++ b/force-app/main/default/reports/NZC_Reports/Emissions_by_Asset_and_Year.report-meta.xml @@ -0,0 +1,35 @@ + + + + Sum + StnryAssetCrbnFtprnt$TotScope1EmissionsInTco2e + + + Sum + StnryAssetCrbnFtprnt$TotScope2LocBasedEmissions + + + Sum + StnryAssetCrbnFtprnt$TotScope2MktBasedEmissions + + One row per stationary asset, one column per reporting year, emissions summed in each cell. Read across a row to spot a site whose number jumped or collapsed between years; that is the anomaly check the CRM Analytics audit dashboard does, without the licence. + Matrix + + Day + StnryAssetCrbnFtprnt$ReportingYear + Asc + + + Day + StnryAssetCrbnFtprnt$StnryAssetEnvrSrc + Asc + + Emissions by Asset and Year + Standalone_Carbon_Footprints__c + organization + false + + StnryAssetCrbnFtprnt$CreatedDate + INTERVAL_CUSTOM + + diff --git a/force-app/main/default/reports/NZC_Reports/Fleet_Footprints_by_Stage.report-meta.xml b/force-app/main/default/reports/NZC_Reports/Fleet_Footprints_by_Stage.report-meta.xml new file mode 100644 index 0000000..c6b9ad7 --- /dev/null +++ b/force-app/main/default/reports/NZC_Reports/Fleet_Footprints_by_Stage.report-meta.xml @@ -0,0 +1,27 @@ + + + + VehicleAssetCrbnFtprnt$Name + + + VehicleAssetCrbnFtprnt$ReportingYear + + + VehicleAssetCrbnFtprnt$VehicleAssetEmssnSrc + + Fleet equivalent of Footprints by Stage: how much of the vehicle inventory is still draft or in progress versus complete. + Summary + + Day + VehicleAssetCrbnFtprnt$FootprintStage + Asc + + Fleet Footprints by Stage + Standalone_Vehicle_Carbon_Footprints__c + organization + true + + VehicleAssetCrbnFtprnt$CreatedDate + INTERVAL_CUSTOM + + diff --git a/force-app/main/default/reports/NZC_Reports/Fleet_Footprints_by_Year_and_Stage.report-meta.xml b/force-app/main/default/reports/NZC_Reports/Fleet_Footprints_by_Year_and_Stage.report-meta.xml new file mode 100644 index 0000000..4e86336 --- /dev/null +++ b/force-app/main/default/reports/NZC_Reports/Fleet_Footprints_by_Year_and_Stage.report-meta.xml @@ -0,0 +1,29 @@ + + + + VehicleAssetCrbnFtprnt$Name + + + VehicleAssetCrbnFtprnt$VehicleAssetEmssnSrc + + Fleet equivalent of Footprints by Year and Stage: reporting years down, stage across, record count in each cell. + Matrix + + Day + VehicleAssetCrbnFtprnt$FootprintStage + Asc + + + Day + VehicleAssetCrbnFtprnt$ReportingYear + Asc + + Fleet Footprints by Year and Stage + Standalone_Vehicle_Carbon_Footprints__c + organization + false + + VehicleAssetCrbnFtprnt$CreatedDate + INTERVAL_CUSTOM + + diff --git a/force-app/main/default/reports/NZC_Reports/Footprints_by_Stage.report-meta.xml b/force-app/main/default/reports/NZC_Reports/Footprints_by_Stage.report-meta.xml new file mode 100644 index 0000000..285ff78 --- /dev/null +++ b/force-app/main/default/reports/NZC_Reports/Footprints_by_Stage.report-meta.xml @@ -0,0 +1,27 @@ + + + + StnryAssetCrbnFtprnt$Name + + + StnryAssetCrbnFtprnt$ReportingYear + + + StnryAssetCrbnFtprnt$StnryAssetEnvrSrc + + How much of the stationary inventory is still draft or in progress versus complete. Anything not complete is a number that could still change under audit. + Summary + + Day + StnryAssetCrbnFtprnt$FootprintStage + Asc + + Footprints by Stage + Standalone_Carbon_Footprints__c + organization + true + + StnryAssetCrbnFtprnt$CreatedDate + INTERVAL_CUSTOM + + diff --git a/force-app/main/default/reports/NZC_Reports/Footprints_by_Year_and_Stage.report-meta.xml b/force-app/main/default/reports/NZC_Reports/Footprints_by_Year_and_Stage.report-meta.xml new file mode 100644 index 0000000..a6c9bd3 --- /dev/null +++ b/force-app/main/default/reports/NZC_Reports/Footprints_by_Year_and_Stage.report-meta.xml @@ -0,0 +1,29 @@ + + + + StnryAssetCrbnFtprnt$Name + + + StnryAssetCrbnFtprnt$StnryAssetEnvrSrc + + Reporting years down, footprint stage across, record count in each cell. A prior year with anything still outside the complete column is a disclosure that is not yet closed. + Matrix + + Day + StnryAssetCrbnFtprnt$FootprintStage + Asc + + + Day + StnryAssetCrbnFtprnt$ReportingYear + Asc + + Footprints by Year and Stage + Standalone_Carbon_Footprints__c + organization + false + + StnryAssetCrbnFtprnt$CreatedDate + INTERVAL_CUSTOM + + diff --git a/manifest/package-2-reports.xml b/manifest/package-2-reports.xml index 845d5c1..f20a67c 100644 --- a/manifest/package-2-reports.xml +++ b/manifest/package-2-reports.xml @@ -6,14 +6,19 @@ NZC_Reports NZC_Reports/Asset_Names_and_Locations + NZC_Reports/Emissions_by_Asset_and_Year NZC_Reports/Emissions_by_Reporting_Year NZC_Reports/Energy_Use_Data_Entry NZC_Reports/Fleet_Assets_Missing_Energy_Use NZC_Reports/Fleet_Assets_Missing_Footprints NZC_Reports/Fleet_Energy_Data_Entry + NZC_Reports/Fleet_Footprints_by_Stage + NZC_Reports/Fleet_Footprints_by_Year_and_Stage NZC_Reports/Fleet_Fuel_by_Fuel_Type NZC_Reports/Fleet_Names_and_Types NZC_Reports/Footprint_Data_Entry + NZC_Reports/Footprints_by_Stage + NZC_Reports/Footprints_by_Year_and_Stage NZC_Reports/Fuel_Consumption_by_Fuel_Type NZC_Reports/Orphaned_Carbon_Footprints NZC_Reports/Orphaned_Fleet_Footprints diff --git a/manifest/package-3-dashboards.xml b/manifest/package-3-dashboards.xml index fb66347..76b06d5 100644 --- a/manifest/package-3-dashboards.xml +++ b/manifest/package-3-dashboards.xml @@ -4,6 +4,7 @@ NZC_Dashboards + NZC_Dashboards/NZC_Audit NZC_Dashboards/NZC_Data_Quality NZC_Dashboards/NZC_Emissions_Coverage Dashboard diff --git a/manifest/package-4-list-views.xml b/manifest/package-4-list-views.xml new file mode 100644 index 0000000..b8552a2 --- /dev/null +++ b/manifest/package-4-list-views.xml @@ -0,0 +1,19 @@ + + + + + StnryAssetEnvrSrc.NZC_Assets + StnryAssetCrbnFtprnt.NZC_Footprints + StnryAssetEnrgyUse.NZC_Energy_Uses + VehicleAssetEmssnSrc.NZC_Fleet_Assets + VehicleAssetCrbnFtprnt.NZC_Fleet_Footprints + VehicleAssetEnrgyUse.NZC_Fleet_Energy_Uses + ListView + + 67.0 + diff --git a/manifest/package.xml b/manifest/package.xml index 54bb15d..29217af 100644 --- a/manifest/package.xml +++ b/manifest/package.xml @@ -22,14 +22,19 @@ NZC_Reports NZC_Reports/Asset_Names_and_Locations + NZC_Reports/Emissions_by_Asset_and_Year NZC_Reports/Emissions_by_Reporting_Year NZC_Reports/Energy_Use_Data_Entry NZC_Reports/Fleet_Assets_Missing_Energy_Use NZC_Reports/Fleet_Assets_Missing_Footprints NZC_Reports/Fleet_Energy_Data_Entry + NZC_Reports/Fleet_Footprints_by_Stage + NZC_Reports/Fleet_Footprints_by_Year_and_Stage NZC_Reports/Fleet_Fuel_by_Fuel_Type NZC_Reports/Fleet_Names_and_Types NZC_Reports/Footprint_Data_Entry + NZC_Reports/Footprints_by_Stage + NZC_Reports/Footprints_by_Year_and_Stage NZC_Reports/Fuel_Consumption_by_Fuel_Type NZC_Reports/Orphaned_Carbon_Footprints NZC_Reports/Orphaned_Fleet_Footprints @@ -41,6 +46,7 @@ NZC_Dashboards + NZC_Dashboards/NZC_Audit NZC_Dashboards/NZC_Data_Quality NZC_Dashboards/NZC_Emissions_Coverage Dashboard From 1309effb100ae1ed6445a89658e066951e1fcd2a Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 2 Sep 2026 14:45:51 +0000 Subject: [PATCH 2/4] Shorten two descriptions to the 255-character metadata limit Dry run against an NZC org validated 40/42 components; the audit dashboard and the asset-by-year matrix report failed only on description length. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01XsipTUqX7dcQDkvUkaFCuC --- .../dashboards/NZC_Dashboards/NZC_Audit.dashboard-meta.xml | 2 +- .../NZC_Reports/Emissions_by_Asset_and_Year.report-meta.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/force-app/main/default/dashboards/NZC_Dashboards/NZC_Audit.dashboard-meta.xml b/force-app/main/default/dashboards/NZC_Dashboards/NZC_Audit.dashboard-meta.xml index 3e02ffc..0b1164a 100644 --- a/force-app/main/default/dashboards/NZC_Dashboards/NZC_Audit.dashboard-meta.xml +++ b/force-app/main/default/dashboards/NZC_Dashboards/NZC_Audit.dashboard-meta.xml @@ -23,7 +23,7 @@ Reporting Year LoggedInUser - Audit view of the emissions inventory in core Lightning, no CRM Analytics licence: emissions per asset across years to spot anomalies, how much of each year is still not complete, and orphaned records. Pick a Reporting Year at the top to audit one disclosure year at a time. + Audit view in core Lightning, no CRM Analytics licence: emissions per asset across years to spot anomalies, how much of each year is still not complete, and orphaned records. Pick a Reporting Year at the top to audit one year at a time. false Medium diff --git a/force-app/main/default/reports/NZC_Reports/Emissions_by_Asset_and_Year.report-meta.xml b/force-app/main/default/reports/NZC_Reports/Emissions_by_Asset_and_Year.report-meta.xml index 8a562ad..f859f77 100644 --- a/force-app/main/default/reports/NZC_Reports/Emissions_by_Asset_and_Year.report-meta.xml +++ b/force-app/main/default/reports/NZC_Reports/Emissions_by_Asset_and_Year.report-meta.xml @@ -12,7 +12,7 @@ Sum StnryAssetCrbnFtprnt$TotScope2MktBasedEmissions
- One row per stationary asset, one column per reporting year, emissions summed in each cell. Read across a row to spot a site whose number jumped or collapsed between years; that is the anomaly check the CRM Analytics audit dashboard does, without the licence. + One row per stationary asset, one column per reporting year, emissions summed in each cell. Read across a row to spot a site whose number jumped or collapsed between years: the CRM Analytics audit check, without the licence. Matrix Day From 506679ac9826110f2712fdb35ed1d4a4c7eba24a Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 2 Sep 2026 14:49:45 +0000 Subject: [PATCH 3/4] List views: use Name rather than NAME for the record name column Dry run against an NZC org: 'Could not resolve list view column: NAME' on all six. Modern standard objects take the plain field API name. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01XsipTUqX7dcQDkvUkaFCuC --- .../listViews/NZC_Footprints.listView-meta.xml | 2 +- .../listViews/NZC_Energy_Uses.listView-meta.xml | 2 +- .../StnryAssetEnvrSrc/listViews/NZC_Assets.listView-meta.xml | 2 +- .../listViews/NZC_Fleet_Footprints.listView-meta.xml | 2 +- .../listViews/NZC_Fleet_Assets.listView-meta.xml | 2 +- .../listViews/NZC_Fleet_Energy_Uses.listView-meta.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/force-app/main/default/objects/StnryAssetCrbnFtprnt/listViews/NZC_Footprints.listView-meta.xml b/force-app/main/default/objects/StnryAssetCrbnFtprnt/listViews/NZC_Footprints.listView-meta.xml index 8518a06..bdc579f 100644 --- a/force-app/main/default/objects/StnryAssetCrbnFtprnt/listViews/NZC_Footprints.listView-meta.xml +++ b/force-app/main/default/objects/StnryAssetCrbnFtprnt/listViews/NZC_Footprints.listView-meta.xml @@ -1,7 +1,7 @@ NZC_Footprints - NAME + Name ReportingYear FootprintStage TotScope1EmissionsInTco2e diff --git a/force-app/main/default/objects/StnryAssetEnrgyUse/listViews/NZC_Energy_Uses.listView-meta.xml b/force-app/main/default/objects/StnryAssetEnrgyUse/listViews/NZC_Energy_Uses.listView-meta.xml index 10826ae..d2bd1cd 100644 --- a/force-app/main/default/objects/StnryAssetEnrgyUse/listViews/NZC_Energy_Uses.listView-meta.xml +++ b/force-app/main/default/objects/StnryAssetEnrgyUse/listViews/NZC_Energy_Uses.listView-meta.xml @@ -1,7 +1,7 @@ NZC_Energy_Uses - NAME + Name FuelType FuelConsumption FuelConsumptionUnit diff --git a/force-app/main/default/objects/StnryAssetEnvrSrc/listViews/NZC_Assets.listView-meta.xml b/force-app/main/default/objects/StnryAssetEnvrSrc/listViews/NZC_Assets.listView-meta.xml index 2f4335f..a99ef1d 100644 --- a/force-app/main/default/objects/StnryAssetEnvrSrc/listViews/NZC_Assets.listView-meta.xml +++ b/force-app/main/default/objects/StnryAssetEnvrSrc/listViews/NZC_Assets.listView-meta.xml @@ -1,7 +1,7 @@ NZC_Assets - NAME + Name StationaryAssetType BusinessRegion City diff --git a/force-app/main/default/objects/VehicleAssetCrbnFtprnt/listViews/NZC_Fleet_Footprints.listView-meta.xml b/force-app/main/default/objects/VehicleAssetCrbnFtprnt/listViews/NZC_Fleet_Footprints.listView-meta.xml index 8646605..9b8c1e9 100644 --- a/force-app/main/default/objects/VehicleAssetCrbnFtprnt/listViews/NZC_Fleet_Footprints.listView-meta.xml +++ b/force-app/main/default/objects/VehicleAssetCrbnFtprnt/listViews/NZC_Fleet_Footprints.listView-meta.xml @@ -1,7 +1,7 @@ NZC_Fleet_Footprints - NAME + Name ReportingYear FootprintStage Everything diff --git a/force-app/main/default/objects/VehicleAssetEmssnSrc/listViews/NZC_Fleet_Assets.listView-meta.xml b/force-app/main/default/objects/VehicleAssetEmssnSrc/listViews/NZC_Fleet_Assets.listView-meta.xml index 2023480..bdf639a 100644 --- a/force-app/main/default/objects/VehicleAssetEmssnSrc/listViews/NZC_Fleet_Assets.listView-meta.xml +++ b/force-app/main/default/objects/VehicleAssetEmssnSrc/listViews/NZC_Fleet_Assets.listView-meta.xml @@ -1,7 +1,7 @@ NZC_Fleet_Assets - NAME + Name VehicleType FleetVehicleType Everything diff --git a/force-app/main/default/objects/VehicleAssetEnrgyUse/listViews/NZC_Fleet_Energy_Uses.listView-meta.xml b/force-app/main/default/objects/VehicleAssetEnrgyUse/listViews/NZC_Fleet_Energy_Uses.listView-meta.xml index 3f18ba8..a89f6a0 100644 --- a/force-app/main/default/objects/VehicleAssetEnrgyUse/listViews/NZC_Fleet_Energy_Uses.listView-meta.xml +++ b/force-app/main/default/objects/VehicleAssetEnrgyUse/listViews/NZC_Fleet_Energy_Uses.listView-meta.xml @@ -1,7 +1,7 @@ NZC_Fleet_Energy_Uses - NAME + Name FuelType FuelConsumption FuelConsumptionUnit From b28f356bb79817d385b277b91ceb984e81a06fc0 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 2 Sep 2026 14:51:43 +0000 Subject: [PATCH 4/4] Docs: list views are org-validated; record the Name vs NAME column finding Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01XsipTUqX7dcQDkvUkaFCuC --- README.md | 8 +++----- docs/building-your-own.md | 18 ++++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 7b55c0a..55d10e6 100644 --- a/README.md +++ b/README.md @@ -167,11 +167,9 @@ manifest so they never gate the core deploy: sf project deploy start --manifest manifest/package-4-list-views.xml --target-org --dry-run ``` -Honest caveat: list view column names are their own name space (see -[`docs/building-your-own.md`](docs/building-your-own.md)), and these six were written from -the pattern, not retrieved from an org. If the dry run rejects a column, build one list view -in the UI, retrieve it, and copy what Salesforce emitted — ten seconds, and it settles the -format for all six. +All six validate against a licensed Net Zero Cloud org. They're kept separate anyway, because +they only earn their place once those two settings are on, and because list view column +names are their own name space (see [`docs/building-your-own.md`](docs/building-your-own.md)). --- diff --git a/docs/building-your-own.md b/docs/building-your-own.md index a033305..5fba29f 100644 --- a/docs/building-your-own.md +++ b/docs/building-your-own.md @@ -163,12 +163,14 @@ not verify without an org. ## List views are a fourth name space -List view `` entries are neither describe names nor report keys. Custom fields -use their API name; the record name column is `NAME`; and on the older core CRM objects -standard fields take legacy forms like `ACCOUNT.NAME`. The six list views in this package -use `NAME` plus plain field API names, which is the form the platform emits for objects -introduced after the classic CRM set — but it was written from the pattern, not retrieved. -That is exactly why they live in `manifest/package-4-list-views.xml` and not in -`package.xml`. If a column is rejected: build one list view in the UI, retrieve it, read -what came back, fix all six. +List view `` entries are neither describe names nor report keys, and the form +depends on the object's vintage. On the classic CRM objects, standard fields take legacy +keys like `ACCOUNT.NAME`, and on custom objects the record name column is `NAME`. On the +Net Zero Cloud objects, **neither applies**: a deploy of `NAME` fails with +`Could not resolve list view column: NAME`, and the column that works is the plain field API +name, `Name` — the same form as every other field (`ReportingYear`, `FootprintStage`, +`FuelConsumption`). All six list views in this package deploy against a licensed org on +that pattern. The lesson is the same one as the report type joins: the platform's newer +objects use plain API names in places where its older objects use legacy keys, and only a +deploy tells you which you've got.