From c029b8ef655fcd7124f537b6dbebad629bd867fd Mon Sep 17 00:00:00 2001 From: Roy Date: Tue, 8 Oct 2024 16:11:53 -0600 Subject: [PATCH 01/13] issue-249 add unit conversion using HHV in facility unit settings --- src/app/models/unitSettings.ts | 16 ++++ src/app/shared/constants/unitOptions.ts | 50 ++++++---- src/app/shared/constants/utilityTypes.ts | 38 ++++++-- .../helper-pipes/helper-pipes.module.ts | 7 +- .../is-standard-unit.pipe.spec.ts | 8 ++ .../helper-pipes/is-standard-unit.pipe.ts | 34 +++++++ .../shared-settings-forms.service.ts | 25 +++++ .../units-form/units-form.component.css | 5 + .../units-form/units-form.component.html | 94 ++++++++++++++++++- .../units-form/units-form.component.ts | 23 ++++- 10 files changed, 268 insertions(+), 32 deletions(-) create mode 100644 src/app/shared/helper-pipes/is-standard-unit.pipe.spec.ts create mode 100644 src/app/shared/helper-pipes/is-standard-unit.pipe.ts diff --git a/src/app/models/unitSettings.ts b/src/app/models/unitSettings.ts index bc8d2ae2..01470d47 100644 --- a/src/app/models/unitSettings.ts +++ b/src/app/models/unitSettings.ts @@ -5,36 +5,50 @@ export interface UnitSettings { electricityUse: number, electricityUnit: string, electricityPrice: number, + electricityHHV: number, + electricityEnergyUnit: string, includeNaturalGas: boolean, naturalGasUse: number, naturalGasUnit: string, naturalGasPrice: number, + naturalGasHHV: number, + naturalGasEnergyUnit: string, includeSteam: boolean, steamUse: number, steamUnit: string, steamPrice: number, + steamHHV: number, + steamEnergyUnit: string, includeWater: boolean, waterUse: number, waterUnit: string, waterPrice: number, + waterHHV: number, + waterEnergyUnit: string, includeWasteWater: boolean, wasteWaterUse: number, wasteWaterUnit: string, wasteWaterPrice: number, + wasteWaterHHV: number, + wasteWaterEnergyUnit: string, includeOtherFuels: boolean, otherFuelsUse: number, otherFuelsUnit: string, otherFuelsPrice: number, + otherFuelsHHV: number, + otherFuelsEnergyUnit: string, includeCompressedAir: boolean, compressedAirUse: number, compressedAirUnit: string, compressedAirPrice: number, + compressedAirHHV: number, + compressedAirEnergyUnit: string, } export function getDefaultUnitSettings(): UnitSettings { @@ -47,6 +61,8 @@ export function getDefaultUnitSettings(): UnitSettings { settings[`${camelCaseType}Use`] = 0; settings[`${camelCaseType}Unit`] = option.energyDefaultUnit.value; settings[`${camelCaseType}Price`] = 0; + settings[`${camelCaseType}HHV`] = 0; + settings[`${camelCaseType}EnergyUnit`] = 'MMBtu'; return settings; }, {} as UnitSettings); // set defaults to include electricity and natural gas diff --git a/src/app/shared/constants/unitOptions.ts b/src/app/shared/constants/unitOptions.ts index 94fe7732..e9643a07 100644 --- a/src/app/shared/constants/unitOptions.ts +++ b/src/app/shared/constants/unitOptions.ts @@ -1,7 +1,8 @@ export interface UnitOption { display: string, value: string, // Identifier to match the key in unit definitions. - unitsOfMeasure: string + unitsOfMeasure: string, + isStandard?: boolean // } export const EnergyUnitOptions: Array = [ @@ -177,80 +178,95 @@ export const VolumeGasOptions: Array = [ }, ] -export const SteamUnitOptions: Array = [ +export const EnergySteamUnitOptions: Array = [ { display: 'Pounds (lb)', value: 'lb', - unitsOfMeasure: 'Imperial' + unitsOfMeasure: 'Imperial', + isStandard: false }, { display: 'Kilograms (kg)', value: 'kg', - unitsOfMeasure: 'Metric' + unitsOfMeasure: 'Metric', + isStandard: false }, { display: 'Tons', value: 'ton', - unitsOfMeasure: 'Imperial' + unitsOfMeasure: 'Imperial', + isStandard: false }, { display: 'Metric Tonnes (tonnes)', value: 'tonne', - unitsOfMeasure: 'Metric' + unitsOfMeasure: 'Metric', + isStandard: false }, { display: 'Thousand pounds (klb)', value: 'klb', - unitsOfMeasure: 'Imperial' + unitsOfMeasure: 'Imperial', + isStandard: false }, { display: 'Kilowatt-hour (kWh)', value: 'kWh', - unitsOfMeasure: 'Metric' + unitsOfMeasure: 'Metric', + isStandard: true }, { display: 'Watt-hour (Wh)', value: 'Wh', - unitsOfMeasure: 'Metric' + unitsOfMeasure: 'Metric', + isStandard: true }, { display: 'Megawatt-hour (MWh)', value: 'MWh', - unitsOfMeasure: 'Imperial' + unitsOfMeasure: 'Imperial', + isStandard: true }, { display: 'Kilojoules (kJ)', value: 'kJ', - unitsOfMeasure: 'Imperial' + unitsOfMeasure: 'Imperial', + isStandard: true }, { display: 'Gigajoules (GJ)', value: 'GJ', - unitsOfMeasure: 'Imperial' + unitsOfMeasure: 'Imperial', + isStandard: true }, { display: 'Megajoules (MJ)', value: 'MJ', - unitsOfMeasure: 'Imperial' + unitsOfMeasure: 'Imperial', + isStandard: true }, { display: 'Therms', value: 'Therms', - unitsOfMeasure: 'Metric' + unitsOfMeasure: 'Metric', + isStandard: true }, { display: 'Dekatherms (DTherms)', value: 'Dtherms', - unitsOfMeasure: 'Metric' + unitsOfMeasure: 'Metric', + isStandard: true }, { display: 'Million British Thermal Units (MMBtu)', value: 'MMBtu', - unitsOfMeasure: 'Metric' + unitsOfMeasure: 'Metric', + isStandard: true }, { display: 'Kilocalorie (kcal)', value: 'kcal', - unitsOfMeasure: 'Imperial' + unitsOfMeasure: 'Imperial', + isStandard: true } ] diff --git a/src/app/shared/constants/utilityTypes.ts b/src/app/shared/constants/utilityTypes.ts index 2e29e672..38353d7b 100644 --- a/src/app/shared/constants/utilityTypes.ts +++ b/src/app/shared/constants/utilityTypes.ts @@ -1,4 +1,4 @@ -import { EnergyUnitOptions, MassUnitOptions, PowerUnitOptions, SteamUnitOptions, UnitOption, VolumeGasOptions, VolumeLiquidOptions } from "./unitOptions"; +import { EnergyUnitOptions, MassUnitOptions, PowerUnitOptions, EnergySteamUnitOptions, UnitOption, VolumeGasOptions, VolumeLiquidOptions } from "./unitOptions"; export type UtilityType = 'Electricity' | 'Natural Gas' | 'Other Fuels' | 'Water' | 'Waste Water' | 'Steam' | 'Compressed Air'; export const UtilityTypes: Array = ['Electricity', 'Natural Gas', 'Other Fuels', 'Water', 'Waste Water', 'Steam', 'Compressed Air']; @@ -7,6 +7,7 @@ export const UtilityTypes: Array = ['Electricity', 'Natural Gas', ' export interface UtilityOption { utilityType: UtilityType, energyUnitOptions: Array, + isStandardEnergyUnit: boolean, energyDefaultUnit: UnitOption, powerUnitOptions: Array, powerDefaultUnit: UnitOption @@ -20,37 +21,58 @@ const kSCF: UnitOption = VolumeGasOptions.find(unitOption => unitOption.value == export const UtilityOptions: Array = [ { - utilityType: 'Electricity', energyUnitOptions: EnergyUnitOptions, powerUnitOptions: PowerUnitOptions, + utilityType: 'Electricity', + energyUnitOptions: EnergyUnitOptions, + powerUnitOptions: PowerUnitOptions, + isStandardEnergyUnit: true, energyDefaultUnit: kWh, powerDefaultUnit: undefined }, { - utilityType: 'Natural Gas', energyUnitOptions: EnergyUnitOptions, powerUnitOptions: PowerUnitOptions, + utilityType: 'Natural Gas', + energyUnitOptions: EnergyUnitOptions, + isStandardEnergyUnit: true, + powerUnitOptions: PowerUnitOptions, energyDefaultUnit: MMBtu, powerDefaultUnit: undefined }, { - utilityType: 'Other Fuels', energyUnitOptions: EnergyUnitOptions, powerUnitOptions: PowerUnitOptions, + utilityType: 'Other Fuels', + energyUnitOptions: EnergyUnitOptions, + isStandardEnergyUnit: true, + powerUnitOptions: PowerUnitOptions, energyDefaultUnit: MMBtu, powerDefaultUnit: undefined }, { - utilityType: 'Water', energyUnitOptions: VolumeLiquidOptions, powerUnitOptions: PowerUnitOptions, + utilityType: 'Water', + energyUnitOptions: VolumeLiquidOptions, + isStandardEnergyUnit: false, + powerUnitOptions: PowerUnitOptions, energyDefaultUnit: kgal, powerDefaultUnit: undefined }, { - utilityType: 'Waste Water', energyUnitOptions: VolumeLiquidOptions, powerUnitOptions: PowerUnitOptions, + utilityType: 'Waste Water', + energyUnitOptions: VolumeLiquidOptions, + isStandardEnergyUnit: false, + powerUnitOptions: PowerUnitOptions, energyDefaultUnit: kgal, powerDefaultUnit: undefined }, { - utilityType: 'Steam', energyUnitOptions: SteamUnitOptions, powerUnitOptions: PowerUnitOptions, + utilityType: 'Steam', + energyUnitOptions: EnergySteamUnitOptions, + isStandardEnergyUnit: true, + powerUnitOptions: PowerUnitOptions, energyDefaultUnit: klb, powerDefaultUnit: undefined }, { - utilityType: 'Compressed Air', energyUnitOptions: VolumeGasOptions, powerUnitOptions: PowerUnitOptions, + utilityType: 'Compressed Air', + energyUnitOptions: VolumeGasOptions, + isStandardEnergyUnit: false, + powerUnitOptions: PowerUnitOptions, energyDefaultUnit: kSCF, powerDefaultUnit: undefined }, diff --git a/src/app/shared/helper-pipes/helper-pipes.module.ts b/src/app/shared/helper-pipes/helper-pipes.module.ts index 53c4c159..02313d3f 100644 --- a/src/app/shared/helper-pipes/helper-pipes.module.ts +++ b/src/app/shared/helper-pipes/helper-pipes.module.ts @@ -30,6 +30,7 @@ import { KeyPerformanceMetricImpactsListPipe } from './key-performance-metric-im import { ContactNameDisplayPipe } from './contact-name-display.pipe'; import { LinkedUnitOptionsPipe } from './linked-unit-options.pipe'; import { LinkedUtilityOptionsPipe } from './linked-utility-options.pipe'; +import { IsStandardUnitPipe } from './is-standard-unit.pipe'; @NgModule({ declarations: [ @@ -62,7 +63,8 @@ import { LinkedUtilityOptionsPipe } from './linked-utility-options.pipe'; EnergyEquipmentListPipe, KeyPerformanceMetricImpactsListPipe, LinkedUnitOptionsPipe, - LinkedUtilityOptionsPipe + LinkedUtilityOptionsPipe, + IsStandardUnitPipe, ], imports: [ CommonModule @@ -97,7 +99,8 @@ import { LinkedUtilityOptionsPipe } from './linked-utility-options.pipe'; EnergyEquipmentListPipe, KeyPerformanceMetricImpactsListPipe, LinkedUnitOptionsPipe, - LinkedUtilityOptionsPipe + LinkedUtilityOptionsPipe, + IsStandardUnitPipe, ] }) export class HelperPipesModule { } diff --git a/src/app/shared/helper-pipes/is-standard-unit.pipe.spec.ts b/src/app/shared/helper-pipes/is-standard-unit.pipe.spec.ts new file mode 100644 index 00000000..0e305d9d --- /dev/null +++ b/src/app/shared/helper-pipes/is-standard-unit.pipe.spec.ts @@ -0,0 +1,8 @@ +import { IsStandardUnitPipe } from './is-standard-unit.pipe'; + +describe('IsStandardUnitPipe', () => { + it('create an instance', () => { + const pipe = new IsStandardUnitPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/src/app/shared/helper-pipes/is-standard-unit.pipe.ts b/src/app/shared/helper-pipes/is-standard-unit.pipe.ts new file mode 100644 index 00000000..51a52751 --- /dev/null +++ b/src/app/shared/helper-pipes/is-standard-unit.pipe.ts @@ -0,0 +1,34 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { UtilityOptions } from '../constants/utilityTypes'; +import { UnitOption } from '../constants/unitOptions'; + +@Pipe({ + name: 'isStandardUnit', +}) +export class IsStandardUnitPipe implements PipeTransform { + + transform(utilityType: string, unit: string, unitType: string): boolean { + // To check if the unit is standard for the desired unitType or not + // 1. by isStandardEnergyUnit on the UtilityOption + // 2. by isStandard on the UnitOption + // default to true if utility type is not found/power type + if (unitType === 'Energy') { + let selectedUtility = UtilityOptions.find(_utilityOption => + _utilityOption.utilityType == utilityType); + if (selectedUtility.isStandardEnergyUnit) { + let selectedUnitOption = selectedUtility.energyUnitOptions.find( + _unitOption => _unitOption.value == unit); + if (selectedUnitOption && selectedUnitOption.isStandard === false) { + return false; + } + return true; + } else { + return false; + } + } else if (unitType === 'Power') { + return true; + } + return true; + } + +} diff --git a/src/app/shared/shared-settings-forms/shared-settings-forms.service.ts b/src/app/shared/shared-settings-forms/shared-settings-forms.service.ts index 84441fc4..d75783e4 100644 --- a/src/app/shared/shared-settings-forms/shared-settings-forms.service.ts +++ b/src/app/shared/shared-settings-forms/shared-settings-forms.service.ts @@ -74,36 +74,50 @@ export class SharedSettingsFormsService { electricityUse: [unitSettings.electricityUse, [Validators.min(0)]], electricityUnit: [unitSettings.electricityUnit], electricityPrice: [unitSettings.electricityPrice, [Validators.min(0)]], + electricityHHV: [unitSettings.electricityHHV, [Validators.min(0)]], + electricityEnergyUnit: [unitSettings.electricityEnergyUnit], includeNaturalGas: [unitSettings.includeNaturalGas], naturalGasUse: [unitSettings.naturalGasUse, [Validators.min(0)]], naturalGasUnit: [unitSettings.naturalGasUnit], naturalGasPrice: [unitSettings.naturalGasPrice, [Validators.min(0)]], + naturalGasHHV: [unitSettings.naturalGasHHV, [Validators.min(0)]], + naturalGasEnergyUnit: [unitSettings.naturalGasEnergyUnit], includeSteam: [unitSettings.includeSteam], steamUse: [unitSettings.steamUse, [Validators.min(0)]], steamUnit: [unitSettings.steamUnit], steamPrice: [unitSettings.steamPrice, [Validators.min(0)]], + steamHHV: [unitSettings.steamHHV, [Validators.min(0)]], + steamEnergyUnit: [unitSettings.steamEnergyUnit], includeOtherFuels: [unitSettings.includeOtherFuels], otherFuelsUse: [unitSettings.otherFuelsUse, [Validators.min(0)]], otherFuelsUnit: [unitSettings.otherFuelsUnit], otherFuelsPrice: [unitSettings.otherFuelsPrice, [Validators.min(0)]], + otherFuelsHHV: [unitSettings.otherFuelsHHV, [Validators.min(0)]], + otherFuelsEnergyUnit: [unitSettings.otherFuelsEnergyUnit], includeCompressedAir: [unitSettings.includeCompressedAir], compressedAirUse: [unitSettings.compressedAirUse, [Validators.min(0)]], compressedAirUnit: [unitSettings.compressedAirUnit], compressedAirPrice: [unitSettings.compressedAirPrice, [Validators.min(0)]], + compressedAirHHV: [unitSettings.compressedAirHHV, [Validators.min(0)]], + compressedAirEnergyUnit: [unitSettings.compressedAirEnergyUnit], includeWater: [unitSettings.includeWater], waterUse: [unitSettings.waterUse, [Validators.min(0)]], waterUnit: [unitSettings.waterUnit], waterPrice: [unitSettings.waterPrice, [Validators.min(0)]], + waterHHV: [unitSettings.waterHHV, [Validators.min(0)]], + waterEnergyUnit: [unitSettings.waterEnergyUnit], includeWasteWater: [unitSettings.includeWasteWater], wasteWaterUse: [unitSettings.wasteWaterUse, [Validators.min(0)]], wasteWaterUnit: [unitSettings.wasteWaterUnit], wasteWaterPrice: [unitSettings.wasteWaterPrice, [Validators.min(0)]], + wasteWaterHHV: [unitSettings.wasteWaterHHV, [Validators.min(0)]], + wasteWaterEnergyUnit: [unitSettings.wasteWaterEnergyUnit], }); // Update required validators for included items @@ -123,6 +137,8 @@ export class SharedSettingsFormsService { this.setRequiredValidator(form.controls['waterUse'], unitSettings.includeWater); this.setRequiredValidator(form.controls['wasteWaterUse'], unitSettings.includeWasteWater); + // TO DO: Add validators for HHV and Energy Unit + return form; } @@ -147,6 +163,8 @@ export class SharedSettingsFormsService { unitSettings.steamUse = form.controls['steamUse'].value; unitSettings.steamUnit = form.controls['steamUnit'].value; unitSettings.steamPrice = form.controls['steamPrice'].value; + unitSettings.steamHHV = form.controls['steamHHV'].value; + unitSettings.steamEnergyUnit = form.controls['steamEnergyUnit'].value; unitSettings.includeOtherFuels = form.controls['includeOtherFuels'].value; this.setRequiredValidator(form.controls['otherFuelsPrice'], unitSettings.includeOtherFuels); @@ -161,6 +179,8 @@ export class SharedSettingsFormsService { unitSettings.compressedAirUse = form.controls['compressedAirUse'].value; unitSettings.compressedAirUnit = form.controls['compressedAirUnit'].value; unitSettings.compressedAirPrice = form.controls['compressedAirPrice'].value; + unitSettings.compressedAirHHV = form.controls['compressedAirHHV'].value; + unitSettings.compressedAirEnergyUnit = form.controls['compressedAirEnergyUnit'].value; unitSettings.includeWater = form.controls['includeWater'].value; this.setRequiredValidator(form.controls['waterPrice'], unitSettings.includeWater); @@ -168,6 +188,8 @@ export class SharedSettingsFormsService { unitSettings.waterUse = form.controls['waterUse'].value; unitSettings.waterUnit = form.controls['waterUnit'].value; unitSettings.waterPrice = form.controls['waterPrice'].value; + unitSettings.waterHHV = form.controls['waterHHV'].value; + unitSettings.waterEnergyUnit = form.controls['waterEnergyUnit'].value; unitSettings.includeWasteWater = form.controls['includeWasteWater'].value; this.setRequiredValidator(form.controls['wasteWaterPrice'], unitSettings.includeWasteWater); @@ -175,6 +197,9 @@ export class SharedSettingsFormsService { unitSettings.wasteWaterUse = form.controls['wasteWaterUse'].value; unitSettings.wasteWaterUnit = form.controls['wasteWaterUnit'].value; unitSettings.wasteWaterPrice = form.controls['wasteWaterPrice'].value; + unitSettings.wasteWaterHHV = form.controls['wasteWaterHHV'].value; + unitSettings.wasteWaterEnergyUnit = form.controls['wasteWaterEnergyUnit'].value + return unitSettings; } diff --git a/src/app/shared/shared-settings-forms/units-form/units-form.component.css b/src/app/shared/shared-settings-forms/units-form/units-form.component.css index 67c6f51f..e8217f22 100644 --- a/src/app/shared/shared-settings-forms/units-form/units-form.component.css +++ b/src/app/shared/shared-settings-forms/units-form/units-form.component.css @@ -2,4 +2,9 @@ background-color: white; border: none; border-left: var(--bs-border-width) solid var(--bs-border-color); +} +.disabled-input-label-secondary{ + background-color: white; + border: none; + margin-left: 20px; } \ No newline at end of file diff --git a/src/app/shared/shared-settings-forms/units-form/units-form.component.html b/src/app/shared/shared-settings-forms/units-form/units-form.component.html index 4553f6df..e9dcec17 100644 --- a/src/app/shared/shared-settings-forms/units-form/units-form.component.html +++ b/src/app/shared/shared-settings-forms/units-form/units-form.component.html @@ -7,7 +7,7 @@ Include
- +
@@ -176,6 +176,29 @@
+ +
+
+ +
+
+
+
+ + +
+
+
@@ -216,6 +239,29 @@
+ +
+
+ +
+
+
+
+ + +
+
+
@@ -258,6 +304,29 @@
+ +
+
+ +
+
+
+
+ + +
+
+
@@ -300,6 +369,29 @@
+ +
+
+ +
+
+
+
+ + +
+
+
diff --git a/src/app/shared/shared-settings-forms/units-form/units-form.component.ts b/src/app/shared/shared-settings-forms/units-form/units-form.component.ts index cfa645ce..dc76399e 100644 --- a/src/app/shared/shared-settings-forms/units-form/units-form.component.ts +++ b/src/app/shared/shared-settings-forms/units-form/units-form.component.ts @@ -38,6 +38,8 @@ export class UnitsFormComponent implements OnInit, OnDestroy{ hasAssessments: boolean = false; priceChanged: boolean = false; + energyUnitOptions: Array = EnergyUnitOptions; + constructor( private companyIdbService: CompanyIdbService, private facilityIdbService: FacilityIdbService, @@ -94,10 +96,23 @@ export class UnitsFormComponent implements OnInit, OnDestroy{ let trimmedType = utilityType.replace(/\s+/g, ''); // Remove spaces let camelCaseType = trimmedType.charAt(0).toLowerCase() + trimmedType.slice(1); if (this.facility.unitSettings[`include${trimmedType}`]) { - let convertedUse = this.convertValue.convertValue( - this.facility.unitSettings[`${camelCaseType}Use`], - this.facility.unitSettings[`${camelCaseType}Unit`], - this.companyEnergyUnit).convertedValue; + let convertedUse = 0; + let selectedUnitOption = option.energyUnitOptions.find( + _unitOption => _unitOption.value == this.facility.unitSettings[`${camelCaseType}Unit`]); + if (option.isStandardEnergyUnit && selectedUnitOption.isStandard !== false) { + // standard energy unit + convertedUse = this.convertValue.convertValue( + this.facility.unitSettings[`${camelCaseType}Use`], + this.facility.unitSettings[`${camelCaseType}Unit`], + this.companyEnergyUnit).convertedValue; + } else { + // non-standard energy unit + convertedUse = this.convertValue.convertValue( + this.facility.unitSettings[`${camelCaseType}Use`] * + this.facility.unitSettings[`${camelCaseType}HHV`], + this.facility.unitSettings[`${camelCaseType}EnergyUnit`], + this.companyEnergyUnit).convertedValue; + } use += convertedUse; cost += this.facility.unitSettings[`${camelCaseType}Use`] * this.facility.unitSettings[`${camelCaseType}Price`]; From 7e464a0b766e521c0fa11429d20c6d92ff754869 Mon Sep 17 00:00:00 2001 From: Roy Date: Tue, 8 Oct 2024 16:36:14 -0600 Subject: [PATCH 02/13] issue-247 feedback that update facility energy use for company unit changes --- src/app/indexed-db/facility-idb.service.ts | 14 ++++++ .../company-setup/company-setup.component.ts | 10 ++++ .../facility-setup.service.spec.ts | 16 +++++++ .../facility-setup/facility-setup.service.ts | 48 +++++++++++++++++++ 4 files changed, 88 insertions(+) create mode 100644 src/app/setup-wizard/pre-visit/facility-setup/facility-setup.service.spec.ts create mode 100644 src/app/setup-wizard/pre-visit/facility-setup/facility-setup.service.ts diff --git a/src/app/indexed-db/facility-idb.service.ts b/src/app/indexed-db/facility-idb.service.ts index 8a4ba049..e8ea101e 100644 --- a/src/app/indexed-db/facility-idb.service.ts +++ b/src/app/indexed-db/facility-idb.service.ts @@ -67,4 +67,18 @@ export class FacilityIdbService { await this.setFacilities(); return newFacility.guid; } + + getByOtherGuid(guid: string, type: string): Array { + let facilities: Array = this.facilities.getValue(); + let _facilities: Array = facilities.filter(facility => { + if (type == 'company') { + return facility.companyId == guid; + } else if (type == 'user') { + return facility.userId == guid; + } else { + return false; + } + }); + return _facilities; + } } diff --git a/src/app/setup-wizard/pre-visit/company-setup/company-setup.component.ts b/src/app/setup-wizard/pre-visit/company-setup/company-setup.component.ts index 764490a5..f37f80e5 100644 --- a/src/app/setup-wizard/pre-visit/company-setup/company-setup.component.ts +++ b/src/app/setup-wizard/pre-visit/company-setup/company-setup.component.ts @@ -11,6 +11,9 @@ import { CompanySetupService } from './company-setup.service'; import { PreAssessmentSetupService } from '../pre-assessment-setup/pre-assessment-setup.service'; import { AssessmentIdbService } from 'src/app/indexed-db/assessment-idb.service'; import { IdbAssessment } from 'src/app/models/assessment'; +import { IdbFacility } from 'src/app/models/facility'; +import { FacilityIdbService } from 'src/app/indexed-db/facility-idb.service'; +import { FacilitySetupService } from '../facility-setup/facility-setup.service'; @Component({ selector: 'app-company-setup', @@ -37,6 +40,7 @@ export class CompanySetupComponent implements OnInit, OnDestroy { energyUnitChange: boolean = false; companyAssessments: Array = []; + companyFacilities: Array = []; constructor(private router: Router, private companyIdbService: CompanyIdbService, @@ -44,6 +48,8 @@ export class CompanySetupComponent implements OnInit, OnDestroy { private companySetupService: CompanySetupService, private preAassessmentSetupService: PreAssessmentSetupService, private assessmentIdbService: AssessmentIdbService, + private facilityIdbService: FacilityIdbService, + private facilitySetupService: FacilitySetupService ) { } @@ -61,6 +67,8 @@ export class CompanySetupComponent implements OnInit, OnDestroy { if (this.companyAssessments.length > 0) { this.hasAssessments = true; } + + this.companyFacilities = this.facilityIdbService.getByOtherGuid(this.selectedCompany.guid, 'company'); } } @@ -87,6 +95,8 @@ export class CompanySetupComponent implements OnInit, OnDestroy { await this.saveChanges(); await this.preAassessmentSetupService.updateAssessmentEnergyUse( this.companyAssessments, this.energyUnit.value); + await this.facilitySetupService.updateFacilityEnergyUse( + this.companyFacilities, this.energyUnit.value); } async saveChanges() { diff --git a/src/app/setup-wizard/pre-visit/facility-setup/facility-setup.service.spec.ts b/src/app/setup-wizard/pre-visit/facility-setup/facility-setup.service.spec.ts new file mode 100644 index 00000000..a10c68f7 --- /dev/null +++ b/src/app/setup-wizard/pre-visit/facility-setup/facility-setup.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { FacilitySetupService } from './facility-setup.service'; + +describe('FacilitySetupService', () => { + let service: FacilitySetupService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(FacilitySetupService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/setup-wizard/pre-visit/facility-setup/facility-setup.service.ts b/src/app/setup-wizard/pre-visit/facility-setup/facility-setup.service.ts new file mode 100644 index 00000000..c9f5d8ea --- /dev/null +++ b/src/app/setup-wizard/pre-visit/facility-setup/facility-setup.service.ts @@ -0,0 +1,48 @@ +import { Injectable } from '@angular/core'; +import { FacilityIdbService } from 'src/app/indexed-db/facility-idb.service'; +import { IdbFacility } from 'src/app/models/facility'; +import { UtilityOptions } from 'src/app/shared/constants/utilityTypes'; +import { ConvertValue } from 'src/app/shared/conversions/convertValue'; + +@Injectable({ + providedIn: 'root' +}) +export class FacilitySetupService { + convertValue = new ConvertValue(); + + constructor(private facilityIdbService: FacilityIdbService) { } + + async updateFacilityEnergyUse(facilities: Array, companyEnergyUnit: string) { + // update facility energy use + for (const facility of facilities) { + let use = 0; + UtilityOptions.forEach(option => { + let utilityType = option.utilityType; + let trimmedType = utilityType.replace(/\s+/g, ''); // Remove spaces + let camelCaseType = trimmedType.charAt(0).toLowerCase() + trimmedType.slice(1); + if (facility.unitSettings[`include${trimmedType}`]) { + let convertedUse = 0; + let selectedUnitOption = option.energyUnitOptions.find( + _unitOption => _unitOption.value == facility.unitSettings[`${camelCaseType}Unit`]); + if (option.isStandardEnergyUnit && selectedUnitOption.isStandard !== false) { + // standard energy unit + convertedUse = this.convertValue.convertValue( + facility.unitSettings[`${camelCaseType}Use`], + facility.unitSettings[`${camelCaseType}Unit`], + companyEnergyUnit).convertedValue; + } else { + // non-standard energy unit + convertedUse = this.convertValue.convertValue( + facility.unitSettings[`${camelCaseType}Use`] * + facility.unitSettings[`${camelCaseType}HHV`], + facility.unitSettings[`${camelCaseType}EnergyUnit`], + companyEnergyUnit).convertedValue; + } + use += convertedUse; + } + }); + facility.energyUse = use; + await this.facilityIdbService.asyncUpdate(facility); + } + } +} From 5d34c62a9f0c8a1cf7e62fe7cbfc87a8ee32e591 Mon Sep 17 00:00:00 2001 From: Roy Date: Tue, 8 Oct 2024 18:35:01 -0600 Subject: [PATCH 03/13] issue-249 fix a typo in unit setting form --- .../shared-settings-forms/units-form/units-form.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/shared-settings-forms/units-form/units-form.component.html b/src/app/shared/shared-settings-forms/units-form/units-form.component.html index e9dcec17..fd77f34a 100644 --- a/src/app/shared/shared-settings-forms/units-form/units-form.component.html +++ b/src/app/shared/shared-settings-forms/units-form/units-form.component.html @@ -240,7 +240,7 @@
+ && !('Waste Water' | isStandardUnit: form.controls['wasteWaterUnit'].value : 'Energy')">
Date: Tue, 8 Oct 2024 21:11:50 -0600 Subject: [PATCH 04/13] issue-207 update assessment type table to feedback --- src/app/shared/constants/assessmentTypes.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/shared/constants/assessmentTypes.ts b/src/app/shared/constants/assessmentTypes.ts index d9d77811..ea0ebf7b 100644 --- a/src/app/shared/constants/assessmentTypes.ts +++ b/src/app/shared/constants/assessmentTypes.ts @@ -12,10 +12,10 @@ export interface AssessmentOption { export const AssessmentOptions: Array = [ {assessmentType: "Pump", utilityTypes: ['Electricity']}, {assessmentType: "Fan", utilityTypes: ['Electricity']}, - {assessmentType: "Process heating", utilityTypes: ['Natural Gas']}, - {assessmentType: "Steam", utilityTypes: ['Natural Gas']}, + {assessmentType: "Process heating", utilityTypes: ['Natural Gas', 'Other Fuels', 'Electricity']}, + {assessmentType: "Steam", utilityTypes: ['Natural Gas', "Other Fuels", 'Electricity']}, {assessmentType: "Compressed Air", utilityTypes: ['Electricity']}, {assessmentType: "Water", utilityTypes: ['Water']}, - {assessmentType: "Treasure Hunt", utilityTypes: ['Electricity', 'Natural Gas']}, + {assessmentType: "Treasure Hunt", utilityTypes: UtilityTypes}, {assessmentType: "Other", utilityTypes: UtilityTypes} ]; \ No newline at end of file From 9ca1b83e2b8a3620aaf2634acd518901a0a96a63 Mon Sep 17 00:00:00 2001 From: Roy Date: Tue, 8 Oct 2024 21:18:48 -0600 Subject: [PATCH 05/13] issue-249 add non-standard to standard energy conversion in pre-assessment --- src/app/models/utilityEnergyUses.ts | 25 ++++++++++--- .../pre-assessment-setup.component.css | 6 ++++ .../pre-assessment-setup.component.html | 36 +++++++++++++++++-- .../pre-assessment-setup.component.ts | 31 +++++++++++----- .../pre-assessment-setup.service.ts | 26 +++++++++++--- 5 files changed, 104 insertions(+), 20 deletions(-) diff --git a/src/app/models/utilityEnergyUses.ts b/src/app/models/utilityEnergyUses.ts index 71b97c44..ba4ec097 100644 --- a/src/app/models/utilityEnergyUses.ts +++ b/src/app/models/utilityEnergyUses.ts @@ -1,13 +1,17 @@ import { FacilityIdbService } from "../indexed-db/facility-idb.service"; import { UtilityOptions, UtilityType } from "../shared/constants/utilityTypes"; +import { energy } from "../shared/conversions/definitions/energy"; import { getDefaultUnitSettings, UnitSettings } from "./unitSettings"; export interface UtilityEnergyUse { utilityType: UtilityType; include: boolean; energyUse: number; - unit: string; + energyUnit: string; + energyHHV?: number; + energyUnitStandard?: string; + isKnown?: boolean; // TO DO: allow user to enter estimated values } export function getDefaultUtilityEnergyUses(facilityUnitSettings: UnitSettings): Array { @@ -16,14 +20,27 @@ export function getDefaultUtilityEnergyUses(facilityUnitSettings: UnitSettings): const camelCaseType = utilityType.charAt(0).toLowerCase() + utilityType.slice(1); let energyUnit = option.energyDefaultUnit.value; - if (facilityUnitSettings[`${camelCaseType}Unit`] && facilityUnitSettings[`include${utilityType}`]) { - energyUnit = facilityUnitSettings[`${camelCaseType}Unit`]; + let energyHHV = 0; + let energyUnitStandard = 'MMBtu'; + if (facilityUnitSettings[`include${utilityType}`]) { + if (facilityUnitSettings[`${camelCaseType}Unit`]) { + energyUnit = facilityUnitSettings[`${camelCaseType}Unit`]; + } + if (facilityUnitSettings[`${camelCaseType}HHV`]) { + energyHHV = facilityUnitSettings[`${camelCaseType}HHV`]; + } + if (facilityUnitSettings[`${camelCaseType}EnergyUnit`]) { + energyUnitStandard = facilityUnitSettings[`${camelCaseType}EnergyUnit`]; + } } return { utilityType: option.utilityType, include: false, + energyUnitStandard: energyUnitStandard, + energyHHV: energyHHV, energyUse: 0, - unit: energyUnit + energyUnit: energyUnit, + isKnown: true }; }); } \ No newline at end of file diff --git a/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.css b/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.css index 75f16dbc..7f82bd11 100644 --- a/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.css +++ b/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.css @@ -6,4 +6,10 @@ .utility-row:hover, .utility-row:hover .disabled-input-label { background-color: #efefef; +} + +.disabled-input-label-secondary{ + background-color: white; + border: none; + margin-left: 20px; } \ No newline at end of file diff --git a/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.html b/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.html index 36c8cfcb..315b5930 100644 --- a/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.html +++ b/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.html @@ -87,7 +87,7 @@
Utility Types
-
+
Utility Types
-
+
Utility Types +
+
+
+
+ + +
+
+

diff --git a/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.ts b/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.ts index 24ff3331..953c968b 100644 --- a/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.ts +++ b/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.ts @@ -23,6 +23,7 @@ import { UtilityEnergyUse } from 'src/app/models/utilityEnergyUses'; import { SharedSettingsFormsService } from 'src/app/shared/shared-settings-forms/shared-settings-forms.service'; import { FormGroup } from '@angular/forms'; import { UnitSettings } from 'src/app/models/unitSettings'; +import { EnergyUnitOptions, UnitOption } from 'src/app/shared/constants/unitOptions'; @Component({ selector: 'app-pre-assessment-setup', @@ -68,6 +69,7 @@ export class PreAssessmentSetupComponent { companyEnergyUnit: string; facilitySub: Subscription; facilityUnitSettings: UnitSettings + energyUnitOptions: Array = EnergyUnitOptions; accordionGuid: string; isAddNew: boolean = false; @@ -146,18 +148,31 @@ export class PreAssessmentSetupComponent { let utilityEnergyUse: UtilityEnergyUse = assessment.utilityEnergyUses.find( _energyUse => _energyUse.utilityType == utilityType); if (utilityEnergyUse.include) { + let trimmedType = utilityType.replace(/\s+/g, ''); // Remove spaces + let camelCaseType = trimmedType.charAt(0).toLowerCase() + trimmedType.slice(1); + let convertedUse = 0, convertedCost = 0; + let selectedUtilityOption = this.utilityOptions.find( + _option => _option.utilityType == utilityType); + let selectedUnitOption = selectedUtilityOption.energyUnitOptions.find( + _unitOption => _unitOption.value == utilityEnergyUse.energyUnit); // calculate use - let convertedUse = this.convertValue.convertValue( - utilityEnergyUse.energyUse, - utilityEnergyUse.unit, - this.companyEnergyUnit).convertedValue; + if (selectedUtilityOption.isStandardEnergyUnit + && selectedUnitOption.isStandard !== false) { + convertedUse = this.convertValue.convertValue( + utilityEnergyUse.energyUse, + utilityEnergyUse.energyUnit, + this.companyEnergyUnit).convertedValue; + } else { + convertedUse = this.convertValue.convertValue( + utilityEnergyUse.energyUse * utilityEnergyUse.energyHHV, + utilityEnergyUse.energyUnitStandard, + this.companyEnergyUnit).convertedValue; + } use += convertedUse; // calculate cost - let trimmedType = utilityType.replace(/\s+/g, ''); // Remove spaces - let camelCaseType = trimmedType.charAt(0).toLowerCase() + trimmedType.slice(1); - let convertedCost = this.convertValue.convertValue( + convertedCost = this.convertValue.convertValue( utilityEnergyUse.energyUse, - utilityEnergyUse.unit, + utilityEnergyUse.energyUnit, this.facilityUnitSettings[`${camelCaseType}Unit`]).convertedValue; cost += convertedCost * this.facilityUnitSettings[`${camelCaseType}Price`]; } diff --git a/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.service.ts b/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.service.ts index fb70a50d..0a1d0297 100644 --- a/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.service.ts +++ b/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.service.ts @@ -3,6 +3,7 @@ import { AssessmentIdbService } from 'src/app/indexed-db/assessment-idb.service' import { IdbAssessment } from 'src/app/models/assessment'; import { UnitSettings } from 'src/app/models/unitSettings'; import { UtilityEnergyUse } from 'src/app/models/utilityEnergyUses'; +import { UtilityOptions } from 'src/app/shared/constants/utilityTypes'; import { ConvertValue } from 'src/app/shared/conversions/convertValue'; @Injectable({ @@ -21,10 +22,25 @@ export class PreAssessmentSetupService { _energyUse => _energyUse.utilityType == utilityType); if (utilityEnergyUse.include) { // calculate use - let convertedUse = this.convertValue.convertValue( - utilityEnergyUse.energyUse, - utilityEnergyUse.unit, - companyEnergyUnit).convertedValue; + let trimmedType = utilityType.replace(/\s+/g, ''); // Remove spaces + let camelCaseType = trimmedType.charAt(0).toLowerCase() + trimmedType.slice(1); + let convertedUse = 0; + let selectedUtilityOption = UtilityOptions.find( + _option => _option.utilityType == utilityType); + let selectedUnitOption = selectedUtilityOption.energyUnitOptions.find( + _unitOption => _unitOption.value == utilityEnergyUse.energyUnit); + if (selectedUtilityOption.isStandardEnergyUnit + && selectedUnitOption.isStandard !== false) { + convertedUse = this.convertValue.convertValue( + utilityEnergyUse.energyUse, + utilityEnergyUse.energyUnit, + companyEnergyUnit).convertedValue; + } else { + convertedUse = this.convertValue.convertValue( + utilityEnergyUse.energyUse * utilityEnergyUse.energyHHV, + utilityEnergyUse.energyUnitStandard, + companyEnergyUnit).convertedValue; + } use += convertedUse; } }); @@ -45,7 +61,7 @@ export class PreAssessmentSetupService { let camelCaseType = trimmedType.charAt(0).toLowerCase() + trimmedType.slice(1); let convertedCost = this.convertValue.convertValue( utilityEnergyUse.energyUse, - utilityEnergyUse.unit, + utilityEnergyUse.energyUnit, facilityUnitSettings[`${camelCaseType}Unit`]).convertedValue; cost += convertedCost * facilityUnitSettings[`${camelCaseType}Price`]; } From 2aa97a1c58d842be273eef9fae0717c6de35e933 Mon Sep 17 00:00:00 2001 From: Roy Date: Tue, 8 Oct 2024 21:58:56 -0600 Subject: [PATCH 06/13] issue-249 updated assessment detail page to pre-assessment page --- src/app/models/assessment.ts | 4 - .../assessment-details-form.component.css | 15 +++ .../assessment-details-form.component.html | 121 +++++++++++++----- .../assessment-details-form.component.ts | 81 +++++++++--- .../pre-assessment-setup.component.ts | 2 +- 5 files changed, 168 insertions(+), 55 deletions(-) diff --git a/src/app/models/assessment.ts b/src/app/models/assessment.ts index 50249b92..91efab5f 100644 --- a/src/app/models/assessment.ts +++ b/src/app/models/assessment.ts @@ -13,8 +13,6 @@ export interface IdbAssessment extends IdbEntry { assessmentType: AssessmentType, utilityTypes: Array, // track all utility types associated with assessment type utilityEnergyUses: Array, // track all utility energy uses - utilityType: UtilityType, - unitOptionValue: string, equipmentId: string, energyUse: number, cost: number, @@ -41,8 +39,6 @@ export function getNewIdbAssessment(userId: string, companyId: string, facilityI assessmentType: defaultAssessmentType, utilityTypes: defaultUtilityTypes, utilityEnergyUses: getDefaultUtilityEnergyUses(facilityUnitSettings), - utilityType: undefined, - unitOptionValue: undefined, equipmentId: undefined, energyUse: 0, cost: 0, diff --git a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.css b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.css index e69de29b..7f82bd11 100644 --- a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.css +++ b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.css @@ -0,0 +1,15 @@ +.disabled-input-label{ + background-color: white; + border: none; + border-left: var(--bs-border-width) solid var(--bs-border-color); +} + +.utility-row:hover, .utility-row:hover .disabled-input-label { + background-color: #efefef; +} + +.disabled-input-label-secondary{ + background-color: white; + border: none; + margin-left: 20px; +} \ No newline at end of file diff --git a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.html b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.html index e01fb510..2fffef47 100644 --- a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.html +++ b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.html @@ -22,52 +22,107 @@
-
- -
- - - +
+
Utility Types
+

Select the utility types that are + applicable to this assessment and enter the annual energy + use for each type.

+ +
+
+
+
+ +
+ +
+
+ +
+
+
+ + +
+
+
+
+ +
+
+ +
+
+
+
+ + +
+
+
-
+ +
- - +
+ {{assessment.energyUse | number:'1.0-2'}}  + + +
-
diff --git a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/assessment-energy-opportunities-form.service.spec.ts b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/assessment-energy-opportunities-form.service.spec.ts new file mode 100644 index 00000000..014b830d --- /dev/null +++ b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/assessment-energy-opportunities-form.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AssessmentEnergyOpportunitiesFormService } from './assessment-energy-opportunities-form.service'; + +describe('AssessmentEnergyOpportunitiesFormService', () => { + let service: AssessmentEnergyOpportunitiesFormService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(AssessmentEnergyOpportunitiesFormService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/assessment-energy-opportunities-form.service.ts b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/assessment-energy-opportunities-form.service.ts new file mode 100644 index 00000000..c3ef54e5 --- /dev/null +++ b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/assessment-energy-opportunities-form.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { EnergyOpportunityIdbService } from 'src/app/indexed-db/energy-opportunity-idb.service'; +import { IdbEnergyOpportunity } from 'src/app/models/energyOpportunity'; +import { ConvertValue } from 'src/app/shared/conversions/convertValue'; + +@Injectable({ + providedIn: 'root' +}) +export class AssessmentEnergyOpportunitiesFormService { + + convertValue = new ConvertValue(); + + constructor(private energyOpportunityIdbService: EnergyOpportunityIdbService) { } + + async updateEnergyOpportunityEnergyUse(energyOpportunities: Array, companyEnergyUnit: string) { + for (const energyOpportunity of energyOpportunities) { + // Update energy opportunity energy savings + if (companyEnergyUnit === 'MMBtu') { + energyOpportunity.energySavings = this.convertValue.convertValue( + energyOpportunity.energySavings, + 'kWh', + 'MMBtu').convertedValue; + } else { + energyOpportunity.energySavings = this.convertValue.convertValue( + energyOpportunity.energySavings, + 'MMBtu', + 'kWh').convertedValue; + } + await this.energyOpportunityIdbService.asyncUpdate(energyOpportunity); + } + } +} diff --git a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.html b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.html index 2a2f71b9..8f3da0cd 100644 --- a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.html +++ b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.html @@ -76,7 +76,7 @@
- MMBtu/yr +
diff --git a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.ts b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.ts index bf769d3f..712ee2fb 100644 --- a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.ts +++ b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.ts @@ -7,7 +7,8 @@ import { IdbEnergyOpportunity } from 'src/app/models/energyOpportunity'; import { EnergyOpportunityIdbService } from 'src/app/indexed-db/energy-opportunity-idb.service'; import { NonEnergyBenefitsIdbService } from 'src/app/indexed-db/non-energy-benefits-idb.service'; import { getNewIdbNonEnergyBenefit, IdbNonEnergyBenefit } from 'src/app/models/nonEnergyBenefit'; -import { firstValueFrom } from 'rxjs'; +import { firstValueFrom, Subscription } from 'rxjs'; +import { CompanyIdbService } from 'src/app/indexed-db/company-idb.service'; @Component({ selector: 'app-energy-opportunity-setup-form', @@ -32,16 +33,24 @@ export class EnergyOpportunitySetupFormComponent { opportunityTypes: Array = [{ value: 'other', label: 'Other' }]; displayDeleteModal: boolean = false; showAddNebDropdown: boolean = false; + + companySub: Subscription; + companyEnergyUnit: string; + constructor( private energyOpportunityIdbService: EnergyOpportunityIdbService, private dbChangesService: DbChangesService, private setupWizardService: SetupWizardService, - private nonEnergyBenefitsIdbService: NonEnergyBenefitsIdbService + private nonEnergyBenefitsIdbService: NonEnergyBenefitsIdbService, + private companyIdbService: CompanyIdbService, ) { } ngOnInit() { this.energyOpportunity = this.energyOpportunityIdbService.getByGuid(this.energyOpportunityGuid); + this.companySub = this.companyIdbService.selectedCompany.subscribe(company => { + this.companyEnergyUnit = company.companyEnergyUnit; + }); } ngOnDestroy() { diff --git a/src/app/setup-wizard/pre-visit/company-setup/company-setup.component.ts b/src/app/setup-wizard/pre-visit/company-setup/company-setup.component.ts index f37f80e5..7ab62168 100644 --- a/src/app/setup-wizard/pre-visit/company-setup/company-setup.component.ts +++ b/src/app/setup-wizard/pre-visit/company-setup/company-setup.component.ts @@ -14,6 +14,10 @@ import { IdbAssessment } from 'src/app/models/assessment'; import { IdbFacility } from 'src/app/models/facility'; import { FacilityIdbService } from 'src/app/indexed-db/facility-idb.service'; import { FacilitySetupService } from '../facility-setup/facility-setup.service'; +import { IdbEnergyOpportunity } from 'src/app/models/energyOpportunity'; +import { EnergyOpportunityIdbService } from 'src/app/indexed-db/energy-opportunity-idb.service'; +import { EnergyOpportunitySetupFormComponent } from '../../data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component'; +import { AssessmentEnergyOpportunitiesFormService } from '../../data-collection/on-site-assessment/assessment-energy-opportunities-form/assessment-energy-opportunities-form.service'; @Component({ selector: 'app-company-setup', @@ -41,6 +45,7 @@ export class CompanySetupComponent implements OnInit, OnDestroy { companyAssessments: Array = []; companyFacilities: Array = []; + companyEnergyOpportunities: Array = []; constructor(private router: Router, private companyIdbService: CompanyIdbService, @@ -49,7 +54,9 @@ export class CompanySetupComponent implements OnInit, OnDestroy { private preAassessmentSetupService: PreAssessmentSetupService, private assessmentIdbService: AssessmentIdbService, private facilityIdbService: FacilityIdbService, - private facilitySetupService: FacilitySetupService + private facilitySetupService: FacilitySetupService, + private energyOpportunityIdbService: EnergyOpportunityIdbService, + private assessmentEnergyOpportunitiesFormService: AssessmentEnergyOpportunitiesFormService, ) { } @@ -69,6 +76,7 @@ export class CompanySetupComponent implements OnInit, OnDestroy { } this.companyFacilities = this.facilityIdbService.getByOtherGuid(this.selectedCompany.guid, 'company'); + this.companyEnergyOpportunities = this.energyOpportunityIdbService.getByOtherGuid(this.selectedCompany.guid, 'company'); } } @@ -97,6 +105,8 @@ export class CompanySetupComponent implements OnInit, OnDestroy { this.companyAssessments, this.energyUnit.value); await this.facilitySetupService.updateFacilityEnergyUse( this.companyFacilities, this.energyUnit.value); + await this.assessmentEnergyOpportunitiesFormService.updateEnergyOpportunityEnergyUse( + this.companyEnergyOpportunities, this.energyUnit.value); } async saveChanges() { diff --git a/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.service.ts b/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.service.ts index 0a1d0297..09471866 100644 --- a/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.service.ts +++ b/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.service.ts @@ -45,6 +45,18 @@ export class PreAssessmentSetupService { } }); assessment.energyUse = use; + // Update assessment energy savings + if (companyEnergyUnit === 'MMBtu') { + assessment.energySavings = this.convertValue.convertValue( + assessment.energySavings, + 'kWh', + 'MMBtu').convertedValue; + } else { + assessment.energySavings = this.convertValue.convertValue( + assessment.energySavings, + 'MMBtu', + 'kWh').convertedValue; + } await this.saveChanges(assessment); } } From 31c71ab7d59a4a0910c823f44d54e488ffe0e786 Mon Sep 17 00:00:00 2001 From: Roy Date: Wed, 9 Oct 2024 00:14:47 -0600 Subject: [PATCH 08/13] issue-163 add total size in company unit --- .../energy-equipment-form.component.html | 14 +++++++- .../energy-equipment-form.component.ts | 30 +++++++++++++---- src/app/shared/constants/equipmentTypes.ts | 33 ++++++++++++------- 3 files changed, 58 insertions(+), 19 deletions(-) diff --git a/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.html b/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.html index 77a4b3fa..0f486066 100644 --- a/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.html +++ b/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.html @@ -112,6 +112,17 @@
+
+ +
+
+ {{ convertSize() | number: '1.0-2' }}  + +
+
+
diff --git a/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.ts b/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.ts index 25c2c9ea..c285817a 100644 --- a/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.ts +++ b/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.ts @@ -1,6 +1,7 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { faContactBook, faTrash, faUser, IconDefinition } from '@fortawesome/free-solid-svg-icons'; import { Subscription } from 'rxjs'; +import { CompanyIdbService } from 'src/app/indexed-db/company-idb.service'; import { ContactIdbService } from 'src/app/indexed-db/contact-idb.service'; import { DbChangesService } from 'src/app/indexed-db/db-changes.service'; import { EnergyEquipmentIdbService } from 'src/app/indexed-db/energy-equipment-idb.service'; @@ -27,7 +28,9 @@ export class EnergyEquipmentFormComponent { faContactBook: IconDefinition = faContactBook; equipmentTypes: Array = EquipmentTypes; - equipmentTypeOptions: Array<{ equipmentType: EquipmentType, utilityTypes: Array }> = EquipmentTypeOptions; + equipmentTypeOptions: Array<{ equipmentType: EquipmentType, + utilityTypes: Array, + defaultUnit: string }> = EquipmentTypeOptions; utilityOptions: Array = UtilityOptions; fuelVolumeUnitOptions:Array = [...VolumeLiquidOptions, ...VolumeGasOptions]; @@ -43,9 +46,14 @@ export class EnergyEquipmentFormComponent { contactSub: Subscription; viewContact: IdbContact; displayContactModal: boolean = false; + + companySub: Subscription; + companyEnergyUnit: string; + constructor(private energyEquipmentIdbService: EnergyEquipmentIdbService, private dbChangesService: DbChangesService, - private contactIdbService: ContactIdbService + private contactIdbService: ContactIdbService, + private companyIdbService: CompanyIdbService, ) { } ngOnInit() { @@ -53,6 +61,10 @@ export class EnergyEquipmentFormComponent { this.contactSub = this.contactIdbService.contacts.subscribe(_contacts => { this.contacts = _contacts; }); + + this.companySub = this.companyIdbService.selectedCompany.subscribe(_company => { + this.companyEnergyUnit = _company.companyEnergyUnit; + }); } ngOnDestroy() { @@ -104,12 +116,16 @@ export class EnergyEquipmentFormComponent { } } - async calculateAnnualEnergyUse() { + convertSize(): number { let unitConv = this.convertValue.convertValue(1, this.energyEquipment.sizeUnit).convertedValue * 3600; // Wh to J - unitConv = unitConv / this.convertValue.convertValue(1, 'kWh').convertedValue; // J to kWh (for now) - this.energyEquipment.annualEnergyUse = this.energyEquipment.size * this.energyEquipment.operatingHours * - (this.energyEquipment.loadFactor / 100) / (this.energyEquipment.efficiency / 100) * this.energyEquipment.numberOfEquipment * - unitConv; + unitConv = unitConv / this.convertValue.convertValue(1, this.companyEnergyUnit).convertedValue; + return this.energyEquipment.size * unitConv; + } + + async calculateAnnualEnergyUse() { + let convertedSize = this.convertSize(); + this.energyEquipment.annualEnergyUse = convertedSize * this.energyEquipment.operatingHours * + (this.energyEquipment.loadFactor / 100) / (this.energyEquipment.efficiency / 100) * this.energyEquipment.numberOfEquipment; if (!this.energyEquipment.annualEnergyUse || this.energyEquipment.annualEnergyUse === Infinity) { this.energyEquipment.annualEnergyUse = 0; } diff --git a/src/app/shared/constants/equipmentTypes.ts b/src/app/shared/constants/equipmentTypes.ts index b2b3e126..e41ffce8 100644 --- a/src/app/shared/constants/equipmentTypes.ts +++ b/src/app/shared/constants/equipmentTypes.ts @@ -12,27 +12,38 @@ import { UtilityType } from "./utilityTypes"; export type EquipmentType = "Pump" | "Fan" | "Process Heating" | "Compressed Air" | "Steam" | "Process Cooling" | "Motor" | "Lighting" | "HVAC" | "Mobile"; export const EquipmentTypes: Array = ["Pump", "Fan", "Process Heating", "Compressed Air", "Steam", "Process Cooling", "Motor", "Lighting", "HVAC", "Mobile"]; -export const EquipmentTypeOptions: Array<{ equipmentType: EquipmentType, utilityTypes: Array }> = EquipmentTypes.map(type => { +export const EquipmentTypeOptions: + Array<{ equipmentType: EquipmentType, + utilityTypes: Array, + defaultUnit: string }> = EquipmentTypes.map(type => { switch (type) { case "Pump": - return { equipmentType: type, utilityTypes: ['Electricity'] }; + return { equipmentType: type, utilityTypes: ['Electricity'], defaultUnit: 'kW' }; case "Fan": - return { equipmentType: type, utilityTypes: ['Electricity'] }; + return { equipmentType: type, utilityTypes: ['Electricity'], defaultUnit: 'kW' }; case "Process Heating": - return { equipmentType: type, utilityTypes: ['Natural Gas', 'Other Fuels', 'Electricity', 'Steam'] }; + return { equipmentType: type, utilityTypes: ['Natural Gas', 'Other Fuels', 'Electricity', 'Steam'], + defaultUnit: 'kW' + }; case "Compressed Air": - return { equipmentType: type, utilityTypes: ['Electricity'] }; + return { equipmentType: type, utilityTypes: ['Electricity'], + defaultUnit: 'kW' + }; case "Steam": - return { equipmentType: type, utilityTypes: ['Natural Gas', 'Other Fuels', 'Electricity'] }; + return { equipmentType: type, utilityTypes: ['Natural Gas', 'Other Fuels', 'Electricity'], + defaultUnit: 'kW' + }; case "Process Cooling": - return { equipmentType: type, utilityTypes: ['Electricity'] }; + return { equipmentType: type, utilityTypes: ['Electricity'], defaultUnit: 'kW' }; case "Motor": - return { equipmentType: type, utilityTypes: ['Electricity'] }; + return { equipmentType: type, utilityTypes: ['Electricity'], defaultUnit: 'kW' }; case "Lighting": - return { equipmentType: type, utilityTypes: ['Electricity'] }; + return { equipmentType: type, utilityTypes: ['Electricity'], defaultUnit: 'W' }; case "HVAC": - return { equipmentType: type, utilityTypes: ['Electricity'] }; + return { equipmentType: type, utilityTypes: ['Electricity'], defaultUnit: 'kW' }; case "Mobile": - return { equipmentType: type, utilityTypes: ['Electricity', 'Natural Gas', 'Other Fuels'] }; + return { equipmentType: type, utilityTypes: ['Electricity', 'Natural Gas', 'Other Fuels'], + defaultUnit: 'kW' + }; } }); From a0cacc0e04fb4ebc09bdf126f3bff11233dbb48f Mon Sep 17 00:00:00 2001 From: Roy Date: Wed, 9 Oct 2024 00:18:25 -0600 Subject: [PATCH 09/13] issue-163 update the default unit logic --- .../energy-equipment-form.component.ts | 24 +++++-------------- 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.ts b/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.ts index c285817a..5e58b18b 100644 --- a/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.ts +++ b/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.ts @@ -75,30 +75,18 @@ export class EnergyEquipmentFormComponent { let _utilityTypes = this.equipmentTypeOptions.find( option => option.equipmentType === this.energyEquipment.equipmentType )?.utilityTypes || []; - if (!(_utilityTypes.includes(this.energyEquipment.utilityType)) || this.energyEquipment.utilityType) { - this.energyEquipment.utilityType = _utilityTypes[0]; // Set to first utility type - } + this.energyEquipment.utilityType = _utilityTypes[0]; // Set to first utility type + this.energyEquipment.sizeUnit = this.equipmentTypeOptions.find( + option => option.equipmentType === this.energyEquipment.equipmentType + )?.defaultUnit || 'kW'; // Set to default unit await this.utilityTypeChange(); } async utilityTypeChange() { if (this.energyEquipment.equipmentType === 'Process Cooling') { // Process Cooling unit changes - if (!this.processCoolingUnitOptions.map(option => option.value).includes(this.energyEquipment.sizeUnit)) { - this.energyEquipment.sizeUnit = this.processCoolingUnitOptions[0].value; - await this.updateEnergyCalculations(); - } else { - await this.saveChanges(); - } - } else { - let _utilityOption = this.utilityOptions.find(option => option.utilityType === this.energyEquipment.utilityType); - let _unitOptions = _utilityOption.powerUnitOptions; - if (!_unitOptions.map(option => option.value).includes(this.energyEquipment.sizeUnit)) { - this.energyEquipment.sizeUnit = _unitOptions[0].value; - await this.updateEnergyCalculations(); - } else { - await this.saveChanges(); - } + this.energyEquipment.sizeUnit = this.processCoolingUnitOptions[0].value; } + await this.updateEnergyCalculations(); } async updateEnergyCalculations() { From b84388e687eb3c2d3e95e6fdaa57719e5475af8d Mon Sep 17 00:00:00 2001 From: Roy Date: Wed, 9 Oct 2024 00:36:55 -0600 Subject: [PATCH 10/13] fix unit tests --- .../assessment-details-form.component.spec.ts | 7 +++++++ ...sessment-energy-opportunities-form.service.spec.ts | 6 +++++- .../energy-opportunity-setup-form.component.spec.ts | 8 +++++++- .../company-setup/company-setup.component.spec.ts | 11 +++++++++-- .../energy-equipment-form.component.spec.ts | 10 ++++++++-- .../facility-setup/facility-setup.service.spec.ts | 5 ++++- 6 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.spec.ts b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.spec.ts index c78e0239..cc886041 100644 --- a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.spec.ts +++ b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.spec.ts @@ -16,6 +16,8 @@ import { HelperPipesModule } from 'src/app/shared/helper-pipes/helper-pipes.modu import { EnergyEquipmentIdbService } from 'src/app/indexed-db/energy-equipment-idb.service'; import { IdbEnergyEquipment } from 'src/app/models/energyEquipment'; import { getDefaultUnitSettings } from 'src/app/models/unitSettings'; +import { CompanyIdbService } from 'src/app/indexed-db/company-idb.service'; +import { IdbCompany } from 'src/app/models/company'; describe('AssessmentDetailsFormComponent', () => { let component: AssessmentDetailsFormComponent; @@ -47,6 +49,10 @@ describe('AssessmentDetailsFormComponent', () => { let energyEquipmentIdbService: Partial = { energyEquipments: new BehaviorSubject>([]) }; + + let companyIdbService: Partial = { + selectedCompany: new BehaviorSubject(null) + }; beforeEach(async () => { await TestBed.configureTestingModule({ imports: [FontAwesomeModule, FormsModule, RouterTestingModule, HelperPipesModule], @@ -57,6 +63,7 @@ describe('AssessmentDetailsFormComponent', () => { { provide: SetupWizardService, useValue: setupWizardService }, { provide: ContactIdbService, useValue: contactIdbService }, { provide: EnergyEquipmentIdbService, useValue: energyEquipmentIdbService }, + { provide: CompanyIdbService, useValue: companyIdbService }, ] }) .compileComponents(); diff --git a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/assessment-energy-opportunities-form.service.spec.ts b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/assessment-energy-opportunities-form.service.spec.ts index 014b830d..d6810a28 100644 --- a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/assessment-energy-opportunities-form.service.spec.ts +++ b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/assessment-energy-opportunities-form.service.spec.ts @@ -1,12 +1,16 @@ import { TestBed } from '@angular/core/testing'; import { AssessmentEnergyOpportunitiesFormService } from './assessment-energy-opportunities-form.service'; +import { EnergyOpportunityIdbService } from 'src/app/indexed-db/energy-opportunity-idb.service'; describe('AssessmentEnergyOpportunitiesFormService', () => { let service: AssessmentEnergyOpportunitiesFormService; + let energyOpportunityIdbService: Partial = {}; beforeEach(() => { - TestBed.configureTestingModule({}); + TestBed.configureTestingModule({ + providers: [{ provide: EnergyOpportunityIdbService, useValue: energyOpportunityIdbService }] + }); service = TestBed.inject(AssessmentEnergyOpportunitiesFormService); }); diff --git a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.spec.ts b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.spec.ts index ab739a17..3da8e88d 100644 --- a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.spec.ts +++ b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.spec.ts @@ -15,6 +15,8 @@ import { NebFormsAccordionComponent } from '../../neb-forms-accordion/neb-forms- import { LocalStorageDataService } from 'src/app/shared/shared-services/local-storage-data.service'; import { ChangeDetectorRef } from '@angular/core'; import { BootstrapService } from 'src/app/shared/shared-services/bootstrap.service'; +import { CompanyIdbService } from 'src/app/indexed-db/company-idb.service'; +import { IdbCompany } from 'src/app/models/company'; describe('EnergyOpportunitySetupFormComponent', () => { let component: EnergyOpportunitySetupFormComponent; @@ -35,6 +37,9 @@ describe('EnergyOpportunitySetupFormComponent', () => { let localStorageDataService: Partial = {}; let cd: Partial = {}; let bootstrapService: Partial = {}; + let companyIdbService: Partial = { + selectedCompany: new BehaviorSubject(null) + }; beforeEach(async () => { await TestBed.configureTestingModule({ imports: [FontAwesomeModule, RouterTestingModule, FormsModule], @@ -46,7 +51,8 @@ describe('EnergyOpportunitySetupFormComponent', () => { { provide: DbChangesService, useValue: dbChangesService }, { provide: LocalStorageDataService, useValue: localStorageDataService }, { provide: ChangeDetectorRef, useValue: cd }, - { provide: BootstrapService, useValue: bootstrapService } + { provide: BootstrapService, useValue: bootstrapService }, + { provide: CompanyIdbService, useValue: companyIdbService } ] }) diff --git a/src/app/setup-wizard/pre-visit/company-setup/company-setup.component.spec.ts b/src/app/setup-wizard/pre-visit/company-setup/company-setup.component.spec.ts index 59231e2f..0db6df10 100644 --- a/src/app/setup-wizard/pre-visit/company-setup/company-setup.component.spec.ts +++ b/src/app/setup-wizard/pre-visit/company-setup/company-setup.component.spec.ts @@ -17,6 +17,7 @@ import { IdbOnSiteVisit, getNewIdbOnSiteVisit } from 'src/app/models/onSiteVisit import { LabelWithTooltipModule } from 'src/app/shared/label-with-tooltip/label-with-tooltip.module'; import { PreAssessmentSetupService } from '../pre-assessment-setup/pre-assessment-setup.service'; import { AssessmentIdbService } from 'src/app/indexed-db/assessment-idb.service'; +import { EnergyOpportunityIdbService } from 'src/app/indexed-db/energy-opportunity-idb.service'; describe('CompanySetupComponent', () => { let component: CompanySetupComponent; @@ -32,7 +33,8 @@ describe('CompanySetupComponent', () => { }; let facilityIdbService: Partial = { facilities: new BehaviorSubject>([]), - selectedFacility: new BehaviorSubject(getNewIdbFacility('', '')) + selectedFacility: new BehaviorSubject(getNewIdbFacility('', '')), + getByOtherGuid: (guid, idType) => [] }; let onSiteVisitIdbService: Partial = { selectedVisit: new BehaviorSubject(getNewIdbOnSiteVisit('', '', '')) @@ -42,6 +44,10 @@ describe('CompanySetupComponent', () => { getByOtherGuid: (guid, idType) => [] }; + let energyOpportunityIdbService: Partial = { + getByOtherGuid: (guid, idType) => [] + }; + beforeEach(async () => { await TestBed.configureTestingModule({ imports: [FontAwesomeModule, SharedSettingsFormsModule, FormsModule, ReactiveFormsModule, LabelWithTooltipModule], @@ -53,7 +59,8 @@ describe('CompanySetupComponent', () => { { provide: FacilityIdbService, useValue: facilityIdbService }, { provide: OnSiteVisitIdbService, useValue: onSiteVisitIdbService }, { provide: PreAssessmentSetupService, useValue: preAassessmentSetupService }, - { provide: AssessmentIdbService, useValue: assessmentIdbService } + { provide: AssessmentIdbService, useValue: assessmentIdbService }, + { provide: EnergyOpportunityIdbService, useValue: energyOpportunityIdbService } ] }) .compileComponents(); diff --git a/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.spec.ts b/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.spec.ts index 9b9e5d36..b451bebc 100644 --- a/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.spec.ts +++ b/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.spec.ts @@ -10,6 +10,8 @@ import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; import { DbChangesService } from 'src/app/indexed-db/db-changes.service'; import { HelperPipesModule } from 'src/app/shared/helper-pipes/helper-pipes.module'; import { FormsModule } from '@angular/forms'; +import { CompanyIdbService } from 'src/app/indexed-db/company-idb.service'; +import { IdbCompany } from 'src/app/models/company'; describe('EnergyEquipmentFormComponent', () => { let component: EnergyEquipmentFormComponent; @@ -22,7 +24,10 @@ describe('EnergyEquipmentFormComponent', () => { energyEquipments: new BehaviorSubject>([]), getByGuid: () => { return getNewIdbEnergyEquipment('', '', '') } }; - let dbChangesService: Partial = {} + let dbChangesService: Partial = {}; + let companyIdbService: Partial = { + selectedCompany: new BehaviorSubject(null) + }; beforeEach(async () => { await TestBed.configureTestingModule({ imports: [FontAwesomeModule, HelperPipesModule, FormsModule], @@ -30,7 +35,8 @@ describe('EnergyEquipmentFormComponent', () => { providers: [ { provide: DbChangesService, useValue: dbChangesService }, { provide: ContactIdbService, useValue: contactIdbService }, - { provide: EnergyEquipmentIdbService, useValue: energyEquipmentIdbService } + { provide: EnergyEquipmentIdbService, useValue: energyEquipmentIdbService }, + { provide: CompanyIdbService, useValue: companyIdbService }, ] }) .compileComponents(); diff --git a/src/app/setup-wizard/pre-visit/facility-setup/facility-setup.service.spec.ts b/src/app/setup-wizard/pre-visit/facility-setup/facility-setup.service.spec.ts index a10c68f7..ff962fa5 100644 --- a/src/app/setup-wizard/pre-visit/facility-setup/facility-setup.service.spec.ts +++ b/src/app/setup-wizard/pre-visit/facility-setup/facility-setup.service.spec.ts @@ -4,9 +4,12 @@ import { FacilitySetupService } from './facility-setup.service'; describe('FacilitySetupService', () => { let service: FacilitySetupService; + let facilitySetupService: Partial = {}; beforeEach(() => { - TestBed.configureTestingModule({}); + TestBed.configureTestingModule({ + providers: [{ provide: FacilitySetupService, useValue: facilitySetupService }] + }); service = TestBed.inject(FacilitySetupService); }); From 6230975df2db4fe4359f01d1e5e7eadd1c51a016 Mon Sep 17 00:00:00 2001 From: Roy Date: Wed, 9 Oct 2024 10:37:45 -0600 Subject: [PATCH 11/13] PR268 added idtype constant --- src/app/indexed-db/assessment-idb.service.ts | 3 ++- src/app/indexed-db/energy-opportunity-idb.service.ts | 3 ++- src/app/indexed-db/facility-idb.service.ts | 7 ++++--- src/app/shared/constants/guidTypes.ts | 1 + 4 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 src/app/shared/constants/guidTypes.ts diff --git a/src/app/indexed-db/assessment-idb.service.ts b/src/app/indexed-db/assessment-idb.service.ts index 31833af8..f001bd83 100644 --- a/src/app/indexed-db/assessment-idb.service.ts +++ b/src/app/indexed-db/assessment-idb.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable, firstValueFrom } from 'rxjs'; import { IdbAssessment } from '../models/assessment'; import { NgxIndexedDBService } from 'ngx-indexed-db'; +import { guidType } from '../shared/constants/guidTypes'; @Injectable({ providedIn: 'root' @@ -58,7 +59,7 @@ export class AssessmentIdbService { return assessments.find(_assessment => { return _assessment.guid == guid }); } - getByOtherGuid(guid: string, idType: string): Array { + getByOtherGuid(guid: string, idType: guidType): Array { let assessments: Array = this.assessments.getValue(); if (idType == 'company') { return assessments.filter(_assessment => { return _assessment.companyId == guid }); diff --git a/src/app/indexed-db/energy-opportunity-idb.service.ts b/src/app/indexed-db/energy-opportunity-idb.service.ts index 909cf968..65915f76 100644 --- a/src/app/indexed-db/energy-opportunity-idb.service.ts +++ b/src/app/indexed-db/energy-opportunity-idb.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { IdbEnergyOpportunity } from '../models/energyOpportunity'; import { NgxIndexedDBService } from 'ngx-indexed-db'; import { BehaviorSubject, Observable, firstValueFrom } from 'rxjs'; +import { guidType } from '../shared/constants/guidTypes'; @Injectable({ providedIn: 'root' @@ -60,7 +61,7 @@ export class EnergyOpportunityIdbService { }); } - getByOtherGuid(guid: string, idType: string): Array { + getByOtherGuid(guid: string, idType: guidType): Array { let energyOpportunities: Array = this.energyOpportunities.getValue(); if (idType == 'company') { return energyOpportunities.filter(opportunity => { diff --git a/src/app/indexed-db/facility-idb.service.ts b/src/app/indexed-db/facility-idb.service.ts index e8ea101e..1115c719 100644 --- a/src/app/indexed-db/facility-idb.service.ts +++ b/src/app/indexed-db/facility-idb.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable, firstValueFrom } from 'rxjs'; import { IdbFacility, getNewIdbFacility } from '../models/facility'; import { NgxIndexedDBService } from 'ngx-indexed-db'; +import { guidType } from '../shared/constants/guidTypes'; @Injectable({ providedIn: 'root' @@ -68,12 +69,12 @@ export class FacilityIdbService { return newFacility.guid; } - getByOtherGuid(guid: string, type: string): Array { + getByOtherGuid(guid: string, idType: guidType): Array { let facilities: Array = this.facilities.getValue(); let _facilities: Array = facilities.filter(facility => { - if (type == 'company') { + if (idType == 'company') { return facility.companyId == guid; - } else if (type == 'user') { + } else if (idType == 'user') { return facility.userId == guid; } else { return false; diff --git a/src/app/shared/constants/guidTypes.ts b/src/app/shared/constants/guidTypes.ts new file mode 100644 index 00000000..84e42bf8 --- /dev/null +++ b/src/app/shared/constants/guidTypes.ts @@ -0,0 +1 @@ +export type guidType = 'company' | 'facility' | 'user' | 'visit' | 'energy opportunity' | 'neb' | 'kpi' | 'kpm'; \ No newline at end of file From c8575d84ceb04042dc7d483e6c430743960b224e Mon Sep 17 00:00:00 2001 From: Roy Date: Wed, 9 Oct 2024 11:10:21 -0600 Subject: [PATCH 12/13] PR268 address the label alignments, unsubscribes for feedback --- .../assessment-details-form.component.css | 2 +- .../assessment-details-form.component.ts | 4 +++- .../energy-opportunity-setup-form.component.ts | 1 + .../energy-equipment-form/energy-equipment-form.component.ts | 1 + .../pre-assessment-setup/pre-assessment-setup.component.css | 2 +- .../shared-settings-forms/units-form/units-form.component.css | 2 +- 6 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.css b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.css index 7f82bd11..c3c9bc86 100644 --- a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.css +++ b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.css @@ -11,5 +11,5 @@ .disabled-input-label-secondary{ background-color: white; border: none; - margin-left: 20px; + margin-left: 28px; } \ No newline at end of file diff --git a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.ts b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.ts index d6cc9bcd..4f5a076f 100644 --- a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.ts +++ b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.ts @@ -87,13 +87,15 @@ export class AssessmentDetailsFormComponent { this.contactsSub.unsubscribe(); this.assessmentSub.unsubscribe(); this.energyEquipmentSub.unsubscribe(); + this.facilitySub.unsubscribe(); + this.companySub.unsubscribe(); } async assessmentTypeChange() { let utilityTypes = AssessmentOptions.find( _assessmentOption => _assessmentOption.assessmentType == this.assessment.assessmentType)?.utilityTypes || []; this.assessment.utilityTypes = utilityTypes; // track all utility types - this.calculateEnergyUseCost(); + await this.calculateEnergyUseCost(); } async calculateEnergyUseCost() { diff --git a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.ts b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.ts index 712ee2fb..3ac002fe 100644 --- a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.ts +++ b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-energy-opportunities-form/energy-opportunity-setup-form/energy-opportunity-setup-form.component.ts @@ -54,6 +54,7 @@ export class EnergyOpportunitySetupFormComponent { } ngOnDestroy() { + this.companySub.unsubscribe(); } ngAfterViewInit() { diff --git a/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.ts b/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.ts index 5e58b18b..73f80aea 100644 --- a/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.ts +++ b/src/app/setup-wizard/pre-visit/facility-energy-equipment-setup/energy-equipment-form/energy-equipment-form.component.ts @@ -69,6 +69,7 @@ export class EnergyEquipmentFormComponent { ngOnDestroy() { this.contactSub.unsubscribe(); + this.companySub.unsubscribe(); } async industrialSystemChange() { diff --git a/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.css b/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.css index 7f82bd11..c3c9bc86 100644 --- a/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.css +++ b/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.css @@ -11,5 +11,5 @@ .disabled-input-label-secondary{ background-color: white; border: none; - margin-left: 20px; + margin-left: 28px; } \ No newline at end of file diff --git a/src/app/shared/shared-settings-forms/units-form/units-form.component.css b/src/app/shared/shared-settings-forms/units-form/units-form.component.css index e8217f22..9ea3a6b8 100644 --- a/src/app/shared/shared-settings-forms/units-form/units-form.component.css +++ b/src/app/shared/shared-settings-forms/units-form/units-form.component.css @@ -6,5 +6,5 @@ .disabled-input-label-secondary{ background-color: white; border: none; - margin-left: 20px; + margin-left: 28px; } \ No newline at end of file From efea2553390f3d58b0e148807e24edf3d78f1bd0 Mon Sep 17 00:00:00 2001 From: Roy Date: Wed, 9 Oct 2024 11:35:18 -0600 Subject: [PATCH 13/13] issue-249 naming change for HHV --- .../assessment-details-form.component.html | 2 +- .../pre-assessment-setup.component.html | 2 +- .../helper-pipes/helper-pipes.module.ts | 3 +++ .../utility-hhv-display.pipe.spec.ts | 8 ++++++++ .../helper-pipes/utility-hhv-display.pipe.ts | 19 +++++++++++++++++++ .../units-form/units-form.component.html | 4 ++-- 6 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 src/app/shared/helper-pipes/utility-hhv-display.pipe.spec.ts create mode 100644 src/app/shared/helper-pipes/utility-hhv-display.pipe.ts diff --git a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.html b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.html index 9996a276..6a09df79 100644 --- a/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.html +++ b/src/app/setup-wizard/data-collection/on-site-assessment/assessment-details-form/assessment-details-form.component.html @@ -74,7 +74,7 @@
Utility Types
+ value="{{use.utilityType | utilityHhvDisplay}}">
diff --git a/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.html b/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.html index 315b5930..5f6bf95c 100644 --- a/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.html +++ b/src/app/setup-wizard/pre-visit/pre-assessment-setup/pre-assessment-setup.component.html @@ -131,7 +131,7 @@
Utility Types
+ value="{{use.utilityType | utilityHhvDisplay}}">
diff --git a/src/app/shared/helper-pipes/helper-pipes.module.ts b/src/app/shared/helper-pipes/helper-pipes.module.ts index 02313d3f..39be708b 100644 --- a/src/app/shared/helper-pipes/helper-pipes.module.ts +++ b/src/app/shared/helper-pipes/helper-pipes.module.ts @@ -31,6 +31,7 @@ import { ContactNameDisplayPipe } from './contact-name-display.pipe'; import { LinkedUnitOptionsPipe } from './linked-unit-options.pipe'; import { LinkedUtilityOptionsPipe } from './linked-utility-options.pipe'; import { IsStandardUnitPipe } from './is-standard-unit.pipe'; +import { UtilityHhvDisplayPipe } from './utility-hhv-display.pipe'; @NgModule({ declarations: [ @@ -65,6 +66,7 @@ import { IsStandardUnitPipe } from './is-standard-unit.pipe'; LinkedUnitOptionsPipe, LinkedUtilityOptionsPipe, IsStandardUnitPipe, + UtilityHhvDisplayPipe, ], imports: [ CommonModule @@ -101,6 +103,7 @@ import { IsStandardUnitPipe } from './is-standard-unit.pipe'; LinkedUnitOptionsPipe, LinkedUtilityOptionsPipe, IsStandardUnitPipe, + UtilityHhvDisplayPipe, ] }) export class HelperPipesModule { } diff --git a/src/app/shared/helper-pipes/utility-hhv-display.pipe.spec.ts b/src/app/shared/helper-pipes/utility-hhv-display.pipe.spec.ts new file mode 100644 index 00000000..0deda9bc --- /dev/null +++ b/src/app/shared/helper-pipes/utility-hhv-display.pipe.spec.ts @@ -0,0 +1,8 @@ +import { UtilityHhvDisplayPipe } from './utility-hhv-display.pipe'; + +describe('UtilityHhvDisplayPipe', () => { + it('create an instance', () => { + const pipe = new UtilityHhvDisplayPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/src/app/shared/helper-pipes/utility-hhv-display.pipe.ts b/src/app/shared/helper-pipes/utility-hhv-display.pipe.ts new file mode 100644 index 00000000..3fd913d9 --- /dev/null +++ b/src/app/shared/helper-pipes/utility-hhv-display.pipe.ts @@ -0,0 +1,19 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { UtilityType } from '../constants/utilityTypes'; + +@Pipe({ + name: 'utilityHhvDisplay', +}) +export class UtilityHhvDisplayPipe implements PipeTransform { + + transform(utilityType: UtilityType): string { + if (utilityType === 'Steam') { + return 'Enthalpy'; + } else if (utilityType === 'Compressed Air') { + return 'Specific Power'; + } else { + return 'Higher Heating Value'; + } + } + +} diff --git a/src/app/shared/shared-settings-forms/units-form/units-form.component.html b/src/app/shared/shared-settings-forms/units-form/units-form.component.html index fd77f34a..d7fa569e 100644 --- a/src/app/shared/shared-settings-forms/units-form/units-form.component.html +++ b/src/app/shared/shared-settings-forms/units-form/units-form.component.html @@ -309,7 +309,7 @@
+ value="{{'Steam' | utilityHhvDisplay}}">
@@ -374,7 +374,7 @@
+ value="{{'Compressed Air' | utilityHhvDisplay}}">