diff --git a/app/containers/Products/ProductRowItemContainer.tsx b/app/containers/Products/ProductRowItemContainer.tsx index 82745c597f..a6ef803667 100644 --- a/app/containers/Products/ProductRowItemContainer.tsx +++ b/app/containers/Products/ProductRowItemContainer.tsx @@ -181,7 +181,8 @@ export const ProductRowItemComponent: React.FunctionComponent = ({ product.subtractGeneratedElectricityEmissions, newSubtractGeneratedHeatEmissions: product.subtractGeneratedHeatEmissions, - newRequiresProductAmount: product.requiresProductAmount + newRequiresProductAmount: product.requiresProductAmount, + newAddEmissionsFromEios: product.addEmissionsFromEios } }; const response = await saveProductMutation(relay.environment, variables); @@ -212,7 +213,8 @@ export const ProductRowItemComponent: React.FunctionComponent = ({ e.formData.subtractGeneratedElectricityEmissions, newSubtractGeneratedHeatEmissions: e.formData.subtractGeneratedHeatEmissions, - newRequiresProductAmount: e.formData.requiresProductAmount + newRequiresProductAmount: e.formData.requiresProductAmount, + newAddEmissionsFromEios: e.formData.addEmissionsFromEios } }; const response = await saveProductMutation(relay.environment, variables); @@ -490,6 +492,7 @@ export default createFragmentContainer(ProductRowItemComponent, { subtractExportedHeatEmissions subtractGeneratedElectricityEmissions subtractGeneratedHeatEmissions + addEmissionsFromEios requiresProductAmount benchmarksByProductId { edges { diff --git a/app/containers/Products/product-schema.json b/app/containers/Products/product-schema.json index 121c382a22..cf3697359b 100644 --- a/app/containers/Products/product-schema.json +++ b/app/containers/Products/product-schema.json @@ -62,6 +62,12 @@ "enumNames": [" Yes", " No"], "default": false }, + "addEmissionsFromEios": { + "type": "boolean", + "title": "Emissions from EIOs are added to facility emissions", + "enumNames": [" Yes", " No"], + "default": false + }, "requiresProductAmount": { "type": "boolean", "title": "Production amount needs to be reported", @@ -79,6 +85,7 @@ "subtractExportedHeatEmissions", "subtractGeneratedElectricityEmissions", "subtractGeneratedHeatEmissions", + "addEmissionsFromEios", "requiresProductAmount" ] }, @@ -119,6 +126,9 @@ }, "subtractGeneratedHeatEmissions": { "ui:widget": "radio" + }, + "addEmissionsFromEios": { + "ui:widget": "radio" } } } diff --git a/app/cypress/integration/product-benchmark.spec.js b/app/cypress/integration/product-benchmark.spec.js index 93a15f4b22..5108e7c25f 100644 --- a/app/cypress/integration/product-benchmark.spec.js +++ b/app/cypress/integration/product-benchmark.spec.js @@ -52,6 +52,9 @@ describe('The products and benchmark page', () => { cy.get( '#root_subtractGeneratedHeatEmissions > :nth-child(1) > label > :nth-child(1) > input' ).click(); + cy.get( + '#root_addEmissionsFromEios > :nth-child(1) > label > :nth-child(1) > input' + ).click(); cy.contains('Add Product').click(); cy.get('tr') .its('length') diff --git a/app/server/schema.graphql b/app/server/schema.graphql index 6797ee4a00..371fa1fd0e 100644 --- a/app/server/schema.graphql +++ b/app/server/schema.graphql @@ -9615,6 +9615,12 @@ type PageInfo { """Table containing the information for a CIIP product""" type Product implements Node { + """ + Boolean value indicates if EIO facility emissions should be added to the + facility emissions when calculating the product emission intensity + """ + addEmissionsFromEios: Boolean! + """ Boolean value indicates if purchased electricity emissions should be added to the facility emissions when calculating the product emission intensity @@ -9758,6 +9764,9 @@ type Product implements Node { A condition to be used against `Product` object types. All fields are tested for equality and combined with a logical ‘and.’ """ input ProductCondition { + """Checks for equality with the object’s `addEmissionsFromEios` field.""" + addEmissionsFromEios: Boolean + """ Checks for equality with the object’s `addPurchasedElectricityEmissions` field. """ @@ -9838,6 +9847,12 @@ input ProductCondition { """An input for mutations affecting `Product`""" input ProductInput { + """ + Boolean value indicates if EIO facility emissions should be added to the + facility emissions when calculating the product emission intensity + """ + addEmissionsFromEios: Boolean + """ Boolean value indicates if purchased electricity emissions should be added to the facility emissions when calculating the product emission intensity @@ -9935,6 +9950,12 @@ input ProductInput { Represents an update to a `Product`. Fields that are set will be updated. """ input ProductPatch { + """ + Boolean value indicates if EIO facility emissions should be added to the + facility emissions when calculating the product emission intensity + """ + addEmissionsFromEios: Boolean + """ Boolean value indicates if purchased electricity emissions should be added to the facility emissions when calculating the product emission intensity @@ -10056,6 +10077,8 @@ type ProductsEdge { """Methods to use when ordering `Product`.""" enum ProductsOrderBy { + ADD_EMISSIONS_FROM_EIOS_ASC + ADD_EMISSIONS_FROM_EIOS_DESC ADD_PURCHASED_ELECTRICITY_EMISSIONS_ASC ADD_PURCHASED_ELECTRICITY_EMISSIONS_DESC ADD_PURCHASED_HEAT_EMISSIONS_ASC @@ -11590,6 +11613,7 @@ input SaveProductMutationChainInput { payload verbatim. May be used to track mutations by the client. """ clientMutationId: String + newAddEmissionsFromEios: Boolean newAddPurchasedElectricityEmissions: Boolean newAddPurchasedHeatEmissions: Boolean newDescription: String diff --git a/app/server/schema.json b/app/server/schema.json index 5bbe24c971..e067da86ef 100644 --- a/app/server/schema.json +++ b/app/server/schema.json @@ -11885,6 +11885,22 @@ "name": "Product", "description": "Table containing the information for a CIIP product", "fields": [ + { + "name": "addEmissionsFromEios", + "description": "Boolean value indicates if EIO facility emissions should be added to the facility emissions when calculating the product emission intensity", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "addPurchasedElectricityEmissions", "description": "Boolean value indicates if purchased electricity emissions should be added to the facility emissions when calculating the product emission intensity (applies only to products where requires_emission_allocation is false)", @@ -22337,6 +22353,16 @@ "description": "A condition to be used against `Product` object types. All fields are tested for equality and combined with a logical ‘and.’", "fields": null, "inputFields": [ + { + "name": "addEmissionsFromEios", + "description": "Checks for equality with the object’s `addEmissionsFromEios` field.", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null + }, { "name": "addPurchasedElectricityEmissions", "description": "Checks for equality with the object’s `addPurchasedElectricityEmissions` field.", @@ -22564,6 +22590,18 @@ "inputFields": null, "interfaces": null, "enumValues": [ + { + "name": "ADD_EMISSIONS_FROM_EIOS_ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ADD_EMISSIONS_FROM_EIOS_DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "ADD_PURCHASED_ELECTRICITY_EMISSIONS_ASC", "description": null, @@ -34907,6 +34945,16 @@ "description": "An input for mutations affecting `Product`", "fields": null, "inputFields": [ + { + "name": "addEmissionsFromEios", + "description": "Boolean value indicates if EIO facility emissions should be added to the facility emissions when calculating the product emission intensity", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null + }, { "name": "addPurchasedElectricityEmissions", "description": "Boolean value indicates if purchased electricity emissions should be added to the facility emissions when calculating the product emission intensity (applies only to products where requires_emission_allocation is false)", @@ -40416,6 +40464,16 @@ }, "defaultValue": null }, + { + "name": "newAddEmissionsFromEios", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null + }, { "name": "newAddPurchasedElectricityEmissions", "description": null, @@ -46400,6 +46458,16 @@ "description": "Represents an update to a `Product`. Fields that are set will be updated.", "fields": null, "inputFields": [ + { + "name": "addEmissionsFromEios", + "description": "Boolean value indicates if EIO facility emissions should be added to the facility emissions when calculating the product emission intensity", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null + }, { "name": "addPurchasedElectricityEmissions", "description": "Boolean value indicates if purchased electricity emissions should be added to the facility emissions when calculating the product emission intensity (applies only to products where requires_emission_allocation is false)", diff --git a/schema/data/prod/product.sql b/schema/data/prod/product.sql index 8d9713f7e6..b40646af59 100644 --- a/schema/data/prod/product.sql +++ b/schema/data/prod/product.sql @@ -43,7 +43,8 @@ values (37, 'Purchased electricity', 'GWh', 'active' ,true, true), (38, 'Purchased heat', 'GJ', 'active' ,true, true), (39, 'Generated electricity', 'GWh', 'active' ,true, true), -(40, 'Generated heat', 'GJ', 'active' ,true, true) +(40, 'Generated heat', 'GJ', 'active' ,true, true), +(41, 'Emissions from EIOs', 'GJ', 'active' ,true, true) on conflict(id) do update set name=excluded.name, diff --git a/schema/deploy/computed_columns/application_revision_ciip_incentive.sql b/schema/deploy/computed_columns/application_revision_ciip_incentive.sql index c652f14078..b8dc60cfb4 100644 --- a/schema/deploy/computed_columns/application_revision_ciip_incentive.sql +++ b/schema/deploy/computed_columns/application_revision_ciip_incentive.sql @@ -115,6 +115,15 @@ returns setof ggircs_portal.ciip_incentive_by_product as $function$ and _product.name = 'Exported heat' ); end if; + if product_data.add_emissions_from_eios then + em_product = em_product + ( + select p.product_emissions + from unnest(reported_products) p + join ggircs_portal.product _product on + p.product_id = _product.id + and _product.name = 'Emissions from EIOs' + ); + end if; end if; -- Calculate Emission Intensity diff --git a/schema/deploy/mutations/save_product_mutation_chain.sql b/schema/deploy/mutations/save_product_mutation_chain.sql index 9ff7719e77..aa9972b627 100644 --- a/schema/deploy/mutations/save_product_mutation_chain.sql +++ b/schema/deploy/mutations/save_product_mutation_chain.sql @@ -7,7 +7,7 @@ begin; create or replace function ggircs_portal.save_product_mutation_chain(prev_id int, new_name varchar(1000), new_units varchar(1000), new_description varchar(1000), new_state varchar(1000), new_parent int[], new_requires_emission_allocation boolean, new_is_ciip_product boolean, new_add_purchased_electricity_emissions boolean, new_subtract_exported_electricity_emissions boolean, new_add_purchased_heat_emissions boolean, new_subtract_exported_heat_emissions boolean, new_subtract_generated_electricity_emissions boolean, new_subtract_generated_heat_emissions boolean, -new_requires_product_amount boolean) +new_add_emissions_from_eios boolean, new_requires_product_amount boolean) returns ggircs_portal.product as $function$ declare @@ -29,6 +29,7 @@ begin subtract_exported_heat_emissions, subtract_generated_electricity_emissions, subtract_generated_heat_emissions, + add_emissions_from_eios, requires_product_amount) values (new_name, new_description, @@ -43,6 +44,7 @@ begin new_subtract_exported_heat_emissions, new_subtract_generated_electricity_emissions, new_subtract_generated_heat_emissions, + new_add_emissions_from_eios, new_requires_product_amount) returning id into new_id; update ggircs_portal.benchmark diff --git a/schema/deploy/search_functions/search_products.sql b/schema/deploy/search_functions/search_products.sql index 3168b88b98..f6f7368dea 100644 --- a/schema/deploy/search_functions/search_products.sql +++ b/schema/deploy/search_functions/search_products.sql @@ -30,7 +30,7 @@ returns setof ggircs_portal.product as select id, name, description, units, state, parent, requires_emission_allocation, is_ciip_product, requires_product_amount, subtract_exported_electricity_emissions, subtract_exported_electricity_emissions, subtract_exported_heat_emissions, subtract_exported_heat_emissions, - subtract_generated_electricity_emissions, subtract_generated_heat_emissions, created_at, created_by, updated_at, updated_by, deleted_at, deleted_by + subtract_generated_electricity_emissions, subtract_generated_heat_emissions, add_emissions_from_eios, created_at, created_by, updated_at, updated_by, deleted_at, deleted_by from outerTable where state != ''deprecated'' @@ -56,7 +56,7 @@ returns setof ggircs_portal.product as select id, name, description, units, state, parent, requires_emission_allocation, is_ciip_product, requires_product_amount, subtract_exported_electricity_emissions, subtract_exported_electricity_emissions, subtract_exported_heat_emissions, subtract_exported_heat_emissions, - subtract_generated_electricity_emissions, subtract_generated_heat_emissions, created_at, created_by, updated_at, updated_by, deleted_at, deleted_by from outerTable + subtract_generated_electricity_emissions, subtract_generated_heat_emissions, add_emissions_from_eios, created_at, created_by, updated_at, updated_by, deleted_at, deleted_by from outerTable where state != ''deprecated'' and '|| search_field || '::text ilike ''%' || search_value || '%'' and diff --git a/schema/deploy/tables/product.sql b/schema/deploy/tables/product.sql index 28b769a41b..fdb95f5662 100644 --- a/schema/deploy/tables/product.sql +++ b/schema/deploy/tables/product.sql @@ -19,6 +19,7 @@ create table ggircs_portal.product ( subtract_exported_heat_emissions boolean not null default false, subtract_generated_electricity_emissions boolean not null default false, subtract_generated_heat_emissions boolean not null default false, + add_emissions_from_eios boolean not null default false, created_at timestamp with time zone not null default now(), created_by int references ggircs_portal.ciip_user, updated_at timestamp with time zone not null default now(), @@ -85,6 +86,7 @@ comment on column ggircs_portal.product.add_purchased_heat_emissions is 'Boolea comment on column ggircs_portal.product.subtract_exported_heat_emissions is 'Boolean value indicates if exported heat emissions should be subtracted from the facility emissions when calculating the product emission intensity (applies only to products where requires_emission_allocation is false)'; comment on column ggircs_portal.product.subtract_generated_electricity_emissions is 'Boolean value indicates if generated electricity emissions should be subtracted from the facility emissions when calculating the product emission intensity (applies only to products where requires_emission_allocation is false)'; comment on column ggircs_portal.product.subtract_generated_heat_emissions is 'Boolean value indicates if generated heat emissions should be subtracted from the facility emissions when calculating the product emission intensity (applies only to products where requires_emission_allocation is false)'; +comment on column ggircs_portal.product.add_emissions_from_eios is 'Boolean value indicates if EIO facility emissions should be added to the facility emissions when calculating the product emission intensity'; comment on column ggircs_portal.product.state is 'The current state of the product within the lifecycle (created, split, merged, redefined, archived, unarchived)'; comment on column ggircs_portal.product.parent is 'The parent ID(s) (previous state) of the product'; comment on column ggircs_portal.product.created_at is 'Creation date of row'; diff --git a/schema/test/unit/computed_columns/application_revision_ciip_incentive_test.sql b/schema/test/unit/computed_columns/application_revision_ciip_incentive_test.sql index 2dbb96d12f..55f6ee54c2 100644 --- a/schema/test/unit/computed_columns/application_revision_ciip_incentive_test.sql +++ b/schema/test/unit/computed_columns/application_revision_ciip_incentive_test.sql @@ -25,42 +25,47 @@ insert into ggircs_portal.product ( add_purchased_heat_emissions, subtract_exported_heat_emissions, subtract_generated_electricity_emissions, - subtract_generated_heat_emissions + subtract_generated_heat_emissions, + add_emissions_from_eios ) overriding system value values (1, 'simple product (no allocation, emissions = facility emissions)', 'active', - false, true, true, false, false, false, false, false, false), + false, true, true, false, false, false, false, false, false, false), (2, 'product A with allocation of emissions', 'active', - true, true, true, false, false, false, false, false, false), + true, true, true, false, false, false, false, false, false, false), (3, 'product B with allocation of emissions', 'active', - true, true, true, false, false, false, false, false, false), + true, true, true, false, false, false, false, false, false, false), (4, 'non-ciip product', 'active', - true, false, true, false, false, false, false, false, false), + true, false, true, false, false, false, false, false, false, false), (5, 'product with added purchased electricity emissions', 'active', - false, true, true, true, false, false, false, false, false), + false, true, true, true, false, false, false, false, false, false), (6, 'product with excluded exported electricity emissions', 'active', - false, true, true, false, true, false, false, false, false), + false, true, true, false, true, false, false, false, false, false), (7, 'product with added purchased heat emissions', 'active', - false, true, true, false, false, true, false, false, false), + false, true, true, false, false, true, false, false, false, false), (8, 'product with excluded exported heat emissions', 'active', - false, true, true, false, false, false, true, false, false), + false, true, true, false, false, false, true, false, false, false), (9, 'product with excluded generated electricity emissions', 'active', - false, true, true, false, false, false, false, true, false), + false, true, true, false, false, false, false, true, false, false), (10, 'product with excluded generated heat emissions', 'active', - false, true, true, false, false, false, false, false, true), + false, true, true, false, false, false, false, false, true, false), (11, 'Purchased electricity', 'active', - true, false, true, false, false, false, false, false, false), + true, false, true, false, false, false, false, false, false, false), (12, 'Exported electricity', 'active', - true, true, true, false, false, false, false, false, false), + true, true, true, false, false, false, false, false, false, false), (13, 'Purchased heat', 'active', - true, false, true, false, false, false, false, false, false), + true, false, true, false, false, false, false, false, false, false), (14, 'Exported heat', 'active', - true, true, true, false, false, false, false, false, false), + true, true, true, false, false, false, false, false, false, false), (15, 'Electricity generated on site', 'active', - true, false, true, false, false, false, false, false, false), + true, false, true, false, false, false, false, false, false, false), (16, 'Heat generated on site', 'active', - true, false, true, false, false, false, false, false, false) + true, false, true, false, false, false, false, false, false, false), + (17, 'product with added EIO emissions', 'active', + false, true, true, false, false, false, false, false, false, true), + (18, 'Emissions from EIOs', 'active', + true, false, true, false, false, false, false, false, false, false) ; insert into ggircs_portal.benchmark @@ -83,7 +88,8 @@ values (4, 5, 0, 1, 1, 2018, 2018, 0.42, 0.42), (5, 6, 0, 1, 1, 2018, 2018, 0.42, 0.42), (6, 7, 0, 1, 1, 2018, 2018, 0.42, 0.42), -(8, 9, 0, 1, 1, 2018, 2018, 0.42, 0.42); +(8, 9, 0, 1, 1, 2018, 2018, 0.42, 0.42), +(9, 17, 0, 1, 1, 2018, 2018, 0.42, 0.42); alter table ggircs_portal.application_revision_status disable trigger _status_change_email; @@ -338,6 +344,36 @@ select is( 'exported heat emissions are removed from the facility emissions for products that require it' ); +-- Report a product with no allocation of emissions which requires "EIO Emissions" to be reported +update ggircs_portal.form_result +set form_result = '[ + { + "productRowId": 17, + "productAmount": 100 + }, + { + "productRowId": 18, + "productAmount": 42, + "productEmissions": 11 + } +]' +where application_id = 1 and version_number = 1 and form_id = 4; + +select is( + ( + with record as ( + select row(application_revision.*)::ggircs_portal.application_revision + from ggircs_portal.application_revision where application_id = 1 and version_number = 1 + ) + select product_emissions + from ggircs_portal.application_revision_ciip_incentive( + (select * from record) + ) where product_id = 17 + ), + 61.0, + 'EIO Emissions are added to the facility emissions for products that require it' +); + -- Test roles set role ciip_administrator; diff --git a/schema/verify/mutations/save_product_mutation_chain.sql b/schema/verify/mutations/save_product_mutation_chain.sql index 4a8f5969e3..eb181d8713 100644 --- a/schema/verify/mutations/save_product_mutation_chain.sql +++ b/schema/verify/mutations/save_product_mutation_chain.sql @@ -17,6 +17,7 @@ select pg_get_functiondef('ggircs_portal.save_product_mutation_chain( boolean, boolean, boolean, + boolean, boolean)'::regprocedure); rollback;