diff --git a/chellow/reports/report_247.py b/chellow/reports/report_247.py index 8dfe9fbd0..e7a3cdd1b 100644 --- a/chellow/reports/report_247.py +++ b/chellow/reports/report_247.py @@ -287,7 +287,7 @@ def _process_site( month_data["import-3rd-party-kwh"] += kwh month_data["used-3rd-party-net-gbp"] += gbp month_data["used-3rd-party-kwh"] += kwh - month_data["used-gbp"] += gbp + month_data["used-net-gbp"] += gbp month_data["used-kwh"] += kwh elif source_code == "3rd-party-reverse": month_data["export-3rd-party-net-gbp"] += gbp diff --git a/test/reports/test_report_247.py b/test/reports/test_report_247.py index 181dffb38..b12ba443c 100644 --- a/test/reports/test_report_247.py +++ b/test/reports/test_report_247.py @@ -4485,3 +4485,459 @@ def virtual_bill(ds): ], ] assert era_expected == era_table + + +def test_3rd_party(mocker, sess): + vf = to_utc(ct_datetime(1996, 1, 1)) + site = Site.insert(sess, "CI017", "Water Works") + + market_role_Z = MarketRole.insert(sess, "Z", "Non-core") + participant = Participant.insert(sess, "CALB", "AK Industries") + participant.insert_party(sess, market_role_Z, "None core", vf, None, None) + bank_holiday_rate_script = {"bank_holidays": []} + Contract.insert_non_core( + sess, "bank_holidays", "", {}, vf, None, bank_holiday_rate_script + ) + market_role_X = MarketRole.insert(sess, "X", "Supplier") + market_role_M = MarketRole.insert(sess, "M", "Mop") + market_role_C = MarketRole.insert(sess, "C", "HH Dc") + market_role_R = MarketRole.insert(sess, "R", "Distributor") + participant.insert_party(sess, market_role_M, "Fusion Mop", vf, None, None) + participant.insert_party(sess, market_role_X, "Fusion Ltc", vf, None, None) + participant.insert_party(sess, market_role_C, "Fusion DC", vf, None, None) + + mop_charge_script = """ +from chellow.utils import reduce_bill_hhs + +def virtual_bill_titles(): + return ['net-gbp', 'problem'] + +def virtual_bill(ds): + for hh in ds.hh_data: + hh_start = hh['start-date'] + bill_hh = ds.supplier_bill_hhs[hh_start] + + bill_hh['net-gbp'] = sum( + v for k, v in bill_hh.items() if k.endswith('gbp')) + + ds.mop_bill = reduce_bill_hhs(ds.supplier_bill_hhs) +""" + mop_contract = Contract.insert_mop( + sess, + "Fusion Mop Contract", + participant, + mop_charge_script, + {}, + utc_datetime(2000, 1, 1), + None, + {}, + ) + + dc_charge_script = """ +from chellow.utils import reduce_bill_hhs + +def virtual_bill_titles(): + return ['net-gbp', 'problem'] + +def virtual_bill(ds): + for hh in ds.hh_data: + hh_start = hh['start-date'] + bill_hh = ds.supplier_bill_hhs[hh_start] + + bill_hh['net-gbp'] = sum( + v for k, v in bill_hh.items() if k.endswith('gbp')) + + ds.dc_bill = reduce_bill_hhs(ds.supplier_bill_hhs) +""" + + dc_contract = Contract.insert_dc( + sess, + "Fusion DC 2000", + participant, + dc_charge_script, + {}, + utc_datetime(2000, 1, 1), + None, + {}, + ) + pc = Pc.insert(sess, "00", "hh", vf, None) + insert_cops(sess) + cop = Cop.get_by_code(sess, "5") + insert_comms(sess) + comm = Comm.get_by_code(sess, "GSM") + + supplier_charge_script = """ +from chellow.utils import HH, reduce_bill_hhs, utc_datetime + +def virtual_bill_titles(): + return ['net-gbp', 'vat-gbp', 'gross-gbp', 'sum-msp-kwh', 'sum-msp-gbp', 'problem'] + +def virtual_bill(ds): + for hh in ds.hh_data: + hh_start = hh['start-date'] + bill_hh = ds.supplier_bill_hhs[hh_start] + bill_hh['sum-msp-kwh'] = hh['msp-kwh'] + bill_hh['sum-msp-gbp'] = hh['msp-kwh'] * 0.1 + bill_hh['net-gbp'] = sum( + v for k, v in bill_hh.items() if k.endswith('gbp')) + bill_hh['vat-gbp'] = 0 + bill_hh['gross-gbp'] = bill_hh['net-gbp'] + bill_hh['vat-gbp'] + + ds.supplier_bill = reduce_bill_hhs(ds.supplier_bill_hhs) +""" + imp_supplier_contract = Contract.insert_supplier( + sess, + "Fusion Supplier 2000", + participant, + supplier_charge_script, + {}, + utc_datetime(2000, 1, 1), + None, + {}, + ) + dno = participant.insert_party(sess, market_role_R, "WPD", vf, None, "22") + Contract.insert_dno(sess, dno.dno_code, participant, "", {}, vf, None, {}) + meter_type = MeterType.insert(sess, "C5", "COP 1-5", vf, None) + meter_payment_type = MeterPaymentType.insert(sess, "CR", "Credit", vf, None) + mtc = Mtc.insert(sess, "845", False, True, vf, None) + mtc_participant = MtcParticipant.insert( + sess, + mtc, + participant, + "HH COP5 And Above With Comms", + False, + True, + meter_type, + meter_payment_type, + 0, + vf, + None, + ) + insert_voltage_levels(sess) + voltage_level = VoltageLevel.get_by_code(sess, "HV") + llfc = dno.insert_llfc( + sess, "510", "PC 5-8 & HH HV", voltage_level, False, True, vf, None + ) + MtcLlfc.insert(sess, mtc_participant, llfc, vf, None) + insert_sources(sess) + source = Source.get_by_code(sess, "3rd-party") + gsp_group = GspGroup.insert(sess, "_L", "South Western") + insert_energisation_statuses(sess) + energisation_status = EnergisationStatus.get_by_code(sess, "E") + insert_dtc_meter_types(sess) + dtc_meter_type = DtcMeterType.get_by_code(sess, "H") + site.insert_e_supply( + sess, + source, + None, + "Bob", + utc_datetime(2000, 1, 1), + None, + gsp_group, + mop_contract, + "773", + dc_contract, + "ghyy3", + "hgjeyhuw", + dno, + pc, + "845", + cop, + comm, + None, + energisation_status, + dtc_meter_type, + "22 7867 6232 781", + "510", + imp_supplier_contract, + "7748", + 361, + None, + None, + None, + None, + None, + ) + + editor = UserRole.insert(sess, "editor") + user = User.insert(sess, "admin@example.com", "xxx", editor, None) + user_id = user.id + site_code = site.code + + sess.commit() + + scenario_props = { + "scenario_start_year": 2010, + "scenario_start_month": 1, + "scenario_duration": 1, + "by_hh": False, + "site_codes": [site_code], + "mpan_cores": None, + } + base_name = ["monthly_duration"] + compression = False + now = utc_datetime(2020, 1, 1) + is_bill_check = False + + mock_file = BytesIO() + mock_file.close = mocker.Mock() + mocker.patch("chellow.reports.report_247.open_file", return_value=mock_file) + + content( + scenario_props, + base_name, + user_id, + compression, + now, + is_bill_check, + ) + + sheet = odio.parse_spreadsheet(mock_file) + site_table = list(sheet.tables[0].rows) + + site_expected = [ + [ + "creation-date", + "site-id", + "site-name", + "associated-site-ids", + "month", + "metering-type", + "sources", + "generator-types", + "import-grid-kwh", + "export-grid-kwh", + "import-gen-kwh", + "export-gen-kwh", + "import-3rd-party-kwh", + "export-3rd-party-kwh", + "displaced-kwh", + "used-kwh", + "used-3rd-party-kwh", + "import-grid-net-gbp", + "export-grid-net-gbp", + "import-gen-net-gbp", + "export-gen-net-gbp", + "import-3rd-party-net-gbp", + "export-3rd-party-net-gbp", + "displaced-net-gbp", + "used-net-gbp", + "used-3rd-party-net-gbp", + "billed-import-kwh", + "billed-import-net-gbp", + "billed-import-vat-gbp", + "billed-import-gross-gbp", + "billed-supplier-import-net-gbp", + "billed-supplier-import-vat-gbp", + "billed-supplier-import-gross-gbp", + "billed-dc-import-net-gbp", + "billed-dc-import-vat-gbp", + "billed-dc-import-gross-gbp", + "billed-mop-import-net-gbp", + "billed-mop-import-vat-gbp", + "billed-mop-import-gross-gbp", + "billed-export-kwh", + "billed-export-net-gbp", + ], + [ + Datetime(2020, 1, 1, 0, 0), + "CI017", + "Water Works", + "", + Datetime(2010, 1, 31, 23, 30), + "hh", + "3rd-party", + "", + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + ], + ] + + assert site_expected == site_table + + era_table = list(sheet.tables[1].rows) + era_expected = [ + [ + "creation-date", + "imp-mpan-core", + "imp-supplier-contract", + "exp-mpan-core", + "exp-supplier-contract", + "era-start-date", + "metering-type", + "source", + "generator-type", + "supply-name", + "msn", + "pc", + "energisation-status", + "gsp-group", + "dno", + "imp-voltage-level", + "imp-is-substation", + "imp-llfc-code", + "imp-llfc-description", + "exp-voltage-level", + "exp-is-substation", + "exp-llfc-code", + "exp-llfc-description", + "site-id", + "site-name", + "associated-site-ids", + "month", + "import-grid-kwh", + "export-grid-kwh", + "import-gen-kwh", + "export-gen-kwh", + "import-3rd-party-kwh", + "export-3rd-party-kwh", + "displaced-kwh", + "used-kwh", + "used-3rd-party-kwh", + "import-grid-net-gbp", + "export-grid-net-gbp", + "import-gen-net-gbp", + "export-gen-net-gbp", + "import-3rd-party-net-gbp", + "export-3rd-party-net-gbp", + "displaced-net-gbp", + "used-net-gbp", + "used-3rd-party-net-gbp", + "billed-import-kwh", + "billed-import-net-gbp", + "billed-import-vat-gbp", + "billed-import-gross-gbp", + "billed-supplier-import-net-gbp", + "billed-supplier-import-vat-gbp", + "billed-supplier-import-gross-gbp", + "billed-dc-import-net-gbp", + "billed-dc-import-vat-gbp", + "billed-dc-import-gross-gbp", + "billed-mop-import-net-gbp", + "billed-mop-import-vat-gbp", + "billed-mop-import-gross-gbp", + "billed-export-kwh", + "billed-export-net-gbp", + None, + "mop-net-gbp", + "mop-problem", + None, + "dc-net-gbp", + "dc-problem", + None, + "imp-supplier-net-gbp", + "imp-supplier-vat-gbp", + "imp-supplier-gross-gbp", + "imp-supplier-sum-msp-kwh", + "imp-supplier-sum-msp-gbp", + "imp-supplier-problem", + None, + ], + [ + Datetime(2020, 1, 1, 0, 0), + "22 7867 6232 781", + "Fusion Supplier 2000", + None, + None, + Datetime(2000, 1, 1, 0, 0), + "hh", + "3rd-party", + None, + "Bob", + "hgjeyhuw", + "00", + "E", + "_L", + "22", + "HV", + False, + "510", + "PC 5-8 & HH HV", + None, + None, + None, + None, + "CI017", + "Water Works", + "", + Datetime(2010, 1, 31, 23, 30), + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + None, + 0.0, + None, + None, + 0.0, + None, + None, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + None, + ], + ] + assert era_expected == era_table