From f01de06edd56719c3fca6a74415699ff2798c99b Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Thu, 11 Apr 2024 16:47:54 +0200 Subject: [PATCH 01/38] add new fields --- .../core_fields_attributes.py | 39 +++++++++++++++++++ .../people_fields_attributes.py | 39 +++++++++++++++++++ backend/hct_mis_api/apps/household/models.py | 3 ++ backend/hct_mis_api/apps/payment/models.py | 5 +++ .../apps/registration_datahub/models.py | 3 ++ 5 files changed, 89 insertions(+) diff --git a/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py b/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py index 9a4da6605c..d3b6d4859b 100644 --- a/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py +++ b/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py @@ -1789,6 +1789,45 @@ "xlsx_field": "bank_branch_name_i_c", "scope": [Scope.XLSX, Scope.PAYMENT_CHANNEL, Scope.KOBO_IMPORT], }, + { + "id": "", + "type": TYPE_STRING, + "name": "wallet_name", + "lookup": "wallet_name", + "label": {"English(EN)": "Wallet Name"}, + "hint": "", + "required": False, + "choices": [], + "associated_with": _INDIVIDUAL, + "xlsx_field": "wallet_name_i_c", + "scope": [Scope.XLSX, Scope.INDIVIDUAL_UPDATE], + }, + { + "id": "", + "type": TYPE_STRING, + "name": "blockchain_name", + "lookup": "blockchain_name", + "label": {"English(EN)": "Blockchain Name"}, + "hint": "", + "required": False, + "choices": [], + "associated_with": _INDIVIDUAL, + "xlsx_field": "blockchain_name_i_c", + "scope": [Scope.XLSX, Scope.INDIVIDUAL_UPDATE], + }, + { + "id": "", + "type": TYPE_STRING, + "name": "wallet_address", + "lookup": "wallet_address", + "label": {"English(EN)": "Wallet Address"}, + "hint": "", + "required": False, + "choices": [], + "associated_with": _INDIVIDUAL, + "xlsx_field": "wallet_address_i_c", + "scope": [Scope.XLSX, Scope.INDIVIDUAL_UPDATE], + }, ] + PEOPLE_FIELDS_ATTRIBUTES + PAYMENT_CHANNEL_FIELDS_ATTRIBUTES diff --git a/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py b/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py index 721c5f21d6..b5ea265d5e 100644 --- a/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py +++ b/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py @@ -1326,4 +1326,43 @@ "xlsx_field": "pp_payment_delivery_phone_no_i_c", "scope": [Scope.XLSX_PEOPLE], }, + { + "id": "", + "type": TYPE_STRING, + "name": "wallet_name", + "lookup": "wallet_name", + "label": {"English(EN)": "Wallet Name"}, + "hint": "", + "required": False, + "choices": [], + "associated_with": _INDIVIDUAL, + "xlsx_field": "pp_wallet_name_i_c", + "scope": [Scope.XLSX_PEOPLE], + }, + { + "id": "", + "type": TYPE_STRING, + "name": "blockchain_name", + "lookup": "blockchain_name", + "label": {"English(EN)": "Blockchain Name"}, + "hint": "", + "required": False, + "choices": [], + "associated_with": _INDIVIDUAL, + "xlsx_field": "pp_blockchain_name_i_c", + "scope": [Scope.XLSX_PEOPLE], + }, + { + "id": "", + "type": TYPE_STRING, + "name": "wallet_address", + "lookup": "wallet_address", + "label": {"English(EN)": "Wallet Address"}, + "hint": "", + "required": False, + "choices": [], + "associated_with": _INDIVIDUAL, + "xlsx_field": "pp_wallet_address_i_c", + "scope": [Scope.XLSX_PEOPLE], + }, ] diff --git a/backend/hct_mis_api/apps/household/models.py b/backend/hct_mis_api/apps/household/models.py index c2eb1dea6b..7f9354ccb8 100644 --- a/backend/hct_mis_api/apps/household/models.py +++ b/backend/hct_mis_api/apps/household/models.py @@ -1000,6 +1000,9 @@ class Individual( preferred_language = models.CharField(max_length=6, choices=Languages.get_tuple(), null=True, blank=True) relationship_confirmed = models.BooleanField(default=False) age_at_registration = models.PositiveSmallIntegerField(null=True, blank=True) + wallet_name = models.CharField(max_length=64, blank=True, default="") + blockchain_name = models.CharField(max_length=64, blank=True, default="") + wallet_address = models.CharField(max_length=128, blank=True, default="") program = models.ForeignKey( "program.Program", null=True, blank=True, db_index=True, related_name="individuals", on_delete=models.SET_NULL diff --git a/backend/hct_mis_api/apps/payment/models.py b/backend/hct_mis_api/apps/payment/models.py index 7df9559836..19a4bf9396 100644 --- a/backend/hct_mis_api/apps/payment/models.py +++ b/backend/hct_mis_api/apps/payment/models.py @@ -260,6 +260,7 @@ class GenericPayment(TimeStampedUUIDModel): DELIVERY_TYPE_TRANSFER = "Transfer" DELIVERY_TYPE_TRANSFER_TO_ACCOUNT = "Transfer to Account" DELIVERY_TYPE_VOUCHER = "Voucher" + DELIVERY_TYPE_TRANSFER_TO_DIGITAL_WALLET = "Transfer to Digital Wallet" DELIVERY_TYPES_IN_CASH = ( DELIVERY_TYPE_CARDLESS_CASH_WITHDRAWAL, @@ -287,6 +288,7 @@ class GenericPayment(TimeStampedUUIDModel): (DELIVERY_TYPE_TRANSFER, _("Transfer")), (DELIVERY_TYPE_TRANSFER_TO_ACCOUNT, _("Transfer to Account")), (DELIVERY_TYPE_VOUCHER, _("Voucher")), + (DELIVERY_TYPE_TRANSFER_TO_DIGITAL_WALLET, _("Transfer to Digital Wallet")), ) business_area = models.ForeignKey("core.BusinessArea", on_delete=models.CASCADE) @@ -1068,6 +1070,7 @@ class FinancialServiceProviderXlsxTemplate(TimeStampedUUIDModel): ("additional_document_number", _("Additional Document Number")), ("registration_token", _("Registration Token")), ("status", _("Status")), + ("transaction_status_blockchain", _("Transaction Status on the Blockchain")), ) DEFAULT_COLUMNS = [col[0] for col in COLUMNS_CHOICES] @@ -1163,6 +1166,8 @@ def get_column_value_from_payment(cls, payment: "Payment", column_name: str) -> "additional_document_type": (payment, "additional_document_type"), "additional_document_number": (payment, "additional_document_number"), "status": (payment, "payment_status"), + # TODO: add new column + "transaction_status_blockchain": (payment, "transaction_status_blockchain"), } additional_columns = {"registration_token": cls.get_registration_token_doc_number} if column_name in additional_columns: diff --git a/backend/hct_mis_api/apps/registration_datahub/models.py b/backend/hct_mis_api/apps/registration_datahub/models.py index 5e99cbd828..98700766ef 100644 --- a/backend/hct_mis_api/apps/registration_datahub/models.py +++ b/backend/hct_mis_api/apps/registration_datahub/models.py @@ -295,6 +295,9 @@ class ImportedIndividual(TimeStampedUUIDModel): null=True, db_index=True, blank=True ) # TODO temporary null=True until we migrate backward all data age_at_registration = models.PositiveSmallIntegerField(null=True, blank=True) + wallet_name = models.CharField(max_length=64, blank=True, default="") + blockchain_name = models.CharField(max_length=64, blank=True, default="") + wallet_address = models.CharField(max_length=128, blank=True, default="") @property def age(self) -> int: From 46339935da4daa3bd1e44cbb03fc7268ce184594 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Fri, 12 Apr 2024 08:30:41 +0200 Subject: [PATCH 02/38] add usdc --- backend/hct_mis_api/apps/core/currencies.py | 2 ++ .../apps/core/field_attributes/core_fields_attributes.py | 6 +++--- .../apps/core/field_attributes/people_fields_attributes.py | 6 +++--- backend/hct_mis_api/apps/payment/models.py | 6 +++++- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/backend/hct_mis_api/apps/core/currencies.py b/backend/hct_mis_api/apps/core/currencies.py index 13b90abfad..6b411553c7 100644 --- a/backend/hct_mis_api/apps/core/currencies.py +++ b/backend/hct_mis_api/apps/core/currencies.py @@ -144,6 +144,7 @@ UAH = "UAH" UGX = "UGX" USD = "USD" +USDC = "USDC" UYU = "UYU" UYW = "UYW" UZS = "UZS" @@ -325,4 +326,5 @@ (ZAR, _("South African rand")), (ZMW, _("Zambian kwacha")), (ZWL, _("Zimbabwean dollar")), + (USDC, _("Digital currency")), ) diff --git a/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py b/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py index d3b6d4859b..319fbe75cb 100644 --- a/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py +++ b/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py @@ -1790,7 +1790,7 @@ "scope": [Scope.XLSX, Scope.PAYMENT_CHANNEL, Scope.KOBO_IMPORT], }, { - "id": "", + "id": " ", "type": TYPE_STRING, "name": "wallet_name", "lookup": "wallet_name", @@ -1803,7 +1803,7 @@ "scope": [Scope.XLSX, Scope.INDIVIDUAL_UPDATE], }, { - "id": "", + "id": " ", "type": TYPE_STRING, "name": "blockchain_name", "lookup": "blockchain_name", @@ -1816,7 +1816,7 @@ "scope": [Scope.XLSX, Scope.INDIVIDUAL_UPDATE], }, { - "id": "", + "id": " ", "type": TYPE_STRING, "name": "wallet_address", "lookup": "wallet_address", diff --git a/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py b/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py index b5ea265d5e..c41c93992d 100644 --- a/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py +++ b/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py @@ -1327,7 +1327,7 @@ "scope": [Scope.XLSX_PEOPLE], }, { - "id": "", + "id": " ", "type": TYPE_STRING, "name": "wallet_name", "lookup": "wallet_name", @@ -1340,7 +1340,7 @@ "scope": [Scope.XLSX_PEOPLE], }, { - "id": "", + "id": " ", "type": TYPE_STRING, "name": "blockchain_name", "lookup": "blockchain_name", @@ -1353,7 +1353,7 @@ "scope": [Scope.XLSX_PEOPLE], }, { - "id": "", + "id": " ", "type": TYPE_STRING, "name": "wallet_address", "lookup": "wallet_address", diff --git a/backend/hct_mis_api/apps/payment/models.py b/backend/hct_mis_api/apps/payment/models.py index 19a4bf9396..6a408e68c5 100644 --- a/backend/hct_mis_api/apps/payment/models.py +++ b/backend/hct_mis_api/apps/payment/models.py @@ -44,7 +44,7 @@ from hct_mis_api.apps.account.models import HorizontalChoiceArrayField from hct_mis_api.apps.activity_log.utils import create_mapping_dict -from hct_mis_api.apps.core.currencies import CURRENCY_CHOICES +from hct_mis_api.apps.core.currencies import CURRENCY_CHOICES, USDC from hct_mis_api.apps.core.exchange_rates import ExchangeRates from hct_mis_api.apps.core.field_attributes.core_fields_attributes import ( CORE_FIELDS_ATTRIBUTES, @@ -163,6 +163,10 @@ def get_unicef_id(self) -> str: return self.ca_id if isinstance(self, CashPlan) else self.unicef_id def get_exchange_rate(self, exchange_rates_client: Optional["ExchangeRateClient"] = None) -> float: + if self.currency == USDC: + # exchange rate for Digital currency + return 1.0 + if exchange_rates_client is None: exchange_rates_client = ExchangeRates() From 5a381684e55796d3e14e896a9e39e05f19cfa8fa Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Fri, 12 Apr 2024 09:23:57 +0200 Subject: [PATCH 03/38] add migrations --- .../migrations/0018_migration.py | 18 ++++++ .../apps/cash_assist_datahub/models.py | 2 +- .../core_fields_attributes.py | 6 +- .../people_fields_attributes.py | 6 +- .../household/migrations/0174_migration.py | 33 ++++++++++ .../apps/payment/migrations/0124_migration.py | 60 +++++++++++++++++++ backend/hct_mis_api/apps/payment/models.py | 7 ++- .../migrations/0111_migration.py | 33 ++++++++++ 8 files changed, 155 insertions(+), 10 deletions(-) create mode 100644 backend/hct_mis_api/apps/cash_assist_datahub/migrations/0018_migration.py create mode 100644 backend/hct_mis_api/apps/household/migrations/0174_migration.py create mode 100644 backend/hct_mis_api/apps/payment/migrations/0124_migration.py create mode 100644 backend/hct_mis_api/apps/registration_datahub/migrations/0111_migration.py diff --git a/backend/hct_mis_api/apps/cash_assist_datahub/migrations/0018_migration.py b/backend/hct_mis_api/apps/cash_assist_datahub/migrations/0018_migration.py new file mode 100644 index 0000000000..2952402a99 --- /dev/null +++ b/backend/hct_mis_api/apps/cash_assist_datahub/migrations/0018_migration.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.25 on 2024-04-12 07:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cash_assist_datahub', '0017_migration'), + ] + + operations = [ + migrations.AlterField( + model_name='paymentrecord', + name='delivery_type', + field=models.CharField(choices=[('Cardless cash withdrawal', 'Cardless cash withdrawal'), ('Cash', 'Cash'), ('Cash by FSP', 'Cash by FSP'), ('Cheque', 'Cheque'), ('Deposit to Card', 'Deposit to Card'), ('Mobile Money', 'Mobile Money'), ('Pre-paid card', 'Pre-paid card'), ('Referral', 'Referral'), ('Transfer', 'Transfer'), ('Transfer to Account', 'Transfer to Account'), ('Voucher', 'Voucher'), ('Transfer to Digital Wallet', 'Transfer to Digital Wallet')], default='Cash', max_length=32, null=True), + ), + ] diff --git a/backend/hct_mis_api/apps/cash_assist_datahub/models.py b/backend/hct_mis_api/apps/cash_assist_datahub/models.py index 78f3302ba6..862c63a90d 100644 --- a/backend/hct_mis_api/apps/cash_assist_datahub/models.py +++ b/backend/hct_mis_api/apps/cash_assist_datahub/models.py @@ -138,7 +138,7 @@ class PaymentRecord(SessionModel): delivery_type = models.CharField( choices=InternalPaymentRecord.DELIVERY_TYPE_CHOICE, default=InternalPaymentRecord.DELIVERY_TYPE_CASH, - max_length=24, + max_length=32, null=True, ) currency = models.CharField(max_length=4, null=True) diff --git a/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py b/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py index 319fbe75cb..9ce33268c1 100644 --- a/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py +++ b/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py @@ -1790,7 +1790,7 @@ "scope": [Scope.XLSX, Scope.PAYMENT_CHANNEL, Scope.KOBO_IMPORT], }, { - "id": " ", + "id": "15b7b623-0dee-4212-a32a-a6d6f6877b4e", "type": TYPE_STRING, "name": "wallet_name", "lookup": "wallet_name", @@ -1803,7 +1803,7 @@ "scope": [Scope.XLSX, Scope.INDIVIDUAL_UPDATE], }, { - "id": " ", + "id": "0010bc3e-0a4a-452b-a776-2cc4b760a0fd", "type": TYPE_STRING, "name": "blockchain_name", "lookup": "blockchain_name", @@ -1816,7 +1816,7 @@ "scope": [Scope.XLSX, Scope.INDIVIDUAL_UPDATE], }, { - "id": " ", + "id": "15d35efa-8f36-4a40-b9ed-a7812a665e01", "type": TYPE_STRING, "name": "wallet_address", "lookup": "wallet_address", diff --git a/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py b/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py index c41c93992d..a5e7d5f040 100644 --- a/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py +++ b/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py @@ -1327,7 +1327,7 @@ "scope": [Scope.XLSX_PEOPLE], }, { - "id": " ", + "id": "8f423979-6721-45d3-9b08-f3ffe22e72e4", "type": TYPE_STRING, "name": "wallet_name", "lookup": "wallet_name", @@ -1340,7 +1340,7 @@ "scope": [Scope.XLSX_PEOPLE], }, { - "id": " ", + "id": "b4c56b02-8805-4eae-82cd-0e6451d006b9", "type": TYPE_STRING, "name": "blockchain_name", "lookup": "blockchain_name", @@ -1353,7 +1353,7 @@ "scope": [Scope.XLSX_PEOPLE], }, { - "id": " ", + "id": "ff6284e2-8e3a-47b8-80c1-6c6b20b2d837", "type": TYPE_STRING, "name": "wallet_address", "lookup": "wallet_address", diff --git a/backend/hct_mis_api/apps/household/migrations/0174_migration.py b/backend/hct_mis_api/apps/household/migrations/0174_migration.py new file mode 100644 index 0000000000..993a4185ef --- /dev/null +++ b/backend/hct_mis_api/apps/household/migrations/0174_migration.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.25 on 2024-04-12 07:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('household', '0173_migration'), + ] + + operations = [ + migrations.AddField( + model_name='individual', + name='blockchain_name', + field=models.CharField(blank=True, default='', max_length=64), + ), + migrations.AddField( + model_name='individual', + name='wallet_address', + field=models.CharField(blank=True, default='', max_length=128), + ), + migrations.AddField( + model_name='individual', + name='wallet_name', + field=models.CharField(blank=True, default='', max_length=64), + ), + migrations.AlterField( + model_name='household', + name='currency', + field=models.CharField(choices=[('', 'None'), ('AED', 'United Arab Emirates dirham'), ('AFN', 'Afghan afghani'), ('ALL', 'Albanian lek'), ('AMD', 'Armenian dram'), ('ANG', 'Netherlands Antillean guilder'), ('AOA', 'Angolan kwanza'), ('ARS', 'Argentine peso'), ('AUD', 'Australian dollar'), ('AWG', 'Aruban florin'), ('AZN', 'Azerbaijani manat'), ('BAM', 'Bosnia and Herzegovina convertible mark'), ('BBD', 'Barbados dollar'), ('BDT', 'Bangladeshi taka'), ('BGN', 'Bulgarian lev'), ('BHD', 'Bahraini dinar'), ('BIF', 'Burundian franc'), ('BMD', 'Bermudian dollar'), ('BND', 'Brunei dollar'), ('BOB', 'Boliviano'), ('BOV', 'Bolivian Mvdol (funds code)'), ('BRL', 'Brazilian real'), ('BSD', 'Bahamian dollar'), ('BTN', 'Bhutanese ngultrum'), ('BWP', 'Botswana pula'), ('BYN', 'Belarusian ruble'), ('BZD', 'Belize dollar'), ('CAD', 'Canadian dollar'), ('CDF', 'Congolese franc'), ('CHF', 'Swiss franc'), ('CLP', 'Chilean peso'), ('CNY', 'Chinese yuan'), ('COP', 'Colombian peso'), ('CRC', 'Costa Rican colon'), ('CUC', 'Cuban convertible peso'), ('CUP', 'Cuban peso'), ('CVE', 'Cape Verdean escudo'), ('CZK', 'Czech koruna'), ('DJF', 'Djiboutian franc'), ('DKK', 'Danish krone'), ('DOP', 'Dominican peso'), ('DZD', 'Algerian dinar'), ('EGP', 'Egyptian pound'), ('ERN', 'Eritrean nakfa'), ('ETB', 'Ethiopian birr'), ('EUR', 'Euro'), ('FJD', 'Fiji dollar'), ('FKP', 'Falkland Islands pound'), ('GBP', 'Pound sterling'), ('GEL', 'Georgian lari'), ('GHS', 'Ghanaian cedi'), ('GIP', 'Gibraltar pound'), ('GMD', 'Gambian dalasi'), ('GNF', 'Guinean franc'), ('GTQ', 'Guatemalan quetzal'), ('GYD', 'Guyanese dollar'), ('HKD', 'Hong Kong dollar'), ('HNL', 'Honduran lempira'), ('HRK', 'Croatian kuna'), ('HTG', 'Haitian gourde'), ('HUF', 'Hungarian forint'), ('IDR', 'Indonesian rupiah'), ('ILS', 'Israeli new shekel'), ('INR', 'Indian rupee'), ('IQD', 'Iraqi dinar'), ('IRR', 'Iranian rial'), ('ISK', 'Icelandic króna'), ('JMD', 'Jamaican dollar'), ('JOD', 'Jordanian dinar'), ('JPY', 'Japanese yen'), ('KES', 'Kenyan shilling'), ('KGS', 'Kyrgyzstani som'), ('KHR', 'Cambodian riel'), ('KMF', 'Comoro franc'), ('KPW', 'North Korean won'), ('KRW', 'South Korean won'), ('KWD', 'Kuwaiti dinar'), ('KYD', 'Cayman Islands dollar'), ('KZT', 'Kazakhstani tenge'), ('LAK', 'Lao kip'), ('LBP', 'Lebanese pound'), ('LKR', 'Sri Lankan rupee'), ('LRD', 'Liberian dollar'), ('LSL', 'Lesotho loti'), ('LYD', 'Libyan dinar'), ('MAD', 'Moroccan dirham'), ('MDL', 'Moldovan leu'), ('MGA', 'Malagasy ariary'), ('MKD', 'Macedonian denar'), ('MMK', 'Myanmar kyat'), ('MNT', 'Mongolian tögrög'), ('MOP', 'Macanese pataca'), ('MRU', 'Mauritanian ouguiya'), ('MUR', 'Mauritian rupee'), ('MVR', 'Maldivian rufiyaa'), ('MWK', 'Malawian kwacha'), ('MXN', 'Mexican peso'), ('MYR', 'Malaysian ringgit'), ('MZN', 'Mozambican metical'), ('NAD', 'Namibian dollar'), ('NGN', 'Nigerian naira'), ('NIO', 'Nicaraguan córdoba'), ('NOK', 'Norwegian krone'), ('NPR', 'Nepalese rupee'), ('NZD', 'New Zealand dollar'), ('OMR', 'Omani rial'), ('PAB', 'Panamanian balboa'), ('PEN', 'Peruvian sol'), ('PGK', 'Papua New Guinean kina'), ('PHP', 'Philippine peso'), ('PKR', 'Pakistani rupee'), ('PLN', 'Polish złoty'), ('PYG', 'Paraguayan guaraní'), ('QAR', 'Qatari riyal'), ('RON', 'Romanian leu'), ('RSD', 'Serbian dinar'), ('RUB', 'Russian ruble'), ('RWF', 'Rwandan franc'), ('SAR', 'Saudi riyal'), ('SBD', 'Solomon Islands dollar'), ('SCR', 'Seychelles rupee'), ('SDG', 'Sudanese pound'), ('SEK', 'Swedish krona/kronor'), ('SGD', 'Singapore dollar'), ('SHP', 'Saint Helena pound'), ('SLL', 'Sierra Leonean leone'), ('SOS', 'Somali shilling'), ('SRD', 'Surinamese dollar'), ('SSP', 'South Sudanese pound'), ('STN', 'São Tomé and Príncipe dobra'), ('SVC', 'Salvadoran colón'), ('SYP', 'Syrian pound'), ('SZL', 'Swazi lilangeni'), ('THB', 'Thai baht'), ('TJS', 'Tajikistani somoni'), ('TMT', 'Turkmenistan manat'), ('TND', 'Tunisian dinar'), ('TOP', 'Tongan paʻanga'), ('TRY', 'Turkish lira'), ('TTD', 'Trinidad and Tobago dollar'), ('TWD', 'New Taiwan dollar'), ('TZS', 'Tanzanian shilling'), ('UAH', 'Ukrainian hryvnia'), ('UGX', 'Ugandan shilling'), ('USD', 'United States dollar'), ('UYU', 'Uruguayan peso'), ('UYW', 'Unidad previsional[14]'), ('UZS', 'Uzbekistan som'), ('VES', 'Venezuelan bolívar soberano'), ('VND', 'Vietnamese đồng'), ('VUV', 'Vanuatu vatu'), ('WST', 'Samoan tala'), ('XAF', 'CFA franc BEAC'), ('XAG', 'Silver (one troy ounce)'), ('XAU', 'Gold (one troy ounce)'), ('XCD', 'East Caribbean dollar'), ('XOF', 'CFA franc BCEAO'), ('XPF', 'CFP franc (franc Pacifique)'), ('YER', 'Yemeni rial'), ('ZAR', 'South African rand'), ('ZMW', 'Zambian kwacha'), ('ZWL', 'Zimbabwean dollar'), ('USDC', 'Digital currency')], default='', max_length=250), + ), + ] diff --git a/backend/hct_mis_api/apps/payment/migrations/0124_migration.py b/backend/hct_mis_api/apps/payment/migrations/0124_migration.py new file mode 100644 index 0000000000..5b3765f0c9 --- /dev/null +++ b/backend/hct_mis_api/apps/payment/migrations/0124_migration.py @@ -0,0 +1,60 @@ +# Generated by Django 3.2.25 on 2024-04-12 07:14 + +from django.db import migrations, models +import hct_mis_api.apps.account.models +import multiselectfield.db.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('payment', '0123_migration'), + ] + + operations = [ + migrations.AlterField( + model_name='cashplan', + name='delivery_type', + field=models.CharField(choices=[('Cardless cash withdrawal', 'Cardless cash withdrawal'), ('Cash', 'Cash'), ('Cash by FSP', 'Cash by FSP'), ('Cheque', 'Cheque'), ('Deposit to Card', 'Deposit to Card'), ('Mobile Money', 'Mobile Money'), ('Pre-paid card', 'Pre-paid card'), ('Referral', 'Referral'), ('Transfer', 'Transfer'), ('Transfer to Account', 'Transfer to Account'), ('Voucher', 'Voucher'), ('Transfer to Digital Wallet', 'Transfer to Digital Wallet')], db_index=True, max_length=32, null=True), + ), + migrations.AlterField( + model_name='deliverymechanismperpaymentplan', + name='delivery_mechanism', + field=models.CharField(choices=[('Cardless cash withdrawal', 'Cardless cash withdrawal'), ('Cash', 'Cash'), ('Cash by FSP', 'Cash by FSP'), ('Cheque', 'Cheque'), ('Deposit to Card', 'Deposit to Card'), ('Mobile Money', 'Mobile Money'), ('Pre-paid card', 'Pre-paid card'), ('Referral', 'Referral'), ('Transfer', 'Transfer'), ('Transfer to Account', 'Transfer to Account'), ('Voucher', 'Voucher'), ('Transfer to Digital Wallet', 'Transfer to Digital Wallet')], db_index=True, max_length=255, null=True), + ), + migrations.AlterField( + model_name='financialserviceprovider', + name='delivery_mechanisms', + field=hct_mis_api.apps.account.models.HorizontalChoiceArrayField(base_field=models.CharField(choices=[('Cardless cash withdrawal', 'Cardless cash withdrawal'), ('Cash', 'Cash'), ('Cash by FSP', 'Cash by FSP'), ('Cheque', 'Cheque'), ('Deposit to Card', 'Deposit to Card'), ('Mobile Money', 'Mobile Money'), ('Pre-paid card', 'Pre-paid card'), ('Referral', 'Referral'), ('Transfer', 'Transfer'), ('Transfer to Account', 'Transfer to Account'), ('Voucher', 'Voucher'), ('Transfer to Digital Wallet', 'Transfer to Digital Wallet')], max_length=32), size=None), + ), + migrations.AlterField( + model_name='financialserviceproviderxlsxtemplate', + name='columns', + field=multiselectfield.db.fields.MultiSelectField(choices=[('payment_id', 'Payment ID'), ('household_id', 'Household ID'), ('household_size', 'Household Size'), ('collector_name', 'Collector Name'), ('alternate_collector_full_name', 'Alternate collector Full Name'), ('alternate_collector_given_name', 'Alternate collector Given Name'), ('alternate_collector_middle_name', 'Alternate collector Middle Name'), ('alternate_collector_phone_no', 'Alternate collector phone number'), ('alternate_collector_document_numbers', 'Alternate collector Document numbers'), ('alternate_collector_sex', 'Alternate collector Gender'), ('payment_channel', 'Payment Channel'), ('fsp_name', 'FSP Name'), ('currency', 'Currency'), ('entitlement_quantity', 'Entitlement Quantity'), ('entitlement_quantity_usd', 'Entitlement Quantity USD'), ('delivered_quantity', 'Delivered Quantity'), ('delivery_date', 'Delivery Date'), ('reference_id', 'Reference id'), ('reason_for_unsuccessful_payment', 'Reason for unsuccessful payment'), ('order_number', 'Order Number'), ('token_number', 'Token Number'), ('additional_collector_name', 'Additional Collector Name'), ('additional_document_type', 'Additional Document Type'), ('additional_document_number', 'Additional Document Number'), ('registration_token', 'Registration Token'), ('status', 'Status'), ('transaction_status_blockchain', 'Transaction Status on the Blockchain')], default=['payment_id', 'household_id', 'household_size', 'collector_name', 'alternate_collector_full_name', 'alternate_collector_given_name', 'alternate_collector_middle_name', 'alternate_collector_phone_no', 'alternate_collector_document_numbers', 'alternate_collector_sex', 'payment_channel', 'fsp_name', 'currency', 'entitlement_quantity', 'entitlement_quantity_usd', 'delivered_quantity', 'delivery_date', 'reference_id', 'reason_for_unsuccessful_payment', 'order_number', 'token_number', 'additional_collector_name', 'additional_document_type', 'additional_document_number', 'registration_token', 'status', 'transaction_status_blockchain'], help_text='Select the columns to include in the report', max_length=1000, verbose_name='Columns'), + ), + migrations.AlterField( + model_name='financialserviceproviderxlsxtemplate', + name='core_fields', + field=hct_mis_api.apps.account.models.HorizontalChoiceArrayField(base_field=models.CharField(blank=True, choices=[('age', 'Age (calculated)'), ('residence_status', 'Residence status'), ('consent', 'Do you consent?'), ('consent_sign', 'Do you consent?'), ('country_origin', 'Country of Origin'), ('country', 'Country of registration'), ('address', 'Address'), ('zip_code', 'Zip code'), ('admin1', 'Household resides in which ${admin1_h_c}?'), ('admin2', 'Household resides in which ${admin2_h_c}?'), ('admin3', 'Household resides in which ${admin3_h_c}?'), ('admin4', 'Household resides in which ${admin4_h_c}?'), ('geopoint', 'Geolocation'), ('unhcr_id', 'UNHCR Case ID'), ('returnee', 'Is this a returnee household?'), ('size', 'What is the household size?'), ('fchild_hoh', 'Child is female and head of household'), ('child_hoh', 'Child is head of household'), ('relationship', 'Relationship to head of household'), ('full_name', 'Full name'), ('given_name', 'Given name'), ('middle_name', 'Middle name(s)'), ('family_name', 'Family name'), ('sex', 'Gender'), ('birth_date', 'Birth date'), ('estimated_birth_date', 'Estimated birth date?'), ('photo', "Individual's photo"), ('marital_status', 'Marital status'), ('phone_no', 'Phone number'), ('who_answers_phone', 'Who answers this phone?'), ('phone_no_alternative', 'Alternative phone number'), ('who_answers_alt_phone', 'Who answers this (alt) phone?'), ('registration_method', 'Method of collection (e.g. HH survey, Community, etc.)'), ('collect_individual_data', "Will you be collecting all member Individuals' data?"), ('currency', 'Which currency will be used for financial questions?'), ('birth_certificate_no', 'Birth certificate number'), ('birth_certificate_issuer', 'Issuing country of birth certificate'), ('birth_certificate_photo', 'Birth certificate photo'), ('tax_id_no', 'Tax identification number'), ('tax_id_issuer', 'Issuing country of tax identification'), ('tax_id_photo', 'Tax identification photo'), ('drivers_license_no', "Driver's license number"), ('drivers_license_issuer', "Issuing country of driver's license"), ('drivers_license_photo', "Driver's license photo"), ('electoral_card_no', 'Electoral card number'), ('electoral_card_issuer', 'Issuing country of electoral card'), ('electoral_card_photo', 'Electoral card photo'), ('unhcr_id_no', 'UNHCR ID number'), ('unhcr_id_issuer', 'Issuing entity of UNHCR ID'), ('unhcr_id_photo', 'UNHCR ID photo'), ('national_passport', 'National passport number'), ('national_passport_issuer', 'Issuing country of national passport'), ('national_passport_photo', 'National passport photo'), ('national_id_no', 'National ID number'), ('national_id_issuer', 'Issuing country of national ID'), ('national_id_photo', 'National ID photo'), ('scope_id_no', 'WFP Scope ID number'), ('scope_id_issuer', 'Issuing entity of SCOPE ID'), ('scope_id_photo', 'WFP Scope ID photo'), ('other_id_type', 'If other type of ID, specify the type'), ('other_id_no', 'Other ID number'), ('other_id_issuer', 'Issuing country of other ID'), ('other_id_photo', 'ID photo'), ('female_age_group_0_5_count', 'Females Age 0 - 5'), ('female_age_group_6_11_count', 'Females Age 6 - 11'), ('female_age_group_12_17_count', 'Females Age 12 - 17'), ('female_age_group_18_59_count', 'Females Age 18 - 59'), ('female_age_group_60_count', 'Females Age 60 +'), ('pregnant_count', 'Pregnant count'), ('male_age_group_0_5_count', 'Males Age 0 - 5'), ('male_age_group_6_11_count', 'Males Age 6 - 11'), ('male_age_group_12_17_count', 'Males Age 12 - 17'), ('male_age_group_18_59_count', 'Males Age 18 - 59'), ('male_age_group_60_count', 'Males Age 60 +'), ('female_age_group_0_5_disabled_count', 'Females age 0 - 5 with disability'), ('female_age_group_6_11_disabled_count', 'Females age 6 - 11 with disability'), ('female_age_group_12_17_disabled_count', 'Females age 12 - 17 with disability'), ('female_age_group_18_59_disabled_count', 'Females Age 18 - 59 with disability'), ('female_age_group_60_disabled_count', 'Female members with Disability age 60 +'), ('male_age_group_0_5_disabled_count', 'Males age 0 - 5 with disability'), ('male_age_group_6_11_disabled_count', 'Males age 6 - 11 with disability'), ('male_age_group_12_17_disabled_count', 'Males age 12 - 17 with disability'), ('male_age_group_18_59_disabled_count', 'Males Age 18 - 59 with disability'), ('male_age_group_60_disabled_count', 'Male members with Disability age 60 +'), ('pregnant', 'Is the individual pregnant?'), ('work_status', 'Does the individual have paid employment in the current month?'), ('observed_disability', 'Does the individual have disability?'), ('seeing_disability', 'If the individual has difficulty seeing, what is the severity?'), ('hearing_disability', 'If the individual has difficulty hearing, what is the severity?'), ('physical_disability', 'If the individual has difficulty walking or climbing steps, what is the severity?'), ('memory_disability', 'If the individual has difficulty remembering or concentrating, what is the severity?'), ('selfcare_disability', 'Do you have difficulty (with self-care such as) washing all over or dressing'), ('comms_disability', 'If the individual has difficulty communicating, what is the severity?'), ('fchild_hoh', 'Female child headed household'), ('child_hoh', 'Child headed household'), ('village', 'Village'), ('deviceid', 'Device ID'), ('name_enumerator', 'Name of the enumerator'), ('org_enumerator', 'Organization of the enumerator'), ('consent_sharing', 'Which organizations may we share your information with?'), ('org_name_enumerator', 'Name of partner organization'), ('disability', 'Individual is disabled?'), ('first_registration_date', 'First individual registration date'), ('first_registration_date', 'First household registration date'), ('number_of_children', 'What is the number of children in the household?'), ('has_phone_number', 'Has phone number?'), ('has_tax_id_number', 'Has tax ID number?'), ('has_the_bank_account_number', 'Has the bank account number?'), ('role', 'Role'), ('registration_data_import', 'Registration Data Import'), ('unicef_id', 'Household unicef id'), ('unicef_id', 'Individual unicef id'), ('admin_area_title', 'Household resides in which admin area?'), ('start', 'Data collection start date'), ('end', 'Data collection end date'), ('primary_collector_id', 'List of primary collectors ids, separated by a semicolon'), ('alternate_collector_id', 'List of alternate collectors ids, separated by a semicolon'), ('household_id', 'Household ID'), ('household_id', 'Household ID'), ('email', 'Individual email'), ('preferred_language', 'Preferred language'), ('age_at_registration', 'Age at registration'), ('account_holder_name', 'Account holder name'), ('bank_branch_name', 'Bank branch name'), ('wallet_name', 'Wallet Name'), ('blockchain_name', 'Blockchain Name'), ('wallet_address', 'Wallet Address'), ('index_id', 'Index ID'), ('full_name', 'Full name'), ('given_name', 'Given name'), ('middle_name', 'Middle name(s)'), ('family_name', 'Family name'), ('sex', 'Gender'), ('birth_date', 'Birth date'), ('estimated_birth_date', 'Estimated birth date?'), ('photo', "Individual's photo"), ('address', 'Address'), ('country_origin', 'Country of Origin'), ('country', 'Country of registration'), ('zip_code', 'Zip code'), ('admin1', 'Social worker resides in which ${admin1_i_c}?'), ('admin2', 'Social worker resides in which ${admin2_i_c}?'), ('admin3', 'Social worker resides in which ${admin3_i_c}?'), ('admin4', 'Social worker resides in which ${admin4_i_c}?'), ('residence_status', 'Residence status'), ('consent', 'Do you consent?'), ('consent_sign', 'Do you consent?'), ('geopoint', 'Geolocation'), ('unhcr_id', 'UNHCR Case ID'), ('returnee', 'Is this a returnee household?'), ('registration_method', 'Method of collection (e.g. HH survey, Community, etc.)'), ('currency', 'Which currency will be used for financial questions?'), ('village', 'Village'), ('deviceid', 'Device ID'), ('name_enumerator', 'Name of the enumerator'), ('org_enumerator', 'Organization of the enumerator'), ('consent_sharing', 'Which organizations may we share your information with?'), ('org_name_enumerator', 'Name of partner organization'), ('age', 'Age (calculated)'), ('fchild_hoh', 'Child is female and head of household'), ('child_hoh', 'Child is head of household'), ('relationship', 'Relationship to head of household'), ('marital_status', 'Marital status'), ('phone_no', 'Phone number'), ('who_answers_phone', 'Who answers this phone?'), ('phone_no_alternative', 'Alternative phone number'), ('who_answers_alt_phone', 'Who answers this (alt) phone?'), ('birth_certificate_no', 'Birth certificate number'), ('birth_certificate_issuer', 'Issuing country of birth certificate'), ('birth_certificate_photo', 'Birth certificate photo'), ('tax_id_no', 'Tax identification number'), ('tax_id_issuer', 'Issuing country of tax identification'), ('tax_id_photo', 'Tax identification photo'), ('drivers_license_no', "Driver's license number"), ('drivers_license_issuer', "Issuing country of driver's license"), ('drivers_license_photo', "Driver's license photo"), ('electoral_card_no', 'Electoral card number'), ('electoral_card_issuer', 'Issuing country of electoral card'), ('electoral_card_photo', 'Electoral card photo'), ('unhcr_id_no', 'UNHCR ID number'), ('unhcr_id_issuer', 'Issuing entity of UNHCR ID'), ('unhcr_id_photo', 'UNHCR ID photo'), ('national_passport', 'National passport number'), ('national_passport_issuer', 'Issuing country of national passport'), ('national_passport_photo', 'National passport photo'), ('national_id_no', 'National ID number'), ('national_id_issuer', 'Issuing country of national ID'), ('national_id_photo', 'National ID photo'), ('scope_id_no', 'WFP Scope ID number'), ('scope_id_issuer', 'Issuing entity of SCOPE ID'), ('scope_id_photo', 'WFP Scope ID photo'), ('other_id_type', 'If other type of ID, specify the type'), ('other_id_no', 'Other ID number'), ('other_id_issuer', 'Issuing country of other ID'), ('other_id_photo', 'ID photo'), ('pregnant', 'Is the individual pregnant?'), ('work_status', 'Does the individual have paid employment in the current month?'), ('observed_disability', 'Does the individual have disability?'), ('seeing_disability', 'If the individual has difficulty seeing, what is the severity?'), ('hearing_disability', 'If the individual has difficulty hearing, what is the severity?'), ('physical_disability', 'If the individual has difficulty walking or climbing steps, what is the severity?'), ('memory_disability', 'If the individual has difficulty remembering or concentrating, what is the severity?'), ('selfcare_disability', 'Do you have difficulty (with self-care such as) washing all over or dressing'), ('comms_disability', 'If the individual has difficulty communicating, what is the severity?'), ('disability', 'Individual is disabled?'), ('first_registration_date', 'First individual registration date'), ('primary_collector_id', 'List of primary collectors ids, separated by a semicolon'), ('alternate_collector_id', 'List of alternate collectors ids, separated by a semicolon'), ('email', 'Individual email'), ('preferred_language', 'Preferred language'), ('age_at_registration', 'Age at registration'), ('account_holder_name', 'Account holder name'), ('bank_branch_name', 'Bank branch name'), ('bank_name', 'Bank name'), ('bank_account_number', 'Bank account number'), ('debit_card_issuer', 'Debit Card Issuer'), ('debit_card_number', 'Debit card number'), ('payment_delivery_phone_no', 'Payment delivery phone number'), ('wallet_name', 'Wallet Name'), ('blockchain_name', 'Blockchain Name'), ('wallet_address', 'Wallet Address'), ('bank_name', 'Bank name'), ('bank_account_number', 'Bank account number'), ('debit_card_issuer', 'Debit Card Issuer'), ('debit_card_number', 'Debit card number'), ('payment_delivery_phone_no', 'Payment delivery phone number')], max_length=255), blank=True, default=list, size=None), + ), + migrations.AlterField( + model_name='fspxlsxtemplateperdeliverymechanism', + name='delivery_mechanism', + field=models.CharField(choices=[('Cardless cash withdrawal', 'Cardless cash withdrawal'), ('Cash', 'Cash'), ('Cash by FSP', 'Cash by FSP'), ('Cheque', 'Cheque'), ('Deposit to Card', 'Deposit to Card'), ('Mobile Money', 'Mobile Money'), ('Pre-paid card', 'Pre-paid card'), ('Referral', 'Referral'), ('Transfer', 'Transfer'), ('Transfer to Account', 'Transfer to Account'), ('Voucher', 'Voucher'), ('Transfer to Digital Wallet', 'Transfer to Digital Wallet')], max_length=255, verbose_name='Delivery Mechanism'), + ), + migrations.AlterField( + model_name='payment', + name='delivery_type', + field=models.CharField(choices=[('Cardless cash withdrawal', 'Cardless cash withdrawal'), ('Cash', 'Cash'), ('Cash by FSP', 'Cash by FSP'), ('Cheque', 'Cheque'), ('Deposit to Card', 'Deposit to Card'), ('Mobile Money', 'Mobile Money'), ('Pre-paid card', 'Pre-paid card'), ('Referral', 'Referral'), ('Transfer', 'Transfer'), ('Transfer to Account', 'Transfer to Account'), ('Voucher', 'Voucher'), ('Transfer to Digital Wallet', 'Transfer to Digital Wallet')], max_length=32, null=True), + ), + migrations.AlterField( + model_name='paymentplan', + name='currency', + field=models.CharField(choices=[('', 'None'), ('AED', 'United Arab Emirates dirham'), ('AFN', 'Afghan afghani'), ('ALL', 'Albanian lek'), ('AMD', 'Armenian dram'), ('ANG', 'Netherlands Antillean guilder'), ('AOA', 'Angolan kwanza'), ('ARS', 'Argentine peso'), ('AUD', 'Australian dollar'), ('AWG', 'Aruban florin'), ('AZN', 'Azerbaijani manat'), ('BAM', 'Bosnia and Herzegovina convertible mark'), ('BBD', 'Barbados dollar'), ('BDT', 'Bangladeshi taka'), ('BGN', 'Bulgarian lev'), ('BHD', 'Bahraini dinar'), ('BIF', 'Burundian franc'), ('BMD', 'Bermudian dollar'), ('BND', 'Brunei dollar'), ('BOB', 'Boliviano'), ('BOV', 'Bolivian Mvdol (funds code)'), ('BRL', 'Brazilian real'), ('BSD', 'Bahamian dollar'), ('BTN', 'Bhutanese ngultrum'), ('BWP', 'Botswana pula'), ('BYN', 'Belarusian ruble'), ('BZD', 'Belize dollar'), ('CAD', 'Canadian dollar'), ('CDF', 'Congolese franc'), ('CHF', 'Swiss franc'), ('CLP', 'Chilean peso'), ('CNY', 'Chinese yuan'), ('COP', 'Colombian peso'), ('CRC', 'Costa Rican colon'), ('CUC', 'Cuban convertible peso'), ('CUP', 'Cuban peso'), ('CVE', 'Cape Verdean escudo'), ('CZK', 'Czech koruna'), ('DJF', 'Djiboutian franc'), ('DKK', 'Danish krone'), ('DOP', 'Dominican peso'), ('DZD', 'Algerian dinar'), ('EGP', 'Egyptian pound'), ('ERN', 'Eritrean nakfa'), ('ETB', 'Ethiopian birr'), ('EUR', 'Euro'), ('FJD', 'Fiji dollar'), ('FKP', 'Falkland Islands pound'), ('GBP', 'Pound sterling'), ('GEL', 'Georgian lari'), ('GHS', 'Ghanaian cedi'), ('GIP', 'Gibraltar pound'), ('GMD', 'Gambian dalasi'), ('GNF', 'Guinean franc'), ('GTQ', 'Guatemalan quetzal'), ('GYD', 'Guyanese dollar'), ('HKD', 'Hong Kong dollar'), ('HNL', 'Honduran lempira'), ('HRK', 'Croatian kuna'), ('HTG', 'Haitian gourde'), ('HUF', 'Hungarian forint'), ('IDR', 'Indonesian rupiah'), ('ILS', 'Israeli new shekel'), ('INR', 'Indian rupee'), ('IQD', 'Iraqi dinar'), ('IRR', 'Iranian rial'), ('ISK', 'Icelandic króna'), ('JMD', 'Jamaican dollar'), ('JOD', 'Jordanian dinar'), ('JPY', 'Japanese yen'), ('KES', 'Kenyan shilling'), ('KGS', 'Kyrgyzstani som'), ('KHR', 'Cambodian riel'), ('KMF', 'Comoro franc'), ('KPW', 'North Korean won'), ('KRW', 'South Korean won'), ('KWD', 'Kuwaiti dinar'), ('KYD', 'Cayman Islands dollar'), ('KZT', 'Kazakhstani tenge'), ('LAK', 'Lao kip'), ('LBP', 'Lebanese pound'), ('LKR', 'Sri Lankan rupee'), ('LRD', 'Liberian dollar'), ('LSL', 'Lesotho loti'), ('LYD', 'Libyan dinar'), ('MAD', 'Moroccan dirham'), ('MDL', 'Moldovan leu'), ('MGA', 'Malagasy ariary'), ('MKD', 'Macedonian denar'), ('MMK', 'Myanmar kyat'), ('MNT', 'Mongolian tögrög'), ('MOP', 'Macanese pataca'), ('MRU', 'Mauritanian ouguiya'), ('MUR', 'Mauritian rupee'), ('MVR', 'Maldivian rufiyaa'), ('MWK', 'Malawian kwacha'), ('MXN', 'Mexican peso'), ('MYR', 'Malaysian ringgit'), ('MZN', 'Mozambican metical'), ('NAD', 'Namibian dollar'), ('NGN', 'Nigerian naira'), ('NIO', 'Nicaraguan córdoba'), ('NOK', 'Norwegian krone'), ('NPR', 'Nepalese rupee'), ('NZD', 'New Zealand dollar'), ('OMR', 'Omani rial'), ('PAB', 'Panamanian balboa'), ('PEN', 'Peruvian sol'), ('PGK', 'Papua New Guinean kina'), ('PHP', 'Philippine peso'), ('PKR', 'Pakistani rupee'), ('PLN', 'Polish złoty'), ('PYG', 'Paraguayan guaraní'), ('QAR', 'Qatari riyal'), ('RON', 'Romanian leu'), ('RSD', 'Serbian dinar'), ('RUB', 'Russian ruble'), ('RWF', 'Rwandan franc'), ('SAR', 'Saudi riyal'), ('SBD', 'Solomon Islands dollar'), ('SCR', 'Seychelles rupee'), ('SDG', 'Sudanese pound'), ('SEK', 'Swedish krona/kronor'), ('SGD', 'Singapore dollar'), ('SHP', 'Saint Helena pound'), ('SLL', 'Sierra Leonean leone'), ('SOS', 'Somali shilling'), ('SRD', 'Surinamese dollar'), ('SSP', 'South Sudanese pound'), ('STN', 'São Tomé and Príncipe dobra'), ('SVC', 'Salvadoran colón'), ('SYP', 'Syrian pound'), ('SZL', 'Swazi lilangeni'), ('THB', 'Thai baht'), ('TJS', 'Tajikistani somoni'), ('TMT', 'Turkmenistan manat'), ('TND', 'Tunisian dinar'), ('TOP', 'Tongan paʻanga'), ('TRY', 'Turkish lira'), ('TTD', 'Trinidad and Tobago dollar'), ('TWD', 'New Taiwan dollar'), ('TZS', 'Tanzanian shilling'), ('UAH', 'Ukrainian hryvnia'), ('UGX', 'Ugandan shilling'), ('USD', 'United States dollar'), ('UYU', 'Uruguayan peso'), ('UYW', 'Unidad previsional[14]'), ('UZS', 'Uzbekistan som'), ('VES', 'Venezuelan bolívar soberano'), ('VND', 'Vietnamese đồng'), ('VUV', 'Vanuatu vatu'), ('WST', 'Samoan tala'), ('XAF', 'CFA franc BEAC'), ('XAG', 'Silver (one troy ounce)'), ('XAU', 'Gold (one troy ounce)'), ('XCD', 'East Caribbean dollar'), ('XOF', 'CFA franc BCEAO'), ('XPF', 'CFP franc (franc Pacifique)'), ('YER', 'Yemeni rial'), ('ZAR', 'South African rand'), ('ZMW', 'Zambian kwacha'), ('ZWL', 'Zimbabwean dollar'), ('USDC', 'Digital currency')], max_length=4), + ), + migrations.AlterField( + model_name='paymentrecord', + name='delivery_type', + field=models.CharField(choices=[('Cardless cash withdrawal', 'Cardless cash withdrawal'), ('Cash', 'Cash'), ('Cash by FSP', 'Cash by FSP'), ('Cheque', 'Cheque'), ('Deposit to Card', 'Deposit to Card'), ('Mobile Money', 'Mobile Money'), ('Pre-paid card', 'Pre-paid card'), ('Referral', 'Referral'), ('Transfer', 'Transfer'), ('Transfer to Account', 'Transfer to Account'), ('Voucher', 'Voucher'), ('Transfer to Digital Wallet', 'Transfer to Digital Wallet')], max_length=32, null=True), + ), + ] diff --git a/backend/hct_mis_api/apps/payment/models.py b/backend/hct_mis_api/apps/payment/models.py index 6a408e68c5..0f6454e375 100644 --- a/backend/hct_mis_api/apps/payment/models.py +++ b/backend/hct_mis_api/apps/payment/models.py @@ -164,6 +164,7 @@ def get_unicef_id(self) -> str: def get_exchange_rate(self, exchange_rates_client: Optional["ExchangeRateClient"] = None) -> float: if self.currency == USDC: + # TODO: is it good place for that? # exchange rate for Digital currency return 1.0 @@ -304,7 +305,7 @@ class GenericPayment(TimeStampedUUIDModel): status_date = models.DateTimeField() household = models.ForeignKey("household.Household", on_delete=models.CASCADE) head_of_household = models.ForeignKey("household.Individual", on_delete=models.CASCADE, null=True) - delivery_type = models.CharField(choices=DELIVERY_TYPE_CHOICE, max_length=24, null=True) + delivery_type = models.CharField(choices=DELIVERY_TYPE_CHOICE, max_length=32, null=True) currency = models.CharField( max_length=4, ) @@ -1254,7 +1255,7 @@ class FinancialServiceProvider(LimitBusinessAreaModelMixin, TimeStampedUUIDModel name = models.CharField(max_length=100, unique=True) vision_vendor_number = models.CharField(max_length=100, unique=True) delivery_mechanisms = HorizontalChoiceArrayField( - models.CharField(choices=GenericPayment.DELIVERY_TYPE_CHOICE, max_length=24) + models.CharField(choices=GenericPayment.DELIVERY_TYPE_CHOICE, max_length=32) ) distribution_limit = models.DecimalField( decimal_places=2, @@ -1431,7 +1432,7 @@ class CashPlan(ConcurrencyModel, AdminUrlMixin, GenericPaymentPlan): comments = models.CharField(max_length=255, null=True) delivery_type = models.CharField( choices=GenericPayment.DELIVERY_TYPE_CHOICE, - max_length=24, + max_length=32, null=True, db_index=True, ) diff --git a/backend/hct_mis_api/apps/registration_datahub/migrations/0111_migration.py b/backend/hct_mis_api/apps/registration_datahub/migrations/0111_migration.py new file mode 100644 index 0000000000..d6cacf2b93 --- /dev/null +++ b/backend/hct_mis_api/apps/registration_datahub/migrations/0111_migration.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.25 on 2024-04-12 07:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('registration_datahub', '0110_migration'), + ] + + operations = [ + migrations.AddField( + model_name='importedindividual', + name='blockchain_name', + field=models.CharField(blank=True, default='', max_length=64), + ), + migrations.AddField( + model_name='importedindividual', + name='wallet_address', + field=models.CharField(blank=True, default='', max_length=128), + ), + migrations.AddField( + model_name='importedindividual', + name='wallet_name', + field=models.CharField(blank=True, default='', max_length=64), + ), + migrations.AlterField( + model_name='importedhousehold', + name='currency', + field=models.CharField(choices=[('', 'None'), ('AED', 'United Arab Emirates dirham'), ('AFN', 'Afghan afghani'), ('ALL', 'Albanian lek'), ('AMD', 'Armenian dram'), ('ANG', 'Netherlands Antillean guilder'), ('AOA', 'Angolan kwanza'), ('ARS', 'Argentine peso'), ('AUD', 'Australian dollar'), ('AWG', 'Aruban florin'), ('AZN', 'Azerbaijani manat'), ('BAM', 'Bosnia and Herzegovina convertible mark'), ('BBD', 'Barbados dollar'), ('BDT', 'Bangladeshi taka'), ('BGN', 'Bulgarian lev'), ('BHD', 'Bahraini dinar'), ('BIF', 'Burundian franc'), ('BMD', 'Bermudian dollar'), ('BND', 'Brunei dollar'), ('BOB', 'Boliviano'), ('BOV', 'Bolivian Mvdol (funds code)'), ('BRL', 'Brazilian real'), ('BSD', 'Bahamian dollar'), ('BTN', 'Bhutanese ngultrum'), ('BWP', 'Botswana pula'), ('BYN', 'Belarusian ruble'), ('BZD', 'Belize dollar'), ('CAD', 'Canadian dollar'), ('CDF', 'Congolese franc'), ('CHF', 'Swiss franc'), ('CLP', 'Chilean peso'), ('CNY', 'Chinese yuan'), ('COP', 'Colombian peso'), ('CRC', 'Costa Rican colon'), ('CUC', 'Cuban convertible peso'), ('CUP', 'Cuban peso'), ('CVE', 'Cape Verdean escudo'), ('CZK', 'Czech koruna'), ('DJF', 'Djiboutian franc'), ('DKK', 'Danish krone'), ('DOP', 'Dominican peso'), ('DZD', 'Algerian dinar'), ('EGP', 'Egyptian pound'), ('ERN', 'Eritrean nakfa'), ('ETB', 'Ethiopian birr'), ('EUR', 'Euro'), ('FJD', 'Fiji dollar'), ('FKP', 'Falkland Islands pound'), ('GBP', 'Pound sterling'), ('GEL', 'Georgian lari'), ('GHS', 'Ghanaian cedi'), ('GIP', 'Gibraltar pound'), ('GMD', 'Gambian dalasi'), ('GNF', 'Guinean franc'), ('GTQ', 'Guatemalan quetzal'), ('GYD', 'Guyanese dollar'), ('HKD', 'Hong Kong dollar'), ('HNL', 'Honduran lempira'), ('HRK', 'Croatian kuna'), ('HTG', 'Haitian gourde'), ('HUF', 'Hungarian forint'), ('IDR', 'Indonesian rupiah'), ('ILS', 'Israeli new shekel'), ('INR', 'Indian rupee'), ('IQD', 'Iraqi dinar'), ('IRR', 'Iranian rial'), ('ISK', 'Icelandic króna'), ('JMD', 'Jamaican dollar'), ('JOD', 'Jordanian dinar'), ('JPY', 'Japanese yen'), ('KES', 'Kenyan shilling'), ('KGS', 'Kyrgyzstani som'), ('KHR', 'Cambodian riel'), ('KMF', 'Comoro franc'), ('KPW', 'North Korean won'), ('KRW', 'South Korean won'), ('KWD', 'Kuwaiti dinar'), ('KYD', 'Cayman Islands dollar'), ('KZT', 'Kazakhstani tenge'), ('LAK', 'Lao kip'), ('LBP', 'Lebanese pound'), ('LKR', 'Sri Lankan rupee'), ('LRD', 'Liberian dollar'), ('LSL', 'Lesotho loti'), ('LYD', 'Libyan dinar'), ('MAD', 'Moroccan dirham'), ('MDL', 'Moldovan leu'), ('MGA', 'Malagasy ariary'), ('MKD', 'Macedonian denar'), ('MMK', 'Myanmar kyat'), ('MNT', 'Mongolian tögrög'), ('MOP', 'Macanese pataca'), ('MRU', 'Mauritanian ouguiya'), ('MUR', 'Mauritian rupee'), ('MVR', 'Maldivian rufiyaa'), ('MWK', 'Malawian kwacha'), ('MXN', 'Mexican peso'), ('MYR', 'Malaysian ringgit'), ('MZN', 'Mozambican metical'), ('NAD', 'Namibian dollar'), ('NGN', 'Nigerian naira'), ('NIO', 'Nicaraguan córdoba'), ('NOK', 'Norwegian krone'), ('NPR', 'Nepalese rupee'), ('NZD', 'New Zealand dollar'), ('OMR', 'Omani rial'), ('PAB', 'Panamanian balboa'), ('PEN', 'Peruvian sol'), ('PGK', 'Papua New Guinean kina'), ('PHP', 'Philippine peso'), ('PKR', 'Pakistani rupee'), ('PLN', 'Polish złoty'), ('PYG', 'Paraguayan guaraní'), ('QAR', 'Qatari riyal'), ('RON', 'Romanian leu'), ('RSD', 'Serbian dinar'), ('RUB', 'Russian ruble'), ('RWF', 'Rwandan franc'), ('SAR', 'Saudi riyal'), ('SBD', 'Solomon Islands dollar'), ('SCR', 'Seychelles rupee'), ('SDG', 'Sudanese pound'), ('SEK', 'Swedish krona/kronor'), ('SGD', 'Singapore dollar'), ('SHP', 'Saint Helena pound'), ('SLL', 'Sierra Leonean leone'), ('SOS', 'Somali shilling'), ('SRD', 'Surinamese dollar'), ('SSP', 'South Sudanese pound'), ('STN', 'São Tomé and Príncipe dobra'), ('SVC', 'Salvadoran colón'), ('SYP', 'Syrian pound'), ('SZL', 'Swazi lilangeni'), ('THB', 'Thai baht'), ('TJS', 'Tajikistani somoni'), ('TMT', 'Turkmenistan manat'), ('TND', 'Tunisian dinar'), ('TOP', 'Tongan paʻanga'), ('TRY', 'Turkish lira'), ('TTD', 'Trinidad and Tobago dollar'), ('TWD', 'New Taiwan dollar'), ('TZS', 'Tanzanian shilling'), ('UAH', 'Ukrainian hryvnia'), ('UGX', 'Ugandan shilling'), ('USD', 'United States dollar'), ('UYU', 'Uruguayan peso'), ('UYW', 'Unidad previsional[14]'), ('UZS', 'Uzbekistan som'), ('VES', 'Venezuelan bolívar soberano'), ('VND', 'Vietnamese đồng'), ('VUV', 'Vanuatu vatu'), ('WST', 'Samoan tala'), ('XAF', 'CFA franc BEAC'), ('XAG', 'Silver (one troy ounce)'), ('XAU', 'Gold (one troy ounce)'), ('XCD', 'East Caribbean dollar'), ('XOF', 'CFA franc BCEAO'), ('XPF', 'CFP franc (franc Pacifique)'), ('YER', 'Yemeni rial'), ('ZAR', 'South African rand'), ('ZMW', 'Zambian kwacha'), ('ZWL', 'Zimbabwean dollar'), ('USDC', 'Digital currency')], default='', max_length=250), + ), + ] From 590a1b00ff8ca4eefc4e857ab8015d2792c00677 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Fri, 12 Apr 2024 19:08:25 +0200 Subject: [PATCH 04/38] add validation --- .../apps/payment/migrations/0124_migration.py | 12 +++++- backend/hct_mis_api/apps/payment/models.py | 2 +- backend/hct_mis_api/apps/payment/mutations.py | 8 ++++ frontend/data/schema.graphql | 24 +++++------ frontend/src/__generated__/graphql.tsx | 43 ++++++++----------- 5 files changed, 48 insertions(+), 41 deletions(-) diff --git a/backend/hct_mis_api/apps/payment/migrations/0124_migration.py b/backend/hct_mis_api/apps/payment/migrations/0124_migration.py index 5b3765f0c9..6ca2b589c8 100644 --- a/backend/hct_mis_api/apps/payment/migrations/0124_migration.py +++ b/backend/hct_mis_api/apps/payment/migrations/0124_migration.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.25 on 2024-04-12 07:14 +# Generated by Django 3.2.25 on 2024-04-12 16:50 from django.db import migrations, models import hct_mis_api.apps.account.models @@ -12,6 +12,16 @@ class Migration(migrations.Migration): ] operations = [ + migrations.AddField( + model_name='payment', + name='transaction_status_blockchain', + field=models.CharField(max_length=128, null=True), + ), + migrations.AddField( + model_name='paymentrecord', + name='transaction_status_blockchain', + field=models.CharField(max_length=128, null=True), + ), migrations.AlterField( model_name='cashplan', name='delivery_type', diff --git a/backend/hct_mis_api/apps/payment/models.py b/backend/hct_mis_api/apps/payment/models.py index 0f6454e375..f0c64f13d1 100644 --- a/backend/hct_mis_api/apps/payment/models.py +++ b/backend/hct_mis_api/apps/payment/models.py @@ -323,6 +323,7 @@ class GenericPayment(TimeStampedUUIDModel): ) delivery_date = models.DateTimeField(null=True, blank=True) transaction_reference_id = models.CharField(max_length=255, null=True) # transaction_id + transaction_status_blockchain = models.CharField(max_length=128, null=True) class Meta: abstract = True @@ -1171,7 +1172,6 @@ def get_column_value_from_payment(cls, payment: "Payment", column_name: str) -> "additional_document_type": (payment, "additional_document_type"), "additional_document_number": (payment, "additional_document_number"), "status": (payment, "payment_status"), - # TODO: add new column "transaction_status_blockchain": (payment, "transaction_status_blockchain"), } additional_columns = {"registration_token": cls.get_registration_token_doc_number} diff --git a/backend/hct_mis_api/apps/payment/mutations.py b/backend/hct_mis_api/apps/payment/mutations.py index b1f5d4ad4c..68cd4f1731 100644 --- a/backend/hct_mis_api/apps/payment/mutations.py +++ b/backend/hct_mis_api/apps/payment/mutations.py @@ -16,6 +16,7 @@ from hct_mis_api.apps.account.permissions import PermissionMutation, Permissions from hct_mis_api.apps.activity_log.models import log_create from hct_mis_api.apps.activity_log.utils import copy_model_object +from hct_mis_api.apps.core.currencies import USDC from hct_mis_api.apps.core.permissions import is_authenticated from hct_mis_api.apps.core.scalars import BigInt from hct_mis_api.apps.core.utils import ( @@ -951,6 +952,13 @@ def mutate(cls, root: Any, info: Any, input: Dict, **kwargs: Any) -> "AssignFspT if len(mappings) != payment_plan.delivery_mechanisms.count(): raise GraphQLError("Please assign FSP to all delivery mechanisms before moving to next step") + if payment_plan.currency == USDC: + for mapping in mappings: + if mapping["delivery_mechanism"] != GenericPayment.DELIVERY_TYPE_TRANSFER_TO_DIGITAL_WALLET: + raise GraphQLError( + "For currency USDC can be assigned only delivery mechanism Transfer to Digital Wallet" + ) + existing_pairs = set() for mapping in mappings: key = (mapping["fsp_id"], mapping["delivery_mechanism"]) diff --git a/frontend/data/schema.graphql b/frontend/data/schema.graphql index a9211de6f8..ee0f3ab700 100644 --- a/frontend/data/schema.graphql +++ b/frontend/data/schema.graphql @@ -135,7 +135,6 @@ type ApprovalProcessNode implements Node { approvalNumberRequired: Int! authorizationNumberRequired: Int! financeReleaseNumberRequired: Int! - adminUrl: String rejectedOn: String actions: FilteredActionsListNode } @@ -441,7 +440,6 @@ type CashPlanNode implements Node { totalPersonsCovered: Int! totalPersonsCoveredRevised: Int! paymentItems(offset: Int, before: String, after: String, first: Int, last: Int): PaymentRecordNodeConnection! - adminUrl: String bankReconciliationSuccess: Int bankReconciliationError: Int totalNumberOfHouseholds: Int @@ -571,7 +569,6 @@ type CommunicationMessageRecipientMapNode implements Node { id: ID! size: Int headOfHousehold: IndividualNode! - adminUrl: String } type CommunicationMessageRecipientMapNodeConnection { @@ -976,6 +973,7 @@ enum DeliveryMechanismPerPaymentPlanDeliveryMechanism { TRANSFER TRANSFER_TO_ACCOUNT VOUCHER + TRANSFER_TO_DIGITAL_WALLET } type DiscardPaymentVerificationPlan { @@ -1243,7 +1241,6 @@ type FinancialServiceProviderNode implements Node { financialserviceproviderxlsxreportSet(offset: Int, before: String, after: String, first: Int, last: Int): FinancialServiceProviderXlsxReportNodeConnection! deliveryMechanismsPerPaymentPlan(offset: Int, before: String, after: String, first: Int, last: Int): DeliveryMechanismNodeConnection! paymentSet(offset: Int, before: String, after: String, first: Int, last: Int): PaymentNodeConnection! - adminUrl: String fullName: String isPaymentGateway: Boolean } @@ -1266,7 +1263,6 @@ type FinancialServiceProviderXlsxReportNode implements Node { updatedAt: DateTime! financialServiceProvider: FinancialServiceProviderNode! status: Int - adminUrl: String reportUrl: String } @@ -1291,7 +1287,6 @@ type FinancialServiceProviderXlsxTemplateNode implements Node { columns: [String] coreFields: [String!]! financialServiceProviders(offset: Int, before: String, after: String, first: Int, last: Int): FinancialServiceProviderNodeConnection! - adminUrl: String } type FinancialServiceProviderXlsxTemplateNodeConnection { @@ -1383,7 +1378,6 @@ type GetCashplanVerificationSampleSizeObject { } type GetCommunicationMessageSampleSizeNode { - adminUrl: String numberOfRecipients: Int sampleSize: Int } @@ -2007,6 +2001,7 @@ enum ImportedHouseholdCurrency { ZAR ZMW ZWL + USDC } type ImportedHouseholdNode implements Node { @@ -2082,7 +2077,6 @@ type ImportedHouseholdNode implements Node { programId: UUID collectType: ImportedHouseholdCollectType! individuals(offset: Int, before: String, after: String, first: Int, last: Int): ImportedIndividualNodeConnection! - adminUrl: String hasDuplicates: Boolean importId: String } @@ -2220,10 +2214,12 @@ type ImportedIndividualNode implements Node { misUnicefId: String programId: UUID ageAtRegistration: Int + walletName: String! + blockchainName: String! + walletAddress: String! importedhousehold: ImportedHouseholdNode documents(offset: Int, before: String, after: String, first: Int, last: Int): ImportedDocumentNodeConnection! identities(offset: Int, before: String, after: String, first: Int, last: Int): ImportedIndividualIdentityNodeConnection! - adminUrl: String role: String age: Int importId: String @@ -2398,6 +2394,9 @@ type IndividualNode implements Node { preferredLanguage: String relationshipConfirmed: Boolean! ageAtRegistration: Int + walletName: String! + blockchainName: String! + walletAddress: String! program: ProgramNode copiedFrom: IndividualNode originUnicefId: String @@ -2864,6 +2863,7 @@ enum PaymentDeliveryType { TRANSFER TRANSFER_TO_ACCOUNT VOUCHER + TRANSFER_TO_DIGITAL_WALLET } type PaymentDetailsApproveMutation { @@ -2877,7 +2877,6 @@ type PaymentHouseholdSnapshotNode implements Node { snapshotData: JSONString! householdId: UUID! payment: PaymentNode! - adminUrl: String } type PaymentNode implements Node { @@ -3126,6 +3125,7 @@ enum PaymentPlanCurrency { ZAR ZMW ZWL + USDC } type PaymentPlanNode implements Node { @@ -3222,7 +3222,6 @@ enum PaymentPlanStatus { } type PaymentRecordAndPaymentNode { - adminUrl: String objType: String id: String caId: String @@ -3249,6 +3248,7 @@ enum PaymentRecordDeliveryType { TRANSFER TRANSFER_TO_ACCOUNT VOUCHER + TRANSFER_TO_DIGITAL_WALLET } enum PaymentRecordEntitlementCardStatus { @@ -3813,7 +3813,6 @@ type RecipientNode implements Node { id: ID! size: Int headOfHousehold: IndividualNode! - adminUrl: String } type RecipientNodeConnection { @@ -4001,7 +4000,6 @@ type ReportNode implements Node { numberOfRecords: Int program: ProgramNode adminArea(offset: Int, before: String, after: String, first: Int, last: Int, name: String): AreaNodeConnection! - adminUrl: String fileUrl: String adminArea1(offset: Int, before: String, after: String, first: Int, last: Int, name: String): AreaNodeConnection adminArea2(offset: Int, before: String, after: String, first: Int, last: Int, name: String): AreaNodeConnection diff --git a/frontend/src/__generated__/graphql.tsx b/frontend/src/__generated__/graphql.tsx index 71de62fdda..bafd3ad7ba 100644 --- a/frontend/src/__generated__/graphql.tsx +++ b/frontend/src/__generated__/graphql.tsx @@ -155,7 +155,6 @@ export type ApprovalNode = { export type ApprovalProcessNode = Node & { __typename?: 'ApprovalProcessNode'; actions?: Maybe; - adminUrl?: Maybe; approvalNumberRequired: Scalars['Int']['output']; authorizationNumberRequired: Scalars['Int']['output']; createdAt: Scalars['DateTime']['output']; @@ -743,7 +742,6 @@ export type CashPlanAndPaymentPlanNode = { export type CashPlanNode = Node & { __typename?: 'CashPlanNode'; - adminUrl?: Maybe; assistanceMeasurement: Scalars['String']['output']; assistanceThrough: Scalars['String']['output']; availablePaymentRecordsCount?: Maybe; @@ -959,7 +957,6 @@ export type CommunicationMessageNodeEdge = { export type CommunicationMessageRecipientMapNode = Node & { __typename?: 'CommunicationMessageRecipientMapNode'; - adminUrl?: Maybe; headOfHousehold: IndividualNode; id: Scalars['ID']['output']; size?: Maybe; @@ -1487,6 +1484,7 @@ export enum DeliveryMechanismPerPaymentPlanDeliveryMechanism { Referral = 'REFERRAL', Transfer = 'TRANSFER', TransferToAccount = 'TRANSFER_TO_ACCOUNT', + TransferToDigitalWallet = 'TRANSFER_TO_DIGITAL_WALLET', Voucher = 'VOUCHER' } @@ -1800,7 +1798,6 @@ export enum FinancialServiceProviderCommunicationChannel { export type FinancialServiceProviderNode = Node & { __typename?: 'FinancialServiceProviderNode'; - adminUrl?: Maybe; allowedBusinessAreas: UserBusinessAreaNodeConnection; communicationChannel: FinancialServiceProviderCommunicationChannel; createdAt: Scalars['DateTime']['output']; @@ -1883,7 +1880,6 @@ export type FinancialServiceProviderNodeEdge = { export type FinancialServiceProviderXlsxReportNode = Node & { __typename?: 'FinancialServiceProviderXlsxReportNode'; - adminUrl?: Maybe; createdAt: Scalars['DateTime']['output']; financialServiceProvider: FinancialServiceProviderNode; id: Scalars['ID']['output']; @@ -1908,7 +1904,6 @@ export type FinancialServiceProviderXlsxReportNodeEdge = { export type FinancialServiceProviderXlsxTemplateNode = Node & { __typename?: 'FinancialServiceProviderXlsxTemplateNode'; - adminUrl?: Maybe; columns?: Maybe>>; coreFields: Array; createdAt: Scalars['DateTime']['output']; @@ -2032,7 +2027,6 @@ export type GetCashplanVerificationSampleSizeObject = { export type GetCommunicationMessageSampleSizeNode = { __typename?: 'GetCommunicationMessageSampleSizeNode'; - adminUrl?: Maybe; numberOfRecipients?: Maybe; sampleSize?: Maybe; }; @@ -2906,6 +2900,7 @@ export enum ImportedHouseholdCurrency { Uah = 'UAH', Ugx = 'UGX', Usd = 'USD', + Usdc = 'USDC', Uyu = 'UYU', Uyw = 'UYW', Uzs = 'UZS', @@ -2938,7 +2933,6 @@ export type ImportedHouseholdNode = Node & { admin4Title: Scalars['String']['output']; adminArea: Scalars['String']['output']; adminAreaTitle: Scalars['String']['output']; - adminUrl?: Maybe; childHoh?: Maybe; collectIndividualData: ImportedHouseholdCollectIndividualData; collectType: ImportedHouseholdCollectType; @@ -3103,10 +3097,10 @@ export enum ImportedIndividualMaritalStatus { export type ImportedIndividualNode = Node & { __typename?: 'ImportedIndividualNode'; - adminUrl?: Maybe; age?: Maybe; ageAtRegistration?: Maybe; birthDate: Scalars['Date']['output']; + blockchainName: Scalars['String']['output']; commsDisability: Scalars['String']['output']; createdAt: Scalars['DateTime']['output']; deduplicationBatchResults?: Maybe>>; @@ -3156,6 +3150,8 @@ export type ImportedIndividualNode = Node & { selfcareDisability: Scalars['String']['output']; sex: ImportedIndividualSex; updatedAt: Scalars['DateTime']['output']; + walletAddress: Scalars['String']['output']; + walletName: Scalars['String']['output']; whoAnswersAltPhone: Scalars['String']['output']; whoAnswersPhone: Scalars['String']['output']; workStatus: Scalars['String']['output']; @@ -3303,6 +3299,7 @@ export type IndividualNode = Node & { ageAtRegistration?: Maybe; bankAccountInfo?: Maybe; birthDate: Scalars['Date']['output']; + blockchainName: Scalars['String']['output']; businessArea: UserBusinessAreaNode; childHoh: Scalars['Boolean']['output']; collectorPayments: PaymentNodeConnection; @@ -3393,6 +3390,8 @@ export type IndividualNode = Node & { updatedAt: Scalars['DateTime']['output']; userFields: Scalars['JSONString']['output']; version: Scalars['BigInt']['output']; + walletAddress: Scalars['String']['output']; + walletName: Scalars['String']['output']; whoAnswersAltPhone: Scalars['String']['output']; whoAnswersPhone: Scalars['String']['output']; withdrawn: Scalars['Boolean']['output']; @@ -4595,6 +4594,7 @@ export enum PaymentDeliveryType { Referral = 'REFERRAL', Transfer = 'TRANSFER', TransferToAccount = 'TRANSFER_TO_ACCOUNT', + TransferToDigitalWallet = 'TRANSFER_TO_DIGITAL_WALLET', Voucher = 'VOUCHER' } @@ -4605,7 +4605,6 @@ export type PaymentDetailsApproveMutation = { export type PaymentHouseholdSnapshotNode = Node & { __typename?: 'PaymentHouseholdSnapshotNode'; - adminUrl?: Maybe; createdAt: Scalars['DateTime']['output']; householdId: Scalars['UUID']['output']; id: Scalars['ID']['output']; @@ -4855,6 +4854,7 @@ export enum PaymentPlanCurrency { Uah = 'UAH', Ugx = 'UGX', Usd = 'USD', + Usdc = 'USDC', Uyu = 'UYU', Uyw = 'UYW', Uzs = 'UZS', @@ -5009,7 +5009,6 @@ export enum PaymentPlanStatus { export type PaymentRecordAndPaymentNode = { __typename?: 'PaymentRecordAndPaymentNode'; - adminUrl?: Maybe; caId?: Maybe; currency?: Maybe; deliveredQuantity?: Maybe; @@ -5035,6 +5034,7 @@ export enum PaymentRecordDeliveryType { Referral = 'REFERRAL', Transfer = 'TRANSFER', TransferToAccount = 'TRANSFER_TO_ACCOUNT', + TransferToDigitalWallet = 'TRANSFER_TO_DIGITAL_WALLET', Voucher = 'VOUCHER' } @@ -6864,7 +6864,6 @@ export type RebuildTargetPopulationMutation = { export type RecipientNode = Node & { __typename?: 'RecipientNode'; - adminUrl?: Maybe; headOfHousehold: IndividualNode; id: Scalars['ID']['output']; size?: Maybe; @@ -7113,7 +7112,6 @@ export type ReportNode = Node & { adminArea: AreaNodeConnection; adminArea1?: Maybe; adminArea2?: Maybe; - adminUrl?: Maybe; businessArea: UserBusinessAreaNode; createdAt: Scalars['DateTime']['output']; createdBy: UserNode; @@ -24336,7 +24334,6 @@ export type ApprovalNodeResolvers = { actions?: Resolver, ParentType, ContextType>; - adminUrl?: Resolver, ParentType, ContextType>; approvalNumberRequired?: Resolver; authorizationNumberRequired?: Resolver; createdAt?: Resolver; @@ -24627,7 +24624,6 @@ export type CashPlanAndPaymentPlanNodeResolvers = { - adminUrl?: Resolver, ParentType, ContextType>; assistanceMeasurement?: Resolver; assistanceThrough?: Resolver; availablePaymentRecordsCount?: Resolver, ParentType, ContextType>; @@ -24786,7 +24782,6 @@ export type CommunicationMessageNodeEdgeResolvers = { - adminUrl?: Resolver, ParentType, ContextType>; headOfHousehold?: Resolver; id?: Resolver; size?: Resolver, ParentType, ContextType>; @@ -25264,7 +25259,6 @@ export type FinalizeTargetPopulationMutationResolvers = { - adminUrl?: Resolver, ParentType, ContextType>; allowedBusinessAreas?: Resolver>; communicationChannel?: Resolver; createdAt?: Resolver; @@ -25301,7 +25295,6 @@ export type FinancialServiceProviderNodeEdgeResolvers = { - adminUrl?: Resolver, ParentType, ContextType>; createdAt?: Resolver; financialServiceProvider?: Resolver; id?: Resolver; @@ -25326,7 +25319,6 @@ export type FinancialServiceProviderXlsxReportNodeEdgeResolvers = { - adminUrl?: Resolver, ParentType, ContextType>; columns?: Resolver>>, ParentType, ContextType>; coreFields?: Resolver, ParentType, ContextType>; createdAt?: Resolver; @@ -25415,7 +25407,6 @@ export type GetCashplanVerificationSampleSizeObjectResolvers = { - adminUrl?: Resolver, ParentType, ContextType>; numberOfRecipients?: Resolver, ParentType, ContextType>; sampleSize?: Resolver, ParentType, ContextType>; __isTypeOf?: IsTypeOfResolverFn; @@ -25778,7 +25769,6 @@ export type ImportedHouseholdNodeResolvers; adminArea?: Resolver; adminAreaTitle?: Resolver; - adminUrl?: Resolver, ParentType, ContextType>; childHoh?: Resolver, ParentType, ContextType>; collectIndividualData?: Resolver; collectType?: Resolver; @@ -25883,10 +25873,10 @@ export type ImportedIndividualIdentityNodeEdgeResolvers = { - adminUrl?: Resolver, ParentType, ContextType>; age?: Resolver, ParentType, ContextType>; ageAtRegistration?: Resolver, ParentType, ContextType>; birthDate?: Resolver; + blockchainName?: Resolver; commsDisability?: Resolver; createdAt?: Resolver; deduplicationBatchResults?: Resolver>>, ParentType, ContextType>; @@ -25936,6 +25926,8 @@ export type ImportedIndividualNodeResolvers; sex?: Resolver; updatedAt?: Resolver; + walletAddress?: Resolver; + walletName?: Resolver; whoAnswersAltPhone?: Resolver; whoAnswersPhone?: Resolver; workStatus?: Resolver; @@ -25999,6 +25991,7 @@ export type IndividualNodeResolvers, ParentType, ContextType>; bankAccountInfo?: Resolver, ParentType, ContextType>; birthDate?: Resolver; + blockchainName?: Resolver; businessArea?: Resolver; childHoh?: Resolver; collectorPayments?: Resolver>; @@ -26089,6 +26082,8 @@ export type IndividualNodeResolvers; userFields?: Resolver; version?: Resolver; + walletAddress?: Resolver; + walletName?: Resolver; whoAnswersAltPhone?: Resolver; whoAnswersPhone?: Resolver; withdrawn?: Resolver; @@ -26447,7 +26442,6 @@ export type PaymentDetailsApproveMutationResolvers = { - adminUrl?: Resolver, ParentType, ContextType>; createdAt?: Resolver; householdId?: Resolver; id?: Resolver; @@ -26614,7 +26608,6 @@ export type PaymentPlanNodeEdgeResolvers = { - adminUrl?: Resolver, ParentType, ContextType>; caId?: Resolver, ParentType, ContextType>; currency?: Resolver, ParentType, ContextType>; deliveredQuantity?: Resolver, ParentType, ContextType>; @@ -27107,7 +27100,6 @@ export type RebuildTargetPopulationMutationResolvers = { - adminUrl?: Resolver, ParentType, ContextType>; headOfHousehold?: Resolver; id?: Resolver; size?: Resolver, ParentType, ContextType>; @@ -27252,7 +27244,6 @@ export type ReportNodeResolvers>; adminArea1?: Resolver, ParentType, ContextType, Partial>; adminArea2?: Resolver, ParentType, ContextType, Partial>; - adminUrl?: Resolver, ParentType, ContextType>; businessArea?: Resolver; createdAt?: Resolver; createdBy?: Resolver; From 271d3e2a368d0b6b30e6e2a3ebccd0f1cf661725 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Mon, 15 Apr 2024 22:12:15 +0200 Subject: [PATCH 05/38] update tests --- .../snap_test_all_fields_attributes_query.py | 10 +++++ .../test_files/kobo-template-invalid.xlsx | Bin 100842 -> 104045 bytes .../tests/test_files/kobo-template-valid.xlsx | Bin 105044 -> 105074 bytes .../payment/tests/test_fsp_in_payment_plan.py | 35 ++++++++++++++++++ .../tests/test_rdi_merge.py | 10 +++++ 5 files changed, 55 insertions(+) diff --git a/backend/hct_mis_api/apps/core/tests/snapshots/snap_test_all_fields_attributes_query.py b/backend/hct_mis_api/apps/core/tests/snapshots/snap_test_all_fields_attributes_query.py index 40e57773da..8c19d38225 100644 --- a/backend/hct_mis_api/apps/core/tests/snapshots/snap_test_all_fields_attributes_query.py +++ b/backend/hct_mis_api/apps/core/tests/snapshots/snap_test_all_fields_attributes_query.py @@ -52305,6 +52305,16 @@ ], 'value': 'DKK' }, + { + 'labelEn': 'Digital currency', + 'labels': [ + { + 'label': 'Digital currency', + 'language': 'English(EN)' + } + ], + 'value': 'USDC' + }, { 'labelEn': 'Djiboutian franc', 'labels': [ diff --git a/backend/hct_mis_api/apps/core/tests/test_files/kobo-template-invalid.xlsx b/backend/hct_mis_api/apps/core/tests/test_files/kobo-template-invalid.xlsx index 858cb5a26d911f7d311c22187eea01800c6acd4c..c97b50752b62b19641814d29a7fb29576c09af98 100644 GIT binary patch literal 104045 zcmeEucU%VTckW$p8Y9Gm>+V zoD~?-Ff+HO2hQ%EUC+JeyZ6t#zui}t>Uyi{si&&mZf06V9{&_24i3&~9LfB!N9pmJ zd1Ju;iQwVjkl;|_7&w~RIB{`eR$QF3fZ(tHe0pDJRnJWtxamzi>-n+7pXWh@ep5>M zZ5Yu{o0~kZId0@W-reQ(FCvhmws|OvM*pHK8S6GuD`*)}x7mT_lzy{lJs1`|JlOg2 zwGZK1>iMlz=Ji}%W}Y1L!UKxy%k)>raQ#~^-VB-VJx6rIbdLUg(Z}U;WiH+%M-i!G z1nP88J|0X9=q65HK)ofyZ4|me$j+00AzI)~^ONa7&&UTNpPN5-CBM#j$N%KgC`$ho ztn0DYRZnuN`S+K*{Jy7F=08<~nK^GKKWJ|#?+~q{`L%zK&!?jH2hr#Nk;-3iIdyID zA`FO~1{VkC9DvJHdlMB$`)5vECiae|oX>4-{s|r1P(|y2yJzojqKIQF%j~Y6(t$^* zU&50$ERY)eZj?v?6`_XsFnx}Z50$R==yxAq)Adn*I;&SO3RAr)yc6NzR3JW?oXgBl z-bgJKB;ISi^CFGv$L&p8H!6?PR{`X{4%c!kx&qqgGsCpxLmdKBenHLs)cZvJZhnur zL{{_d7VQHUZKdZd_1aI|>H_Yv={SDt8RR%By7zsn#=ly)LmWgefHF}XY%#ANvOwJ zR%8WbH+|0Ddz(?;5wcd@l`)!gUN~X(+zfr>m5^6t#*P7rq8g=?zHuS-84=~nYDx1w zm)H5#d|Sxhx8N%zK8cn3sL{)|FRWS7H2x^qXMuJ$twlG}h!MHtn-}WhtyajJf~y|L zz*1ve{HrGG8uB1|qmS*WGQ5%IuhC4{y_rG-k@NwnqyVCMZo}nf?`UmoZ*Tp(VBV@0 z+0|dA9N)h9s=7|`LVIaQv4&=Gd8a~Wu_TWn?(2w}&EgvmW%TYiYzl2mytabyi&gki zjOr*Q4^iJVq+u>y7eXF-L2fO5)z|#EoyoAMbZTB8GD-d7tjg_6R|p;il+x7x&|9rK zckba7&rlich2T&E*>H=1P82Ui^{X$pSj0|wxFN!{sYFjxQ{Lr6PPCo2wbWD0{>mSc z>JyOgz){SKZK8!$0LJnBO})_U$0${!nF(vuwD?`OTi11-Ni@x%=%A5~?xT*=C9_vF@S$B%!lc>b>^^=TXG9kY%Z3mBU;KZAEu+gGv3wub7nS){d%$xDsOX0uAQ-C;)78eYs|n0qo^8g$DPZ$ zjhFulT&3oo8XqAJ&Rs1WoC{dsoGnakO}W68=Xc~=e`2dXCUh1xX)yC^Z_vRwD1g=Z zd4+;~pfzu8r?-}kuaam|>LCuFFdgiNgsP5PsPu9!l*(;}ZAE|`imZzdAf_Ma{1 zE+E#%{nq*1S46mH^TE`Ye!+%=3rM>iYMe88ON~8cVn^wXp7=*Ld~l^Ev8tgTNF#)@a#t5rtZM2U2JykyjaM2HYtmWPH;_JKqP-IOoy1a?jW;TQgoW?&0@Tc6 zi>jgR2}Sv(hL)(7eu>w?1;+3FsfQjtYL|oS>bf(%IJ>JqVb&<~C1=4<434YVZ=mz& zk}^#G-p8gVpG=2(?z275DQd0T4ym~L^Y!2pNI5@R(psrGo|}U`P0CM%E*i=~efELW z`ktDk7(18H{f#W%2Rvt%Lw_it$A8i4ON_^(1o?k73%T<>`^=l57_wK8S5O#-FqtaD zd(SX(E|2UgRCp=E%l2`=r)vvDIcw9iP7b-v+Y@rWibapC(oY5V_Owxt&q~_9LAH{8;?N{XyQEcG`(}sT zq=~zv>6IqS+2B}tI*I2vhha9aYNR>eyX3`kHqs1 zM*T0ISq20IO>Zl`GCu2U;jE~oy;lgWNYdtSxVvMy*id_VIACM>#t?zTMH+Rw`b(TM ztEP4SQ1`Q6w^MA)3rPtpbuz<*KDAzE|B&bRq%+8FT{fM*R&KCZTF7t=J;-=7e zZn)d>#;wfVryQJYcP6<7Ax7k|mby6q;-RKGajshe8Vyu8c-~Qw@icMpFv*ZIK9CBL zl_#Zm{i4C*)l6x_&u}W4kU%OQ`4HCg_^-d8H5olWivtQBdd`~!HrzGlYltarh{5i$ z;LhQ8KL7J2s+#oh4*}&LwA<6st~!=BzNe-HOq*~uMdBBo6=6xgK2>?o257$zMNiPj zeT_0FDa=z?fNv9YOFUbI^9JUa4SaH6C?-r=HYfYe1sU{Rokg2^HylZ9;ccU3NITFs zc(~DF4YfxS=kfpH2UCe?`(D(_ZqZSVh&a^(S|p24RpSx6Y;H{;^~ip)$B~X0Dvutb z6*hCaZ$*YwAs5*0Q)okN$({4~eJe3q4~-3V>0ZCEbYUcf4un(HXzNzDK}G7(@6^$k z6K4g{xPKiy&OeTNh?H<}%ro$CsQx(dI9ZsQIy-TJfBbg(e5lrorW0(nGX57}E!o~lN)OL*-~bVK&Ha~TX!NAZFXcX;0{dbe57 z9^!Sd@rz*!wOlC(IhtLSsPcHe9aMwbU&(Zv8W^+n+1nkU;F=OcRr;W|S8I-r)`N0| zhYk<8>ppplsMYk1YDe@Lmw>)LJaH;AZXohdOZQG?t$7q*OsA0pf!sEKlf{qF8QB)I@CF?A%SUybTZ zo)Xi~MVZk|`Cwu>+UN{Ro++QII#{h_phurZ@2uDt_&g7hK+1l78g?1dO^?0`Kw96e zj6UcL1I!-|1EvvuXfz@S;yL1@Ugjt|IaZ0@4ANFcw+BHcnkDoOo`0ZVFp%)^Le9^I zO_6T@n~!WfFLNCRgTe{22q2 zF!a`5D#S}c47EKwRhv8o8HAw6YLKYiu}#!2>NCTI?ym|ZnfEJ{MThQJD~npBO)%?Q zq)jm^DTW{#dK;>g8=_yMB8SD9zj`K&EzW3KKZn0*f1BC99z8RViMIVQyz?=veOTOU zXLl!Ki!XyssK8K9(hGNEqfp0f`0GCJ#`B={Wr)a<{9=WVbH#mnaj)kUNXM{yO4sCN zyks{viXZQd6kPTil$ac1{`urO#XbGg!Y|pceJ_?k6r$FoGQAGeJak<#Rjt~K zuE>?h7XNpbL6bHk$=>CtwMwOf&mWT4f3}WtCbNI(FufqQ=2#D2ur@-*Fi6Hw<5N!r zY`P~g)ZV|kAvzcMGT~m-JE6}sKKHePzO)W4KHO=%oE1nrj`NUL!PCzjE z5lnOA_6Yq;lGf|q$rY3C-$l4Q7Ns|<(%m*nW7OV?6nHFZZqRZvy6MBaawpvfFhAh0 zb}E>NG#hvK7pd`KOC`~(iKhH?Cs;{ZUNy30gR)?=Dh#=j==NpXz1rzZk88CPhupD{ z{bB*fhtzhfmd{sUc_l|IcP?^BtM=k)R1s>FRQ6l*WOl&gNuQ3wD;2(TJvW=GR06N97D zSS;gj=_lR_a+q~{xl-RwW&33F30MCDysK1=6>CygvsxD}zT2+H{}qnt2^!)XEft*# z60aKU$%j{1(WqlEN`uZho&JgS5bd1FI zM54)GpvmuDB=_A(nj%;qOw9LQpZ+SJ{vBy3Pkv48iw=0RTiX+em;Goq2(pD`rj>rC z)xZ~rmbD?8pbq$uy`l)#IgWLW&LhPqynqYpKFmb1*0DA}9}Dl7(jMuP`|w1&<}A46 z48Elq>Zpp6ZF|!GwC@TOgh$@`(YDninx?nbX8HyR=^gOKRw%y$h-uVd;lehcGV8-P;?mt0|CJwk5zXy8nthyn^LqI2DxzdtY_@iB*EK*CN=nrE z3)D+7DA)|$mc=;tM?@?7nJeW6H4ZJuqP1f)OO|A-`edt(pi*)qs}oYT!kP?AlT7|R zPyRgZ*(UyCJ%}2#1I|33f9!SAVBy9<;UvI>4p%+9cOwPupH8$E?cd#=x;B6b$VbmE zvVyamd^69lT&vDAce+y(YYyY%+UN1BH`*1gW5BeFeKMNJHS)e9XxCo|{QFls`TT1a z;tZ-7RDg>wgR$WTZ0Hh>5&SzcJxzpy%* zvNK5Gy|)3^#DjIgHU07xvA`z@6wUA#IUwLbiXFT^_}(7UJ`*Uw1CsN>XhYyo!vh{5 z&p}lrmu_zfJhC+g4TqGxCM$UT)@uBVS?Fr+smO}2a@-}a!Q$iTWfG`j5{Pq{jT6ov zdwY9mUf{117$|A~i)3rBBHrG4sN9a#BY(-LmS$)sarNh*%kxbS-P}O!T*9i&BUdqJ z|5WP_O+BUZ6t-H&Ug(e&=)CQ$a3j_m;|t7p@vvY3b7q|GZS&mQX05AQed*8&H!z>; zGU>X>u}&CSLD*X<^aA~%;9gHng>F6w6P0B}oPI@|U<|@l%-stX9#x+(r5$n|~8!jE{nOoJVVY-Mhl)&19z*=i@a`lodZc0-fk6F;*-vR`h0wPFoB<>Dk6mZ%Yqv%ih-7RX1AFR_1s2 zwy67~z{b+p5q3Jx{8XmXCM8UOj8reaDImh{na0^J;%`QEC8ml6rkxlNS_N+rx4PZ3 z)j2i-3MMe;Dam9Bwklw24(?}TDKb{&T6S@9@|v?);vTKkkY2f^2o`Vov5|$+;!k(>$WvDj zsurnW8!$ygEJ*3cqul}p$+m!hr}dPV#F~3thHOWBK+K1G1IygWY*)LgrDVElRb|NQ zY)4m*CHm#=)pkxEbT8+qXak=PSr!}{@|;+J!#bB;DBnjsqk6BGS*-+O%>f|}IG{S6 zIixDn_034el}=O=kNz5N_dDMpne=MAZI6kCojb&>MqesbM#P~{M=Xnu_j@z3aIsR+ zKwN$2$#?(bva+$19;*&6lPY>|Vnq2K-+>B-@^Bmq#vt@_B|3x3Q+L$0pk%!Ao-R<_Ywore?``S7)O(x&AmNBQRg_t6x92gz>Af8L z=e#S^jBfCk(0OP^KSZm@Bq61)xgUlJ@PV1yElFM1ml_MgWWG$DxHY$_@~;wr6FWaY zS&KCGlqPPR;Mx~h=1FEdmEbw$gA{X$4CjC%vDGdHX^TFHDbRBp{*!J|@k(WQSoSK7m5__Kd?%_%bKPM4D_~h(b$Bz)(rACNM019F=-g5t!N!bz8{`-qWeL>}`zDKGDX?M4{3F7@j zhGcl=V&O-CDA$AyU!__LOO(6-+lE8B_v+8X!S4y4LGKcH8hYUC{y}9}3_?pX==9}9 zU{0H7-;;)dN|rkUXVdo4{)os+?upCzb^_)aKJz z0shDz+kZSdQ(9u;1PJ2S07B&VB^_(*mej9WHgAlJ1PF`(?9$6z$1>{%ggf`(=^)02 z?dMe%#!B*}Zej|Hm&_&KZs^u*g=pp_8wsq}))($>KH4Mfdvo+xWU}U#!PI1;PWNm(nF7S280K1GQuN%aH5-Q6UF34aXFm#OEQP8sXrv4C>-uh?XNqrwvqe=ICrWchxJ=z9{-)Lr-J0Dj?>!wv zBMh-MKOyg3_eRFO{^5FG@$Rw_Vy6UIRaMbFHuP{r0)LlwSSodKu@8S|`OM+YX=H(@ z)RgxtanYl%Yg@0(6k4}iSY2c|QXek&74Iw?9q#Y}S13(+C;2Q7p1tbQBG(-01%YO+ z^qIhyD-L%I0jbWEcZm-*M!ID8G1AN6W9C+$$-#2P(T*XiKs0vBn-3BT>UL+w^b$}g zzNP=J+`W_;v;&!EMQ)fJ&Kw-_othO)rRwFNSP!KiR90TiY=%ST-H{vk2)NOHx33t{ zuFBGxqn*<}9)uEN0cbYm88?P{im-03A*Zcwq0;uuNVTnxf?^@bNlnUOvzd#(7AfYq z7A_pfR|`w|YE-u>8^yd&mYm5xs#P*1c@%lnderE}hgR>R!rPCuvm#B4yyKrzUuS}R z!C|Pnq8%xl&zr3)g>$1hhRlTo>~fr>EKr`5ej_p?Ul+N{H!_@g z?rq~c;ea9v7N}UtQp7E){n0ACXOmY+HoiHs#9aj+2Q=j< zc9#c*zk|LCIv} zLUT-{Zm4W7GM)GfqU2sG{x6(DmI{xQn2i^X%w$=Q?*vs2H`}UY3{5tRqvT+6MFb?c zg%^hLF5MJ7N2xBYvO$Yy5L+L>70)!VE57?{HC478$$0(?!o&CWX|fM@3n|qk9;Blp()Nl^qp!pAM;C zAYeQVG)9&RqSTn{0gmR}`)#zu<0%Q7ipHOrB`ird7H~?>rk@6~rW;`FaZV0>6jf=k z((`cl(H%&(R2x02vQ(_4#FY6vX0q<@Sg!XvZki;E8}vE~GjZ%iW0DH7Kxa~%t=#nV%jaV3HqS_GyG~60RAXo%_XYUvI3>yRk_ZDH%@GF`tXgnC z)@^Bba=M*nly3h#fY94BjT%gmUp<{thTlbbUPkb7uvT1EIwsv#fbr;sHfFNAi77{; z?l)IR>3yq@MREbgch0pXc1&+)u3Cuzs8mV5RS89ubW-6HV6G&BZr@q{9=9te(Dhi(WD*EWXOi3x@ zx9)JtP_9HqJ4k-SSv!Tvt0r-yGi#*CnQz)ncZ*mFE=Ll($kh;J<6(JqnT@h9?`NbF zAj@Vu@8d7xB7KkH6bC*g<922&(74o)<+m@4)wSmWc$R_#?wk%J#59;Ey($XwQU`N) z_O}o<<$fd?`zRXPU(xKbpm*eVb z#a&=z(xVe4#Rf9osG>kEh5H&W#7HeWqPRm=0d_}*`dBq4HO4Fu?;gPw{11182NN3R z;1)l5j}1PQ;<-s?s%1^8u_E9u9A~oS$k%e^Sg$ZOrYZ3DOnFi9a*p~g4g&%YTjYURc)uVKbrKjl-qegjyamc9VEn()6R|s3QP5Mc+qs%);5|!RESB!-M1DO>#aO(u%!bF zjcEGZ1;p0om(N7|!8fqT0ox{Z@UkgOih5R1WdB=zVUhG4b%oqJEhh;~ zNsS2%#4{#{!z(F;GM^HLk}$~8y}AMxp0*T^DH*|iQog{%4du(?P0lk?+4!bd4%)In z%Tj&IXLu_SY(BLH4lL%=c3{7P1853Tp1n~LUnTT)YN_w0W}=DOK;4gHu&c=$DFrFH zulG<9Pb6!=C)iw4?2qg5TcGh38saZ!El58!UA0dfsa7NUag0j76$>;s)i-a37r=R+ zyx_}=f@3H}Xo6X7S*CR@1X;~RO7fx1!opC4ah0yx2{8Iqn&4%7mK41d9#WXZ0bvsl z@<*T=(G?<0v5e2DD149_nYmd`r|&p6b5ro_33G*|c-Bb?@`yhzwWW<_WCB}G)utrA zfZ~EJpPy2F;AbRn)7?_}FegU^eQUhV;{<7oQTD-AcI&UyOYSjC6d5XXJ8kr=)b4?< zurUNLd$BZkQrAnmD0Tyilc$~U=HhRHc;@@CKoP0FM?l&?DS^9&65*f161)5^r8>SU z`E!8@RhL;dPv0SzOY)s@*TK5>_HM2VV&{CkMc8UJXTXJ`e8#^i?R8s zw4WBX=f+vz%*pvMntGN|Po*6dv>3B) zf^^8L&`pc8dQE)i^p*M)MBhbO%$(9?Y`KZ)98MMY`RC7j|yu`q#JjraL4Uck7hL6Mm+6S5o}aOsQ{F;J@gPZU)Z`K39u-mw2k)h;Lby>ORfz z_<}`BMdKJLX=(n87d0~|y2XpQ4DO%b!C^Q!Mk<#nCp#`HCCFl^Z={>$=B8}@yDBEq zv=gx6vY-}eezblM?y?@d#DNM>HG#s|8!hvEGtl z#oQ3#tPy~1i9cFRLtRdlX6LIEOcXlDd_|#^f{%ghJR+Lc_Xp8EVt@tLr1@V`mXcW$ zM!sh-=e{Y?=~eP@yc5TRp@qd)y3>?$AX2qo;1jiqoc=~#WYy^QcUlKQ{4DRQX*ieo zFRN;(-&Y+o>-1II(xrgTWh8|SzN)0YyNZ8?00=)IE$)2qs4Hgc%N|z;?6>Z8KQw8W zAWhkM;fn|G<*uqCuC#3szd!zllH2tRXJ-04_)A__lYyP1l{M7GRS})Bxao(AuGgVY znSJ=Ay@c`4Duc2905ZjF#WhGuJf66AU!hg$$l~>vcwA@kcS<;K;^digSQDSOQS)X! zbNhUO=cdT7kGenX2vrVhHE`Lj>~gZ8*=f6Gohfw_txD;UqCROp{c@O)uRpp4gv@bq zphTnJ4t`$-eqH38`sWLkyZ5;@K(m3tR#$ET1R*6HPu#dKx2)8kbXu1Lnt2#!DLADf4EfoSnQly^%7ui{-&=ThxD;PV*QVOot#A|?5Sz_l-QGukw`51>6awjk8bT;S1$HF&794wSi zAwZVe)nq}DY2>-g_j0sHUdOyo6e?l%JH!L#A-}ePhPtdb7Vd`glKtcI2>=+#+P^A4OVDfE0F zHHI(&=UoAv(EJ#u^%is@zqyzj3oSnu+6Vj}uDIv|(CT%Y8Ogc+0P-PDhRMfxrmAA{ zgG5X|hWvFfP?R$JDd1zEh_=*FhpJ{`pnz*!0+^+={@Sn?Oo-x@0X|F7`4H;6`29C@ zB6~0BsC!;t5(I4_AMnFzj%}G7+u8zcJ^8AtcyMg1{!t8=s}35_b@z{P3vV+Mcw8*52QGiX~LFWZMH2RiQ1wj{IvjOEd z4v4z2ak*=#FaC<;HNzoO343fL2XfjM+nU+mo6bucMU(&HS%VVDBf>n<_`SO|zZup*uG zII};AFktiqgK_DGTUkkC3w%ZRk^d~T&BoL|{|+q)KzMop zLJ3fWc$l-y@NXhXaZuF$Fo%`F{m)IbC+Tz(*270?iYBe2byp$8{G9VpDk^#0N6iPIgIU_mdpfC|t$~&| zPfL=S(~+`DdZ#0$9ppP@Rm>VRcZ+ zQ;v6?6;v|$*9cX@6ngsrYo|tLi7`Nrx2YoGYG8vE#3Y(y56agU-y4i!ec;A@8AY%l z;y~Bs)#F$dv97D1G$Io)UONR#C{KpwAMxe^RTK>>t*XUk%Ucfo5pOOqtTVuP^CQh* zYPzM^cxQlalLIttR)B~W6)YLCX^~hWIs!y=49(D7e?6@Y`i{KSxszLBg`u`^^EcL! z*P5Q!Piuhz*U9k`uzkV|Hj_S}z`&+g0J?$Dj9b>mx)FbJ1o6P)SJ10aEtiYI56cWp z5#@pox_&Sl)dU@Ef&vE(fB@^SuVS5;zttIub>gkw2^Qrb78_cY(8n44e_&w)V37|x z(XJWCs%_c%2Nv-F7FbhuAIxByx|mr5;Ef5Rcj99A=f5Czuz`_K?!kfKw zr--k;`Q9-FRlV8Cyx2jtu#8yoD6@k{Ed1mr2aW$%lDIhF>;f>l84K;BxMdT|sIZr6 z+t3p(g<-i=#Mjr{%g#WO0R@A)4=>{TSp-50xOVs`Zr&udKN4ss?-R4cqX@+>VfZ}W z+^fJKU+l#m8HX*9f#%-Yf48LG1+=@aBEJ7}L+O)LF_2)&bi>3F8kV6Weo3w~?RTD= zeLo@6zxzJ|N7r} z{*Sc|fbhE>_4nuVa&}QX z%I@$H3^Rk6fb*NCDWRTuj}alA8L)^Y*KwP3=K(jgHsG1cVTqKm!>|^!%<;x7kV5}B zeJUl^1yC!*0857#VZ5+^XB;kHEp`wJCe{%ipEBFc3*&i*KVdh#HsHd%amSy|413B< z>YnB{fA$D-G=DQ+z>;uNb9c=M9F~|#gvrk~gL&V7h zB?r^B158jw2KjPef{xAsXJ@d9_=9axY_G@}n8+N!L>3SR?skNmdw&No*q#55l)%Y- z=HD>9-p=;qfd01}jyVJO3gFY5zxlBK zTc!VL;{O9km{ZknO9Y%$e+P-~w+@Q@mMyL)Hza?{)Ot^1RyGofc@p?Hlxo1cx_=GQ zKjl~N_vI1&`|`ltTK;o+xc-Oos608${=Gc(e;e@sP;xKlpUdN~C(J*W$G^@Ee=B)c z%ma>pE)VPzn1AdpLr(12dH(mJ`p;T_nu~v~fz^}8Hh-&|zaBCFRBP)Vp)b`uLZ$zy zLjUu2ze(=@2Ld|;{y!s*r{O;Xu_F>BXSsa#Ye?ztFVs^uM}@&3%t3AYz=yFe*0tiX zdu%*ihDKyOR=Om&?hyqrG)g*=oh|`$`@K{VkrA&Hl^+*jo~(oHNW%BT+5N#AZ!j4O z+;?t_%)54sx@F!!*w3goP@WL2Y&cX`7!-Z!Di$wQ)DH7{k=kA+%HynaheRqm@xor} z?zNqEgYkBYP62mw-2>54rjLnT7MX&h%OS3Jz`yd29xzaS(oq{I*jl@gyWU}9Muk~&|Wj~^90P3b;AU7W%%@ z-TYh={Z%{oIg1a=yniVwn^4s1gTLSW?qnn{_>zN;k*yit^MhBZm10O~B{kRO#C^ds z=f2_Iy3hBdQZ%BksaUm~Wg^AZcRXcE0%YuSMtoZodECV-co{of<>4MnD|#m}C2~wS zmpT8;>p5Gyp2@op?~#&7A@KW*dB`EAUFNJl(mUX{MLO(c_=h8iHtuyc{1Db=c-2ZV zLIbg*cra?TZ#+cI+n>6H{grDtLOXETfO=XXm6bB)8~kDP;`5@_@7+PEmp))K5;9(U zTLHfv$C_9%wU;tS0hiNN?C5~I|KrI9B98)>4XLLUQ(5`q?nSfKHs&`=Fa*YFVA0@l zBxwh}@r~cX%J))9J?1vSmti>0QoTxa8}{>%4>pXbp+TnOf&4Ee)qB=YUuJ{R5h)ne zQW9d82jVX+m5g-NW4K@DjGg1uauHFA`4+&cfLS`ch~tG{cE){s0P5w!=mcZF5vmUx z64NLcwPzN_s}Fx-UE?E|2z^$RGv*M)y2kyI4q8}Gx$8w7B>b{I?i|m`t5 zOkQl9*1|k83K?&^t-#jKqUFZkPZw|V5cViy{ZWdDUo<8^H}*c0_O;&*9-t#}X=WM= z=Nx=0a%m~l&d z(S0&>TS2cqOUpe^gMOZtU0_Di^#t;3sPNT3yn!2q3X}8dFw*f*m1VSZm3MHIB zN6HD}TW1UDU4`%g-;QeY3aYH0fzRGy@EKVgt}({+t5VWUFZm z)3M173`mt2Af_EbAoMuvohw4jJ~Tg=cfe3-%tZvqc08C+J11&rrzu~qsKBi-Kw~0Hw<+3LA22oy$9tmlgtg4=BK}m9Ti-i z0cJacCKCaZun;?!W~B+$bbCM(DFkR1Vl}mZAWt+$1*>8#rXB=soYub#R_N+&g@X1a zEw{CPy7_lE^c5QHKT5fsD#kkNN(~(`b~g{91KOu-K$D+B8;X}@-k!pLzOBpmf&ckTlx>mS4^fH$YIyq z;{5YvSl*?$gQ4(q)%RD0*j;S#nWlAqNY6*4_g>|iBpgd4{lIJw>iV2_vw=?UIL>H$ zhP1}fs$7@c1Es5g)RVgYR`|zh+Na9j2HF&pNVy67WmLX`M%w_R22F)lb6I>u;orUw z(3^Z_CZd$>!AeJ?jjRA^@SKGZ(MZIz(&m`8R$R^V{ahf!4ozcLqIvRe3E%0G++}>S z&co#CcsKSG5?jF#YADK-G*=R24?$H*RMq2Bc2Y3$$EcYNeU1@BS(cv=#w+N3O74qw2~8snWe8h z#6Xmk0BDkcn$|{v*)OU4Rw6DS(qGLkSmWh#%RT;spN33L7Wv&7&dC6usa8s4aS;1$EzTHV)ptUW-nmP8V6>-#+rTF zhjDlr<8TgE^CGW;=CNk{hU`j&-X0@hvk|lj18f>&ZD!jiC-*Z~Zpbc0q=bM>`M^`J z(G+3{Z+-3kc@@BR1jN=Bi|t!#sDPP5uCme^WLSn~oo_K{(a=(cH4O~{tyjU{%R0cMlNNT8>nT=NRc%kx&Wc=I1^rVuJ6lFgx zFmXd|r0Q(E0=dd|!_4rk&IjIV-J>=@(m6o%b4>%Yqp0Htm<87&Jci9aif3oq3IHfZ zgDApp*Y~%Fbgo3u?8=JS6{{xqZwp|;?Eu3K2EsLKvV*tM0pWfb$yQ!@5l;t%YX*kf z353gQQhqoW>aC_cz6ONb(n$`4%L|5UWfqeYTlCo5u~|IZ+|CsUcgZXWNIN!MeqM!v zj^R(@6(-63>VhIbxUR)g$)_f;;l@)#?G}KK&)_1`lPWQ0>j1NJi*>U4F$7__P9Tin86|ZcyUN9H+9xXsXhN3bR{Qgh+p@ zSV06-!fZ_|alA-rV{88-=8A3!yceY4$IxzEZXs2_%Ilh|wDE}9%^jy#$;C06`Ra?i zgy2WC!%3b7vc97Z(qyK{i>MUETTZ!C(SGCI-K+SRkI*)@5Ztb(Yze8)i69zm)k}Ke ztdclBe@*7}H;;+tKqj)Wnr9}UkS@NHhrFQ2eUAEqdogtbaG2$Gs)#)WNaS(cPr#;=JU!O7xGIDJCK`FpCOvodie{gn8g{ z^0CW78?reOz>*b_k^*w%B452m59n~UsE!@b-jt(&QeBELOa;XpeDx)OcqO7a6lj1I zeYC(gMUqclBm;e(&0%3w*+G&Y9XWj`@#z?)uE|Fg30|`>4z?VNhzv>Fg z-=$)^9YpMu#f@F!x>IAFECy+>bfvb@Ug=D2rM=RTT8CY9#e?j+QXe}l2?cRFE%60i zb6VmKB0pXZXaj|Vj5>{g`J+r8=fBa4>qNyJ1TNv-MsZFtgS1Rtl6!OMKtKuHL1&y| zz~z8ez==GbpXguB+|ggyhC7ICp|Fm&%!|BIIA|gce-~)-?+<~lT~SZ#8dFd1G;Bof zDNeN6I@kAkw1WmCK2NWRis_Sfuf0l6)qv|SWO&v+m9J5t@BCPY-%GV4aZJBrms1%7 zZ>)HnN;~-m1p3rKA*lpb`0hkl(aAS2(Dxn`(jE(YPK4E+d~kujUQoz>EId1Yylq`4 zAAw-s`EiU*QBb%ht8yZ2?Bu&B*r$dO0gU-WZFCx-~AWK$Z zJR=c?mDp-pD2ulowS$^gVuUis!s!#?*LcfAKocXJdncxotxOJRRvl|L#amvnhniOX zSvY+n?25O%V-KDGi_oz8SaUGmQWwyy#%T5c^UiSzGw&v8fIiO zVQ}6dK-BGOVxdSg-Q9SdB4wqCh<@fwOnpw*fT$w{i(|cex28G*y&c<Qe)S5n{l!vjaMjAGVEk+!X4IoK}$c;{|A|xcl^@ zctvZ{DKc`fL-GzyE2#VPa*%b|3^NOkM7%wmWAZ$IUkF>+PXc%q&vljD7b-SN9(Pt& z!z`GNL5?9%{_!6zZe=p&1+87%}Y3{lf;dm9(XClPT=+c56*DSv=7JA8CS2tm# zNV)9=EqE+qeB}UsmO7?_$~?|E!Sc0(S+h7Rkt3FwDNV;Lu}ZMa0gN{N#VGBu(RRRS zb8HkX#wgH=S1=1Ovzx(K;6i=Z*C#)y$RGwCCqE#KQ6Yj&bB{iA^RDuKCQuA=z~w+;p!( z`HfoGobR<`bsEP7bE&QZvTs(A7QpU|i{g9kXFsz_h9A@MqHv!E;C48#YPdRFft(d^ zuN7DNn2y?W3hLp!9MWC)rIiMFh0}ozn20EakLeiBt0>)7LMeRVqOfN7+`H?UE3vdH zbH@cD4b*^epW2*)2HRn^(Ho#q#(y>%1{w|jyHS-K0Hk^zoe0Ad zhyxQWuQ)@KjXRQ6Y+P|AdGP=5YWo4jfqE z&mpiIJW!GIFvcYZu&s!7@d145oyBN5OB*X_Git~dVyWbsU^(glHEmAS$o8NLGJ#!B zmGuJ%imAg{1@%x~4q@^P`b}kR;JcyH_rgyJg7v%66bq#>*R`XS6PrxNexri^j1?`W z_dR*btH|F~(k~S0QFZ*K4>N53nPMEiA`ZF>^s7CeA8gETLJ-l>z`L~|RbGh9A>i#` zofHMA{e7Y;k-`Bv{ z-ds@*@>gfPTQX{a2_a(4%! zj7BCy5EES5UXWj5X!?qMiLc(sEh5;$db>4hEFR*$4ZJqs@E4avmDk=%O%-a{o(u9E ziL^%{gObt6<*DsurmvMXnVTro!g`IEcPIp%jDr02g>pnpD^qUmI5-80gui>C-0k1J z&NLmV=*HOYV)|xxs-VX(H|Lj3%(|_?mG>K25zH^{GX5Z8#IyZyU(ex*Y@Xz2xjiHz zx&!}VAR>;?cFUR3@%y(4+{e^EV|Y7`HcP%GMyqf9_tgPvu893ar}G4%dn4YGX`{S$Z{TxJ0pP5~sv2hD}vssvtC7gmGL zL?btAkYN(YTT>GQ2FRIm^lljB&?8?0wYrHKVu1YW`+mLoa29=7Z;$?!T%-4`20f-6 zbhrmOnt&YrU_fmEuELifUyo`IfGYrU|B~pP`Z}l&`IQUVueASIP=i>9pnfe#pgWTx zk>~@&6j}m;;tE3_?bYlbUO@i>UNx6Y0ok9BkU(xo_#m3?TP4uD2B=@a8`Y9gv_6MO z;Js?AVeu%h27}gXn>Bi~2NdmWUqgM66B6iU12pRLY;^YE=wulD2!S3)?z*A(YEa9o zMO$2t4;rVA`ha)$CHtT^H)ps|3wvmUGI|$&KFJ3G@j=)d1VJj_kFBlNp%c8T-$5{z zevP4#@euR`#LE+dAsVrcMlULxmsc9>zF!$iUROrfKoILg=*g(&SstADzcnzT@wY;T|Dy54qO4zM!^TeYbpk3u;hN9%1w;U+Gf3(F7$m zOT>p`xQBcA`vyBARQ5zvQxKwcuDE*V@{;Kd3T$dz0CTd zW-aqkTjbjA|Dx@$!=h}y2VndW1f&flmQv{kVd+|U00HR+=@4lt=?;~Y7Nn7m1!0jc zkrG*2TvF-oSX_AT#dy@u_xF4MdarA*!H^GKk2OXk~NU{HmTaLUHwsQ+Ng;IqxVk9T)Fj#;JJ%TyBO`31pq8K)RlG7bVhcD#KLn~FdEnQkTmB9PH?Nm%txwI zAHG#Q22lUtVE&e6GOFqmL*vKr#c`CENOv-1#{X*z5*f3BGJZgWis%!NWAD2rFud2X zaf`CAu>YG+@66fJ;YR;FLIP^P?MXT57#wa7MPSDuOkyP3@=1+h6<(jQ!|k0Wu?y^- zrm>Ulw+HQ%$q2$Q#LOmCpU&QYR$I!ullw zR1SyFr(1Nsa@3tp6UuKgc*a^V_2kl@B5WU=kyrOiv~cZKG079fQ85U~J15QG>ESiZ z*`IfhEznb$pXG{sz~I@Wq;0sPs`Kq|Xu7Y;^9b2i$(|-bp6LfVknk5C%bdYIUqFF&#*7rN)1Fi+p37Z*W4K(mq>UeAc*|6-oCr(~dBTgs5FHu-Qmr=K>L7SG-O zl&PefQsYI{J!h_-V0saG8ioln*1kioURxL|rYdF8lQ40ZQ*AKbBI$*$^dGp4Uo z*wwePEXuALL4X=tcM2FW9ONBv^Aj=%Z`hCvwDxZ3&3l*_~S` zMZ-7-=dGJ%3Z6Lg<_!kRibTHMv^w+bHxD|Q zvvHG(ySI9j z&_cK8rnX{d5wbc_M#ChA1>_CNp?Gf&=tXVTTlBYf3&?k^JC z?$3AZf09UeTtGgroapz}fUZ3k3DW|P6c?AZcf@RLXpQD*ap?3S_=(4 zj;m3N3Zt7^8%Cp>qpC+XrQTW%IyK(CeZwRv1>`&`QGSZfPhxWC_e}8JDjprBHs{V! z_@1Vh=1;0PLTSYDAV45M9A?=yB4G zlgOZ+d*K=tqg|USQ1q< z*fY%@h)0pHfOzb95?l#oNTlV*RjGJLT-+TsSD7`$m>5D&vH##Ii5jo9%+%S2YeAvYF;H>;t6rwY{XL(vO@SUk^SMCI6dFR32RLkZ3Mr+=xq`P1HMOxV%0RtHa*mixbF;~*xTDmr0Mn9@| z_|DC`aaQMw*HCd4Q{U(|WMqJ$&A;0du(jfCU46RH1JIQ1e%7FJu3Xfi&w)W@A(zk4 za@L?)ZoKTnC{B>r($z5IC|3TB1T&AQa!}JEOW42$%9eN~R~uX(Ra2(-A*9S6U(V%e z$HRr~5;D@v=@x-9{o&ImSUaGN6Q(!>8lmPBws9R=E*+G~U82I+S(}+_w88rVu3xP< zaJyMn0t+}sLI#81)!NG4lDvn2EJZPF+vnyBX&t-kO);mG;dn9u7Et}FbyJ=eTS-3$$m4%s#Z%GMB+RpXW;!2dB3 z&3HoU#YMB@;gW3_{Cr8OL3WvV2|i7@n!aSe^?s;fYs-mF89B{?Fv4?j9vzof8LPs*gZtaD<}-!ha_nCF%?9f;PbOTrDln$T@XUUdoX-nxT`TP4D{;11 zzO80lw}g*qH~Hga@{Cx0TSSA3Rc%V~&?U6RC!5%WAGfz;_U{`V;CR#&WkNsQy=0pm zcm2c6nX>p?;YP*098DsOVKfmFBxYUxwPVR%?(xW?@l=LfPnWVA`F|U10XW5Aoi>#5 z$%I`-U!)ef6lNpaMU8p4xW)gj=7YaO0=DzH>i}l|5p5$JkX4K4ELu zk>$KWz1#@dff7Yj)+3(B*=Q@Hc(6o??7FVq?Z9ir$s2f{2|oE(9^s3ReQMrYc`xCp zrYN8kZyg>!vBlOtW0i+Y=yXC^=zdKe#V`xuoAVcR@YO) z1Qi4hc!`X- zG+VolE{_)2(u%?k+j#5D%IG&@%n|8G@g~AkkE2!NInGhN+Mdjo^t+sD4 zou!NEMJRtM+|VK1zmxIb{Pr1C7h6PY-R+vDf1`cZmSNQJc*M}-gQ1{Z6S04`njyi- z4g2j6S5EF`rrqO-+5`h4RWO(gROoOWea5^AcajC42DUe`LI){yxACQ+#Jlku-b5xT!Om?>l3J*Rv&Rh|jEO z?R<`Xg}L@Eua@0!6L?uh+iB{=rY(gL8N-P2A!4k|dg?hE94}2eys!9=siht*yI!|J z9r3-2`?h*g>UQALrU}ZK&6=Gcrh|>MhdRjx?2X6~PY=7Bp~FciB%v_XA_BE5KF3|? zIOTU~{*CNWyowQ8G#WQ)ysrcZu(wS5 z)qE1k6{l=9C&mG^l65uk5#g!_5C;CcXd8tu7bDyDHr3yAUDh;oz=K8H>31U z&VKC$O5st0XbX5<-&+MV9KL4{3AAMO`Rm2F6UVN+@2*xJ{9F7p`G z*<_L^h>gsq6$}S%svra7W3~(~i|$J=!-=!6i|t*u_LN&rd+8N)vA@f64!$;Q-f{F` zfE{MTi!qXYCwo;S>!-xq6rcP%wCv~nt>0iZxY@b(mGh+NXT_YR=IsbsmH!lmOzy)d zKNRV~mZMmUUXJS?lyhqIUheo^!)#UcLTZ+==#V!|F;5gf6Zy6V0E_bV$X;YW8?%qa z5%Hp$8VSD?^_x%wN&|#Ka_HC4JrdbB#Q-%m%Zx-*eV%G+#nkd`=>J44Xw#}-^` z_WW(wzA(y`vBEpn;wWj~XE?ETd2w%g)yH?`i#uiom-F!-bL)aDw&IS;y?@SM7S{AN zeB+}rS7<_{Wtp~aeCE-WITj|4j>yor)42zVhdWp ztooBUZtFENjEIphR54wrQEb2=UJhm2Z>RH`qiA9nX}Z2ja~8QP2g+E)kJ$@dI%&uB zoqN{2eb3k<-*G*=nPIFcXDWCJ*&gg$fR{A_kG{%Ky%{K5XP2ibr6R^${~}KI=;DA_ ztFk|GN^ool&xMU>bA6G|4VIOQQU;}i>#g@6NFg{9KNW}9eyyl4KyW?8pUJKm+@`T@5c;@O96^FUs?mDYyZPxx z!P8o@!!6y@i^&rEiuMnZYnKoEVBl&x^(c;eaE*%tphg+EZuTiCB=ydKa;{qQROhk= zVVPXvF2mu#A2VjKQ}mZ5Jr0M-f?;JZe$1F#ePI@7#+O_LOQf6Qc+zg+#*7k;R&C<* zNaTlHeyx^@`gY0hhS5nRq9yHbo6V4wgbU^>8FQX92uPN&p|I)ai$82h-8=WAA%Kl;G8O)nQJ zq&aa`J5U{b+TB-9H(Fy|OwLztOncU3jVKV^)k?4*+|TX-tbARBW!_)xxeyA4fm{f@ zzFjD(u_E(Ao-S3zd9_Kt-df5mpJJJ`Fs?~Xc{thhFXy8qLYLGJ>0aKv%$E7zK?%qP zIFH!oKJD_(g{`1pfXsTYeRTv>d^7uCLuIE(yXxmuSN%{8=-5U^g^{=f>)!b94%PV8y$YVi zil4K5_Z(z?mU!>T{Y@mTlV)+8S@;`5p< zN!~2dgj)}c*Sv1|TbA+VLrLTDevL@enx_b^Q0UEFY)7%f1lZ+M5s}Er5nk(ksPNdS zx(i2UJr3YYn<9wo|A$ghIH?BlFG^n4m5KOevXd-PtO)xM@f!FI%GB})@MS-@(#ODo zU7|5#B;>#kF(h)|^8kyTW%%c82xI;5Bz%thC7#DOZ(lgoq}NF}7@2?QJbMkupjlAP zTzrm<&mfe8;v}Ri=x`8Pg^HV6VkBm39$%j0sGky0l)H!tb|x{d{k7q~MT}O}z>R1x zObjIknKXsxr12zW;r#h_V%5po@k@B$70XYn^ncCC_cOOO^TQ82hS0{D{jSCOI6wF* zht;jmSL|EHmM5Al8_I^5sIa$GrEU475EUywLo^xw`Sk1d)>C0)e*oE12RiNAY&S}M z0Hi5|`yCnkYt+sRYSSPjLivij&vf||bSU;4Hr((0>CI7k|A-^Sy`mRVbbc{U;cq*X zb5OVvX6Jki_;Q8|kj&oT3=C?87na?8#db$Dr|)uM#>ZEHEi+1G{VOhV4dLzihX*&f zTo=vi>`kk&MB; z^ozt5SN!S^cV<{})GQkWJ{LH=(0XD>Mq>S6D0pwwQLp505tn||(k0mP<52PKJ@Jm* zJAz}&0Mn9hFKW}LFP$s?WZ@gyEI=Ez@Xr!a7BU?O$KQ&UO6pAJoDOOE+ zEs9mop;MvInn9B<6#3opbUeeB*e&cY`;;MPkIMhs;tA*Wk1_T8IUbU|Bhayi{^JG< z7CJ&UMA@#mQkXoobcgs6YnIlpc`1Q6@O%Cl`F&X+-=Hm>rG<9T`;HCt-0 zT5oXt+h1?zd!GCMKWrp(Xpk0F0~Nfieb#8dz|1jdhJWG^xM^^cEjvw z8@6k_ZmLtksCH@GzNMeJ!aHvMR*za-JpDs?&N$Jpjym`PX5ZYp4{M#@+m0t<`r_@# z*)6objhH+hF07imzjGtzvtI-c-|8OxyNCaMrQRJT85tk{=8*Dv(PUd<(82EiJj8ey zP(aBf#N<4yi;QgI_yrNRl45o~%LY2ALQU(pcZlrH>&A^t zx$#5Ay4_E2eab;ie!Tr<1Ni5S!S20W2qkKXvhc)5bS{N2gsPr87P9}amKw`99O8}l zL;vt2mafHN(J|uxP(suidfa9uIAJpUDh5&d`ZZHCd&5`6b^~M~N1C^PZ7h##RX2224{uAhTqOEFqAY7A^##sl;Gg)+2@yKDP@ZUx5Swp%L!X>|o&?0gu(If7l*$^H*g* z{6~n$^qo5k2<#rLvw~gGO=$F*Qq7p&p@NvB%ZX59R&D|EosLh+TB2WF>JJc{a z#w3HWL45G6K#%7e)O5u02C_7;^bcH4xBnbkhTd`!mbVRDBRB)JKe8xxV4@=Cfw|&} zIkAsDw1Ry-b+t0zYaM$iyOC(Y&EwS7<20|t)(dk*RWV#&cw{I$$>VcB3Ql3JO2|hoJ+iK336&T?9m2|GvC>z*| zOqNzUG8v{$-GsY_=btvNFnrp--oV7+qyiWOs2em3mkde+-i{Bt(;lgK2-=uLfT0jf zNuoDE|Zor3Dmu7>w|Mzyr3NJ4D~;$e8LN`3uCdHnwfP@_e$CGl95G>6Ct08Sf|=ydz8H3a4* zQW`qml3T}iekUw6JLMvI35Uc94PrT8uMy4%U=T6S{tlvbFUdgzF!2Pl&>&fih1px( z`ZXRAo1w!k&y+@%Ftilf8MI#3X9^sX&vLtNP2EgV7kD3yrT96r5i`uCTdDDs98SC@%nPwWn`GL z!PY+Z^?fA_-+0Lxdbq%`q8d|1>vCh$zB$two8}A)qo2C!H~Om*xbIXjcH$SmFkyA7 z*i;&*=swrj+8=w<=^$oM+CS@i-6QkzwA>rH?n4h2fIqReWqNL5+(>1N-1ycX=yQs6 z624z`d3A&Gklc8$buRw`&mjX9s(i`#$eu5~bqf=3C#ZHAP@s#R^c&6K0s52E@xzVQ2at zTRX?UgzQ+Tic*lMV0Xsyi&$4h;Li5a1#EB&Zi9bK>n-C5J{(U6&Cs$jI%)Z z!RA$zW&S+r^%xvlGbgHpyM5)KV#Oq3!GP?d=JjDJ)+ZPhzCr8%OkAtFVezn=GgeH+ zZ$Pz!>N6eX#~qA`12Kb9r%fkk_?!j)MnV&fz|7Gx;%&dtM67SvI!zVM_tP(Y9pB>5 z^WiLAJ(0b-jpx-@tg5xRsm;gVGSm`-_!+&eaW)R#ZuwiMY4%8aTl-To9XJ;zOE*!i zE~s*ad+iL|o|zsT|5GS7v{HDD z-aEGO-`d!-nJn6cXl@}OhgT;2+VaEBD~}h^l~1utsbBY4^s;jQUj&MTjhR z_6vx$#Sb(v{-2tTx}nb~*RUi9Zya&D;DK(J%ooApbVs^7PATkpUX+K)Bo)#-t>zZn z_#~E%ue~pcX zFuov{z2hwI3n4SjaRkBHo#2-4S+2Xs5u?QWO&(qdYz(^K*6v%}cdtYe{6L+qXL-g0|`TWQ|OlyZABqT5vS{Dn=iiMH@tntn@JEB=* zV5VW`=TRlX?roD4B4-Z2U`@)K@Ktc23%3&y_Q$qXA#y<+%%y<%e>xQ_(a$sEU@n-r zESNwROsbXXaM`m>wP?nJI|4rHg~8hVOnt`s=V)eMi*(c6MpUTmprpgT^?-GG%%EoP zOgf*oJ--%wlMb6rmOwjlwgL+eu$e-z=&8tUNXIPi{NrdV1P%TY~79lc2%1sKY2Gc=7h;DN`Q$# zJ7|_&%D2rLg`dSbbPe|>xxUmZ-XQITIWxh?>H2MJPd3`pD}+fu^U+K?w?*8#|B8+H zl&K1*D&2hGj84BOR{QOxdSl^xVRg7&LoUUQ@x1lG0?9^oDB+J~9zM1H{4iNv|y0WlN2M}YHe?iSCny2ZrH z;0`Azaw4LRHd8@C0-W%JtNV^0s8Y4s?p6Y`+ z0Kt8fxW9Z4RU0!m zp~9&rE+k?XwEzVtb&Tl}8JG+GDtPp$YDA2ZxW9M)M9~NFK7Qcsq3Zp%>+HUWQoN6I zzUhdDu>P>bFqC)9z}@^kZIa#O7n>zF+$tWV#e=wv>1fKWadv}TuJOAL5v&uJs_4Eo zGIf89HB2gvM&x*v7Sgb>u4gSkgOfUl^u?1|X%bkC%=`x);S@2R=6J7DFnaLGL=sV2 zH(9RbD8Rf29L`^r=;#^VYc}xXyvF9pWjJ0TiNYHp{?4B1!_rzi!&Q-g^Iqis;82Ep0ox4e8r#jjGS-MmteaN^OO6KU!wn{-k zQk~^X;Ur z04n`yN<}1ON}kQ2H1U>EBZQ5z`ue+wU=KaR-XrZ*6kQ4#&fXUjBdQM(!JeLdV`X;m z-W1QB6wk-pTtthVZH>p1jUMnuj}MJ-Xz{?P9^vV-Z)MjRXGi_jEqE&t;pKrZvwCC6 zjeO8Pom#4Y`@EAJ*skPvwp9zJBmrY?Bf1&+k~HQeDbDa06Md@t5d%sQI7$&+{BLti zwT>2#c6g`BcSv@rsc=wVFl~gglCq4c_WM@Vo5$51$=g~QAC~9`1w6jWO@y(?VKDA2 z$zhK19{5071+S3fT>9#ANh1g&|7!nMRoYeJc*m{ehL+|e4?N#mb`#6q^fC1})QyLL zg@Q!W+q{Es{qkrXmW0)K{}Pu*YhR;fiN4L@hZc!4%V(Z1F^uv9l38Xgdnfx6vXWUU zabCiqpBMP6@-o#FMP-upgGyO&ZC++2$+!5IP5Ak;%-FKP@&n3POlGnb{eLxqPtt7?*37EdtB*` zVsXlXw|2O6=zLi+Gr~TC9v4+%NQSe=;g#YATB56 zec+HkagY~x7`CC!6GHK6s_WQmStfFv+gyP8D8BW&VPLFmz**ps?AF{; zKa=E)+hxyjFn_ud!!d&&tRtc3k+pqq?pZr;C>dVn__+AYSoP&hK6S}Ll53heHn$d!&{4vr`&jc)t72t7I}h5F9-cbt|CuVOx<*?rNDn(uNza#ML6 z+z7?Niy_Hi7S-^`-uCp}pydM}UwMJ?<+Y|Y>(k`BWL&SY(mv-X*^64XlPjK5DA|vU z$SS2jP)^EUEqOvBuKqSNLr#~j5&5hgGgJ;wg(QQeQT4d7`H(mjgS@O-vP**SsqtB zAur$!3w0{q$NUfJN)&DR(bgI`Dlh#)Xe4rrf>VVHi{krUY{<=yir~?*OsWjz{_Cu& zfdh8?9hj?dv9uK=lfVTnB{d*l6YAaS>Uy+HoO;CQ&Mv)6b z!v$I-^m*ii2IJa|8SFDRrT&qT`{?SNKYBQqQ{Az=2k7oJjT+yxFnH^Ojpt0S7g zT7INc$1_6xI~Uka7s`Y;Kw`w~V`O}aqjX@RValN5X3Z*CEc`?hyj*BAqPEkT)TuU_ zIakOk#Cm0`Aek;2&!{PP8<5LI(Z1wc`lNDNJ!)Fcnu%0e4F91~Ld76g&6`wOSaMoz zYNK_z#Sl5I-00^x{JyJtD2nLfxLhw{NBdQz^U&$S(_DR{^lz}Dn|3w;iNR2?FSFEd zw0@%C#X=jnnwHZKvP;p$*wk84!mKo(_AlWcJQOTeK$F!s{&ub=yQ!A1%!N64?Ll$AAHfHts@SfT4e9lp9@)F2TO}`}~?H;)P(!XHj^(a-1XL2#8 z?AUs}MZaT-rlZ%}B6U@|8f>kcCrz?_V1q%Co_v)y@4hiZ8#sfw{OD;1HkPd_^#2C& z>*I<^4oNxZ*x1dI?xE{$J-q>omur;Q+7?|iGW

@zN-tcqnc(?I7YoT;cmY4{_QvFgTxPg8aN_Z; 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 Jg!je<_%ATx1f>7~ literal 100842 zcmaHRV{j&27j10Ywr$&<*tYHDi6^#gW0Fj4+jcUs?K|)HT~*z>Z~y2zr}|WP_1e4F zTKnu)k_81r1A>Br0y^d;*8uvz4%okA17|Z^7eaBcgR_mXgM$r&r=4w#%9#BI6H?bRE!egly}mVW zDyT+mJkS)O zPzevJHD;qj+^yj--cMaKU2AY+UVs^AmB&O8$Gg~hm+0$wShY|!My<^Ph>U%BJBWC$ zZdM{G|I~DI3UKZk2$1Y4L@uYBECbp(62_kZCfD4bXdFB>vP!E#Sn+rjJ~|QOjY}+; zD7o!Hc=|u`yrk_UbxSApx_*5waX~9SyP>PPjyf~Y&*p~;_)B+-MzJBMC30g+-W+fL zMtp@8Ar)7_X5k2<1eSas+2PX}b0+hb1eH`bpq?aQu~7@kIsKi^lBjOM&JMw` zdmLeVl%Q)ILJZ}^?QstG^}s#fAI6xsDpR z6+;Pl;fS?zn4`!X>5*EZKMU?Ix7jHqh9Dr?$(7bBQ`ocleo7A3^}sFOz1rb8d1}}F zg!m_|UVej5;rvah2he{@EBODWm5ZyFt(nU|Np+bc@30|(6n6cI4t5drqLSI} zm>`S0h=7!T5`>|Ff}BW8S21{2cb&M{I%G<{aL7CPLSi+vg)f+yk+X*A{PIK%SIsCg z)EzC+a$jnrLy{>q6K78PelV~#v(kc2X@A%j6g@bqAGzw!`(=eiStYbN6DmcwC4v@r z;gv||f9kqFrW<1aA;BP4+>;@L-X8f?Zl2>=5OO|bRl;=g(7q*1>H0ZJfLLVaiAmAG zo-jd$y@t6#LL1<9ZM6pBw=tg8k&=sXgoq4%1mS*sIFuHS`K|4^mR~WXjq|ko(H*VC&J@3)6yxi6-qPmxn`;_Tbr6%b_m08!Je9i`uv0E7l zPTVVIq;}Lphena#XZvMW+#iwGFpmJbybTiItxy1k^8I6RN{rMw9aIA5NLB_#K~R zIBO_e&v%N@f$qqbq;HK2(a25_NIq@7G1~pPeZ_2T)q3}_v-g?Me+YP`N+}yznEGBj z-^gN_xZlc%-rPMfHdWjr!gy*q@pxrlM~e*)N~dTiJev7)YD0oq!NnqNTE1g@R-AZ9 zpSJ=?f!}|V%sUr;sqZ+bqq*)VxQgYiEV@ogSA=T3e1GX^2j`XtQ>~tD5y^0?7i@(AhC0HyB1 zVn;RsaUZ$2<)ZOt_zg{@Ce<64ORtr{<|chNIMZ z7!I^pP+SDe5PuHHy*OgY-aX)k_-8~Xb$%DdXB?mjnPk!Ni-*-8;V>UEE;92pEkBOb zO;+=m^P%f(b7W{W_T23_HmGD(!;J{tuBj~GE1fd@zRaWN|;iQ$vV(97UgaS$V_877Bg1Hp30*Hj%S9{HhKNk= zQXsfiqnMw@#3nXeGjfIl55Su4;{Y(rrB%{fAP6a$AAZL27Y?G=@C=2bTmtZFLZqor zP4}?u;n-Ho_~bbHWM7-O*Pw0m(Wvp;=b`D(cJ$%>i~dxmYsvi1C7k*iH*=@Khs82R zr#*(dMJJvgL&piW+(#8w@z#x?$Q(tY4TMS@-4|hFw&3Yl4P;LsR?m;5msQFPT5XKc zol0jFttPrOaj6wT#onJdhRHJgogq7jFAuiox#Ya|YES59aOv=~_mxo;4z5Zwu3;VKz%c4~X0liZ9@9B+;eM zs{aVGF9bgr6{4JvPsljDAeyAoqJUzd=_Vv|2>zSqGqoYY=1kOJ#>p2WG|wi@_afe3 zJa3>9`TH;^KQqObp>225?UKT=4;EeYZFvWxT35_*y+TMbIdcU~^@9W0qK>r&w_M zt{8sIp3RayT!us0#rddB{Y0YjWJX=O&BFoOii^! zorbQ_v!pc0$HVDb@9x^Ys}u#hd1$QhR)k{aQZ}TETiA7!$fL|gK?Mlu#X;)iaY0=g*5dY55>I(5p%oW8)^W0eQXf>`i(dMB>R|;PZQE^p<&Mgl zeQ#y&*DdqA`SZJ`B_%2(nbj?BwFqYqJwJ}~>&^k*8f9mGNHjSTYwB&><<1!eTYZa! z`wvr}x)G)yg8$eE`<^6AI4B^XJRsnIai^sJ$DO)Znwhz}F#gxX|7XJTkFWTzosXY_ z>1RR;xfT##?U3F8M6g|!K8P`kBco3dFLV(dm3qBc#dMGvav293nYRN0 zASr?~_)PbJFN&&suDBEV+b0G2j~3UB8K7t}S~wl;U@@6xr5dzW1qo{zN?XXuXi&to zf-s+0F`mkf2=DO^;z$NGwd3=VV0n`oJ6-XREx06&du4QcrN%vD$u{p|NM&M`3n`Bl zZ}m7GoyA}}rX9z25&}Z0VCz8-GMWW2Sfnk>#b@0ky-;&MyhNPWEVSFRL3_IfIZ0bRtmitpXts%aKcC}y~8^`j8akIzm zTg1+N645NL^6uG-^uoZ($_rJ{fqkP}UofooS3{kXMHJL&Vv$rUlh@U& zje9_ZnHp;_hwt98lyAmdwzfY#_&?bz@w$X(s^^E^$ZYo5V;;*m;AmbBLp$zaN}IOSmjSGpZcCG#j#22w z+0|1;=e~sCJA18vDIKs^`E~c{$QcFKmc;=J)6a148cg@87WAZaprsVH20D?GO=R_- zp^r-??(S37{F$6XO@{6%p6wA4I7bJmJ7@bc-IY%kzLq`ZO#WgXpCd}|7Cfpiz#}Nb zi`~g{UQ~*WRr(^Vjm7Q0Meg1^iSdPhYRNfxs~O&fD)Z)g82E9${+1F)rajHQp`{zX zy!i;RlT;OM!38xef$!$|&bG9T)r<`z{JT)K4%oB8OLY{s34C{>L=flA#iFXxw!b?Y z3YQ=(l(JtU+-NSc{?=&qOf&r$(jN0qpjD2`S4Pggn_C?jSe-8~4x87JHon@m|K-e_ z)`G?r9(*SLv$?0aL)hbZTTU?}1PYFnDN&VxGm)jMxiG0{d{77k3ihbAtIX`nWbkkp z5hye~8B6@qOLG41WH8A8x=zDIZs}|;jQYRk*3L4s50k;A|9kyIa{gKd_!OM*|9rq2 zwQ#P_)k2_+6idNu2nnh-zECq=na4IYH}#=i1+OJ7APl~J+mEr8xxE7+h@*)YghfGL zlNcGkfPSRYBXGl*LE099%dPGW{uUnCxKc;RgUL3t{|}Bfg&X?srpTV})#XfSM-51M zT?Z~Z!TR8gEAAyEJROx`Q=bFZEvFwMlIq6(iuz}w1t)F+?KbuZ+4?RUZt^W9Dx1zz zy+RwJVLu}-^E)76g$lnYjg8WxWn-ZpyltZPM`pzDXh|Dw25Ul!^e1pdk1-o{KTC+! z7PRp+aZ@^W*e*!v1mBUh98H z@sUuo7CPu9oiK=5yhSKW(zJU9B+BzPHB}=X7|%i0wj0d0JEKQjeJ$n^1| zJ#!c(^_nIgyM;i$Y}WEZxruc}l5kenl~StL7m-yZ@MA{lDjSUD0veI~NZ|L}lidcc z@6#VYF-%5Hsn`)`G07x?@Dr{dpiSk6Ym()P|44~5wIk+ON^;at>lm^rYFE}!N>4{ zuZNA3%j=+kuNirJtzI~7yzk{dZ+ETLYAXiuxSHD~nn1KLUbBwL=vdGkSaQ?sdj4{* z2yJ{sp?N^4lD*NYBhYi8?rcfCJb|tLH5-!;{$(#`|j_9#ueb$tT*OXgCgh za(`6UtHtMm7r$!!V&CvlPO%XYQT)|!IZ0l_Lav=f@o~Mq*&3;Vn4$iJU*((P4}k78 zRY|Z1VD1QB*KC*uOr) z;OI4k@B5{9IcmWiOt#rvJsu zbm#(O4PaAsT8Va}u!oSLRnmy^rz8^ADOLMaHY*L zIzGIj(1Zm1!xnWL!wH?W=Q@Da2BVeT=3=!oGSHU$6SdU9(h^Cfe>jOwYLbXq2FV`T zqnE{J)_)M?HXq6AY7sA;BO?At>e7nLy|@*ZCvLR?LFIfM--WG}*WXCZxdYkEl`Ijp_pqD_jn7s9*cNqQT&?v@1@yO|g_wTcs0q78j-Duuzx4 zHBYlt(q;D%{Bep_j0RUW_?M9>B2UraOLLr;5UfPAS zC!iucma>hVn@27CF|Hml(P~=pS^Pr>!_4DSWI#F9Z$a2iWJRuMS7gDP90+dPWqY+W zQvCCfMFd<=clrd&PV}4OC%jZ9TRFoP%j09Ix}HS=GQX_6DvF(qBpr2-j?+*KqtT|X z>xt-P1on;VuT@cqgNU|vDOO}`fN|D?`3w$}75orC3C3>@2SD?7WU-uU*q9!04OZ9I)&uRWHgS(d@(Lk)Usf< zFtzxeuP}!7CbFC~$vC;R8Qo1NpY11O%JZjeex%~0j8~@2k8d5JTNiV4)P^wJp`ODw zHyUp|wLN;(v0=7`gS=ZCdY8Cr_TjXs!_*93=A)#i(Yz~#h2EMORf)RpbeM3L#0OK7 zorwrQ!Iik+Kv~_|7Tn8%GVm*f${5a=RkS?L=9jF&(F1_3jBI4$jHx{Vm$Q6q0eL;k z{tDZUBSmpl*XeU^QhT6Wf;R6T{1=CuN0lq961XG+2WUGhoiOD36h#rSB%PG^%7ZuA zg%K+kcl(D2U9AYU^F)__eBnOXSFs3_y&?$|QEpVs7(|6&leW-e2b6$SGKADs`LN9X@mUt3o~^vQF3;0bYV1ca5np= z{IgTha|mYoTmID%`GsSoPml$UwY;z;kz2Q1)Y#Om#-x_k6n^`ICtLm5;3wp7eQtTZ zAUZch9FCGer;3Gw5o!p7{ef=Tl^GsKRUb>Ea4sPn6l*wF-8qplt!c75#fB4&Y6wbL zY&+~4)G~bvXEM=3R1woD>gBY6C7lyq+Mn4-s12+D<<*OVceJRy2_EJxCsrmkJuKD5 z>PFa$9fm_jW#NQ3^fGhaE9G-9RHw^T;wTBvS!3bkN?45*W49q;x32T~Y4XwFsrOVA zCgN6Q95|lc6pfu<%WM|Q7*xltX&&P4e+2Lp_taJWarxmdqqOI}rXx|g;VWOG^TN3f zwW}zZ=LF!jBT1rUxFIzi=(RZI_w(19QqG7cgCAofOG3{uryiqt&eK~s5A1FV>N@F` z$#{^LT-{o~>h2C|Gb%=YS%=mb5Xzef*eUw}|A+IkY?r=O|JLMD|Jp|T$4ve2h!{CK z{u7X#czK8Zf4t^9`j5e8c`96@WC*)Vcae1j{Pmh~6ik*QS?Q?p9s?kFt{KYr=Eqh4 zQ*X9*E}@9=H3)gyV3_)TX)_P_H`|?YavI}(b>~Yuwi77inl;c*sA*9t7~=$J4i3w_ zL<1wdAp*F#ANCuYr+Q3$M=Tfh=RV}SOObtn^1mreV~ykt$w%i6f=)zq@#g~y<|7yU zoHhvj{xGix-)2%8qV3Etlh^8)1t!oLz`k8{sRx%`Ky8#?16?1Zdn!*=ivLjL7)LO9 zZqD|&AKAChpJ4n5l=76IU&sDYZ7qnV4|Kgdn}&{6DXLi0b?pz~q30Y)`}13=D6k|XEI z>&>)`drRv;eE4j@&+Y<2!@eyxAN!`cEKeBzIuut5=8%ixx+t*63X~!=UUPW#-NeTHCgk+11pORQUNXzCgf+aii`1!r~NYorHUpJM`JE2 z9>Q>ZqL&dMyhNwg4WAG0>YR@eJzT6Jn0&CE=}CDrVnHb#v{z*o-(zka+j*2`JvuBlourWef-0lbzfANwHStLvdN~^94#1n?kUnSEpW$|9IIJZF=@WB7q-IUT4j26 zuZ6RGjLi&MDPyt?KvcwrWbF(z0jm}hfl3j3g4;pU`>RGj;j8ct#&8+Gj>6C3D7edj zw>(UL!fy30@1*Ek(O367A9f^Vx=j7+o)v(>CobR!~K54=xYkCW3f7o*b z-;(K`-hLwH!COc8IBSlt)1|6=1uA`t(~%8V*WDE2^NAEU$!scqcW6sg?AwJpAi$k! zHg7!#xOV$ukMf^*9&mB$#r=)tKIFd<6WZT+{_Q5aSQMDVWMZ)#AG|mj}hN zq!@yx3z-ihcG>duMM&t*{e)k9ut*WPoNl;M%Z~FIG*L3yuNQ*PFI_n^pa|KODAGqq3+86_s+6FB87g74G#oY|vE>NWZk<@hO=$m- z@ayR%47UuFCw+-O2jNR0<(p zm5l5#CA(eYjb$%N7N`h+)~aw48Od{yXg^KnV`7o01~)wHztq_h_QQ#76vZV-vntgN znb?t_KKNF(u^5`963DK7C|7?Re2nnsa!Qg7A+p3~!*B7IvFWLOX`x_)wY$;$Cv zfRl=b6NBA^0gK^6LOs?eWCU43vX z_BLtsV9F^q0Tv4f9=F;Z0bjgB-&6_bN*ba#AJeHAD+DqdX&W2N#S}B3#CFP(Vd0-O z)i6|gha+FlRU$rB^8Jz^E8j=s`=Fo9I~*(yP#DU9ERIr(&j=CY=}beAMe-Frx}}ox z#%l|Mh$oK(gR!jG|;mCE0cpBm>H-d?L1urx(Ehn$Jqi z9!B>7)$AlCFXDl^%Jc(<-2>qv&|QweOm#1R5C>bkVHVV>ta^zo3^_r)Bz?!Q*ip5L z#T}S~kk7(QVss6%LKF@d<&F~`iK;h5S`6vbDeqf>mA#Lxt^p?tOy_buJ(7frr*qs% zDo*&5k0`EC{>Ecx~1rW^K$C-#`=HJ|p0C41X7@ zJ1#P>$*X~2GQWw0p_$=8x_A`SggZX7fpHhcQuAu4QZW?OYbXiNelgc%@8An)5M$mM zREBtF!cF2oL^d1CBy1w)!O29n5ec#V`k+5Ug;3znhVbKBBBL(agmh!PP^Bgf`SX-S z^+V<+L0g93p-kmiB1AI~CChD^ZHybp5qyQN9)unxyks)jt)JmmeVq1z=M}4I)@9wI z3Y)KmEb|!<*xU!;$f~E^$CYCpvBp{?2_W;s+DFt!Qh$d5he6LZr$>EmmFs*#nB=3bstbFHRnmQGcnlamu14eTymBvKB_wVbc!XlNP;eD_YY z$1F1wQ;;4_1tIn5F~KA1iHzgZnJviS>NOd#5&i1+6r2-<)@ia$g-_Y? z^{Ni`cWPVB(~F(+N29T4_YEP_>==Lh(L^j8+uEnZY-I2qXyR4W80rrUrWdDCV@E61 z{w9LDm1S64HimBl!*KPtV`gAU6%C)l0h|aKX*YReig}f1Q)32U0Oi4Fs^5z(%@Y)(p(q-4DhaBnZ35_tX zX20Ib0WDo| z+>s@21wL0#+z&K@Oy7)vBla>D;Hu&sb>4Yqo?WR#0zAWW-@S$3*)o=fKWno`fe}>b zBEzB8t0N)B#8lD|&eSZpb1yBf>fP(EjD4!tY)N^LNz_q<6~&D`Dx3dkq8Gc+_R7`D z{`t;S&Jm#rJy-R7v`V0+pOX})#4v01$AU*Gv6UEE4SDHz!WsM>LUgX=$XR^4cRU5R zp=PFKdI`rkv5CnLZ^FdoDHZOT*EE1miw1TStS3HR@L565px+FB+io4X6Y#FcHlNXe zxP1tH(pD6(Q(wE#6rb)$B@_aVY~wc|M)S3XLY?7BBkQwz%0wB0EBt_8or zCRUWPQV|g4ibyQ5<583iao$8p=q&i;WOiCLo-&Z2FGvzY%u#|FO^^C<*u-geBU{^d z;wzZvJ!$;+q*UQ}>;16v4kijc2ZPO5gZQO6&WD=;#-5t3 znce3Zx2-rC6XoL@VuaV?02~7D*bPojhK%F(r!4!KQ|UwL;g%;q z2ekKEjxfHQx`GaG|6rwK>!jliLHgSbVR}6}2S{T1>+B81jTYuQP|1Nr^{tyaa%GUS z2gzJWGw=5Kq!3`#5E~+-Si`5=Wi2lH$FZ`CdR)pUh`TJ8)~LFX91V!P^F-s9kfbek zF=|Q*%ZLT+L)2IO{RWSRw;1PQYCRALq?DHq^hU(> zv=B`Sz(>sizQa_{A&8TfJY*fhkHgi6@vk5RdlCxfMCo*-P;kU5e|*HRxWF9yg_}Y0 z`Pk;-3B%i~eWpo0ZFHWDTXO1)@a#{$70AL1gjb+97ayl8PVhvB$`>B3FD04Q#}`m?ZAA>8dpZlXY<|$N%(`~7aJsrmPmtT@DKJRtZfg{v2ylO7wKai zjelarBNsb@j`rt2XWE*mT=3(>q1>qV*au(L;LVtZCNr= ze@6ff`jQnKz=t*4BP5v?ejp0G)rEv694*ee9t<%|qS_n*;}9(xQ^DtVAx!2DA3;CR&T8A*GPM=zwg7a~ol zhG0E$f@fRx!J0|@Hr)w?)U(|G%Smz79;g8Q3Q*LJj)x4-$bK~i)wtc(E-b|6U#oj$%4nq_r_GJlnkDto60t*9(rK6q{jr&hhFF98D57EBV|C8%7U>8Xn|~gKMpuv&F7MT4G==Tu_a_fe-B~C zP~i3aS(!R&@Ts_A;P8mO0NVn*@A6;1~H&gT#Q#Lb4hdPFU?2u$(AG?k8IXw-xq^q;hio^EBtIWKOTF#Y%cZq)35ON4P-umv)D{wEc zdfljaf|5VG&(7y2Ca^!kKk^PGEadm0cp@AwTy+S`pc)&RBuslWsu@@DFXW8)J& zmg0wvNQzyF2HSRJV2qOWoCGHfZt)G5El3Rkt!ZogeFJytQa-0*YT+;^@aR*Yy0pi= zY8K7ldyI3zj9rA{@C`HQoLrup|ifSr}BItR!zYwTv9d2Eg-pRJv*e zCpvyVfZ@@RJK4PpD3AGw%aD4LUG(%#kN72(c%WQ9uv6GP%llU~isXQrfkxPq?AY8; zJklbqg?tj&HR z82(|m-kr~6{~fL1&r_fU(@=3Nj2U?D1S)XQJaeuF!&?fNMZ9~j_Q?hlF zHa=x)l`NlS%|BGj!Vciww_Ya{c0@3Q!>f$AxC*Ab!I*v-)87-tJ-uExi_XsJKj9e( z{n|oYBBfhM;qi`^eE-T6>zGwbW7dZ+Z6??4k0U>h zze$Dvykp-}w3eYRvRMOCo!+}(B+6GV@k~}h(c{d5$+hu6B5u$61YLIyu}c&1T$vtE zd!t{&7`c3uVpDRwbJN4^CX0FDoFli{c=^7tZ8)

LaY4;WmoGk+HSr=%Y_>Uw0b( zUvWYjl=lvFM|LlNiYgHiBvJ=$pKx6mt4|nZVlSqw_yJxC5XMj@BgX27HPYdI(qn#Q z1f~<@7!~eHNpLPj1Zkcl>BNhGt6Olj4|Z-!vM`UI$Mb=J&m??7N*oud%H{FRGgm+0 z2Q5D-gHYDu8JL{)_>4w*V4u1Eep#zJhDDV(Nh!?TrmdUqa8-|1V|hl*5BfOZmows` zFu|bvUKREU`Ehn2YO8@qn*=vE@QK755Q~oKJFrPVLW%WG5T``ID*zr@@ow5-ZkW=1 zFu}3Rplm5Wbs#&LywBj|<>(u!MZHLSVa+8lkUV2D&#PwY%(QX)f}@&Nt~1FT;0x}N ze#&_hHi9@A{mm5shj0{?R1kB-bHn%%IL5=0kCEwe-eoAi6pd7y1 zRjGROn@65cy$p1kC&t#;7&6Bf)1@i5G!o1KJttV2rYr-jZsp^5c#gW@c!L-}lAyjJ z*r&3Bkjj^5#Ml?%kKkNC!R~(bW67itqEyCbrlyw?Uq%NB$LS4OCc1BxAywNT{aj<0 zfC|*DwB5PqJ9u}juE}dM&%Bo-W~o^#mhA3uXz!Nr3~~z;*ZaJ#;g+L}$=QdXCO_M` z88w69{7{c&@Z%blq!^~On>B%98H;vA3$ENtla8D>Fzl}jw0o93EA(g<^s)>PR^91Z zCYJ{}iz2*fT>g$PXq&Vi)r0P_K8q4wpY+ew1Yj)W6Fft2z3}SJ0y)sx*~`v8w0ndM zMUQmPvybSb1IIK~HKQ{;LwoZxwnH-K>RW6+FUK>BbknPPN)Q`pi8fvq=~s4O#;Q`6 zQ0f?bh7$C11Lykc0dkqpY=b0`R%=K(5w|UCCc5QUY;kvMmik(&V{6_`I)h9s^ zmpNV@scd|bwubSH2fkp<6O5>yardV{LeqmZ5yy+3I3 zzSVQaAtgi)=C~}q&`p8DjU=2q;*xl{>exF%9iMwxtnw1M8_6&w})JK418GTGo+r)n9t+X?Ja!8w0Yz&&9G~;Iy;hVZLu#_!*67Sm^SUvCumBY1BJJC)N-xF0B~2~+Rlq?F)?3=F*ixZzO514%p_mL6jS z|yFqx_O;$fT!KP*=_{4K?(st$ZCU}i0ZgNMlOOZWZ3s}0pGh@D91xeW<^7iR?;gRd)ZPDzKfOx)yI;a>-sr*TyZkAV6j`Cml@0$JYEz?bWA(|SsB`(L!G{;F zY@`DZO*60uSdZYP=AFSZ*u7-o$XJfby^e{$fi~v%KIBR|5$2*_e&1ro6#>OeI}2j- zsw|oHg?nFwMw%YJWdp@cqoW2nQ>LJay1s@yAR&t6SN=YBDU-Wbhm=$4EQ$M;Nj#}5 zUotAFe)!23m^~Dw^zR$`$V33&eG*w6vsn*rhR*zRAGk049kv_H3inB{n^?Oq_t?u; z51w`{wI(Np^C{ z(aaw0jJU%aoF$pK3(Up~Tp?>P3ZVoQSfi9tnIC_Z1Je$}`Kx=q!b&YXgnkiBUM8}uoR-do0_=-4!P_F_Hh z;B|}Y;gcjSwqJ;tYUc%;3FYwkoAKSlko()Q`T)P&itL@{ZI6lI?!Ct*{1|Iz4cNV) zlsJ;-Zv)g<1mZ#4yEA$3_DNi@Z{y16*OBw=$$6cpss@R`@&NJ+PaH7)0dLag!$r}C zqe~E{Vv`v44frtMo)Um&~kXr9M9XdNns zo2H3Ve0~$8=tqh!eIL7ZQAE`m{_$V|5$APR|3g!nhixd}jal=hnaaCrFcbuK=28!U z#%ME+G9`}|WOUTUY1zEpsmM<#P65pC@8ckBpZg@&*h(|ThM$C2 z-M{J^Kv;u#4%7A)@B0m;8eT_s0=^{(VZ(|Mie}jnhe+SP)lKjS)|4_^e|SK zTUZ~;!vv)y)`n7-`))?q$#s5a=>7NsQ;mNi(;d7%A>hfs^aFpXx^w|e657O1UPpDm7y~#E^&Q8%9r_($B+@uA@SwLxDIt~ zIOFE6K)J1BT;YU+brEAHJ|K=II{_um4XS(Cs460|1!N+XFfZ7xZd}D!;1E3J85DaA zP3##jDeY=FF#H!EL>>4yzs8!+1AKK}ACFl}Y4XfA7qA1+6bylvn}2M3#xN>8&y`|t zl@j9|;2zBP^l<7X?{|JX6o`DKN#~h91iPY7<+TAp_)2mQ!=UuanqCMoaj7 zm-^~>AOBz^NZ5d!FZ^nilu-j;U&OLBqW(x18NEV9`@i-qm0re83mm4}5Nv#?kR~zB z?wM4xZwsB^PPM?l6G)z%>FEi@cW^kBAS&{w8(3Zs zFi>35#SyssNWJqp8-|0>!p#x+GWX^VZnU1B7A0ZZ4GNzx<_^N`nle!jL_$Ds+X}KV(mswP^5Gdo?%?kK3w&+wwm8vVw{B`@GvVV1_dwZ>tt%u zT|x`~Ea=I&?rQDciRm#=b^Sq9j$=Hq?9pi;wWBVi71ct;Y7sb?jRgT!x+}gTq5NDT z>G7`mOnBsQp$h)&PiJCQ=+XqYUY6UsJEPjZb#we#JtkVA!-g5&I^|1Gp_Aa3?!MIR zr6&}|Yf~Wok&BNIFE865Qo=F~$jJgmoA3q%T*Pq0lmP^+_8g5CWc(q-+29{qLexLh zif*HDg9>I{BDD*S%T^(*lALYdR60TQ43BqlC3I&*;Jv_|9L`_CHE98`r#INK*F7$? z8`>3$2TlHUy;)_p3DC6@LHNHhcQ?S^SfFREiFXAinYUN?=FiQ1q#BI7n*x~Z9O#|$0Py$v;>SDh zmy!1T7`@Gy$3j-`Jx~9HwWROb-rtF*fGDG9_S9P?uh}Wmyh2z3TT8~VH?Z6e!=OIa zZWZ$Bh}We!CPG}a5d`b_nQMY|6=P3@GxT(P&CUJ?Zu2_Bjqm53FVX%L zl|CI)IaG`Zi}E#B@T=C$_gVqx1DFT!dzSW%9sRBz@M|H=)@J?#_!XbklCmUI@1NV? zJ%3F*O~-q2?n^Mwq1#IM=!&38TAuA6O{Xm6CY9R0qbvi9;w13SMGq)*#;lXP?`wLg z$d&vDE+GR_Z}@Eu|CsG|Ur>Q9uTTM!C)Bs%x4GPf>!B~=7t>xvpL~|8BAuK4QAI+CMYjcBE$1@_XSbviP*Z~wo_lu= zal<`*ggEZNzEWw1<%HPt`}j50JM<*YDS>WO^OYF*g(0uhA-;is&*9I2T{(R(hm$Ab zm$xZJOso_JvIO$Qe5&tLkfE3UfuWlPaLpRF{pSc}wGKnC4n82+l26xA`~*AHO10ui zOwgx$NmXTE*r7nUtVs+Qf+*?Scs39lfe+Uh>7FjY=aGEa<2Pz4tX@nq)CHJX=9!W1 zbR-6Eig2lXc2q}#OmajF6=M`k4h;Sd4i6ub);Fsr((1P8vmR_2#wL#gqf zv6ejx?v$la^-R8|!MMz`G$OJqxV6{Le*WtaH4ukcnnnfURDC?geo01Sbv@s4->BAQLbp1iG+pYuhMT-C+<9#&(A5=Fd!=05$W{t5rSu$v!`wMj4`t&Z^{H^- zKbTV20Xku4>X0%fuGF{(uvWl>)TMz>krz%5>FIbAZK}mUcd%*@Ntfymw(*lgR4!cS zdfCIptI_-lc#jCxB_t!2oOuv(D|Etnx&^@Lm~BW^lx;Nc5yU>>2Y_rc@@M z+bC_s!+g%FQU0IjG~0xOu(y=bQLlMzoley#&xnlunDMSE(`Aqovc9zSB!#_A{zOG+ zokC}GHnu{qa_x%7{d|Gc4NcP}TPf_xgLz+W7Vk609yw3N=Ms?>W2naJh0T$!rK7{z zxQgJcAh@`uQ`NA_Kmx>EJm|JNPJfDY`1CLZvvi{mYf$`3PBxo20IvCy5eZQgB#P4e zBYe!nL!*ZkI2lxE4JrlA@lt|#_xU_6Sg`+tudfV>E7-bCf_v};4est9g1fsr!Cis{ z3-0dj?(XicgS$Hn3=H#e->rH-zN+{Boa$56)z!Vb&)HpjueG)m?~1wqN`tE-2dU}i zZLeiQuxLAeN9Z{3_#eigRwx#!$tu*O)&(U|XS@U)>G7ZWfsxcdQ;| zNZC!p%#2Iz3Fk!nII04^R#!w07xE-+vh8F|iwA`;lnioirSfD%3A(+{Bbt&)(T0*d zhQ2Z(!$i0oBC|trorqGDg_#Xfwc9AsC7?+>2(h2mWv&x}!k6RQuO+M&=8s?6TX#y3 zz6iu6qghsK1sgWhja+QkoiJ~S8uzh}lD5b@CvxEy%Q`2_vAa^UX)nhzD1D`!7uj4H z)Kv+YZb|-biLn0=Z9brPFXT72mTA$T5r0@wY699`;sIc1MIsB|2K}x-4P{0lOe2hw z;Grrvt-g>{bJLup-BA65N?^RrLcBRcJLItZi}(f;C7O0{!ZaHbj~qA}gkD(6x7vZO zalx4D!f*1~T7!H+ZlrU&hUx3Qc$w5@CBxq08lS*41C#)!3hQgAW?&>Ja#cbiV_44A z!mI0Goewpa#eoIhh+uweVo~6ta3hn4De;*vp^=z@>h8SgO&?lFwl7BfYsz`u`U4Nr zh^gPH)PYCgNX5V5zu{Tx{k!ORstxfZ0?+=iVS-UG2Td0Bvy5s&SR#43 zlC@C(ETTs0aByL8`gc7HGhT*9YM7U{%~BBU?yd<^Alc_Z910_}85cC?5bDQAk( z%s8xvA6s9lCiq25Y6O3xybceD4Ina`Dbqov^R7ivPD{|p>#k?vN2wNMfhDYwFPwVo zOE$B7YIMzlc;uS!=J7hU5lYqKjrI!qG zNrQYFKMAM)PVw6J`V+;%DM~WuAP39ER zMdaESrF-681yj&c|NanhiZK!`v{MruhLS=)j4~4uTP@kk#9let6^-%r@E|&n*Qy6-V4oh{>?&n zf-LRI&UI8hN)^;|ZD&6VS-S{K?Jm(t!CuyXhU4%u`2b;{o-my;ZKk99vPs%QaJpMn zW^z!nuVJ@g6+nFp_C1^6tJkcok~}>lHTD7uW8&WN zNvWi&wRnqDSr)zcxFtlI;q>k-6PcYC9OY983)g-7T)^n;(%ICJYgRFN&zq3BRxFnTk&cHpeOKqvW5*qKPy^JmBul3-U~E zIb(Y104cOhMwS8VFO2wE8Gy~pO_wH>ULDGqbR_DhlOx^0Mcj03>v9J06`u5iR zmk`|L1o+FbJJVCKV!WO`Fi#gOW~xWl*i?tJ@lz@J&XO*ToQUc6i=L*N4%x}r2p4FN z*-!U=B7Np5CYOTB5l-QSmO%sOZ_aM6zE-=2nR^0uGp%w z#nFB9drRqxYH`{JKMeyR@8=0<_(MVv@XEE|TT77wgyYS16Ok!5yBZ;VTZB%Ar|+#63G!_a(<>sB)M1C9+( zyHf!kax9E5!(w&no|*DwB_NF5`+k-8Jo|XISW#{jQEpuRVraOco2&kjtRs1~6Mp^zdk=i^G_^~Yv^uxY&X#H~K9 zqN(3|29d0A4n-XLGXHT)J-j$I;)sK>!%6lPwOiwAap<+lO{lxs#xAlo#h4Plf#tlT zLkj!1gO!fX@sTZ-_R5pLgu;;B=p(!FN2P*6n}xkIN>ku$Aqj7^fbIJGI8Cl@^f~-) zKIh+BjzOp`8tNG!^;aSHzd98EtTK<$xorQaU!jZZ@T^koW1@B9>Hi8|Kk`B3RyKCK zxV9KchoU$eJT7Q`kRmsKW)wl!TRs|T)1xh~*%zUZ#%oHoPKY}h+0`g{(Qr$;FNKWB zaCg6W9%5u&Z*$U&fPOJ0U}qyB1u1Kq<#QnQ^{pALW(&))F=HW@&B*DZn7%o?g=k%{ z%Jnl1?e|ASKd#gbBc6W=VP@!e4HK1ms~X8$cchM{(HcTC;a|PYJ?f_uP6l}!wviE# zJyY@z=IMl$_>hn%H`a2abiM@mljBRYbK$Yfn5{9&=IgPBOFw~brdE2YtC2kZZPBdT zI+_RCjemcO{yDwf+jAYxI(z7!s~Cqg=4`p{nG$~RiD=jaSexxk=qIV%3SlBdRlVswx|=b%vpxk*k=ETMbi6I20OlOH?Cq1cVNJtf2H{0qRX- zT#)Q~USMh)dzaNUizfz=tJ!a$(ZkTC{>LMs2ssGpY@l-mi$g|7$z_lB86Rv2oeB*o zxn2f|RNfvk?<1orzVk#^Wlo0M`m&Ui%#tKoWaN|Hf@t>%!uWoxIJc&h4L~7B>8Y7E zn`vH!(d7NAfrhsj=-7C5fd;LWe-c1}8(y(Wz8sRbZcyaqJ~4m~pYqdsK`{YMAeuAA zSkuIPB4>Q<#LTw}KBhgMluQm$u&wW>EM}pgRPK_>4@)cdRc(y@Q~d)sOH~=^XK6ww_Wc#f|!FU9$nrFl=OY=`J+nH*=P?XzOd&o*~0sTsa1J%iO4;U_o=;3!w z=Jnplo^FFhoWN>$;jeQRrj7lp!UAGj-jf_H``w(&p75C85onslk|eUyOD*{bJSa3x z7nW?_^n7=IrleU&1Ma6DV|n+A#l(|bx9-vI6EsCBDaq!oVq4yR{po?{XqB36?iZZ^ z+dXeyW?h3fZZg-ubr2Z3)S0-6-6ja*KP}*S=V?yftjEffeK{sGGq=j1anRuofp4CCkgG7zT+j1J z^~n9To>nS+ur=Zzi9t4Hrjr9cAbWB=weH_ z{~7fiS6$b!6UB*J$|a{HY8zVQJ`JP#OH;EOWb(wt0Q~$|6H#&Fza9so%I5cLZhOUA zHdk-&lU>ilux?mf{E8pWu*kx7&9Orq^l2H~77ec z^R*gcZN-=-?wuE2V{%Phqwo`&H#3W;g@i7r(!OWTkOCX{FaaqL5JJy#fcw}MMh3uz zGl2E^8}SQYyY!dmX-G`^yUA3>JKiwsG(YrX!2}uIbPlAhpvLChLQ{01jc#bef=W8v zcm$LsW#>IJ4mCZai??J>FJFinjHf`##=xYvE<2FPhNfq;bdEUmc9bGt)PV@^pV18_ zyO`SLXMeJ(a)Gb1O~(CeJTHz2HCde)RcA8^;Gwt}Vx;_cO|e5@a9u%J)~<%2u!#I8 z`#?Hr58#Lr%0bq<(z7LUk46Er`9sim@AY-iZP+mB1Mo$J%zk>krpg_uy;r?g%v1)y z<)d_^zk6Jy%My-uD#!!Op9zumWlb;6lzdOK@S`fo7|HgTqq61|E*$ZB=bKt2_kkA} zwz7#owJ83Ff1nf=M}1tth|n*8vs%0%6e-lo{qqOrx$f4eL&lo7%1_5g6xst_DY8&l%+{C&0WzIEX}|2)N_x!Ss( zEV5fE9POX5+^*zCC26!22d`EfUw2d=2QIsZ&Y)&(b~<~T=cY_&Jpx9J9;wb#>gDhJ ziNgW%T+GExdcvUjWi(P7&Mjoal&*{IMpzla%f=KsmvVj2n=z-?$7pbVoF&CZVw038)=>3u-0vUl{+{M(`^`zP44sVf)R;4g-rvkOt3({u-&0UQ0zVi{VrC5|-8v zB8?GwuyFDwHSa}Vuth{O+Ea#Umsa-pK98aeXXDfz8&sX73_4Cq?~5+AG_$`&ne#df zEzO^Mj3jKau3znGPTlh@F#$WIwb+Kl;#C<*GpJoLv?%V>ZluXNjgVHhmEY-Jvr>@a+>tAlF$@Z z7N8GK;<*M!vIhp*KGbZ)Tc2+&z)pMo<+^s127$3s&!P0~t9580M9HxMBtFTmW~_pl zS~3UTdCpn>mB=t-2^&n$cM<+}vj9YY|GP7Sxy0oN0|gh|~bA|+0ZN8_{TAY3&3op@8p(o(^( z3Xnkg5;G!imV?6bdsLf^)#Jbx_8-qa3x(!d5t>97Py1KBfA@*7*bhFb_P>|2ZGeWR z#NN4XfEq^BU8p94<(LW_^Dwr=t{1?)tEf*vkxfbVoRT|C+XGh?QDgYXknSfKx3a0D z{W@X&wLEZY0c$iG6;s~v*w_(CsGzQH^1y4NGo#AQ7)Gud31)xxuZnW8fC&oe7W3*(pN}ychDhpik0sX#Lzgtx*04$#A2<}1 zDCuv0#8g@vj2K(WO0p_b@rqPTiQQ!(?%ulNjxhD=nF@=qE*QUQ=c8~Mi3n;D%nJk1 z?H^~q9{aCwoYbK6pQsQ$Om9#NM+zv0=k(w-Bk{3<Y8BVV=1KrJcQ*j^?UoSF|aC@XQ!3nKJfhdau#DPa0c#|=$o7gZelU6K2$p4T#BCy5P7rkQ(Ak`rBM z?8-VcLbPty5jfPo>a$b+GYDK&=Hx$*qxZR);yS|%(88g7BgVQ9{?;f=U8I{i?=S`8 zXh;yuOdm5g$f8$qQ>(PB3w`6~rf0bRf%mcwI z&Yo+QW__JbJaS%?GtYMmWNatRa9zi0RNqOesW@>JT#AuTy(x;;$hlT4H#VogR9o1e z^@ZrG@h|Q7xh@g^4Nqyc%k{$&T3Rr4dvwxH&H)N>wAS3=1Qsl0vVK!KxU6lhv9={A zyw9NYmC$4n)Jl3n`DtO@7CoM?jLKCy5q7|qd5`Xc4CoR?@XghZ%)*>n@-I^@qE)Qz zdY607!=ODY8?jGHeMYLCK!iEUt-Iy3veBy2d9k`<`*V%LFkMWIhX*aXBa|#jqi|L4ZD_*LK zTDtx+IUxMKM^XpRS!Q`-M7Zjpmf~;M{Nm`Af{OtH;1Vs>IAvnz-VwxRzqY5|Trd#j z-9OVjYD)hl3;M+)7o!5d%C#D}e(wDva>S5hm;0^LRTRzS95w4z2Cf)Hy}gfxOVPTO z+p_6p-u3OdVMdIn(Uat_F{K#cr`MJVCw*s`ky3#iaJ_bb$rDIV_E&w4u^4ZBHg<&W z$hlXe1a0eXevp_eqM%AMS9aK3DYfW{aLRF4R@RLCH|=r@y2AA}aDnBcw~0jwdYzk_ z7vHuog4N|kW&C-E>n+@zwS~LMF~A)9wHkQw%Ji$&UZZ92iCCicnlsyH+lJ51FK+4? zOe~&$4A^G>F~_ih#8%ggF`98*f}tt<8%?{)2u*Z<7I0c{W7K_gKWc{F@0J?n$4kM{+t1>P2v!$Pd-VA0f( zhGR-_ynoR=i!|$yMfGaAWK+}f-sDR8MiO=Q*_#FU|(|d7K-Aa{^>P1>_+m7)0^Vww)}NpBi_k_eKN&8qc2Wk z_Tc$M5As`X-&hXR-YJr^d@_vDW%R9*1aJX@sU02HT9oh$gIgbcsVGBY% z13FP8pZ_#A7HJ(Z8uZOSkh8pEw#md>-iL$Q{cDk=Ed&pI_~ap%>pxLP-_$S_=XgX7 ze^#2WA8!X^ywVHQAPjxPbtt6lZa7m^7yCJ4weyEpyIDyQ5%k9{8t3v8JxU2Dzmvj# z#Jq^$jp1U5T{xBUv;OmR0&HL_63_Zde0DH!STn#K%rXMuXZ zRaULD_R_qw$uUm$e5OGB^EP!7gGzR`kqmsAO`E&&-bk5`;KQ`FD>KyHgRYwHweLUB zo1o51Bsg9ri>88HC|)IgWgy_5yuZBdkf=NO?+T}$k0axuArwZ&)v`$zI$U_pTEw{X zc2$>Y$1k>t8Q#a-nRuCMCF+9K2Mso1CbFhJQU)5gm?r6{hat0^{XnTUejX<4w$Cgn z*pnmq=4?Z*Lp317Kh={n6At#jW-0W5bMWhuA^MI)LYcV}_X9rga!;VAjlrn`(ksq*6Y$SM!&cF;<(q+`_Pi9yGpz?MFUnu zPU0p!*oyZvSMv#pdM7Ia4HUU7CcIdkqNDMdtpjf?6^kW})y4If`o2E3fa>=vxw#qR z%V%`g)3=xUx^cYx>bG}Aogw=PI|w?yTZdhT9hU`zdjNlV+n(@{S;C==ID5)zE2v^b z_>Ega()OYtZ}U#fq@tqH#x2N&=>Ag~5+?_TUbju6dr~F}TI_TI5%Hr@OYzY}3JT9k z>_gs&gwNl)xR+ZPlNAn~roP)b&(47YN@yfO?JCp6s6P!Da$je|VD3&K&Phk^sm~#| zAl*v_{L)%#FxMTeNG7#T3ww5Zy>3`|6=A!{#CS6;2eaPh)taH@S{HxvXE;2w$}SfE z9c_o^UMr`;!e!9sdk#p%ABb{im|TL=J~i{u?fQIr|>LfHYn#por@3s1VxT zIA4nStW4zhk|@PAs*_d0@qPA#5T%O+kLv*H7O_Kn7n~c%2P&TIH?0S$H&$p5UI%^c z8MpBnD=uMn9ckMP>Vdt6+zpKNT!OHqqD&#6Q7$Y-%h3p5pgxH~(>T> z1PM+4i#|SO&iHHz41w+Pt~_(%6V>C@W(gdn186!NxD0?efhs^;poRXi) z-+qefWBRSpwR8l+wU)V+69>c$IEn4+D_;H7( ztzB5&_y(5tRhEh`*}v;6Gmht+-?}yo98)T)%?%_$xADU3B`azdPiSttrqUm&Hwub1n zapX(+e{aOLz94C#!jH>{sD@wg@wfQO-(l+tP3k+0|9LXm729igB%9J(AR77fK@~iW z65lesU`q4%gq;hoj$jVlEowQiL?{l4=HJj)Taw+Zv$eKUWBrK9!gqh#FG%HyiF$kn z$cwIpEgV%~ij|Ot;hwxn7e=oN%+b+(0u>Y)<5M)CWXc3aL*uVHZt^iGCqjiHASA(( zGkFFbILY=H$uEd~%V}dM`$U0{Ezown7XhE&fsH@s)XOPhrk^KWz)wCrY8u(~t>e>f zU4eBe3tDHPRs3nM+o@62jg}E?TKI44DGK_y;=#GOIakKkdssK_2rogfETW)O6a4&1 zY%2LbgVTC}u=ABVkVt-l*pH(^r?Ej53_Wpgk>+g)4eGP7K! z5naukj*<7;{KSAPSrx2d-2*rzis>t&$w@8ToTh_~Rp*iy8$WrmcCG2l!?q?sX=r$@;o5?ignRbZy-FV2lj>qoamk5_9~C0`m`uX{Cz&BNz04oMtH0 zu4sLs_(qJ?Fg=*w5LU|IF_V?^6^D{Cs{?~yhmOzScq=FAky39a0M3e~i5xNpU`*U+ z;p^4u7nGV@t~rosEcgsg!+8Qw78^a9rCaeM^3)jB+JCN_(h;&f`+zC@uJ>^s@k&?- zztglB>U>#g53{!y6e%g=&sVvZ!bpwM!>RN1HTR6_u&Vpv2$_mdsN4jBTOflTh8Ara z6DoZDf+aM|&F+X(R$0?7Af1Yz;IwzidxVwko#u{eTWJ(Gy+9Ytf?uLkE&Y!rh$IB2 zcaPW=;?lY?!e%j!yd|2LvXGkNPaZEB0zh$A{@{wZgY+*mEUWPp(0P%sX` z6ibflIrmuV)KLklcn;qF#39s6cyJ3s*%8-3NhX%*JVKb%h9>6s4H0+H8P&lgSw)ug zUo;`01m%a5N&eupH@~m^W$@vIH|cT^UN|^3rmD(@jPR7ap{DJ|f{~PLnY6$p0^2qP zACy^buU|(sMWUUKH}pC?Nju+7BxruxeUO6dbqx0qA!YH-4T^($8M@!6M;TJ2n#-5T zX?R#2ThOpm@PBMw=Zrf?$0?m0@SfyIFX9^mho}@<8dbTwmwqC+uXEdl_xT;^R0G z$yeZ~K8&;KAFl~h_A5Gos+h*rHE(GK&K#e@DPRWQ8+#uZCEMOt0!48Bqc(!YdDUhN zyN5BpcVmp6-Q9sn!Uuxn#gZ5hd8T4M>!ma6ezvy;x)3TI-Wy>r3cvr#c^VkdzqOHS zqN%*cH-g8J)9s^wCptB9tU$=M=>4Zz=T3NPq$K*YRX0D4M)wh*TIVjEiBDmCsQRT9 z{Kiw|eA!}tu5)IrZ_Tf|Y!}wM0Xa(P4SX=y-IKDEx6LiO zjjnz(8&rc}`Qu86ZEs?sf^GBjMPkUz)^K#So71l&Cfp1@Ot-{UMi2NHV?uq~)N$<$ zpqhM{4V%PP+$?OicJ=$_M_-Enw5{?N+{jL}?ZlqgV(piZ1(hSANscIKGP<^7i22;@ zE+AJMfFasSvxwb>J5L1%A7`AvG8E46N`bi`?I0jZu&dJ z%e*q>)rA=GER&$R>F+k|+OjqxO~;4GzN{F)(PJ`CG(~(6{=RIh|7UD2rTB*L$3tSE zKGXJnk5D2Ll^oRL&Q!e)`RHllQ1K%DlGLYi5|I&X7uNcHM;5?-!!3M z>EIQSQ|hQXB<*TY;kKZiU!yK8#(;_Uqhv7FKa|s(<=#dyf7O_}Wf+SaWG-YC1d#Eh zm99DwF+8*mIoh6IweYDsH`7KT=Vz9?x2%i0Okxfkj#YJYNYzMs66|*vDLyO1N^f8s@R&s%eaQ$iW=5g7)4A78(@=5&_l`4Tu~PG~2Blh;!NLm_y<2P_UP*wi(9F z#T&WQ_;=?4PUFGfSzlQ&-l_&JE`&@gI?v5p ziPuP0L>Q0eVT&=p?n@Q5N%kc0P&YJCTQp0kZWR`VKTI80PA!%y)9%oME3$vKMRl1U z`2G{qAVHOXCy@Qn#c<=S7Rs+VJv-;uT+S#`P`}pUjtOFyBnMzGo2$qop8w&7gmK)9 zc(nZC&YzAV1uYU=OaE)-h44CIxqW@{aY#Q&IXrxMl4}!yOkFK>P@EJN`P~@FM_=k;JCfq2_81JOT1F|)L^U8yE|@A zwF*tKMMNWG$!26pT*hmryIBX^T|1-R&1mDFRD-13dFL8-sou?0zdC+Q;imnfKfqgI zdu4|CEN6st^Rn~>9j8Qvn=gwNu@CtiHbhM@xvsdnDbkAoM}ckZ%5)~Mdp=?{tR#)bz*nzuIMEVa>_Z3yP2zF-DEef*0?;t9`dG_R_`AsXlK4zs4BKQW(w}-c~{1SGtw1DT%%bpr_DILgA@SF`kVygYb+b^k}N}vYc7vl-T2R z0B2k}WN$pNNlQ5n>mpVOU%ZzgWhbnKC%mKP6&7U|EGKMr28^;H;EAc1ET4yWS;z*9 z&+bl(bogce*5Se5z|BVlu#vq@P0=`rW;lM*Y754ltSG~2_Nw_eR4HO9d;ET@Px)_*-uM~`zUYY6igBvOA*14B&%FRDvL)#Tw!!gTznn) z7`=)l)6k@6#`SC<0nKc2k-o>cr8q%)!=qn0jZ&GhTAyp$6G z3Y+!(jst<)%XULk{R$^0MOn{<+7Ae`fj?TqlfN_>%;7L!m>=_VN=|)7`OKITv})Oa zi6CKjd(rElgZ}(gQ*1F{K-Kgcblndf2Ml_tPiP0_udWEl$QqQ@-HCwTx)HxsY^N{E zJK`uGTl0T47&QsXpy*^^lQ5a>N|Wrn#;2Lb^9TT@^4NEZtxe6U3a&G>Y`a$`D;$^} zEbcKAmq)^TepXUkUY)l00CwJao&no%JR?2FFTTNFl%!xQD{iWceVL8bTRhs9$$k?S zDzDzj-=se!x2=zD8hdd~NI_~}O`Cdw{G@WDUS5K=yj)PbL z*RU~ufH-G+94c?;-oU(oIKZ2ibyiDZV!YP~{7l&Gn2JMOWxPTl#o6qwullE+X8J+X zdERL64xU>}*__iLejC;%62WH@!_AqeES&Tq5qD9T@qp{0MBYc{c%0vw_B7QRG@~jX z?=5Yd-Kzbr=H6AOF@4@J)vu;R^X+gxKu^3jdUHQk(ISOhhrf}+5YG46ysCQ>gUxRT zx)_v<9o^p2vefk6ns@xaiUW&CYebAmn!=U!(aKgGnZcp_@zaY4dX>%AdxVCU@C>vV{FIQ6j=}!(XMq5{WibJ^nSpY>Wtj{ruM#rG6}yQb!2Y%9Z7ohkB$Gmu zO`VszHu40Ob}=}~V8I>u?abrHAdD(1A5tc@{3 z69}@2ijOZz<6$F&olqZ6YtY=pzmdv${95U9VO21Qog6Q=SiLT)#CQuodBHM=(G8Z` z4!wg==ciGF3);dns_N9fjxyy1neg@^yXNedD_f2Rx@7!HqDCNBnowESMxm2#mA4KL zi@NqA{9_X5M7~>5U-?7DcMC1%Dt4`S9l`A!xC@7nTDKHdv+bB(K_G9fO9EVLF3jO#?E)+;K& z&%=ey0kwJGPYW#*ZUtLTPnhqiWc;%w#&h)E77pDp>Cm16)C*7V?```@YBR4jx?uM1 z-rr%Db#mYN16TF}3~(sF^~Go*_}cP)kH@&#qS$`m$v4UQ@}o&uJU(hIc}F8#S-pFI zLtiN=lF@=uJHe2D`SRbQp{?&wowAI2eIwW2ajE`{*`o~cgc~A1(-@S0OcI*ou|`#@GuILRnYW5| zcXnbhx)yF?t(hJn^i}Llg!x6^vT#I4*IG)g)&qGWE(2sUBXlV_K2!v7l@(9&FukJwbw;m+9ilz{JPJMe-dzT)s;ux}=HGPCj(y>SN_O0wtXvUtD z^?p4xyu6Z={{jQY_IM)6WGUJzUxo=ZW*>89h!!}973#7su`|H@jGdm)_P z;XiVS%*ybgimG~*)7Q9bM3745kN8GZyMV*;^h1uHo%{FbA4`pt+{VSBm)nYD%j+I# zu?oriIT1NTV8G*t3a}$0h+988bVwGjLci~9a{PA_jz#0C^N)0$%x(qiQ@#VZLK7yv zNsGn3A1+_f4EyjvQ!F3uFdR*$MK|X8@mGYD@}AdYNgw zWsK%1surx+N9DxUOMwMfD&_K*ZnGZaskST8v}+#;p*>UEzlOg%)j#7C^Si3t<<=lM z_7zgl8OP|ISIb5}mYAGs+GVbm)Yg+NAPb`*x>C{324YN+GVat4Q4b)U!#q@>Bf#*90bQ6ZNT*4UFkaTd<3U%N|!lOUtX_XT2IExtyOQ=7s)i+Nzb~cWv|*} zup1h#oQL+xA-Z^Yt_Cs;9alPK{L7@erQ)vJ$mQ~URMQL=fYJKn?Qz$yn{89L9&5v!|I@%b*BJ+ z%2an7Yx5++Kixm)lb^!Z-caJD$6~Y^jdy7qrGBNbopsNtbA^p?PRQ@F+jocV*fhaYWU&mmAbIV+*a^! zee2W^^W-PY6Jp+K-&v*n4y$L#E%W@T<>d_lW=PFu=fpYp3wa|beA2ed$u`HS#$j4L z-P{lS-_jf~)G6)yI-fpGXn*hl}Tgk7KKbcz$$Com$C5sZqt1Wfqypyx-!aw&2ntGVUr7nH|P>}w@6vE+bfIA@I z?H({_X?wdHax>Af4S9In%jl@-`Sbc3bL|T{1VTUyD=Ea&5NpVz2C-oG3%G=218RCczE|Y3SyyOI4K zzqehz$4?tVey_*Z-Iqv^kFLI++`&1FuNv3e?{6hF5a(OsO}8F!p=V-aPbYXJWDfFv z_F*aT{@d)phvkm~D{j!mul-(VUJrpSg0@@W{pYKd=UrX?)N=&`KW|9OJMsH=3mVmw zKd|R*#ekSMtqc6JuL#=D=<$X;t+WXFdcQ8T>b|tZ^awWIfgx{CDegU}*l!O{$6S7| zkNYKp{OrK1u6;khle>>i1223BKjw|Q`*~aKJwL4&2oavHe9#1>GWZvJ^!&g}5Fg-G z%e9~P{rP~W_Qqz^yWg$m#=L?ByVt$Y_4|{DKFAO3BJ_5+*#Wsn@F@pgEx7*S4_B~w zj^WC=%Id~7@OwP+e+OSSajifgst*-t5CcEC>XZwWp?%0@_0-E8JDNs^5GI;M-s@pW zj30PmCBz=*b?K;f-S*$YgM-puOOE`DNKMMNHz)-1>cBy8HUsG>!OZFczXA-15&7LL zCyBH@c)RVpP~ToULJ~l`w?aZ$TL#;2x4R247j)oT`;TM#T6Mj)Kmj^u5&}Owx!XL| zO>J+z0Y$io-(ORfd;7zRf5 zZ5#KTo-x<$gY@(bzXn8s@obo;wo|~y&kQtk@E3`;bDfR(qK#nUL!r5YZhI#Mx$2(L zCjJLGq7&__ZqGlZen)`2>CF`P*%POGG5Jelk8iUJhIL?bpXV=8?IV2w*>Dk4xSr4q z8<n=0-FanXu1_w3A^8yjc5A@pJ{ucf70-?#zKR_5G+{n@=G!G8? zXa;-Cn<|!43VDa5Z!v2^k67(G?Z>lsZO5}M3IkIm#Mbs7ANjre^~V9N0LILh4Cja! zuPh4*Miq0;$5FN6!wO}QoMsa24aE6bT`hciAK16N&ASMJ0|AAYlFu*Qx8K1k#9nh1 zRC8AJci1EPb@%6MFXbzWGfrJVF)A!V@3}P53_b&_ywL}K@ws_i3To|_d{wdHbT743 zURJeAAF=B2s2b|phT?P#vEpJxv0(y^@W~{5MbqjxAT_JTI~<1XR8mjwsO}4n*ipQz zLVgodyMB{Bu^nJ{OK;lynvwXm`S#VE@!>yHxUQH?5)>@U&JK-fDTkp#n#K{u8N?yS zDfECIHUu`SnhV4iP{XwXniZn&XlWlxdBf+Q|hQ<9WiFF|B#|4l#K?3dF=EJ9h5 zq7Y|Z5qBu>{6~oNAudT(tewE&?9?RcCO=`J(4W;bp^6&L6UEmNcQUl$s8#tpf&F3tZvj9bPJfYg77VKeKvoNNXNx(-6TI@wD0mXe3P`J8E^ee?homqD39 znZcsJj7h>`6JrJ=>92}(Damn_;c0?Ze_4^BJSjy23$<%cSo&kE%BqNLkWBrmQNs85$6w$-NB?|cG|KE+}lYO~SiRHhxe&xeUA7zU* zgY)#7Y0~18Uo?NG&dIc4w^YTV3CE@gpAXYt6G}>_ez_6Y1Z;D zcD+|j>3nvyh3GDd&ugpkf9QJ4fT-T*eON(2K}t#_6zT3RkrL@{1Yzk=Vre7<6cCW^ zQo31sX_QXMr3L8)Bm@!B=j<-}#n12gzwnLXaL?Qm*IYB_oUDK^QW4PWcN7|D<1tiiSi#dc;OY7;|i~<11d#2nkYU zPP$~EpnPTV2J9b%bQ4crR^tp>k;YyfTyA)2dA`}7J8b{xG1_=^!7b^W$2SYrBXS@) zkJL+;)Z>n=n@=2Uc%}b2SJ1lJJUQv0^*NbrY0i*zi{$!{6=^hi$*z514@>I37;HZ( z8|!x)B}^#A=DbsH+qNsImlddKu@n(cgxwJf-WsmBDZkyyWJ}^keQ+-99u1lPR0BDs zDXyK&%tCwdxDj~R#2tK_1%p<$GDk+ekA1fklxv#Dq^tGp+Zw(~AqFdOQJAXLjUE(h zPYZwN6ljmLGe~EDoGTo8inZ=d)0(eF-?}P=!Ld*nj*;FVdw3L8ZHiFn>9?(?%t@Dw z9Au@<4#k0#jK5GHXW1f+9UXnT3%4E(y#aj7Q#YoRl!tF==0lB9>Zzu$bJc#TrWESV z(>FeL{m^-A8Rje-oTH(hTc9)k^|khjM6Y9ua6IDTL%X`tBQi)`tW?7#VD;bDs_~f} zo13=mC|ZR{Ts2&EQ0}K8dlJSY+mQ26y|6$-i`Di!Wzp%6m^zaO3h01w?OcAM+449U z45bUQ@Adc`tW_tTGCI~&pzFkKYL4-X@X#g33FiNGpl*xBG~3?GhL#ZjG4aDV`gu)2 zc+O;vFi)AZ>0HBM9w<}2SCpR(*DOF^lf(=Tj+LPKx1-iZ5(*w{GDmynHXd zzo1x_a6Dfa*Z=a%Lu}m>>w7FYj~}tW&sGU!KO+~ev(%j4;(R!>D&)GQESxOOZk1UN zc^@$CY^JQ>;;z%5%TGUnnP)U}b=W57F6$Xze9VRAtUt9>e~L-YF;dSi(9&WqBH{OW zI#Ju7#a$rqOnqF0Phi&quO`h~V8oe(57YS5%X_ymODt{{ZM=+c&-7s?M~3bHv71%_ zjjq{?gDOgWi@bLv7JMbWqD+n=6j zQjo_PIFsJG@j969p~h}q`W($F4^2b#!$-{TZ)xDzd@U)Y_nue|p?CO3Mzf=V&WwK= zk|r8$@bnd3$a{Yf$m+*aW7|i#?}^h%WW%1yzRrpBc0%`M|Hm`))#gv%&#*bwYrbOu zBF#~loS!}OP0HjVn*>zS{ixFnM08Fs%gcH;lcDuBTmh0t?Vuy*$F0!YlfBQ$fSXF3 z>mzdzq|nK5$-%x>7umR*y$5p|<7=^O__l@{ziruruBWr)0@2UJLZTgJD~p?9>vli` z_nga=`K`J*^Ydy;z2oiVQydrv^Hamp!OWVn#L@`(k7q|@-JSxZXLG|RB%r51eD*+V zwH0ri8#9k|7?_@Zu-Tko5ym>x#``QA4<8z$*n`VTmc%+yF+8wpWA9X@9lyt2w^E5wNGSyuqI; z04uXUo_zD#32x<5%lS3+dGOT~% zos_;(2A*~t@H#Bz6d2q1)us##>$t326<7SU57v)0#y+l(AztH8jQe>Ll#*$Kei7wD z45^tm|4Bx+a}__8DEQhEA;4fB&3G8Fk5_*W68d!&ZIC?CvuCZ(ncTYyV&-m0CRb;uNGi+w%34JF#v8 zeM2YKbIx|R@Cj?g$cJ5G6BxwXVq#&2N*l}0JslSz*!&xqaQmh9+An2&`tqB6kiRg% zEvkvalnjjiG8jCwCaYdta2UM@Z?Jk*dhhpW7P)rScfP_UDGr*^8^wuf`Z#i^6oCJT zdM0J$pIA!Gm=E>Tp%p<@TC4R8%Gw;Y#|iH&<9~+XU~klyrTgBIECg?lj@8SrEItc- zTIT1J*;ODioxdMzyNRm>AcNiW$F!oT6wqy4SOhNGU-?d8xnr_sB?0!WzFR#Qo};6_ zPV<7*zac-Pl%{O-hFC$>9)9F|4LcX(HJG=7;(^Pba<%)?9xE##1<2j)6RB8os5+b{ zUuQqp?^6$4(tD`nd`2A!=`MhLU!y3HK zURlQb%A5f2z^dh3nT(MHp^9k~R6~15>z#bHbX`;PbuSsa)C-(Zx1KRvyE_&)f$K8X z=*J56JE%--cI_s;;jI!j6n0><9uiVxj zJrSQV9>w2|H&8uk*BCElBx?LNcVqqzk;v=NDYF~%21FwNZ-j_BOe1!p$1vQ?2y>L= zS)B2L8kbM_#4^wRXoz!g`~LIEuQEZ?miQE>Abg242edxZ>986Fivi#d9M8<&ND2Xo zM4qRCA#8t-H6gTMdIt-6m_j_i+A-fntH;u463?3 z_L?KZCvl}akGtgK+TVPoqwpmFYq(}ukNM3M)0+dONNcn?=N}aD+ICIC4q92AjwsM& z{4s{Aa?aZgv<+_4490dd3bqbYUE(=6m5RLGpDXzCZ0{N)-Pv_H$pT(v=yA!PJM-n= zP}IgJBIGm*bgNGFesJ)meSQXS*>SnEXnnAatz`$D*{{@n1Fj-maMpD|aeAdjvOK2xpxSPnBmF?<@Yk{UMhPl9`r$ z(*%tYjvqplFm9ozC>OR&z0+LWRNI*%qnPKD23BA6M%j|+TWTv!ZbAtHr?y=2qBx3O zaP$c+LtyYQ5q#h)MTDRZHM`pH-ZI3GwN7Yo+`4sQA?X#oH)8#BGx|428;7|U=Y-Xz#&xN8 zd}r=Vx}oxRLGeOt>CTV*L|oY@JLt0IY(F0G^`j`ASbE>Y#c6UlMD_Wc7(I!gL?``( z0qL!ejbE^S%Pq&mB728{^QtFFCq+S$k8A8g@{E$t_j8+jE}^V;-qN}Ut*g^-{3m+l zn5X2xL}Mzh=5L*rt$52;*TG*!dfKxLW|fv+xfKS{y9hIju!a$Toa21XRrH~)plY$r zn(;Df{wh-(FlC167ekdmi>?@pY)XRHGoor?*BWkX+361xZflVBTNL~`+byzpkBuT& z$O9k!S4_B|8OK6Fcy2E;jeQ*MGJ0Z~o3A`VDWFjbB79V)XjBsZfCY7$@?baaqJ+th z1y!Dbmog2iFA=iGG~_%qDp8bW*%F8qp0?bjv`2@OPl7*w0BRlCO(|AcN7vj(e|yN) zg;`F*%Vi0`I1j&BO<&_JMRqq13@c@Wb3_9ITw}HlWQ<-PS;$#OuJL}$SK(UO8qC~; zkVX)H)Jrr@;xvm-7wKgYb<+@idnxjQ)=l0}3E(LI>ABvBpRiTqDtCX|kEW#|}5+1{x)%R2CRm~5e@p9{3(YH#wEQry-n6mcK`$=TKB=)7jL-gb `zm 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 delta 73355 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 None: self.assertEqual(new_data[2]["volume"], 500) self.assertEqual(new_data[2]["volumeUsd"], 100) + def test_delivery_mechanism_validation_for_usdc(self) -> None: + DeliveryMechanismPerPaymentPlanFactory( + payment_plan=self.payment_plan, + financial_service_provider=self.santander_fsp, + delivery_mechanism=GenericPayment.DELIVERY_TYPE_CASH, + delivery_mechanism_order=1, + ) + + self.payment_plan.currency = USDC + self.payment_plan.save() + + self.payment_plan.refresh_from_db(fields=["currency"]) + assert self.payment_plan.currency == USDC + + assign_fsps_mutation_response_with_error = self.graphql_request( + request_string=ASSIGN_FSPS_MUTATION, + context={"user": self.user}, + variables={ + "paymentPlanId": self.encoded_payment_plan_id, + "mappings": [ + { + "deliveryMechanism": GenericPayment.DELIVERY_TYPE_CASH, + "fspId": self.encoded_santander_fsp_id, + "order": 1, + }, + ], + }, + ) + assert "errors" in assign_fsps_mutation_response_with_error, assign_fsps_mutation_response_with_error + assert ( + assign_fsps_mutation_response_with_error["errors"][0]["message"] + == "For currency USDC can be assigned only delivery mechanism Transfer to Digital Wallet" + ) + class TestValidateFSPPerDeliveryMechanism(APITestCase): @classmethod diff --git a/backend/hct_mis_api/apps/registration_datahub/tests/test_rdi_merge.py b/backend/hct_mis_api/apps/registration_datahub/tests/test_rdi_merge.py index 8b049057c4..0248fd5b1f 100644 --- a/backend/hct_mis_api/apps/registration_datahub/tests/test_rdi_merge.py +++ b/backend/hct_mis_api/apps/registration_datahub/tests/test_rdi_merge.py @@ -113,6 +113,9 @@ def set_imported_individuals(cls, imported_household: ImportedHouseholdFactory) "registration_data_import": cls.rdi_hub, "household": imported_household, "email": "fake_email_1@com", + "wallet_name": "Wallet Name 1", + "blockchain_name": "Blockchain Name 1", + "wallet_address": "Wallet Address 1", }, { "full_name": "Robin Ford", @@ -244,6 +247,13 @@ def test_merge_rdi_and_recalculation(self) -> None: self.assertEqual(Individual.objects.filter(full_name="Baz Bush").first().email, "fake_email_5@com") self.assertEqual(Individual.objects.filter(full_name="Benjamin Butler").first().email, "fake_email_1@com") self.assertEqual(Individual.objects.filter(full_name="Bob Jackson").first().email, "") + self.assertEqual(Individual.objects.filter(full_name="Benjamin Butler").first().wallet_name, "Wallet Name 1") + self.assertEqual( + Individual.objects.filter(full_name="Benjamin Butler").first().blockchain_name, "Blockchain Name 1" + ) + self.assertEqual( + Individual.objects.filter(full_name="Benjamin Butler").first().wallet_address, "Wallet Address 1" + ) household_data = model_to_dict( households[0], From e0a4657e7c2fae4c87d96b072df4acc6d9979c81 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Tue, 23 Apr 2024 13:21:15 +0200 Subject: [PATCH 06/38] add test_get_exchange_rate_for_usdc_crrency --- backend/hct_mis_api/apps/payment/tests/test_models.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/hct_mis_api/apps/payment/tests/test_models.py b/backend/hct_mis_api/apps/payment/tests/test_models.py index e34cf1b5d5..afa359093e 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_models.py +++ b/backend/hct_mis_api/apps/payment/tests/test_models.py @@ -8,6 +8,7 @@ from dateutil.relativedelta import relativedelta +from hct_mis_api.apps.core.currencies import USDC from hct_mis_api.apps.core.fixtures import create_afghanistan from hct_mis_api.apps.core.models import BusinessArea from hct_mis_api.apps.household.fixtures import HouseholdFactory, IndividualFactory @@ -124,6 +125,10 @@ def test_can_be_locked(self) -> None: PaymentFactory(parent=pp1, conflicted=False, currency="PLN") self.assertEqual(pp1.can_be_locked, True) + def test_get_exchange_rate_for_usdc_currency(self) -> None: + pp = PaymentPlanFactory(currency=USDC) + self.assertEqual(pp.get_exchange_rate(), 1.0) + class TestPaymentModel(TestCase): @classmethod From 6cb533c9478d00f4e06769a56c67d0d0b26c60d7 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Tue, 23 Apr 2024 16:28:59 +0200 Subject: [PATCH 07/38] add more delivery mechanism in tests --- .../apps/payment/tests/test_fsp_in_payment_plan.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py b/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py index 5e84e5be8a..b987128da3 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py +++ b/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py @@ -920,6 +920,13 @@ def test_delivery_mechanism_validation_for_usdc(self) -> None: delivery_mechanism_order=1, ) + DeliveryMechanismPerPaymentPlanFactory( + payment_plan=self.payment_plan, + financial_service_provider=self.bank_of_america_fsp, + delivery_mechanism=GenericPayment.DELIVERY_TYPE_CASH, + delivery_mechanism_order=2, + ) + self.payment_plan.currency = USDC self.payment_plan.save() @@ -937,6 +944,11 @@ def test_delivery_mechanism_validation_for_usdc(self) -> None: "fspId": self.encoded_santander_fsp_id, "order": 1, }, + { + "deliveryMechanism": GenericPayment.DELIVERY_TYPE_CASH, + "fspId": self.encoded_bank_of_america_fsp_id, + "order": 2, + }, ], }, ) From 89a37dba883b5b87c6133830215bb36d5b927688 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Fri, 26 Apr 2024 17:15:51 +0200 Subject: [PATCH 08/38] add migrations & black --- .../individual_data_update_service.py | 12 +++---- .../household/migrations/0175_migration.py | 33 +++++++++++++++++++ .../apps/payment/migrations/0127_migration.py | 19 +++++++++++ .../tests/test_import_verifications.py | 6 ++-- .../xlsx/xlsx_verification_export_service.py | 6 ++-- .../migrations/0112_migration.py | 33 +++++++++++++++++++ .../services/xlsx_export_targeting_service.py | 6 ++-- 7 files changed, 100 insertions(+), 15 deletions(-) create mode 100644 backend/hct_mis_api/apps/household/migrations/0175_migration.py create mode 100644 backend/hct_mis_api/apps/payment/migrations/0127_migration.py create mode 100644 backend/hct_mis_api/apps/registration_datahub/migrations/0112_migration.py diff --git a/backend/hct_mis_api/apps/grievance/services/data_change/individual_data_update_service.py b/backend/hct_mis_api/apps/grievance/services/data_change/individual_data_update_service.py index 4919a78f57..d1f0d6688c 100644 --- a/backend/hct_mis_api/apps/grievance/services/data_change/individual_data_update_service.py +++ b/backend/hct_mis_api/apps/grievance/services/data_change/individual_data_update_service.py @@ -123,9 +123,9 @@ def save(self) -> List[GrievanceTicket]: individual_data_with_approve_status["identities_to_remove"] = identities_to_remove_with_approve_status individual_data_with_approve_status["identities_to_edit"] = prepare_edit_identities(identities_to_edit) individual_data_with_approve_status["payment_channels"] = payment_channels_with_approve_status - individual_data_with_approve_status[ - "payment_channels_to_remove" - ] = payment_channels_to_remove_with_approve_status + individual_data_with_approve_status["payment_channels_to_remove"] = ( + payment_channels_to_remove_with_approve_status + ) individual_data_with_approve_status["payment_channels_to_edit"] = prepare_edit_payment_channel( payment_channels_to_edit ) @@ -215,9 +215,9 @@ def update(self) -> GrievanceTicket: identities_to_remove_with_approve_status ) individual_data_with_approve_status["payment_channels"] = payment_channels_with_approve_status - individual_data_with_approve_status[ - "payment_channels_to_remove" - ] = payment_channels_to_remove_with_approve_status + individual_data_with_approve_status["payment_channels_to_remove"] = ( + payment_channels_to_remove_with_approve_status + ) individual_data_with_approve_status["payment_channels_to_edit"] = prepare_edit_payment_channel( payment_channels_to_edit ) diff --git a/backend/hct_mis_api/apps/household/migrations/0175_migration.py b/backend/hct_mis_api/apps/household/migrations/0175_migration.py new file mode 100644 index 0000000000..8b6591828f --- /dev/null +++ b/backend/hct_mis_api/apps/household/migrations/0175_migration.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.25 on 2024-04-26 15:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('household', '0174_migration'), + ] + + operations = [ + migrations.AddField( + model_name='individual', + name='blockchain_name', + field=models.CharField(blank=True, default='', max_length=64), + ), + migrations.AddField( + model_name='individual', + name='wallet_address', + field=models.CharField(blank=True, default='', max_length=128), + ), + migrations.AddField( + model_name='individual', + name='wallet_name', + field=models.CharField(blank=True, default='', max_length=64), + ), + migrations.AlterField( + model_name='household', + name='currency', + field=models.CharField(choices=[('', 'None'), ('AED', 'United Arab Emirates dirham'), ('AFN', 'Afghan afghani'), ('ALL', 'Albanian lek'), ('AMD', 'Armenian dram'), ('ANG', 'Netherlands Antillean guilder'), ('AOA', 'Angolan kwanza'), ('ARS', 'Argentine peso'), ('AUD', 'Australian dollar'), ('AWG', 'Aruban florin'), ('AZN', 'Azerbaijani manat'), ('BAM', 'Bosnia and Herzegovina convertible mark'), ('BBD', 'Barbados dollar'), ('BDT', 'Bangladeshi taka'), ('BGN', 'Bulgarian lev'), ('BHD', 'Bahraini dinar'), ('BIF', 'Burundian franc'), ('BMD', 'Bermudian dollar'), ('BND', 'Brunei dollar'), ('BOB', 'Boliviano'), ('BOV', 'Bolivian Mvdol (funds code)'), ('BRL', 'Brazilian real'), ('BSD', 'Bahamian dollar'), ('BTN', 'Bhutanese ngultrum'), ('BWP', 'Botswana pula'), ('BYN', 'Belarusian ruble'), ('BZD', 'Belize dollar'), ('CAD', 'Canadian dollar'), ('CDF', 'Congolese franc'), ('CHF', 'Swiss franc'), ('CLP', 'Chilean peso'), ('CNY', 'Chinese yuan'), ('COP', 'Colombian peso'), ('CRC', 'Costa Rican colon'), ('CUC', 'Cuban convertible peso'), ('CUP', 'Cuban peso'), ('CVE', 'Cape Verdean escudo'), ('CZK', 'Czech koruna'), ('DJF', 'Djiboutian franc'), ('DKK', 'Danish krone'), ('DOP', 'Dominican peso'), ('DZD', 'Algerian dinar'), ('EGP', 'Egyptian pound'), ('ERN', 'Eritrean nakfa'), ('ETB', 'Ethiopian birr'), ('EUR', 'Euro'), ('FJD', 'Fiji dollar'), ('FKP', 'Falkland Islands pound'), ('GBP', 'Pound sterling'), ('GEL', 'Georgian lari'), ('GHS', 'Ghanaian cedi'), ('GIP', 'Gibraltar pound'), ('GMD', 'Gambian dalasi'), ('GNF', 'Guinean franc'), ('GTQ', 'Guatemalan quetzal'), ('GYD', 'Guyanese dollar'), ('HKD', 'Hong Kong dollar'), ('HNL', 'Honduran lempira'), ('HRK', 'Croatian kuna'), ('HTG', 'Haitian gourde'), ('HUF', 'Hungarian forint'), ('IDR', 'Indonesian rupiah'), ('ILS', 'Israeli new shekel'), ('INR', 'Indian rupee'), ('IQD', 'Iraqi dinar'), ('IRR', 'Iranian rial'), ('ISK', 'Icelandic króna'), ('JMD', 'Jamaican dollar'), ('JOD', 'Jordanian dinar'), ('JPY', 'Japanese yen'), ('KES', 'Kenyan shilling'), ('KGS', 'Kyrgyzstani som'), ('KHR', 'Cambodian riel'), ('KMF', 'Comoro franc'), ('KPW', 'North Korean won'), ('KRW', 'South Korean won'), ('KWD', 'Kuwaiti dinar'), ('KYD', 'Cayman Islands dollar'), ('KZT', 'Kazakhstani tenge'), ('LAK', 'Lao kip'), ('LBP', 'Lebanese pound'), ('LKR', 'Sri Lankan rupee'), ('LRD', 'Liberian dollar'), ('LSL', 'Lesotho loti'), ('LYD', 'Libyan dinar'), ('MAD', 'Moroccan dirham'), ('MDL', 'Moldovan leu'), ('MGA', 'Malagasy ariary'), ('MKD', 'Macedonian denar'), ('MMK', 'Myanmar kyat'), ('MNT', 'Mongolian tögrög'), ('MOP', 'Macanese pataca'), ('MRU', 'Mauritanian ouguiya'), ('MUR', 'Mauritian rupee'), ('MVR', 'Maldivian rufiyaa'), ('MWK', 'Malawian kwacha'), ('MXN', 'Mexican peso'), ('MYR', 'Malaysian ringgit'), ('MZN', 'Mozambican metical'), ('NAD', 'Namibian dollar'), ('NGN', 'Nigerian naira'), ('NIO', 'Nicaraguan córdoba'), ('NOK', 'Norwegian krone'), ('NPR', 'Nepalese rupee'), ('NZD', 'New Zealand dollar'), ('OMR', 'Omani rial'), ('PAB', 'Panamanian balboa'), ('PEN', 'Peruvian sol'), ('PGK', 'Papua New Guinean kina'), ('PHP', 'Philippine peso'), ('PKR', 'Pakistani rupee'), ('PLN', 'Polish złoty'), ('PYG', 'Paraguayan guaraní'), ('QAR', 'Qatari riyal'), ('RON', 'Romanian leu'), ('RSD', 'Serbian dinar'), ('RUB', 'Russian ruble'), ('RWF', 'Rwandan franc'), ('SAR', 'Saudi riyal'), ('SBD', 'Solomon Islands dollar'), ('SCR', 'Seychelles rupee'), ('SDG', 'Sudanese pound'), ('SEK', 'Swedish krona/kronor'), ('SGD', 'Singapore dollar'), ('SHP', 'Saint Helena pound'), ('SLL', 'Sierra Leonean leone'), ('SOS', 'Somali shilling'), ('SRD', 'Surinamese dollar'), ('SSP', 'South Sudanese pound'), ('STN', 'São Tomé and Príncipe dobra'), ('SVC', 'Salvadoran colón'), ('SYP', 'Syrian pound'), ('SZL', 'Swazi lilangeni'), ('THB', 'Thai baht'), ('TJS', 'Tajikistani somoni'), ('TMT', 'Turkmenistan manat'), ('TND', 'Tunisian dinar'), ('TOP', 'Tongan paʻanga'), ('TRY', 'Turkish lira'), ('TTD', 'Trinidad and Tobago dollar'), ('TWD', 'New Taiwan dollar'), ('TZS', 'Tanzanian shilling'), ('UAH', 'Ukrainian hryvnia'), ('UGX', 'Ugandan shilling'), ('USD', 'United States dollar'), ('UYU', 'Uruguayan peso'), ('UYW', 'Unidad previsional[14]'), ('UZS', 'Uzbekistan som'), ('VES', 'Venezuelan bolívar soberano'), ('VND', 'Vietnamese đồng'), ('VUV', 'Vanuatu vatu'), ('WST', 'Samoan tala'), ('XAF', 'CFA franc BEAC'), ('XAG', 'Silver (one troy ounce)'), ('XAU', 'Gold (one troy ounce)'), ('XCD', 'East Caribbean dollar'), ('XOF', 'CFA franc BCEAO'), ('XPF', 'CFP franc (franc Pacifique)'), ('YER', 'Yemeni rial'), ('ZAR', 'South African rand'), ('ZMW', 'Zambian kwacha'), ('ZWL', 'Zimbabwean dollar'), ('USDC', 'Digital currency')], default='', max_length=250), + ), + ] diff --git a/backend/hct_mis_api/apps/payment/migrations/0127_migration.py b/backend/hct_mis_api/apps/payment/migrations/0127_migration.py new file mode 100644 index 0000000000..c60bb40916 --- /dev/null +++ b/backend/hct_mis_api/apps/payment/migrations/0127_migration.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.25 on 2024-04-26 15:13 + +from django.db import migrations, models +import hct_mis_api.apps.account.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('payment', '0126_migration'), + ] + + operations = [ + migrations.AlterField( + model_name='financialserviceproviderxlsxtemplate', + name='core_fields', + field=hct_mis_api.apps.account.models.HorizontalChoiceArrayField(base_field=models.CharField(blank=True, choices=[('age', 'Age (calculated)'), ('residence_status', 'Residence status'), ('consent', 'Do you consent?'), ('consent_sign', 'Do you consent?'), ('country_origin', 'Country of Origin'), ('country', 'Country of registration'), ('address', 'Address'), ('zip_code', 'Zip code'), ('admin1', 'Household resides in which admin1?'), ('admin2', 'Household resides in which admin2?'), ('admin3', 'Household resides in which admin3?'), ('admin4', 'Household resides in which admin4?'), ('geopoint', 'Geolocation'), ('unhcr_id', 'UNHCR Case ID'), ('returnee', 'Is this a returnee Household?'), ('size', 'What is the Household size?'), ('fchild_hoh', 'Child is female and Head of Household'), ('child_hoh', 'Child is Head of Household'), ('relationship', 'Relationship to Head of Household'), ('full_name', 'Full name'), ('given_name', 'Given name'), ('middle_name', 'Middle name(s)'), ('family_name', 'Family name'), ('sex', 'Gender'), ('birth_date', 'Birth date'), ('estimated_birth_date', 'Estimated birth date?'), ('photo', "Individual's photo"), ('marital_status', 'Marital status'), ('phone_no', 'Phone number'), ('who_answers_phone', 'Who answers this phone?'), ('phone_no_alternative', 'Alternative phone number'), ('who_answers_alt_phone', 'Who answers this (alt) phone?'), ('registration_method', 'Method of collection (e.g. HH survey, Community, etc.)'), ('collect_individual_data', 'Will you be collecting all member Individual data?'), ('currency', 'Which currency will be used for financial questions?'), ('birth_certificate_no', 'Birth certificate number'), ('birth_certificate_issuer', 'Issuing country of birth certificate'), ('birth_certificate_photo', 'Birth certificate photo'), ('tax_id_no', 'Tax identification number'), ('tax_id_issuer', 'Issuing country of tax identification'), ('tax_id_photo', 'Tax identification photo'), ('drivers_license_no', "Driver's license number"), ('drivers_license_issuer', "Issuing country of driver's license"), ('drivers_license_photo', "Driver's license photo"), ('electoral_card_no', 'Electoral card number'), ('electoral_card_issuer', 'Issuing country of electoral card'), ('electoral_card_photo', 'Electoral card photo'), ('unhcr_id_no', 'UNHCR ID number'), ('unhcr_id_issuer', 'Issuing entity of UNHCR ID'), ('unhcr_id_photo', 'UNHCR ID photo'), ('national_passport', 'National passport number'), ('national_passport_issuer', 'Issuing country of national passport'), ('national_passport_photo', 'National passport photo'), ('national_id_no', 'National ID number'), ('national_id_issuer', 'Issuing country of national ID'), ('national_id_photo', 'National ID photo'), ('scope_id_no', 'WFP Scope ID number'), ('scope_id_issuer', 'Issuing entity of SCOPE ID'), ('scope_id_photo', 'WFP Scope ID photo'), ('other_id_type', 'If other type of ID, specify the type'), ('other_id_no', 'Other ID number'), ('other_id_issuer', 'Issuing country of other ID'), ('other_id_photo', 'ID photo'), ('female_age_group_0_5_count', 'Females Age 0 - 5'), ('female_age_group_6_11_count', 'Females Age 6 - 11'), ('female_age_group_12_17_count', 'Females Age 12 - 17'), ('female_age_group_18_59_count', 'Females Age 18 - 59'), ('female_age_group_60_count', 'Females Age 60 +'), ('pregnant_count', 'Pregnant count'), ('male_age_group_0_5_count', 'Males Age 0 - 5'), ('male_age_group_6_11_count', 'Males Age 6 - 11'), ('male_age_group_12_17_count', 'Males Age 12 - 17'), ('male_age_group_18_59_count', 'Males Age 18 - 59'), ('male_age_group_60_count', 'Males Age 60 +'), ('female_age_group_0_5_disabled_count', 'Females age 0 - 5 with disability'), ('female_age_group_6_11_disabled_count', 'Females age 6 - 11 with disability'), ('female_age_group_12_17_disabled_count', 'Females age 12 - 17 with disability'), ('female_age_group_18_59_disabled_count', 'Females Age 18 - 59 with disability'), ('female_age_group_60_disabled_count', 'Female members with Disability age 60 +'), ('male_age_group_0_5_disabled_count', 'Males age 0 - 5 with disability'), ('male_age_group_6_11_disabled_count', 'Males age 6 - 11 with disability'), ('male_age_group_12_17_disabled_count', 'Males age 12 - 17 with disability'), ('male_age_group_18_59_disabled_count', 'Males Age 18 - 59 with disability'), ('male_age_group_60_disabled_count', 'Male members with Disability age 60 +'), ('pregnant', 'Is the Individual pregnant?'), ('work_status', 'Does the Individual have paid employment in the current month?'), ('observed_disability', 'Does the Individual have disability?'), ('seeing_disability', 'If the Individual has difficulty seeing, what is the severity?'), ('hearing_disability', 'If the Individual has difficulty hearing, what is the severity?'), ('physical_disability', 'If the Individual has difficulty walking or climbing steps, what is the severity?'), ('memory_disability', 'If the Individual has difficulty remembering or concentrating, what is the severity?'), ('selfcare_disability', 'Do you have difficulty (with self-care such as) washing all over or dressing'), ('comms_disability', 'If the Individual has difficulty communicating, what is the severity?'), ('fchild_hoh', 'Female child headed Household'), ('child_hoh', 'Child headed Household'), ('village', 'Village'), ('deviceid', 'Device ID'), ('name_enumerator', 'Name of the enumerator'), ('org_enumerator', 'Organization of the enumerator'), ('consent_sharing', 'Which organizations may we share your information with?'), ('org_name_enumerator', 'Name of partner organization'), ('disability', 'Individual is disabled?'), ('first_registration_date', 'First Individual registration date'), ('first_registration_date', 'First Household registration date'), ('number_of_children', 'What is the number of children in the Household?'), ('has_phone_number', 'Has phone number?'), ('has_tax_id_number', 'Has tax ID number?'), ('has_the_bank_account_number', 'Has the bank account number?'), ('role', 'Role'), ('registration_data_import', 'Registration Data Import'), ('registration_data_import', 'Registration Data Import'), ('unicef_id', 'Household unicef id'), ('unicef_id', 'Individual unicef id'), ('admin_area_title', 'Household resides in which admin area?'), ('start', 'Data collection start date'), ('end', 'Data collection end date'), ('primary_collector_id', 'List of primary collectors ids, separated by a semicolon'), ('alternate_collector_id', 'List of alternate collectors ids, separated by a semicolon'), ('household_id', 'Household ID'), ('household_id', 'Household ID'), ('email', 'Individual email'), ('preferred_language', 'Preferred language'), ('age_at_registration', 'Age at registration'), ('account_holder_name', 'Account holder name'), ('bank_branch_name', 'Bank branch name'), ('index_id', 'Index ID'), ('wallet_name', 'Wallet Name'), ('blockchain_name', 'Blockchain Name'), ('wallet_address', 'Wallet Address'), ('registration_id', 'Program registration id'), ('bank_name', 'Bank name'), ('bank_account_number', 'Bank account number'), ('debit_card_issuer', 'Debit Card Issuer'), ('debit_card_number', 'Debit card number'), ('payment_delivery_phone_no', 'Payment delivery phone number')], max_length=255), blank=True, default=list, size=None), + ), + ] diff --git a/backend/hct_mis_api/apps/payment/tests/test_import_verifications.py b/backend/hct_mis_api/apps/payment/tests/test_import_verifications.py index f597387103..404760215b 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_import_verifications.py +++ b/backend/hct_mis_api/apps/payment/tests/test_import_verifications.py @@ -311,9 +311,9 @@ def test_import_valid_status_changed_received_yes_full(self) -> None: payment_verification = PaymentVerification.objects.get(payment_object_id=payment_record_id) self.assertEqual(payment_verification.status, PaymentVerification.STATUS_PENDING) wb.active[f"{XlsxVerificationExportService.RECEIVED_COLUMN_LETTER}2"] = "YES" - wb.active[ - f"{XlsxVerificationExportService.RECEIVED_AMOUNT_COLUMN_LETTER}2" - ] = payment_verification.payment_obj.delivered_quantity + wb.active[f"{XlsxVerificationExportService.RECEIVED_AMOUNT_COLUMN_LETTER}2"] = ( + payment_verification.payment_obj.delivered_quantity + ) with NamedTemporaryFile() as tmp: wb.save(tmp.name) file = io.BytesIO(tmp.read()) diff --git a/backend/hct_mis_api/apps/payment/xlsx/xlsx_verification_export_service.py b/backend/hct_mis_api/apps/payment/xlsx/xlsx_verification_export_service.py index 2e5c66f2cd..c215f3a040 100644 --- a/backend/hct_mis_api/apps/payment/xlsx/xlsx_verification_export_service.py +++ b/backend/hct_mis_api/apps/payment/xlsx/xlsx_verification_export_service.py @@ -72,9 +72,9 @@ def _create_workbook(self) -> openpyxl.Workbook: return wb def _add_version(self) -> None: - self.ws_meta[ - XlsxVerificationExportService.VERSION_CELL_NAME_COORDINATES - ] = XlsxVerificationExportService.VERSION_CELL_NAME + self.ws_meta[XlsxVerificationExportService.VERSION_CELL_NAME_COORDINATES] = ( + XlsxVerificationExportService.VERSION_CELL_NAME + ) self.ws_meta[XlsxVerificationExportService.VERSION_CELL_COORDINATES] = XlsxVerificationExportService.VERSION def _to_received_column(self, payment_record_verification: PaymentVerification) -> Optional[str]: diff --git a/backend/hct_mis_api/apps/registration_datahub/migrations/0112_migration.py b/backend/hct_mis_api/apps/registration_datahub/migrations/0112_migration.py new file mode 100644 index 0000000000..ff98779dac --- /dev/null +++ b/backend/hct_mis_api/apps/registration_datahub/migrations/0112_migration.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.25 on 2024-04-26 15:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('registration_datahub', '0111_migration'), + ] + + operations = [ + migrations.AddField( + model_name='importedindividual', + name='blockchain_name', + field=models.CharField(blank=True, default='', max_length=64), + ), + migrations.AddField( + model_name='importedindividual', + name='wallet_address', + field=models.CharField(blank=True, default='', max_length=128), + ), + migrations.AddField( + model_name='importedindividual', + name='wallet_name', + field=models.CharField(blank=True, default='', max_length=64), + ), + migrations.AlterField( + model_name='importedhousehold', + name='currency', + field=models.CharField(choices=[('', 'None'), ('AED', 'United Arab Emirates dirham'), ('AFN', 'Afghan afghani'), ('ALL', 'Albanian lek'), ('AMD', 'Armenian dram'), ('ANG', 'Netherlands Antillean guilder'), ('AOA', 'Angolan kwanza'), ('ARS', 'Argentine peso'), ('AUD', 'Australian dollar'), ('AWG', 'Aruban florin'), ('AZN', 'Azerbaijani manat'), ('BAM', 'Bosnia and Herzegovina convertible mark'), ('BBD', 'Barbados dollar'), ('BDT', 'Bangladeshi taka'), ('BGN', 'Bulgarian lev'), ('BHD', 'Bahraini dinar'), ('BIF', 'Burundian franc'), ('BMD', 'Bermudian dollar'), ('BND', 'Brunei dollar'), ('BOB', 'Boliviano'), ('BOV', 'Bolivian Mvdol (funds code)'), ('BRL', 'Brazilian real'), ('BSD', 'Bahamian dollar'), ('BTN', 'Bhutanese ngultrum'), ('BWP', 'Botswana pula'), ('BYN', 'Belarusian ruble'), ('BZD', 'Belize dollar'), ('CAD', 'Canadian dollar'), ('CDF', 'Congolese franc'), ('CHF', 'Swiss franc'), ('CLP', 'Chilean peso'), ('CNY', 'Chinese yuan'), ('COP', 'Colombian peso'), ('CRC', 'Costa Rican colon'), ('CUC', 'Cuban convertible peso'), ('CUP', 'Cuban peso'), ('CVE', 'Cape Verdean escudo'), ('CZK', 'Czech koruna'), ('DJF', 'Djiboutian franc'), ('DKK', 'Danish krone'), ('DOP', 'Dominican peso'), ('DZD', 'Algerian dinar'), ('EGP', 'Egyptian pound'), ('ERN', 'Eritrean nakfa'), ('ETB', 'Ethiopian birr'), ('EUR', 'Euro'), ('FJD', 'Fiji dollar'), ('FKP', 'Falkland Islands pound'), ('GBP', 'Pound sterling'), ('GEL', 'Georgian lari'), ('GHS', 'Ghanaian cedi'), ('GIP', 'Gibraltar pound'), ('GMD', 'Gambian dalasi'), ('GNF', 'Guinean franc'), ('GTQ', 'Guatemalan quetzal'), ('GYD', 'Guyanese dollar'), ('HKD', 'Hong Kong dollar'), ('HNL', 'Honduran lempira'), ('HRK', 'Croatian kuna'), ('HTG', 'Haitian gourde'), ('HUF', 'Hungarian forint'), ('IDR', 'Indonesian rupiah'), ('ILS', 'Israeli new shekel'), ('INR', 'Indian rupee'), ('IQD', 'Iraqi dinar'), ('IRR', 'Iranian rial'), ('ISK', 'Icelandic króna'), ('JMD', 'Jamaican dollar'), ('JOD', 'Jordanian dinar'), ('JPY', 'Japanese yen'), ('KES', 'Kenyan shilling'), ('KGS', 'Kyrgyzstani som'), ('KHR', 'Cambodian riel'), ('KMF', 'Comoro franc'), ('KPW', 'North Korean won'), ('KRW', 'South Korean won'), ('KWD', 'Kuwaiti dinar'), ('KYD', 'Cayman Islands dollar'), ('KZT', 'Kazakhstani tenge'), ('LAK', 'Lao kip'), ('LBP', 'Lebanese pound'), ('LKR', 'Sri Lankan rupee'), ('LRD', 'Liberian dollar'), ('LSL', 'Lesotho loti'), ('LYD', 'Libyan dinar'), ('MAD', 'Moroccan dirham'), ('MDL', 'Moldovan leu'), ('MGA', 'Malagasy ariary'), ('MKD', 'Macedonian denar'), ('MMK', 'Myanmar kyat'), ('MNT', 'Mongolian tögrög'), ('MOP', 'Macanese pataca'), ('MRU', 'Mauritanian ouguiya'), ('MUR', 'Mauritian rupee'), ('MVR', 'Maldivian rufiyaa'), ('MWK', 'Malawian kwacha'), ('MXN', 'Mexican peso'), ('MYR', 'Malaysian ringgit'), ('MZN', 'Mozambican metical'), ('NAD', 'Namibian dollar'), ('NGN', 'Nigerian naira'), ('NIO', 'Nicaraguan córdoba'), ('NOK', 'Norwegian krone'), ('NPR', 'Nepalese rupee'), ('NZD', 'New Zealand dollar'), ('OMR', 'Omani rial'), ('PAB', 'Panamanian balboa'), ('PEN', 'Peruvian sol'), ('PGK', 'Papua New Guinean kina'), ('PHP', 'Philippine peso'), ('PKR', 'Pakistani rupee'), ('PLN', 'Polish złoty'), ('PYG', 'Paraguayan guaraní'), ('QAR', 'Qatari riyal'), ('RON', 'Romanian leu'), ('RSD', 'Serbian dinar'), ('RUB', 'Russian ruble'), ('RWF', 'Rwandan franc'), ('SAR', 'Saudi riyal'), ('SBD', 'Solomon Islands dollar'), ('SCR', 'Seychelles rupee'), ('SDG', 'Sudanese pound'), ('SEK', 'Swedish krona/kronor'), ('SGD', 'Singapore dollar'), ('SHP', 'Saint Helena pound'), ('SLL', 'Sierra Leonean leone'), ('SOS', 'Somali shilling'), ('SRD', 'Surinamese dollar'), ('SSP', 'South Sudanese pound'), ('STN', 'São Tomé and Príncipe dobra'), ('SVC', 'Salvadoran colón'), ('SYP', 'Syrian pound'), ('SZL', 'Swazi lilangeni'), ('THB', 'Thai baht'), ('TJS', 'Tajikistani somoni'), ('TMT', 'Turkmenistan manat'), ('TND', 'Tunisian dinar'), ('TOP', 'Tongan paʻanga'), ('TRY', 'Turkish lira'), ('TTD', 'Trinidad and Tobago dollar'), ('TWD', 'New Taiwan dollar'), ('TZS', 'Tanzanian shilling'), ('UAH', 'Ukrainian hryvnia'), ('UGX', 'Ugandan shilling'), ('USD', 'United States dollar'), ('UYU', 'Uruguayan peso'), ('UYW', 'Unidad previsional[14]'), ('UZS', 'Uzbekistan som'), ('VES', 'Venezuelan bolívar soberano'), ('VND', 'Vietnamese đồng'), ('VUV', 'Vanuatu vatu'), ('WST', 'Samoan tala'), ('XAF', 'CFA franc BEAC'), ('XAG', 'Silver (one troy ounce)'), ('XAU', 'Gold (one troy ounce)'), ('XCD', 'East Caribbean dollar'), ('XOF', 'CFA franc BCEAO'), ('XPF', 'CFP franc (franc Pacifique)'), ('YER', 'Yemeni rial'), ('ZAR', 'South African rand'), ('ZMW', 'Zambian kwacha'), ('ZWL', 'Zimbabwean dollar'), ('USDC', 'Digital currency')], default='', max_length=250), + ), + ] diff --git a/backend/hct_mis_api/apps/targeting/services/xlsx_export_targeting_service.py b/backend/hct_mis_api/apps/targeting/services/xlsx_export_targeting_service.py index 63dfa8af1b..ffdbd2d307 100644 --- a/backend/hct_mis_api/apps/targeting/services/xlsx_export_targeting_service.py +++ b/backend/hct_mis_api/apps/targeting/services/xlsx_export_targeting_service.py @@ -60,9 +60,9 @@ def generate_workbook(self) -> Workbook: return self.workbook def _add_version(self) -> None: - self.ws_meta[ - XlsxExportTargetingService.VERSION_CELL_NAME_COORDINATES - ] = XlsxExportTargetingService.VERSION_CELL_NAME + self.ws_meta[XlsxExportTargetingService.VERSION_CELL_NAME_COORDINATES] = ( + XlsxExportTargetingService.VERSION_CELL_NAME + ) self.ws_meta[XlsxExportTargetingService.VERSION_CELL_COORDINATES] = XlsxExportTargetingService.VERSION def _create_workbook(self) -> openpyxl.Workbook: From 2937c322df96991fb128e8b8ed1d15e82cc66687 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Fri, 26 Apr 2024 23:12:03 +0200 Subject: [PATCH 09/38] fix rdi merge new fields --- .../hct_mis_api/apps/registration_datahub/tasks/rdi_merge.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/hct_mis_api/apps/registration_datahub/tasks/rdi_merge.py b/backend/hct_mis_api/apps/registration_datahub/tasks/rdi_merge.py index 168383d6d9..446359e6d9 100644 --- a/backend/hct_mis_api/apps/registration_datahub/tasks/rdi_merge.py +++ b/backend/hct_mis_api/apps/registration_datahub/tasks/rdi_merge.py @@ -144,6 +144,9 @@ class RdiMergeTask: "preferred_language", "age_at_registration", "payment_delivery_phone_no", + "wallet_name", + "blockchain_name", + "wallet_address", ) def merge_admin_areas( From c95374cb278658030412f7f2438c4029f8b4aed7 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Mon, 29 Apr 2024 13:28:55 +0200 Subject: [PATCH 10/38] add more tests --- .../snap_test_payment_plan_reconciliation.py | 120 ++++++++++++++++++ .../tests/test_payment_plan_reconciliation.py | 77 +++++++++++ 2 files changed, 197 insertions(+) diff --git a/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_payment_plan_reconciliation.py b/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_payment_plan_reconciliation.py index c08a723192..9eaaab5a20 100644 --- a/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_payment_plan_reconciliation.py +++ b/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_payment_plan_reconciliation.py @@ -7,6 +7,66 @@ snapshots = Snapshot() +snapshots['TestPaymentPlanReconciliation::test_apply_steficon_rule_with_wrong_payment_plan_status 1'] = { + 'data': { + 'setSteficonRuleOnPaymentPlanPaymentList': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 5, + 'line': 3 + } + ], + 'message': "You can run formula only for 'Locked' status of Payment Plan", + 'path': [ + 'setSteficonRuleOnPaymentPlanPaymentList' + ] + } + ] +} + +snapshots['TestPaymentPlanReconciliation::test_apply_steficon_rule_with_wrong_payment_plan_status 2'] = { + 'data': { + 'setSteficonRuleOnPaymentPlanPaymentList': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 5, + 'line': 3 + } + ], + 'message': 'Rule Engine run in progress', + 'path': [ + 'setSteficonRuleOnPaymentPlanPaymentList' + ] + } + ] +} + +snapshots['TestPaymentPlanReconciliation::test_assign_fsp_mutation_payment_plan_wrong_status 1'] = { + 'data': { + 'assignFspToDeliveryMechanism': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 5, + 'line': 3 + } + ], + 'message': 'Payment plan must be locked to assign FSP to delivery mechanism', + 'path': [ + 'assignFspToDeliveryMechanism' + ] + } + ] +} + snapshots['TestPaymentPlanReconciliation::test_correct_message_displayed_when_file_is_protected 1'] = { 'data': { 'importXlsxPaymentPlanPaymentListPerFsp': None @@ -27,6 +87,46 @@ ] } +snapshots['TestPaymentPlanReconciliation::test_error_message_when_engine_rule_not_enabled_or_deprecated 1'] = { + 'data': { + 'setSteficonRuleOnPaymentPlanPaymentList': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 5, + 'line': 3 + } + ], + 'message': 'This engine rule is not enabled or is deprecated.', + 'path': [ + 'setSteficonRuleOnPaymentPlanPaymentList' + ] + } + ] +} + +snapshots['TestPaymentPlanReconciliation::test_error_message_when_engine_rule_not_enabled_or_deprecated 2'] = { + 'data': { + 'setSteficonRuleOnPaymentPlanPaymentList': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 5, + 'line': 3 + } + ], + 'message': 'This engine rule is not enabled or is deprecated.', + 'path': [ + 'setSteficonRuleOnPaymentPlanPaymentList' + ] + } + ] +} + snapshots['TestPaymentPlanReconciliation::test_follow_up_pp_entitlements_can_be_changed_with_steficon_rule 1'] = { 'data': { 'setSteficonRuleOnPaymentPlanPaymentList': { @@ -61,3 +161,23 @@ } } } + +snapshots['TestPaymentPlanReconciliation::test_import_with_wrong_payment_plan_status 1'] = { + 'data': { + 'importXlsxPaymentPlanPaymentListPerFsp': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 5, + 'line': 3 + } + ], + 'message': 'You can only import for ACCEPTED or FINISHED Payment Plan', + 'path': [ + 'importXlsxPaymentPlanPaymentListPerFsp' + ] + } + ] +} diff --git a/backend/hct_mis_api/apps/payment/tests/test_payment_plan_reconciliation.py b/backend/hct_mis_api/apps/payment/tests/test_payment_plan_reconciliation.py index a068063dff..58b84b2d04 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_payment_plan_reconciliation.py +++ b/backend/hct_mis_api/apps/payment/tests/test_payment_plan_reconciliation.py @@ -961,6 +961,50 @@ def test_follow_up_pp_entitlements_can_be_changed_with_steficon_rule(self) -> No }, ) + def test_apply_steficon_rule_with_wrong_payment_plan_status(self) -> None: + payment_plan = PaymentPlanFactory(status=PaymentPlan.Status.OPEN) + rule = RuleFactory(name="SomeRule") + + self.snapshot_graphql_request( + request_string=SET_STEFICON_RULE_MUTATION, + context={"user": self.user}, + variables={ + "paymentPlanId": encode_id_base64(payment_plan.id, "PaymentPlan"), + "steficonRuleId": encode_id_base64(rule.id, "Rule"), + }, + ) + + payment_plan.status = PaymentPlan.Status.LOCKED + payment_plan.background_action_status = PaymentPlan.BackgroundActionStatus.RULE_ENGINE_RUN + payment_plan.save() + payment_plan.refresh_from_db(fields=["status", "background_action_status"]) + + self.assertEqual(payment_plan.status, PaymentPlan.Status.LOCKED) + self.assertEqual(payment_plan.background_action_status, PaymentPlan.BackgroundActionStatus.RULE_ENGINE_RUN) + self.snapshot_graphql_request( + request_string=SET_STEFICON_RULE_MUTATION, + context={"user": self.user}, + variables={ + "paymentPlanId": encode_id_base64(payment_plan.id, "PaymentPlan"), + "steficonRuleId": encode_id_base64(rule.id, "Rule"), + }, + ) + + def test_error_message_when_engine_rule_not_enabled_or_deprecated(self) -> None: + payment_plan = PaymentPlanFactory(status=PaymentPlan.Status.LOCKED) + rule_not_enabled = RuleFactory(enabled=False) + rule_deprecated = RuleFactory(deprecated=True) + + for rule in [rule_not_enabled, rule_deprecated]: + self.snapshot_graphql_request( + request_string=SET_STEFICON_RULE_MUTATION, + context={"user": self.user}, + variables={ + "paymentPlanId": encode_id_base64(payment_plan.id, "PaymentPlan"), + "steficonRuleId": encode_id_base64(rule.id, "Rule"), + }, + ) + def test_follow_up_pp_entitlements_updated_with_file(self) -> None: content = Path(f"{settings.PROJECT_ROOT}/apps/payment/tests/test_file/pp_payment_list_valid.xlsx").read_bytes() pp = PaymentPlanFactory(is_follow_up=True, status=PaymentPlan.Status.LOCKED) @@ -986,3 +1030,36 @@ def test_correct_message_displayed_when_file_is_protected(self) -> None: "file": BytesIO(content), }, ) + + def test_import_with_wrong_payment_plan_status(self) -> None: + payment_plan = PaymentPlanFactory(status=PaymentPlan.Status.OPEN) + + self.assertEqual(payment_plan.status, PaymentPlan.Status.OPEN) + self.snapshot_graphql_request( + request_string=IMPORT_XLSX_PER_FSP_MUTATION, + context={"user": self.user}, + variables={ + "paymentPlanId": encode_id_base64(payment_plan.id, "PaymentPlan"), + "file": BytesIO(b"some data"), + }, + ) + + def test_assign_fsp_mutation_payment_plan_wrong_status(self) -> None: + payment_plan = PaymentPlanFactory(status=PaymentPlan.Status.OPEN) + fsp = FinancialServiceProviderFactory() + encoded_santander_fsp_id = encode_id_base64(fsp.id, "FinancialServiceProvider") + + self.snapshot_graphql_request( + request_string=ASSIGN_FSPS_MUTATION, + context={"user": self.user}, + variables={ + "paymentPlanId": encode_id_base64(payment_plan.id, "PaymentPlan"), + "mappings": [ + { + "deliveryMechanism": GenericPayment.DELIVERY_TYPE_CASH, + "fspId": encoded_santander_fsp_id, + "order": 1, + } + ], + }, + ) From b5da52bab5c866556be46cf35fc980b12a090c3f Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Mon, 29 Apr 2024 16:10:35 +0200 Subject: [PATCH 11/38] add test_edit_payment_verification_plan_mutation --- ...nap_test_payment_verification_mutations.py | 18 ++++++++ .../test_payment_verification_mutations.py | 46 ++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_payment_verification_mutations.py diff --git a/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_payment_verification_mutations.py b/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_payment_verification_mutations.py new file mode 100644 index 0000000000..716bc4ef0f --- /dev/null +++ b/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_payment_verification_mutations.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# snapshottest: v1 - https://goo.gl/zC4yUc +from __future__ import unicode_literals + +from snapshottest import Snapshot + + +snapshots = Snapshot() + +snapshots['TestPaymentVerificationMutations::test_edit_payment_verification_plan_mutation 1'] = { + 'data': { + 'editPaymentVerificationPlan': { + 'paymentPlan': { + 'status': 'FINISHED' + } + } + } +} diff --git a/backend/hct_mis_api/apps/payment/tests/test_payment_verification_mutations.py b/backend/hct_mis_api/apps/payment/tests/test_payment_verification_mutations.py index 2460e42189..e610b954bb 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_payment_verification_mutations.py +++ b/backend/hct_mis_api/apps/payment/tests/test_payment_verification_mutations.py @@ -14,16 +14,24 @@ from hct_mis_api.apps.core.base_test_case import APITestCase from hct_mis_api.apps.core.fixtures import create_afghanistan from hct_mis_api.apps.core.models import BusinessArea -from hct_mis_api.apps.core.utils import encode_id_base64_required +from hct_mis_api.apps.core.utils import encode_id_base64, encode_id_base64_required from hct_mis_api.apps.geo.models import Area from hct_mis_api.apps.household.fixtures import EntitlementCardFactory, create_household from hct_mis_api.apps.payment.fixtures import ( CashPlanFactory, + PaymentFactory, + PaymentPlanFactory, PaymentRecordFactory, PaymentVerificationFactory, PaymentVerificationPlanFactory, + PaymentVerificationSummaryFactory, +) +from hct_mis_api.apps.payment.models import ( + GenericPayment, + PaymentPlan, + PaymentVerification, + PaymentVerificationPlan, ) -from hct_mis_api.apps.payment.models import PaymentVerification, PaymentVerificationPlan from hct_mis_api.apps.payment.services.verification_plan_status_change_services import ( VerificationPlanStatusChangeServices, ) @@ -34,6 +42,16 @@ TargetPopulationFactory, ) +EDIT_PAYMENT_VERIFICATION_MUTATION = """ +mutation EditPaymentVerificationPlan($input: EditPaymentVerificationInput!) { + editPaymentVerificationPlan(input: $input) { + paymentPlan { + status + } + } +} +""" + class TestPaymentVerificationMutations(APITestCase): @classmethod @@ -211,3 +229,27 @@ def test_permissions(self) -> None: UpdatePaymentVerificationReceivedAndReceivedAmount().mutate( None, info, payment_verification_id, received_amount=Decimal(21.36), received=True ) + + def test_edit_payment_verification_plan_mutation(self) -> None: + payment_plan = PaymentPlanFactory(status=PaymentPlan.Status.FINISHED, business_area=self.business_area) + PaymentVerificationSummaryFactory(generic_fk_obj=payment_plan) + PaymentFactory(parent=payment_plan, currency="PLN", status=GenericPayment.STATUS_SUCCESS) + payment_verification_plan = PaymentVerificationPlanFactory( + generic_fk_obj=payment_plan, + status=PaymentVerificationPlan.STATUS_PENDING, + ) + input_dict = { + "paymentVerificationPlanId": encode_id_base64(payment_verification_plan.id, "PaymentVerificationPlan"), + "sampling": "FULL_LIST", + "verificationChannel": "MANUAL", + "businessAreaSlug": "afghanistan", + "fullListArguments": {"excludedAdminAreas": []}, + "randomSamplingArguments": None, + "rapidProArguments": None, + } + + self.snapshot_graphql_request( + request_string=EDIT_PAYMENT_VERIFICATION_MUTATION, + context={"user": self.user}, + variables={"input": input_dict}, + ) From 8f79562691164b14eafe3c5fdf2a78feb8d6e7df Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Mon, 6 May 2024 12:53:46 +0200 Subject: [PATCH 12/38] black --- .../apps/payment/xlsx/xlsx_verification_export_service.py | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/hct_mis_api/apps/payment/xlsx/xlsx_verification_export_service.py b/backend/hct_mis_api/apps/payment/xlsx/xlsx_verification_export_service.py index c215f3a040..5208b4c403 100644 --- a/backend/hct_mis_api/apps/payment/xlsx/xlsx_verification_export_service.py +++ b/backend/hct_mis_api/apps/payment/xlsx/xlsx_verification_export_service.py @@ -1,4 +1,5 @@ import logging + from tempfile import NamedTemporaryFile from typing import TYPE_CHECKING, Optional From 94665f89aba590fbcc6736eb931eaac3a7d92232 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Mon, 6 May 2024 13:13:22 +0200 Subject: [PATCH 13/38] black --- .../apps/payment/xlsx/xlsx_verification_export_service.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/hct_mis_api/apps/payment/xlsx/xlsx_verification_export_service.py b/backend/hct_mis_api/apps/payment/xlsx/xlsx_verification_export_service.py index 5208b4c403..4c531c123e 100644 --- a/backend/hct_mis_api/apps/payment/xlsx/xlsx_verification_export_service.py +++ b/backend/hct_mis_api/apps/payment/xlsx/xlsx_verification_export_service.py @@ -1,5 +1,4 @@ import logging - from tempfile import NamedTemporaryFile from typing import TYPE_CHECKING, Optional @@ -118,7 +117,7 @@ def _add_data_validation(self) -> None: self.dv_received = DataValidation(type="list", formula1='"YES,NO"', allow_blank=False) self.dv_received.add(f"B2:B{len(self.ws_export_list['B'])}") self.ws_export_list.add_data_validation(self.dv_received) - self.ws_export_list["B2":f"B{len(self.ws_export_list['B'])}"] + self.ws_export_list["B2" :f"B{len(self.ws_export_list['B'])}"] def generate_workbook(self) -> openpyxl.Workbook: self._create_workbook() From 1f8d78852b2b09134218954b1f43bbf86cf6fca8 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Mon, 6 May 2024 17:21:17 +0200 Subject: [PATCH 14/38] add snapshot mutation --- .../snap_test_split_payment_plan_mutation.py | 128 +++++++++++++++ .../tests/test_split_payment_plan_mutation.py | 152 ++++++++++++++++++ 2 files changed, 280 insertions(+) create mode 100644 backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_split_payment_plan_mutation.py create mode 100644 backend/hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py diff --git a/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_split_payment_plan_mutation.py b/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_split_payment_plan_mutation.py new file mode 100644 index 0000000000..163374134a --- /dev/null +++ b/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_split_payment_plan_mutation.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- +# snapshottest: v1 - https://goo.gl/zC4yUc +from __future__ import unicode_literals + +from snapshottest import Snapshot + + +snapshots = Snapshot() + +snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 1'] = { + 'data': { + 'splitPaymentPlan': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 3, + 'line': 3 + } + ], + 'message': 'Payment plan with multiple delivery mechanisms cannot be split', + 'path': [ + 'splitPaymentPlan' + ] + } + ] +} + +snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 2'] = { + 'data': { + 'splitPaymentPlan': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 3, + 'line': 3 + } + ], + 'message': 'Payment plan is already sent to payment gateway', + 'path': [ + 'splitPaymentPlan' + ] + } + ] +} + +snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 3'] = { + 'data': { + 'splitPaymentPlan': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 3, + 'line': 3 + } + ], + 'message': "'>' not supported between instances of 'int' and 'MagicMock'", + 'path': [ + 'splitPaymentPlan' + ] + } + ] +} + +snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 4'] = { + 'data': { + 'splitPaymentPlan': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 3, + 'line': 3 + } + ], + 'message': "'>' not supported between instances of 'int' and 'MagicMock'", + 'path': [ + 'splitPaymentPlan' + ] + } + ] +} + +snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 5'] = { + 'data': { + 'splitPaymentPlan': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 3, + 'line': 3 + } + ], + 'message': 'Cannot split Payment Plan into more than 2 parts', + 'path': [ + 'splitPaymentPlan' + ] + } + ] +} + +snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 6'] = { + 'data': { + 'splitPaymentPlan': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 3, + 'line': 3 + } + ], + 'message': 'Payment Parts number should be between 10 and total number of payments', + 'path': [ + 'splitPaymentPlan' + ] + } + ] +} diff --git a/backend/hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py b/backend/hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py new file mode 100644 index 0000000000..e8e2c553ca --- /dev/null +++ b/backend/hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py @@ -0,0 +1,152 @@ +from typing import Any +from unittest import mock +from unittest.mock import patch + +from hct_mis_api.apps.account.fixtures import UserFactory +from hct_mis_api.apps.account.permissions import Permissions +from hct_mis_api.apps.core.base_test_case import APITestCase +from hct_mis_api.apps.core.fixtures import create_afghanistan +from hct_mis_api.apps.core.models import BusinessArea +from hct_mis_api.apps.payment.fixtures import ( + DeliveryMechanismPerPaymentPlanFactory, + FinancialServiceProviderFactory, + PaymentFactory, + PaymentPlanFactory, +) +from hct_mis_api.apps.payment.models import ( + DeliveryMechanismPerPaymentPlan, + FinancialServiceProvider, + Payment, + PaymentPlan, +) + +SPLIT_PAYMENT_MUTATION = """ +mutation splitPaymentPlan($paymentPlanId: ID!, $paymentsNo: Int, $splitType: String!) { + splitPaymentPlan( + paymentPlanId: $paymentPlanId, + paymentsNo: $paymentsNo, + splitType: $splitType +){ + paymentPlan { + status + } + } +} +""" + + +class TestSplitPaymentPlan(APITestCase): + databases = ("default",) + + @classmethod + def setUpTestData(cls) -> None: + create_afghanistan() + cls.business_area = BusinessArea.objects.get(slug="afghanistan") + cls.user = UserFactory.create() + cls.create_user_role_with_permissions(cls.user, [Permissions.PM_SPLIT], cls.business_area) + + @patch("hct_mis_api.apps.payment.models.PaymentPlanSplit.MAX_CHUNKS") + def test_split_payment_plan_mutation(self, max_chunks_mock: Any) -> None: + pp = PaymentPlanFactory(business_area=self.business_area, status=PaymentPlan.Status.ACCEPTED) + + fsp_1 = FinancialServiceProviderFactory( + name="Test FSP 1", + delivery_mechanisms=[Payment.DELIVERY_TYPE_CASH], + communication_channel=FinancialServiceProvider.COMMUNICATION_CHANNEL_API, + vision_vendor_number=333222111, + payment_gateway_id="test_payment_gateway_id", + ) + fsp_2 = FinancialServiceProviderFactory( + name="Test FSP 2", + delivery_mechanisms=[Payment.DELIVERY_TYPE_CASH], + communication_channel=FinancialServiceProvider.COMMUNICATION_CHANNEL_XLSX, + vision_vendor_number=111222333, + ) + + delivery_mech_for_pp = DeliveryMechanismPerPaymentPlanFactory( + payment_plan=pp, + financial_service_provider=fsp_1, + delivery_mechanism=Payment.DELIVERY_TYPE_CASH, + delivery_mechanism_order=1, + sent_to_payment_gateway=True, + ) + DeliveryMechanismPerPaymentPlanFactory( + payment_plan=pp, + financial_service_provider=fsp_2, + delivery_mechanism=Payment.DELIVERY_TYPE_CASH, + delivery_mechanism_order=2, + ) + # check delivery mechanisms count + self.snapshot_graphql_request( + request_string=SPLIT_PAYMENT_MUTATION, + context={"user": self.user}, + variables={ + "paymentPlanId": self.id_to_base64(pp.id, "PaymentPlanNode"), + "paymentsNo": 2, + "splitType": "BY_RECORDS", + }, + ) + # remove unused delivery mechanism + DeliveryMechanismPerPaymentPlan.objects.filter( + payment_plan=pp, + financial_service_provider=fsp_2, + delivery_mechanism_order=2, + ).delete() + + self.snapshot_graphql_request( + request_string=SPLIT_PAYMENT_MUTATION, + context={"user": self.user}, + variables={ + "paymentPlanId": self.id_to_base64(pp.id, "PaymentPlanNode"), + "paymentsNo": 2, + "splitType": "BY_RECORDS", + }, + ) + + # check correct PaymentPlan status + delivery_mech_for_pp.sent_to_payment_gateway = False + delivery_mech_for_pp.save() + self.snapshot_graphql_request( + request_string=SPLIT_PAYMENT_MUTATION, + context={"user": self.user}, + variables={ + "paymentPlanId": self.id_to_base64(pp.id, "PaymentPlanNode"), + "paymentsNo": 2, + "splitType": "BY_RECORDS", + }, + ) + + self.snapshot_graphql_request( + request_string=SPLIT_PAYMENT_MUTATION, + context={"user": self.user}, + variables={ + "paymentPlanId": self.id_to_base64(pp.id, "PaymentPlanNode"), + "paymentsNo": 2, + "splitType": "BY_RECORDS", + }, + ) + + # check PaymentPlanSplit.MAX_CHUNKS + PaymentFactory.create_batch(10, parent=pp, excluded=False, currency="PLN") + max_chunks_mock.__get__ = mock.Mock(return_value=2) + self.snapshot_graphql_request( + request_string=SPLIT_PAYMENT_MUTATION, + context={"user": self.user}, + variables={ + "paymentPlanId": self.id_to_base64(pp.id, "PaymentPlanNode"), + "paymentsNo": 2, + "splitType": "BY_RECORDS", + }, + ) + + # successful + max_chunks_mock.__get__ = mock.Mock(return_value=99) + self.snapshot_graphql_request( + request_string=SPLIT_PAYMENT_MUTATION, + context={"user": self.user}, + variables={ + "paymentPlanId": self.id_to_base64(pp.id, "PaymentPlanNode"), + "paymentsNo": 2, + "splitType": "BY_RECORDS", + }, + ) From 11fe1d0f7c4f6d5e18783111fccd661f9e98b0b6 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Mon, 6 May 2024 22:46:20 +0200 Subject: [PATCH 15/38] update test --- .../snap_test_split_payment_plan_mutation.py | 128 ------------------ .../tests/test_split_payment_plan_mutation.py | 11 +- 2 files changed, 8 insertions(+), 131 deletions(-) delete mode 100644 backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_split_payment_plan_mutation.py diff --git a/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_split_payment_plan_mutation.py b/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_split_payment_plan_mutation.py deleted file mode 100644 index 163374134a..0000000000 --- a/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_split_payment_plan_mutation.py +++ /dev/null @@ -1,128 +0,0 @@ -# -*- coding: utf-8 -*- -# snapshottest: v1 - https://goo.gl/zC4yUc -from __future__ import unicode_literals - -from snapshottest import Snapshot - - -snapshots = Snapshot() - -snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 1'] = { - 'data': { - 'splitPaymentPlan': None - }, - 'errors': [ - { - 'locations': [ - { - 'column': 3, - 'line': 3 - } - ], - 'message': 'Payment plan with multiple delivery mechanisms cannot be split', - 'path': [ - 'splitPaymentPlan' - ] - } - ] -} - -snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 2'] = { - 'data': { - 'splitPaymentPlan': None - }, - 'errors': [ - { - 'locations': [ - { - 'column': 3, - 'line': 3 - } - ], - 'message': 'Payment plan is already sent to payment gateway', - 'path': [ - 'splitPaymentPlan' - ] - } - ] -} - -snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 3'] = { - 'data': { - 'splitPaymentPlan': None - }, - 'errors': [ - { - 'locations': [ - { - 'column': 3, - 'line': 3 - } - ], - 'message': "'>' not supported between instances of 'int' and 'MagicMock'", - 'path': [ - 'splitPaymentPlan' - ] - } - ] -} - -snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 4'] = { - 'data': { - 'splitPaymentPlan': None - }, - 'errors': [ - { - 'locations': [ - { - 'column': 3, - 'line': 3 - } - ], - 'message': "'>' not supported between instances of 'int' and 'MagicMock'", - 'path': [ - 'splitPaymentPlan' - ] - } - ] -} - -snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 5'] = { - 'data': { - 'splitPaymentPlan': None - }, - 'errors': [ - { - 'locations': [ - { - 'column': 3, - 'line': 3 - } - ], - 'message': 'Cannot split Payment Plan into more than 2 parts', - 'path': [ - 'splitPaymentPlan' - ] - } - ] -} - -snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 6'] = { - 'data': { - 'splitPaymentPlan': None - }, - 'errors': [ - { - 'locations': [ - { - 'column': 3, - 'line': 3 - } - ], - 'message': 'Payment Parts number should be between 10 and total number of payments', - 'path': [ - 'splitPaymentPlan' - ] - } - ] -} diff --git a/backend/hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py b/backend/hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py index e8e2c553ca..c6810388fb 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py +++ b/backend/hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py @@ -47,6 +47,7 @@ def setUpTestData(cls) -> None: @patch("hct_mis_api.apps.payment.models.PaymentPlanSplit.MAX_CHUNKS") def test_split_payment_plan_mutation(self, max_chunks_mock: Any) -> None: + max_chunks_mock.__get__ = mock.Mock(return_value=10) pp = PaymentPlanFactory(business_area=self.business_area, status=PaymentPlan.Status.ACCEPTED) fsp_1 = FinancialServiceProviderFactory( @@ -106,6 +107,8 @@ def test_split_payment_plan_mutation(self, max_chunks_mock: Any) -> None: # check correct PaymentPlan status delivery_mech_for_pp.sent_to_payment_gateway = False delivery_mech_for_pp.save() + pp.status = PaymentPlan.Status.OPEN + pp.save() self.snapshot_graphql_request( request_string=SPLIT_PAYMENT_MUTATION, context={"user": self.user}, @@ -115,13 +118,15 @@ def test_split_payment_plan_mutation(self, max_chunks_mock: Any) -> None: "splitType": "BY_RECORDS", }, ) + pp.status = PaymentPlan.Status.ACCEPTED + pp.save() self.snapshot_graphql_request( request_string=SPLIT_PAYMENT_MUTATION, context={"user": self.user}, variables={ "paymentPlanId": self.id_to_base64(pp.id, "PaymentPlanNode"), - "paymentsNo": 2, + "paymentsNo": 0, "splitType": "BY_RECORDS", }, ) @@ -140,13 +145,13 @@ def test_split_payment_plan_mutation(self, max_chunks_mock: Any) -> None: ) # successful - max_chunks_mock.__get__ = mock.Mock(return_value=99) + max_chunks_mock.__get__ = mock.Mock(return_value=10) self.snapshot_graphql_request( request_string=SPLIT_PAYMENT_MUTATION, context={"user": self.user}, variables={ "paymentPlanId": self.id_to_base64(pp.id, "PaymentPlanNode"), - "paymentsNo": 2, + "paymentsNo": 10, "splitType": "BY_RECORDS", }, ) From d0867922166247e72fe2fb857db49fa41bdc8c02 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Tue, 7 May 2024 10:57:11 +0200 Subject: [PATCH 16/38] add one more test --- .../archive/output_1715070819.0902414.json | 1 + .../archive/output_1715071237.6102688.json | 1 + ...ap_test_export_pdf_payment_plan_summary.py | 18 + .../snap_test_split_payment_plan_mutation.py | 128 ++ .../test_export_pdf_payment_plan_summary.py | 36 + .../tests/test_split_payment_plan_mutation.py | 10 + backend/output.json | 1 + backend/pytest_html_report.html | 1776 +++++++++++++++++ 8 files changed, 1971 insertions(+) create mode 100644 backend/archive/output_1715070819.0902414.json create mode 100644 backend/archive/output_1715071237.6102688.json create mode 100644 backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_export_pdf_payment_plan_summary.py create mode 100644 backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_split_payment_plan_mutation.py create mode 100644 backend/hct_mis_api/apps/payment/tests/test_export_pdf_payment_plan_summary.py create mode 100644 backend/output.json create mode 100644 backend/pytest_html_report.html diff --git a/backend/archive/output_1715070819.0902414.json b/backend/archive/output_1715070819.0902414.json new file mode 100644 index 0000000000..c5de7e7dfd --- /dev/null +++ b/backend/archive/output_1715070819.0902414.json @@ -0,0 +1 @@ +{"content": {"suites": {"0": {"status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_split_payment_plan_mutation", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py"}}}, "date": "May 07, 2024", "start_time": 1715069925.5965283, "total_suite": 1, "status": "PASS", "status_list": {"pass": "1", "fail": "0", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "1"} \ No newline at end of file diff --git a/backend/archive/output_1715071237.6102688.json b/backend/archive/output_1715071237.6102688.json new file mode 100644 index 0000000000..014bb310ad --- /dev/null +++ b/backend/archive/output_1715071237.6102688.json @@ -0,0 +1 @@ +{"content": {"suites": {"0": {"status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_split_payment_plan_mutation", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py"}}}, "date": "May 07, 2024", "start_time": 1715070819.0902414, "total_suite": 1, "status": "PASS", "status_list": {"pass": "1", "fail": "0", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "1"} \ No newline at end of file diff --git a/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_export_pdf_payment_plan_summary.py b/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_export_pdf_payment_plan_summary.py new file mode 100644 index 0000000000..101d4aacbc --- /dev/null +++ b/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_export_pdf_payment_plan_summary.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# snapshottest: v1 - https://goo.gl/zC4yUc +from __future__ import unicode_literals + +from snapshottest import Snapshot + + +snapshots = Snapshot() + +snapshots['TestExportPDFPaymentPlanSummary::test_export_pdf_payment_plan_summary_mutation 1'] = { + 'data': { + 'exportPdfPaymentPlanSummary': { + 'paymentPlan': { + 'status': 'ACCEPTED' + } + } + } +} diff --git a/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_split_payment_plan_mutation.py b/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_split_payment_plan_mutation.py new file mode 100644 index 0000000000..a34dc2b9c2 --- /dev/null +++ b/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_split_payment_plan_mutation.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- +# snapshottest: v1 - https://goo.gl/zC4yUc +from __future__ import unicode_literals + +from snapshottest import Snapshot + + +snapshots = Snapshot() + +snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 1'] = { + 'data': { + 'splitPaymentPlan': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 3, + 'line': 3 + } + ], + 'message': 'Payment plan with multiple delivery mechanisms cannot be split', + 'path': [ + 'splitPaymentPlan' + ] + } + ] +} + +snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 2'] = { + 'data': { + 'splitPaymentPlan': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 3, + 'line': 3 + } + ], + 'message': 'Payment plan is already sent to payment gateway', + 'path': [ + 'splitPaymentPlan' + ] + } + ] +} + +snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 3'] = { + 'data': { + 'splitPaymentPlan': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 3, + 'line': 3 + } + ], + 'message': 'Payment plan must be accepted to make a split', + 'path': [ + 'splitPaymentPlan' + ] + } + ] +} + +snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 4'] = { + 'data': { + 'splitPaymentPlan': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 3, + 'line': 3 + } + ], + 'message': 'Payment Number is required for split by records', + 'path': [ + 'splitPaymentPlan' + ] + } + ] +} + +snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 5'] = { + 'data': { + 'splitPaymentPlan': None + }, + 'errors': [ + { + 'locations': [ + { + 'column': 3, + 'line': 3 + } + ], + 'message': 'Cannot split Payment Plan into more than 2 parts', + 'path': [ + 'splitPaymentPlan' + ] + } + ] +} + +snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 6'] = { + 'data': { + 'splitPaymentPlan': { + 'paymentPlan': { + 'status': 'ACCEPTED' + } + } + } +} + +snapshots['TestSplitPaymentPlan::test_split_payment_plan_mutation 7'] = { + 'data': { + 'splitPaymentPlan': { + 'paymentPlan': { + 'status': 'ACCEPTED' + } + } + } +} diff --git a/backend/hct_mis_api/apps/payment/tests/test_export_pdf_payment_plan_summary.py b/backend/hct_mis_api/apps/payment/tests/test_export_pdf_payment_plan_summary.py new file mode 100644 index 0000000000..9929a0352d --- /dev/null +++ b/backend/hct_mis_api/apps/payment/tests/test_export_pdf_payment_plan_summary.py @@ -0,0 +1,36 @@ +from hct_mis_api.apps.account.fixtures import UserFactory +from hct_mis_api.apps.account.permissions import Permissions +from hct_mis_api.apps.core.base_test_case import APITestCase +from hct_mis_api.apps.core.fixtures import create_afghanistan +from hct_mis_api.apps.core.models import BusinessArea +from hct_mis_api.apps.payment.fixtures import PaymentPlanFactory +from hct_mis_api.apps.payment.models import PaymentPlan + +EXPORT_PDF_MUTATION = """ +mutation exportPdfPPSummary($paymentPlanId: ID!) { + exportPdfPaymentPlanSummary(paymentPlanId: $paymentPlanId) { + paymentPlan { + status + } + } +} +""" + + +class TestExportPDFPaymentPlanSummary(APITestCase): + databases = ("default",) + + @classmethod + def setUpTestData(cls) -> None: + create_afghanistan() + cls.business_area = BusinessArea.objects.get(slug="afghanistan") + cls.user = UserFactory.create() + cls.create_user_role_with_permissions(cls.user, [Permissions.PM_EXPORT_PDF_SUMMARY], cls.business_area) + cls.payment_plan = PaymentPlanFactory(business_area=cls.business_area, status=PaymentPlan.Status.ACCEPTED) + + def test_export_pdf_payment_plan_summary_mutation(self) -> None: + self.snapshot_graphql_request( + request_string=EXPORT_PDF_MUTATION, + context={"user": self.user}, + variables={"paymentPlanId": self.id_to_base64(self.payment_plan.id, "PaymentPlanNode")}, + ) diff --git a/backend/hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py b/backend/hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py index c6810388fb..f30d7c0312 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py +++ b/backend/hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py @@ -155,3 +155,13 @@ def test_split_payment_plan_mutation(self, max_chunks_mock: Any) -> None: "splitType": "BY_RECORDS", }, ) + + self.snapshot_graphql_request( + request_string=SPLIT_PAYMENT_MUTATION, + context={"user": self.user}, + variables={ + "paymentPlanId": self.id_to_base64(pp.id, "PaymentPlanNode"), + "paymentsNo": 10, + "splitType": "BY_COLLECTOR", + }, + ) diff --git a/backend/output.json b/backend/output.json new file mode 100644 index 0000000000..f114f34e44 --- /dev/null +++ b/backend/output.json @@ -0,0 +1 @@ +{"content": {"suites": {"0": {"status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_export_pdf_payment_plan_summary_mutation", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_export_pdf_payment_plan_summary.py"}}}, "date": "May 07, 2024", "start_time": 1715071237.6102688, "total_suite": 1, "status": "PASS", "status_list": {"pass": "1", "fail": "0", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "1"} \ No newline at end of file diff --git a/backend/pytest_html_report.html b/backend/pytest_html_report.html new file mode 100644 index 0000000000..70e5f2954c --- /dev/null +++ b/backend/pytest_html_report.html @@ -0,0 +1,1776 @@ + + + + + + Pytest HTML Reporter + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+
+
+
+ + + Time taken 26.91 secs + +
+
+
+
+ PYTEST REPORT +
+
+
+ May 07, 2024 +
+
+ 1 +
+
+ TEST CASES +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ +
+ + + +
+
+
+
  Trends +
+
+ +
+
+
+ +
+ +
+
+
+
+ Test Suite + 1 +
+
+ +
+
+
+
+ + Suite Highlights +
+
+
+
+ +

0 /0 Times

+
+
+ MOST FAILED SUITE +
+
+
+
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
SuitePassFailSkipxPassxFailErrorRerun
hct_mis_api/apps/payment/tests/test_export_pdf_payment_plan_summary.py1000000
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
SuiteTest CaseStatusTime (s)Error Message
hct_mis_api/apps/payment/tests/test_export_pdf_payment_plan_summary.pytest_export_pdf_payment_plan_summary_mutationPASS11.06 + + +
+
+
+
+
+
+ + +
+ +
+
+

+ Build #3 +

+
+     + MAY 07, 2024 +
+
+
+
+
+ 1 +
+
+ TEST CASES +
+
+
+ +
+
+
+
+
+
+
+
+

1

+

PASSED

+
+
+
+
+

0 +

+

FAILED

+
+
+
+
+

0

+

SKIPPED

+
+
+
+
+

0

+

XPASSED

+
+
+
+
+

0

+

XFAILED

+
+
+
+
+

0

+

ERROR

+
+
+
+
+

0

+

RERUN

+
+
+
+
+
+
+
+ +
+
+

+ Build #2 +

+
+     + MAY 07, 2024 +
+
+
+
+
+ 1 +
+
+ TEST CASES +
+
+
+ +
+
+
+
+
+
+
+
+

1

+

PASSED

+
+
+
+
+

0 +

+

FAILED

+
+
+
+
+

0

+

SKIPPED

+
+
+
+
+

0

+

XPASSED

+
+
+
+
+

0

+

XFAILED

+
+
+
+
+

0

+

ERROR

+
+
+
+
+

0

+

RERUN

+
+
+
+
+
+
+
+ +
+
+

+ Build #1 +

+
+     + MAY 07, 2024 +
+
+
+
+
+ 1 +
+
+ TEST CASES +
+
+
+ +
+
+
+
+
+
+
+
+

1

+

PASSED

+
+
+
+
+

0 +

+

FAILED

+
+
+
+
+

0

+

SKIPPED

+
+
+
+
+

0

+

XPASSED

+
+
+
+
+

0

+

XFAILED

+
+
+
+
+

0

+

ERROR

+
+
+
+
+

0

+

RERUN

+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + \ No newline at end of file From fac52651205e2907320a9e167bac7438e7e3bc45 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Tue, 7 May 2024 10:58:49 +0200 Subject: [PATCH 17/38] remove temp files --- .../archive/output_1715070819.0902414.json | 1 - .../archive/output_1715071237.6102688.json | 1 - backend/output.json | 1 - backend/pytest_html_report.html | 1776 ----------------- 4 files changed, 1779 deletions(-) delete mode 100644 backend/archive/output_1715070819.0902414.json delete mode 100644 backend/archive/output_1715071237.6102688.json delete mode 100644 backend/output.json delete mode 100644 backend/pytest_html_report.html diff --git a/backend/archive/output_1715070819.0902414.json b/backend/archive/output_1715070819.0902414.json deleted file mode 100644 index c5de7e7dfd..0000000000 --- a/backend/archive/output_1715070819.0902414.json +++ /dev/null @@ -1 +0,0 @@ -{"content": {"suites": {"0": {"status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_split_payment_plan_mutation", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py"}}}, "date": "May 07, 2024", "start_time": 1715069925.5965283, "total_suite": 1, "status": "PASS", "status_list": {"pass": "1", "fail": "0", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "1"} \ No newline at end of file diff --git a/backend/archive/output_1715071237.6102688.json b/backend/archive/output_1715071237.6102688.json deleted file mode 100644 index 014bb310ad..0000000000 --- a/backend/archive/output_1715071237.6102688.json +++ /dev/null @@ -1 +0,0 @@ -{"content": {"suites": {"0": {"status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_split_payment_plan_mutation", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py"}}}, "date": "May 07, 2024", "start_time": 1715070819.0902414, "total_suite": 1, "status": "PASS", "status_list": {"pass": "1", "fail": "0", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "1"} \ No newline at end of file diff --git a/backend/output.json b/backend/output.json deleted file mode 100644 index f114f34e44..0000000000 --- a/backend/output.json +++ /dev/null @@ -1 +0,0 @@ -{"content": {"suites": {"0": {"status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_export_pdf_payment_plan_summary_mutation", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_export_pdf_payment_plan_summary.py"}}}, "date": "May 07, 2024", "start_time": 1715071237.6102688, "total_suite": 1, "status": "PASS", "status_list": {"pass": "1", "fail": "0", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "1"} \ No newline at end of file diff --git a/backend/pytest_html_report.html b/backend/pytest_html_report.html deleted file mode 100644 index 70e5f2954c..0000000000 --- a/backend/pytest_html_report.html +++ /dev/null @@ -1,1776 +0,0 @@ - - - - - - Pytest HTML Reporter - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
-
-
-
-
- - - Time taken 26.91 secs - -
-
-
-
- PYTEST REPORT -
-
-
- May 07, 2024 -
-
- 1 -
-
- TEST CASES -
-
-
-
- -
-
-
-
- -
-
-
-
-
- -
- - - -
-
-
-
  Trends -
-
- -
-
-
- -
- -
-
-
-
- Test Suite - 1 -
-
- -
-
-
-
- - Suite Highlights -
-
-
-
- -

0 /0 Times

-
-
- MOST FAILED SUITE -
-
-
-
-
-
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
SuitePassFailSkipxPassxFailErrorRerun
hct_mis_api/apps/payment/tests/test_export_pdf_payment_plan_summary.py1000000
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - -
SuiteTest CaseStatusTime (s)Error Message
hct_mis_api/apps/payment/tests/test_export_pdf_payment_plan_summary.pytest_export_pdf_payment_plan_summary_mutationPASS11.06 - - -
-
-
-
-
-
- - -
- -
-
-

- Build #3 -

-
-     - MAY 07, 2024 -
-
-
-
-
- 1 -
-
- TEST CASES -
-
-
- -
-
-
-
-
-
-
-
-

1

-

PASSED

-
-
-
-
-

0 -

-

FAILED

-
-
-
-
-

0

-

SKIPPED

-
-
-
-
-

0

-

XPASSED

-
-
-
-
-

0

-

XFAILED

-
-
-
-
-

0

-

ERROR

-
-
-
-
-

0

-

RERUN

-
-
-
-
-
-
-
- -
-
-

- Build #2 -

-
-     - MAY 07, 2024 -
-
-
-
-
- 1 -
-
- TEST CASES -
-
-
- -
-
-
-
-
-
-
-
-

1

-

PASSED

-
-
-
-
-

0 -

-

FAILED

-
-
-
-
-

0

-

SKIPPED

-
-
-
-
-

0

-

XPASSED

-
-
-
-
-

0

-

XFAILED

-
-
-
-
-

0

-

ERROR

-
-
-
-
-

0

-

RERUN

-
-
-
-
-
-
-
- -
-
-

- Build #1 -

-
-     - MAY 07, 2024 -
-
-
-
-
- 1 -
-
- TEST CASES -
-
-
- -
-
-
-
-
-
-
-
-

1

-

PASSED

-
-
-
-
-

0 -

-

FAILED

-
-
-
-
-

0

-

SKIPPED

-
-
-
-
-

0

-

XPASSED

-
-
-
-
-

0

-

XFAILED

-
-
-
-
-

0

-

ERROR

-
-
-
-
-

0

-

RERUN

-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - \ No newline at end of file From 44e667792766553a2999c1ddb06ef3487517d3a0 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Tue, 7 May 2024 11:39:16 +0200 Subject: [PATCH 18/38] add more tests --- ...snap_test_create_follow_up_payment_plan.py | 19 +++++++ .../test_create_follow_up_payment_plan.py | 50 +++++++++++++++++++ .../payment/tests/test_fsp_in_payment_plan.py | 2 +- 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_create_follow_up_payment_plan.py create mode 100644 backend/hct_mis_api/apps/payment/tests/test_create_follow_up_payment_plan.py diff --git a/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_create_follow_up_payment_plan.py b/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_create_follow_up_payment_plan.py new file mode 100644 index 0000000000..af8c117d78 --- /dev/null +++ b/backend/hct_mis_api/apps/payment/tests/snapshots/snap_test_create_follow_up_payment_plan.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# snapshottest: v1 - https://goo.gl/zC4yUc +from __future__ import unicode_literals + +from snapshottest import Snapshot + + +snapshots = Snapshot() + +snapshots['TestExportPDFPaymentPlanSummary::test_export_pdf_payment_plan_summary_mutation 1'] = { + 'data': { + 'createFollowUpPaymentPlan': { + 'paymentPlan': { + 'isFollowUp': True, + 'status': 'PREPARING' + } + } + } +} diff --git a/backend/hct_mis_api/apps/payment/tests/test_create_follow_up_payment_plan.py b/backend/hct_mis_api/apps/payment/tests/test_create_follow_up_payment_plan.py new file mode 100644 index 0000000000..89ac7bd4fe --- /dev/null +++ b/backend/hct_mis_api/apps/payment/tests/test_create_follow_up_payment_plan.py @@ -0,0 +1,50 @@ +from django.utils import timezone + +from pytz import utc + +from hct_mis_api.apps.account.fixtures import UserFactory +from hct_mis_api.apps.account.permissions import Permissions +from hct_mis_api.apps.core.base_test_case import APITestCase +from hct_mis_api.apps.core.fixtures import create_afghanistan +from hct_mis_api.apps.core.models import BusinessArea +from hct_mis_api.apps.payment.fixtures import PaymentFactory, PaymentPlanFactory +from hct_mis_api.apps.payment.models import Payment, PaymentPlan + +CREATE_FOLLOW_UP_MUTATION = """ +mutation createFollowUpPaymentPlan($paymentPlanId: ID!, $dispersionStartDate: Date!, $dispersionEndDate: Date!) { + createFollowUpPaymentPlan( + paymentPlanId: $paymentPlanId, dispersionStartDate: $dispersionStartDate, dispersionEndDate: $dispersionEndDate + ) { + paymentPlan { + status + isFollowUp + } + } +} +""" + + +class TestExportPDFPaymentPlanSummary(APITestCase): + databases = ("default",) + + @classmethod + def setUpTestData(cls) -> None: + create_afghanistan() + cls.business_area = BusinessArea.objects.get(slug="afghanistan") + cls.user = UserFactory.create() + cls.create_user_role_with_permissions(cls.user, [Permissions.PM_CREATE], cls.business_area) + cls.payment_plan = PaymentPlanFactory(business_area=cls.business_area, status=PaymentPlan.Status.ACCEPTED) + PaymentFactory.create_batch( + 5, parent=cls.payment_plan, excluded=False, currency="PLN", status=Payment.STATUS_ERROR + ) + + def test_export_pdf_payment_plan_summary_mutation(self) -> None: + self.snapshot_graphql_request( + request_string=CREATE_FOLLOW_UP_MUTATION, + context={"user": self.user}, + variables={ + "paymentPlanId": self.id_to_base64(self.payment_plan.id, "PaymentPlanNode"), + "dispersionStartDate": timezone.datetime(2022, 8, 25, tzinfo=utc), + "dispersionEndDate": timezone.datetime(2022, 8, 30, tzinfo=utc), + }, + ) diff --git a/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py b/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py index 99a0f0633a..180483f62e 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py +++ b/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py @@ -949,7 +949,7 @@ def test_delivery_mechanism_validation_for_usdc(self) -> None: "order": 1, }, { - "deliveryMechanism": GenericPayment.DELIVERY_TYPE_CASH, + "deliveryMechanism": GenericPayment.DELIVERY_TYPE_TRANSFER_TO_DIGITAL_WALLET, "fspId": self.encoded_bank_of_america_fsp_id, "order": 2, }, From 054fb373f13e8ff44dd31559d8e83c0f327af2f4 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Tue, 7 May 2024 12:56:47 +0200 Subject: [PATCH 19/38] update test --- .../archive/output_1715077786.7695792.json | 1 + backend/archive/output_1715078334.683505.json | 1 + .../archive/output_1715078584.4802363.json | 1 + .../archive/output_1715078647.6722705.json | 1 + .../archive/output_1715078796.0063202.json | 1 + .../archive/output_1715079032.8131428.json | 1 + .../payment/tests/test_fsp_in_payment_plan.py | 53 +- backend/output.json | 1 + backend/pytest_html_report.html | 2247 +++++++++++++++++ 9 files changed, 2304 insertions(+), 3 deletions(-) create mode 100644 backend/archive/output_1715077786.7695792.json create mode 100644 backend/archive/output_1715078334.683505.json create mode 100644 backend/archive/output_1715078584.4802363.json create mode 100644 backend/archive/output_1715078647.6722705.json create mode 100644 backend/archive/output_1715078796.0063202.json create mode 100644 backend/archive/output_1715079032.8131428.json create mode 100644 backend/output.json create mode 100644 backend/pytest_html_report.html diff --git a/backend/archive/output_1715077786.7695792.json b/backend/archive/output_1715077786.7695792.json new file mode 100644 index 0000000000..335f8d445f --- /dev/null +++ b/backend/archive/output_1715077786.7695792.json @@ -0,0 +1 @@ +{"content": {"suites": {"0": {"status": {"total_pass": 9, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_update_payment_verification_received_and_received_amount_2_0", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_update_payment_verification_received_and_received_amount_update_time_restricted", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_permissions", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_update_payment_verification_received_and_received_amount_incorrect_arguments_0_21_36", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_update_payment_verification_received_and_received_amount_1_21_35", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_edit_payment_verification_plan_mutation", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_update_payment_verification_received_and_received_amount_payment_status", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_update_payment_verification_received_and_received_amount_0_21_36", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_update_payment_verification_received_and_received_amount_incorrect_arguments_1_0", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_payment_verification_mutations.py"}, "1": {"suite_name": "hct_mis_api/apps/payment/tests/test_all_payment_plan_queries.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_filter_payment_plans_with_follow_up_flag", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_fetch_payment_plan_status_choices", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_fetch_all_payments_for_open_payment_plan", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_fetch_all_payment_plans_filters", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_fetch_all_payment_plans", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_fetch_all_payments_for_locked_payment_plan", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_filter_payment_plans_with_source_id", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_payment_node_with_legacy_data", "rerun": "0"}}, "status": {"total_pass": 8, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "2": {"suite_name": "hct_mis_api/apps/payment/tests/test_rapid_pro_verification_task.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_recalculating_validity_on_number_change", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_mapping", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_wrong_phone_number", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_not_received", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_received", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_filtering_by_start_id", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_received_with_issues", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_phone_numbers", "rerun": "0"}}, "status": {"total_pass": 8, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "3": {"suite_name": "hct_mis_api/apps/payment/tests/test_create_follow_up_payment_plan.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_export_pdf_payment_plan_summary_mutation", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "4": {"suite_name": "hct_mis_api/apps/payment/tests/test_to_decimal.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_to_decimal", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "5": {"suite_name": "hct_mis_api/apps/payment/tests/test_payment_signature.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_bulk_update", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_signature_after_prepare_payment_plan", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_payment_single_signature", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_bulk_create", "rerun": "0"}}, "status": {"total_pass": 4, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "6": {"suite_name": "hct_mis_api/apps/payment/tests/test_import_export_payment_plan_payment_list.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_import_invalid_file", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_export_payment_plan_payment_list", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_export_payment_plan_payment_list_per_split", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_export_payment_plan_payment_list_per_fsp", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_import_invalid_file_with_unexpected_column", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_import_valid_file", "rerun": "0"}}, "status": {"total_pass": 6, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "7": {"suite_name": "hct_mis_api/apps/payment/tests/test_build_summary.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_status_active_when_at_least_one_active_verification", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_status_pending_when_zero_verifications", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_status_finished_when_all_verifications_finished", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_status_pending_when_add_and_removed_verification", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_query_number", "rerun": "0"}}, "status": {"total_pass": 5, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "8": {"suite_name": "hct_mis_api/apps/payment/tests/test_action_payment_plan_mutation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_update_status_payment_plan_1_not_possible_reject", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_update_status_payment_plan_4_reject_if_accepted", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_update_status_payment_plan_0_without_permission", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_call_email_notification", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_update_status_payment_plan_2_lock_approve_authorize_reject", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_update_status_payment_plan_3_all_steps", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_update_status_payment_plan_5_lock_unlock", "rerun": "0"}}, "status": {"total_pass": 7, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "9": {"suite_name": "hct_mis_api/apps/payment/tests/test_exclude_households.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_exclude_successfully", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_exclude_households_mutation", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_exclude_all_households", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_payment_plan_within_not_status_open_or_lock", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_exclude_payment_error_when_payment_has_hard_conflicts", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_exclude_payment_with_wrong_hh_ids", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_exclude_hh_without_permissions", "rerun": "0"}}, "status": {"total_pass": 7, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "10": {"suite_name": "hct_mis_api/apps/payment/tests/test_dashboard_queries.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_table_total_cash_transferred_by_administrative_area", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_sections_0_sectionTotalTransferred", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_charts_1_chartPayment", "rerun": "0"}, "3": {"status": "SKIP", "message": "('/code/hct_mis_api/apps/payment/tests/test_dashboard_queries.py', 246, 'Skipped: to refactor')\n", "test_name": "test_chart_total_transferred_by_country", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_charts_0_chartVolumeByDeliveryMechanism", "rerun": "0"}}, "status": {"total_pass": 4, "total_skip": 1, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "11": {"suite_name": "hct_mis_api/apps/payment/tests/test_chart_total_transferred_cash_by_country.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_resolving_chart_0_with_permission", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_resolving_chart_1_without_permission", "rerun": "0"}}, "status": {"total_pass": 2, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "12": {"suite_name": "hct_mis_api/apps/payment/tests/test_verification_plan_status_change_services.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_failing_rapid_pro_during_cash_plan_payment_verification", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "13": {"suite_name": "hct_mis_api/apps/payment/tests/test_all_payment_records.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_fetch_payment_records_filter_by_cash_plan", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_fetch_payment_records_filter_by_cash_plan_and_household_and_program", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_fetch_payment_records_filter_by_household", "rerun": "0"}}, "status": {"total_pass": 3, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "14": {"suite_name": "hct_mis_api/apps/payment/tests/test_payment_plan_reconciliation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_follow_up_pp_entitlements_updated_with_file", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_apply_steficon_rule_with_wrong_payment_plan_status", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_import_with_wrong_payment_plan_status", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_receiving_payment_reconciliations_status_1", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_correct_message_displayed_when_file_is_protected", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_receiving_payment_reconciliations_status_2", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_xlsx_payment_plan_import_per_fsp_service_import_row", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_assign_fsp_mutation_payment_plan_wrong_status", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_receiving_payment_reconciliations_status_4", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_follow_up_pp_entitlements_can_be_changed_with_steficon_rule", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_receiving_reconciliations_from_fsp", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_receiving_payment_reconciliations_status_0", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_error_message_when_engine_rule_not_enabled_or_deprecated", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_payment_plan_is_fully_delivered", "rerun": "0"}, "14": {"status": "PASS", "message": "", "test_name": "test_receiving_payment_reconciliations_status_3", "rerun": "0"}}, "status": {"total_pass": 15, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "15": {"suite_name": "hct_mis_api/apps/payment/tests/test_create_cash_plan_from_reconciliation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_parse_header_raise_validation_error2", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_parse_header_raise_validation_error", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_parse_header_assign_indexes", "rerun": "0"}}, "status": {"total_pass": 3, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "16": {"suite_name": "hct_mis_api/apps/payment/tests/test_finish_verification_plan.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_create_tickets_with_admin2_same_as_in_household", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "17": {"suite_name": "hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_split_payment_plan_mutation", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "18": {"suite_name": "hct_mis_api/apps/payment/tests/test_invalid_xlsx_verification_mutation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_export_xlsx_payment_verification_plan_0_with_permission_was_downloaded_false", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_export_xlsx_payment_verification_plan_1_with_permission_was_downloaded_true", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_export_xlsx_payment_verification_plan_2_without_permission", "rerun": "0"}}, "status": {"total_pass": 3, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "19": {"suite_name": "hct_mis_api/apps/payment/tests/test_models.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_properties", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_unique_together", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_manager_annotations__pp_conflicts", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_create", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_manager_annotations_pp_no_conflicts_for_follow_up", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_update_population_count_fields", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_not_excluded_payments", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_update_money_fields", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_create", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_get_exchange_rate_for_usdc_currency", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_can_be_locked", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_properties", "rerun": "0"}}, "status": {"total_pass": 12, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "20": {"suite_name": "hct_mis_api/apps/payment/tests/test_update_payments_signature_in_batch.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_number_of_queries", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "21": {"suite_name": "hct_mis_api/apps/payment/tests/test_financial_service_provider.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_fetch_all_financial_service_providers", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_fetch_count_financial_service_providers", "rerun": "0"}}, "status": {"total_pass": 2, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "22": {"suite_name": "hct_mis_api/apps/payment/tests/test_recalculating_household_cash_received.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_household_cash_received_update", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "23": {"suite_name": "hct_mis_api/apps/payment/tests/test_delete_verification_mutation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_delete_active_verification_plan_1_without_permission", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_delete_active_verification_plan_0_with_permission", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_delete_pending_verification_plan_0_with_permission", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_delete_pending_verification_plan_1_without_permission", "rerun": "0"}}, "status": {"total_pass": 4, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "24": {"suite_name": "hct_mis_api/apps/payment/tests/test_payment_notification.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_prepare_user_recipients_for_authorize", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_prepare_user_recipients_for_send_for_approval", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_send_email_notification_subject_test_env", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_prepare_user_recipients_for_release", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_send_email_notification", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_send_email_notification_without_catch_all_email", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_send_email_notification_catch_all_email", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_prepare_user_recipients_for_approve", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_send_email_notification_subject_prod_env", "rerun": "0"}}, "status": {"total_pass": 9, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "25": {"suite_name": "hct_mis_api/apps/payment/tests/test_build_snapshot.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_build_snapshot", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_batching", "rerun": "0"}}, "status": {"total_pass": 2, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "26": {"suite_name": "hct_mis_api/apps/payment/tests/test_discard_verification_mutation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_discard_active_1_without_permission", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_discard_active_0_with_permission", "rerun": "0"}}, "status": {"total_pass": 2, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "27": {"suite_name": "hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_choosing_different_fsps_for_the_same_delivery_mechanism", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments_when_fsp_was_already_set_up", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_assigning_fsps_to_delivery_mechanism", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_successful_fsp_assigment_with_no_limit", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments", "rerun": "0"}, "5": {"status": "FAIL", "message": "E AssertionError: {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '... 'Please assign FSP to all delivery mechanisms before moving to next step', 'path': ['assignFspToDeliveryMechanism']}]}\nE assert 'errors' not in {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '... 'Please assign FSP to all delivery mechanisms before moving to next step', 'path': ['assignFspToDeliveryMechanism']}]}\n", "test_name": "test_delivery_mechanism_validation_for_usdc", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_getting_volume_by_delivery_mechanism", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_all_payments_covered_with_fsp_limit", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_not_all_payments_covered_because_of_fsp_limit", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_fsp_cannot_accept_any_volume", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_chosen_delivery_mechanism_not_supported_by_fsp", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_choosing_delivery_mechanism_order", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_being_able_to_get_possible_delivery_mechanisms", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_providing_non_unique_delivery_mechanisms", "rerun": "0"}}, "status": {"total_pass": 13, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 1, "total_error": 0}}, "28": {"suite_name": "hct_mis_api/apps/payment/tests/test_payment_plan_services.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_create_follow_up_pp", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_update", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_cannot_update_payment_plan_with_end_date_later_than_in_program", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_split", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_cannot_create_payment_plan_with_end_date_later_than_in_program", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_delete_locked", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_cannot_create_payment_plan_with_start_date_earlier_than_in_program", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_update_validation_errors", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_delete_open", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_create", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_create_validation_errors", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_cannot_update_payment_plan_with_start_date_earlier_than_in_program", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_send_to_payment_gateway", "rerun": "0"}}, "status": {"total_pass": 13, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "29": {"suite_name": "hct_mis_api/apps/payment/tests/test_create_payment_verification_mutation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_create_cash_plan_payment_verification_0_with_permission", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_can_t_create_cash_plan_payment_verification_when_there_are_not_available_payment_record", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_create_cash_plan_payment_verification_when_program_is_finished", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_create_cash_plan_payment_verification_when_invalid_arguments", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_create_cash_plan_payment_verification_1_without_permission", "rerun": "0"}}, "status": {"total_pass": 5, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "30": {"suite_name": "hct_mis_api/apps/payment/tests/test_payment_token_and_order_numbers.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_validation_save_payment_with_exists_token_or_order_number", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_validation_token_must_not_has_the_same_digit_more_than_three_times", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_generate_token_and_order_numbers_for_payments", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_check_if_token_or_order_number_exists_per_program", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_payments_created_payments", "rerun": "0"}}, "status": {"total_pass": 5, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "31": {"suite_name": "hct_mis_api/apps/payment/tests/test_sample_size.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_number_of_queries", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_sample_size_in_manual_verification_plan", "rerun": "0"}}, "status": {"total_pass": 2, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "32": {"suite_name": "hct_mis_api/apps/payment/tests/test_import_verifications.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_export_received_from_pending_0_from_pending", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_export_received_from_pending_1_from_not_received", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_validation_of_unordered_columns_2_unordered_columns_3", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_validation_valid_status_changed", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_import_valid_status_changed_received_yes_full", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_validation_wrong_type", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_import_valid_status_changed_received_yes_not_full", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_validation_payment_record_id", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_validation_of_unordered_columns_1_unordered_columns_2", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_validation_invalid_received_received_with_0_amount", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_validation_of_unordered_columns_0_unordered_columns_1", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_validation_invalid_version", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_validation_invalid_received_changed", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_export_received_from_pending_2_from_received", "rerun": "0"}, "14": {"status": "PASS", "message": "", "test_name": "test_validation_invalid_received_not_received_with_amount", "rerun": "0"}, "15": {"status": "PASS", "message": "", "test_name": "test_validation_valid_not_changed_file", "rerun": "0"}, "16": {"status": "PASS", "message": "", "test_name": "test_export_received_from_pending_3_from_received_with_issues", "rerun": "0"}, "17": {"status": "PASS", "message": "", "test_name": "test_import_valid_status_changed_received_no", "rerun": "0"}}, "status": {"total_pass": 18, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "33": {"suite_name": "hct_mis_api/apps/payment/tests/test_export_pdf_payment_plan_summary.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_export_pdf_payment_plan_summary_mutation", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "34": {"suite_name": "hct_mis_api/apps/payment/tests/test_fsp_xlsx_template_get_column_value.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_get_column_value_from_payment_0_field_payment_id", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_get_column_value_from_payment_1_field_household_id", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_get_column_value_from_payment_2_field_household_size", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_get_column_value_registration_token_empty", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_get_column_value_from_payment_3_field_collector_name", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_get_column_value_from_payment_5_field_registration_token", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_get_column_value_from_payment_4_field_currency", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_get_column_value_from_payment_6_test_wrong_column_name", "rerun": "0"}}, "status": {"total_pass": 8, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "35": {"suite_name": "hct_mis_api/apps/payment/tests/test_finance_service_provider_related_queries.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_query_all_financial_service_provider_xlsx_reports", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_query_single_financial_service_provider_xlsx_template", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_query_all_financial_service_provider_xlsx_templates", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_query_single_financial_service_provider", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_query_single_financial_service_provider_xlsx_report", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_query_all_financial_service_providers", "rerun": "0"}}, "status": {"total_pass": 6, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "36": {"suite_name": "hct_mis_api/apps/payment/tests/test_export_xlsx_verification_mutation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_export_xlsx_cash_plan_payment_verification_0_with_permission", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_export_xlsx_cash_plan_payment_verification_1_without_permission", "rerun": "0"}}, "status": {"total_pass": 2, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "37": {"suite_name": "hct_mis_api/apps/payment/tests/test_update_reconciliation_data.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_uploading_xlsx_file_with_existing_dates_throws_error", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_uploading_delivery_date_with_xlsx", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_uploading_xlsx_file_with_one_record_not_overrides_other_payments_dates", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_upload_reference_id", "rerun": "0"}}, "status": {"total_pass": 4, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}}}, "date": "May 07, 2024", "start_time": 1715077076.884457, "total_suite": 38, "status": "FAIL", "status_list": {"pass": "199", "fail": "1", "skip": "1", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "201"} \ No newline at end of file diff --git a/backend/archive/output_1715078334.683505.json b/backend/archive/output_1715078334.683505.json new file mode 100644 index 0000000000..2100d23ca7 --- /dev/null +++ b/backend/archive/output_1715078334.683505.json @@ -0,0 +1 @@ +{"content": {"suites": {"0": {"status": {"total_pass": 13, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 1, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_all_payments_covered_with_fsp_limit", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_chosen_delivery_mechanism_not_supported_by_fsp", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_fsp_cannot_accept_any_volume", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_not_all_payments_covered_because_of_fsp_limit", "rerun": "0"}, "4": {"status": "FAIL", "message": "E AssertionError: {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], 'message': 'No DeliveryMechanismPerPaymentPlan matches the given query.', 'path': ['assignFspToDeliveryMechanism']}]}\nE assert 'errors' not in {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], 'message': 'No DeliveryMechanismPerPaymentPlan matches the given query.', 'path': ['assignFspToDeliveryMechanism']}]}\n", "test_name": "test_delivery_mechanism_validation_for_usdc", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_getting_volume_by_delivery_mechanism", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_assigning_fsps_to_delivery_mechanism", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_successful_fsp_assigment_with_no_limit", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_choosing_different_fsps_for_the_same_delivery_mechanism", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments_when_fsp_was_already_set_up", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_choosing_delivery_mechanism_order", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_providing_non_unique_delivery_mechanisms", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_being_able_to_get_possible_delivery_mechanisms", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py"}}}, "date": "May 07, 2024", "start_time": 1715077786.7695792, "total_suite": 1, "status": "FAIL", "status_list": {"pass": "13", "fail": "1", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "14"} \ No newline at end of file diff --git a/backend/archive/output_1715078584.4802363.json b/backend/archive/output_1715078584.4802363.json new file mode 100644 index 0000000000..ada28de2e1 --- /dev/null +++ b/backend/archive/output_1715078584.4802363.json @@ -0,0 +1 @@ +{"content": {"suites": {"0": {"status": {"total_pass": 13, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 1, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments_when_fsp_was_already_set_up", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_choosing_different_fsps_for_the_same_delivery_mechanism", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_assigning_fsps_to_delivery_mechanism", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_successful_fsp_assigment_with_no_limit", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_getting_volume_by_delivery_mechanism", "rerun": "0"}, "6": {"status": "FAIL", "message": "E AssertionError: {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '... 'Please assign FSP to all delivery mechanisms before moving to next step', 'path': ['assignFspToDeliveryMechanism']}]}\nE assert 'errors' not in {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '... 'Please assign FSP to all delivery mechanisms before moving to next step', 'path': ['assignFspToDeliveryMechanism']}]}\n", "test_name": "test_delivery_mechanism_validation_for_usdc", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_providing_non_unique_delivery_mechanisms", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_choosing_delivery_mechanism_order", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_being_able_to_get_possible_delivery_mechanisms", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_not_all_payments_covered_because_of_fsp_limit", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_all_payments_covered_with_fsp_limit", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_chosen_delivery_mechanism_not_supported_by_fsp", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_fsp_cannot_accept_any_volume", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py"}}}, "date": "May 07, 2024", "start_time": 1715078334.683505, "total_suite": 1, "status": "FAIL", "status_list": {"pass": "13", "fail": "1", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "14"} \ No newline at end of file diff --git a/backend/archive/output_1715078647.6722705.json b/backend/archive/output_1715078647.6722705.json new file mode 100644 index 0000000000..235b63a41a --- /dev/null +++ b/backend/archive/output_1715078647.6722705.json @@ -0,0 +1 @@ +{"content": {"suites": {"0": {"status": {"total_pass": 13, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 1, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_choosing_different_fsps_for_the_same_delivery_mechanism", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_successful_fsp_assigment_with_no_limit", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_assigning_fsps_to_delivery_mechanism", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments_when_fsp_was_already_set_up", "rerun": "0"}, "5": {"status": "FAIL", "message": "E AssertionError: {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '... 'Please assign FSP to all delivery mechanisms before moving to next step', 'path': ['assignFspToDeliveryMechanism']}]}\nE assert 'errors' not in {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '... 'Please assign FSP to all delivery mechanisms before moving to next step', 'path': ['assignFspToDeliveryMechanism']}]}\n", "test_name": "test_delivery_mechanism_validation_for_usdc", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_getting_volume_by_delivery_mechanism", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_fsp_cannot_accept_any_volume", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_all_payments_covered_with_fsp_limit", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_chosen_delivery_mechanism_not_supported_by_fsp", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_not_all_payments_covered_because_of_fsp_limit", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_being_able_to_get_possible_delivery_mechanisms", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_providing_non_unique_delivery_mechanisms", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_choosing_delivery_mechanism_order", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py"}}}, "date": "May 07, 2024", "start_time": 1715078584.4802363, "total_suite": 1, "status": "FAIL", "status_list": {"pass": "13", "fail": "1", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "14"} \ No newline at end of file diff --git a/backend/archive/output_1715078796.0063202.json b/backend/archive/output_1715078796.0063202.json new file mode 100644 index 0000000000..dcb41b7998 --- /dev/null +++ b/backend/archive/output_1715078796.0063202.json @@ -0,0 +1 @@ +{"content": {"suites": {"0": {"status": {"total_pass": 13, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 1, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_getting_volume_by_delivery_mechanism", "rerun": "0"}, "1": {"status": "FAIL", "message": "E AssertionError: {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], 'message': 'No DeliveryMechanismPerPaymentPlan matches the given query.', 'path': ['assignFspToDeliveryMechanism']}]}\nE assert 'errors' not in {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], 'message': 'No DeliveryMechanismPerPaymentPlan matches the given query.', 'path': ['assignFspToDeliveryMechanism']}]}\n", "test_name": "test_delivery_mechanism_validation_for_usdc", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_successful_fsp_assigment_with_no_limit", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_choosing_different_fsps_for_the_same_delivery_mechanism", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments_when_fsp_was_already_set_up", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_assigning_fsps_to_delivery_mechanism", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_being_able_to_get_possible_delivery_mechanisms", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_providing_non_unique_delivery_mechanisms", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_choosing_delivery_mechanism_order", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_all_payments_covered_with_fsp_limit", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_not_all_payments_covered_because_of_fsp_limit", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_fsp_cannot_accept_any_volume", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_chosen_delivery_mechanism_not_supported_by_fsp", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py"}}}, "date": "May 07, 2024", "start_time": 1715078647.6722705, "total_suite": 1, "status": "FAIL", "status_list": {"pass": "13", "fail": "1", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "14"} \ No newline at end of file diff --git a/backend/archive/output_1715079032.8131428.json b/backend/archive/output_1715079032.8131428.json new file mode 100644 index 0000000000..070c7e040e --- /dev/null +++ b/backend/archive/output_1715079032.8131428.json @@ -0,0 +1 @@ +{"content": {"suites": {"0": {"status": {"total_pass": 13, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 1, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_chosen_delivery_mechanism_not_supported_by_fsp", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_all_payments_covered_with_fsp_limit", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_fsp_cannot_accept_any_volume", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_not_all_payments_covered_because_of_fsp_limit", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_choosing_delivery_mechanism_order", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_providing_non_unique_delivery_mechanisms", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_being_able_to_get_possible_delivery_mechanisms", "rerun": "0"}, "7": {"status": "FAIL", "message": "E AssertionError: {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '...o Digital Wallet' is not supported by FSP 'Santander (417-46-3636): SFTP'\", 'path': ['assignFspToDeliveryMechanism']}]}\nE assert 'errors' not in {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '...o Digital Wallet' is not supported by FSP 'Santander (417-46-3636): SFTP'\", 'path': ['assignFspToDeliveryMechanism']}]}\n", "test_name": "test_delivery_mechanism_validation_for_usdc", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_getting_volume_by_delivery_mechanism", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_choosing_different_fsps_for_the_same_delivery_mechanism", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments_when_fsp_was_already_set_up", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_successful_fsp_assigment_with_no_limit", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_assigning_fsps_to_delivery_mechanism", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py"}}}, "date": "May 07, 2024", "start_time": 1715078796.0063202, "total_suite": 1, "status": "FAIL", "status_list": {"pass": "13", "fail": "1", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "14"} \ No newline at end of file diff --git a/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py b/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py index 180483f62e..7bcf95a872 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py +++ b/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py @@ -21,7 +21,11 @@ PaymentFactory, PaymentPlanFactory, ) -from hct_mis_api.apps.payment.models import GenericPayment, PaymentPlan +from hct_mis_api.apps.payment.models import ( + DeliveryMechanismPerPaymentPlan, + GenericPayment, + PaymentPlan, +) from hct_mis_api.apps.payment.services.payment_plan_services import PaymentPlanService from hct_mis_api.apps.program.fixtures import ProgramFactory from hct_mis_api.apps.registration_data.fixtures import RegistrationDataImportFactory @@ -113,7 +117,11 @@ def payment_plan_setup(cls: Any) -> None: cls.santander_fsp = FinancialServiceProviderFactory( name="Santander", distribution_limit=None, - delivery_mechanisms=[GenericPayment.DELIVERY_TYPE_TRANSFER, GenericPayment.DELIVERY_TYPE_CASH], + delivery_mechanisms=[ + GenericPayment.DELIVERY_TYPE_TRANSFER, + GenericPayment.DELIVERY_TYPE_CASH, + GenericPayment.DELIVERY_TYPE_TRANSFER_TO_DIGITAL_WALLET, + ], data_transfer_configuration=[ {"key": "config_1", "label": "Config 1", "id": "1"}, {"key": "config_11", "label": "Config 11", "id": "11"}, @@ -124,7 +132,11 @@ def payment_plan_setup(cls: Any) -> None: cls.bank_of_america_fsp = FinancialServiceProviderFactory( name="Bank of America", - delivery_mechanisms=[GenericPayment.DELIVERY_TYPE_VOUCHER, GenericPayment.DELIVERY_TYPE_CASH], + delivery_mechanisms=[ + GenericPayment.DELIVERY_TYPE_VOUCHER, + GenericPayment.DELIVERY_TYPE_CASH, + GenericPayment.DELIVERY_TYPE_TRANSFER_TO_DIGITAL_WALLET, + ], distribution_limit=1000, data_transfer_configuration=[{"key": "config_2", "label": "Config 2", "id": "2"}], ) @@ -961,6 +973,41 @@ def test_delivery_mechanism_validation_for_usdc(self) -> None: assign_fsps_mutation_response_with_error["errors"][0]["message"] == "For currency USDC can be assigned only delivery mechanism Transfer to Digital Wallet" ) + # remove unused objects + DeliveryMechanismPerPaymentPlan.objects.all().delete() + # and create new + DeliveryMechanismPerPaymentPlanFactory( + payment_plan=self.payment_plan, + financial_service_provider=self.santander_fsp, + delivery_mechanism=GenericPayment.DELIVERY_TYPE_TRANSFER_TO_DIGITAL_WALLET, + delivery_mechanism_order=1, + ) + DeliveryMechanismPerPaymentPlanFactory( + payment_plan=self.payment_plan, + financial_service_provider=self.bank_of_america_fsp, + delivery_mechanism=GenericPayment.DELIVERY_TYPE_TRANSFER_TO_DIGITAL_WALLET, + delivery_mechanism_order=2, + ) + mutation_response = self.graphql_request( + request_string=ASSIGN_FSPS_MUTATION, + context={"user": self.user}, + variables={ + "paymentPlanId": self.encoded_payment_plan_id, + "mappings": [ + { + "deliveryMechanism": GenericPayment.DELIVERY_TYPE_TRANSFER_TO_DIGITAL_WALLET, + "fspId": self.encoded_santander_fsp_id, + "order": 1, + }, + { + "deliveryMechanism": GenericPayment.DELIVERY_TYPE_TRANSFER_TO_DIGITAL_WALLET, + "fspId": self.encoded_bank_of_america_fsp_id, + "order": 2, + }, + ], + }, + ) + assert "errors" not in mutation_response, mutation_response class TestValidateFSPPerDeliveryMechanism(APITestCase): diff --git a/backend/output.json b/backend/output.json new file mode 100644 index 0000000000..30bee49897 --- /dev/null +++ b/backend/output.json @@ -0,0 +1 @@ +{"content": {"suites": {"0": {"status": {"total_pass": 14, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments_when_fsp_was_already_set_up", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_assigning_fsps_to_delivery_mechanism", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_choosing_different_fsps_for_the_same_delivery_mechanism", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_successful_fsp_assigment_with_no_limit", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_chosen_delivery_mechanism_not_supported_by_fsp", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_fsp_cannot_accept_any_volume", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_not_all_payments_covered_because_of_fsp_limit", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_all_payments_covered_with_fsp_limit", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_getting_volume_by_delivery_mechanism", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_delivery_mechanism_validation_for_usdc", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_being_able_to_get_possible_delivery_mechanisms", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_choosing_delivery_mechanism_order", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_providing_non_unique_delivery_mechanisms", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py"}}}, "date": "May 07, 2024", "start_time": 1715079032.8131428, "total_suite": 1, "status": "PASS", "status_list": {"pass": "14", "fail": "0", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "14"} \ No newline at end of file diff --git a/backend/pytest_html_report.html b/backend/pytest_html_report.html new file mode 100644 index 0000000000..9d92f0c1f3 --- /dev/null +++ b/backend/pytest_html_report.html @@ -0,0 +1,2247 @@ + + + + + + Pytest HTML Reporter + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+
+
+
+ + + Time taken 35.68 secs + +
+
+
+
+ PYTEST REPORT +
+
+
+ May 07, 2024 +
+
+ 14 +
+
+ TEST CASES +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ +
+ + + +
+
+
+
  Trends +
+
+ +
+
+
+ +
+ +
+
+
+
+ Test Suite + 1 +
+
+ +
+
+
+
+ + Suite Highlights +
+
+
+
+ +

6 /7 Times

+
+
+ MOST FAILED SUITE +
+
+
+
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
SuitePassFailSkipxPassxFailErrorRerun
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py14000000
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SuiteTest CaseStatusTime (s)Error Message
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_editing_fsps_assignments_when_fsp_was_already_set_upPASS8.15 + + +
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_assigning_fsps_to_delivery_mechanismPASS0.26 + + +
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_choosing_different_fsps_for_the_same_delivery_mechanismPASS0.33 + + +
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_successful_fsp_assigment_with_no_limitPASS0.16 + + +
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_editing_fsps_assignmentsPASS0.23 + + +
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_chosen_delivery_mechanism_not_supported_by_fspPASS1.71 + + +
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_fsp_cannot_accept_any_volumePASS0.97 + + +
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_not_all_payments_covered_because_of_fsp_limitPASS0.42 + + +
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_all_payments_covered_with_fsp_limitPASS0.78 + + +
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_getting_volume_by_delivery_mechanismPASS2.24 + + +
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_delivery_mechanism_validation_for_usdcPASS1.45 + + +
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_being_able_to_get_possible_delivery_mechanismsPASS1.39 + + +
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_choosing_delivery_mechanism_orderPASS0.43 + + +
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_providing_non_unique_delivery_mechanismsPASS0.38 + + +
+
+
+
+
+
+ + +
+ +
+
+

+ Build #7 +

+
+     + MAY 07, 2024 +
+
+
+
+
+ 14 +
+
+ TEST CASES +
+
+
+ +
+
+
+
+
+
+
+
+

14

+

PASSED

+
+
+
+
+

0 +

+

FAILED

+
+
+
+
+

0

+

SKIPPED

+
+
+
+
+

0

+

XPASSED

+
+
+
+
+

0

+

XFAILED

+
+
+
+
+

0

+

ERROR

+
+
+
+
+

0

+

RERUN

+
+
+
+
+
+
+
+ +
+
+

+ Build #6 +

+
+     + MAY 07, 2024 +
+
+
+
+
+ 14 +
+
+ TEST CASES +
+
+
+ +
+
+
+
+
+
+
+
+

13

+

PASSED

+
+
+
+
+

1 +

+

FAILED

+
+
+
+
+

0

+

SKIPPED

+
+
+
+
+

0

+

XPASSED

+
+
+
+
+

0

+

XFAILED

+
+
+
+
+

0

+

ERROR

+
+
+
+
+

0

+

RERUN

+
+
+
+
+
+
+
+ +
+
+

+ Build #5 +

+
+     + MAY 07, 2024 +
+
+
+
+
+ 14 +
+
+ TEST CASES +
+
+
+ +
+
+
+
+
+
+
+
+

13

+

PASSED

+
+
+
+
+

1 +

+

FAILED

+
+
+
+
+

0

+

SKIPPED

+
+
+
+
+

0

+

XPASSED

+
+
+
+
+

0

+

XFAILED

+
+
+
+
+

0

+

ERROR

+
+
+
+
+

0

+

RERUN

+
+
+
+
+
+
+
+ +
+
+

+ Build #4 +

+
+     + MAY 07, 2024 +
+
+
+
+
+ 14 +
+
+ TEST CASES +
+
+
+ +
+
+
+
+
+
+
+
+

13

+

PASSED

+
+
+
+
+

1 +

+

FAILED

+
+
+
+
+

0

+

SKIPPED

+
+
+
+
+

0

+

XPASSED

+
+
+
+
+

0

+

XFAILED

+
+
+
+
+

0

+

ERROR

+
+
+
+
+

0

+

RERUN

+
+
+
+
+
+
+
+ +
+
+

+ Build #3 +

+
+     + MAY 07, 2024 +
+
+
+
+
+ 14 +
+
+ TEST CASES +
+
+
+ +
+
+
+
+
+
+
+
+

13

+

PASSED

+
+
+
+
+

1 +

+

FAILED

+
+
+
+
+

0

+

SKIPPED

+
+
+
+
+

0

+

XPASSED

+
+
+
+
+

0

+

XFAILED

+
+
+
+
+

0

+

ERROR

+
+
+
+
+

0

+

RERUN

+
+
+
+
+
+
+
+ +
+
+

+ Build #2 +

+
+     + MAY 07, 2024 +
+
+
+
+
+ 14 +
+
+ TEST CASES +
+
+
+ +
+
+
+
+
+
+
+
+

13

+

PASSED

+
+
+
+
+

1 +

+

FAILED

+
+
+
+
+

0

+

SKIPPED

+
+
+
+
+

0

+

XPASSED

+
+
+
+
+

0

+

XFAILED

+
+
+
+
+

0

+

ERROR

+
+
+
+
+

0

+

RERUN

+
+
+
+
+
+
+
+ +
+
+

+ Build #1 +

+
+     + MAY 07, 2024 +
+
+
+
+
+ 201 +
+
+ TEST CASES +
+
+
+ +
+
+
+
+
+
+
+
+

199

+

PASSED

+
+
+
+
+

1 +

+

FAILED

+
+
+
+
+

1

+

SKIPPED

+
+
+
+
+

0

+

XPASSED

+
+
+
+
+

0

+

XFAILED

+
+
+
+
+

0

+

ERROR

+
+
+
+
+

0

+

RERUN

+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + \ No newline at end of file From f32bee5adb53f0650bee9d9ff05b356b34fc5bab Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Tue, 7 May 2024 12:59:10 +0200 Subject: [PATCH 20/38] upd gitignore --- backend/.gitignore | 5 +- .../archive/output_1715077786.7695792.json | 1 - backend/archive/output_1715078334.683505.json | 1 - .../archive/output_1715078584.4802363.json | 1 - .../archive/output_1715078647.6722705.json | 1 - .../archive/output_1715078796.0063202.json | 1 - .../archive/output_1715079032.8131428.json | 1 - backend/output.json | 1 - backend/pytest_html_report.html | 2247 ----------------- 9 files changed, 4 insertions(+), 2255 deletions(-) delete mode 100644 backend/archive/output_1715077786.7695792.json delete mode 100644 backend/archive/output_1715078334.683505.json delete mode 100644 backend/archive/output_1715078584.4802363.json delete mode 100644 backend/archive/output_1715078647.6722705.json delete mode 100644 backend/archive/output_1715078796.0063202.json delete mode 100644 backend/archive/output_1715079032.8131428.json delete mode 100644 backend/output.json delete mode 100644 backend/pytest_html_report.html diff --git a/backend/.gitignore b/backend/.gitignore index cac4aa2844..0e61d759a3 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -3,4 +3,7 @@ Makefile *.isorted test_times.txt screenshot -report \ No newline at end of file +report +archive +output.json +pytest_html_report.html \ No newline at end of file diff --git a/backend/archive/output_1715077786.7695792.json b/backend/archive/output_1715077786.7695792.json deleted file mode 100644 index 335f8d445f..0000000000 --- a/backend/archive/output_1715077786.7695792.json +++ /dev/null @@ -1 +0,0 @@ -{"content": {"suites": {"0": {"status": {"total_pass": 9, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_update_payment_verification_received_and_received_amount_2_0", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_update_payment_verification_received_and_received_amount_update_time_restricted", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_permissions", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_update_payment_verification_received_and_received_amount_incorrect_arguments_0_21_36", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_update_payment_verification_received_and_received_amount_1_21_35", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_edit_payment_verification_plan_mutation", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_update_payment_verification_received_and_received_amount_payment_status", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_update_payment_verification_received_and_received_amount_0_21_36", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_update_payment_verification_received_and_received_amount_incorrect_arguments_1_0", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_payment_verification_mutations.py"}, "1": {"suite_name": "hct_mis_api/apps/payment/tests/test_all_payment_plan_queries.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_filter_payment_plans_with_follow_up_flag", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_fetch_payment_plan_status_choices", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_fetch_all_payments_for_open_payment_plan", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_fetch_all_payment_plans_filters", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_fetch_all_payment_plans", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_fetch_all_payments_for_locked_payment_plan", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_filter_payment_plans_with_source_id", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_payment_node_with_legacy_data", "rerun": "0"}}, "status": {"total_pass": 8, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "2": {"suite_name": "hct_mis_api/apps/payment/tests/test_rapid_pro_verification_task.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_recalculating_validity_on_number_change", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_mapping", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_wrong_phone_number", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_not_received", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_received", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_filtering_by_start_id", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_received_with_issues", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_phone_numbers", "rerun": "0"}}, "status": {"total_pass": 8, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "3": {"suite_name": "hct_mis_api/apps/payment/tests/test_create_follow_up_payment_plan.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_export_pdf_payment_plan_summary_mutation", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "4": {"suite_name": "hct_mis_api/apps/payment/tests/test_to_decimal.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_to_decimal", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "5": {"suite_name": "hct_mis_api/apps/payment/tests/test_payment_signature.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_bulk_update", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_signature_after_prepare_payment_plan", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_payment_single_signature", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_bulk_create", "rerun": "0"}}, "status": {"total_pass": 4, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "6": {"suite_name": "hct_mis_api/apps/payment/tests/test_import_export_payment_plan_payment_list.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_import_invalid_file", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_export_payment_plan_payment_list", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_export_payment_plan_payment_list_per_split", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_export_payment_plan_payment_list_per_fsp", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_import_invalid_file_with_unexpected_column", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_import_valid_file", "rerun": "0"}}, "status": {"total_pass": 6, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "7": {"suite_name": "hct_mis_api/apps/payment/tests/test_build_summary.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_status_active_when_at_least_one_active_verification", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_status_pending_when_zero_verifications", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_status_finished_when_all_verifications_finished", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_status_pending_when_add_and_removed_verification", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_query_number", "rerun": "0"}}, "status": {"total_pass": 5, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "8": {"suite_name": "hct_mis_api/apps/payment/tests/test_action_payment_plan_mutation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_update_status_payment_plan_1_not_possible_reject", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_update_status_payment_plan_4_reject_if_accepted", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_update_status_payment_plan_0_without_permission", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_call_email_notification", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_update_status_payment_plan_2_lock_approve_authorize_reject", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_update_status_payment_plan_3_all_steps", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_update_status_payment_plan_5_lock_unlock", "rerun": "0"}}, "status": {"total_pass": 7, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "9": {"suite_name": "hct_mis_api/apps/payment/tests/test_exclude_households.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_exclude_successfully", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_exclude_households_mutation", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_exclude_all_households", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_payment_plan_within_not_status_open_or_lock", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_exclude_payment_error_when_payment_has_hard_conflicts", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_exclude_payment_with_wrong_hh_ids", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_exclude_hh_without_permissions", "rerun": "0"}}, "status": {"total_pass": 7, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "10": {"suite_name": "hct_mis_api/apps/payment/tests/test_dashboard_queries.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_table_total_cash_transferred_by_administrative_area", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_sections_0_sectionTotalTransferred", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_charts_1_chartPayment", "rerun": "0"}, "3": {"status": "SKIP", "message": "('/code/hct_mis_api/apps/payment/tests/test_dashboard_queries.py', 246, 'Skipped: to refactor')\n", "test_name": "test_chart_total_transferred_by_country", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_charts_0_chartVolumeByDeliveryMechanism", "rerun": "0"}}, "status": {"total_pass": 4, "total_skip": 1, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "11": {"suite_name": "hct_mis_api/apps/payment/tests/test_chart_total_transferred_cash_by_country.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_resolving_chart_0_with_permission", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_resolving_chart_1_without_permission", "rerun": "0"}}, "status": {"total_pass": 2, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "12": {"suite_name": "hct_mis_api/apps/payment/tests/test_verification_plan_status_change_services.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_failing_rapid_pro_during_cash_plan_payment_verification", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "13": {"suite_name": "hct_mis_api/apps/payment/tests/test_all_payment_records.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_fetch_payment_records_filter_by_cash_plan", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_fetch_payment_records_filter_by_cash_plan_and_household_and_program", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_fetch_payment_records_filter_by_household", "rerun": "0"}}, "status": {"total_pass": 3, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "14": {"suite_name": "hct_mis_api/apps/payment/tests/test_payment_plan_reconciliation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_follow_up_pp_entitlements_updated_with_file", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_apply_steficon_rule_with_wrong_payment_plan_status", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_import_with_wrong_payment_plan_status", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_receiving_payment_reconciliations_status_1", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_correct_message_displayed_when_file_is_protected", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_receiving_payment_reconciliations_status_2", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_xlsx_payment_plan_import_per_fsp_service_import_row", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_assign_fsp_mutation_payment_plan_wrong_status", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_receiving_payment_reconciliations_status_4", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_follow_up_pp_entitlements_can_be_changed_with_steficon_rule", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_receiving_reconciliations_from_fsp", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_receiving_payment_reconciliations_status_0", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_error_message_when_engine_rule_not_enabled_or_deprecated", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_payment_plan_is_fully_delivered", "rerun": "0"}, "14": {"status": "PASS", "message": "", "test_name": "test_receiving_payment_reconciliations_status_3", "rerun": "0"}}, "status": {"total_pass": 15, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "15": {"suite_name": "hct_mis_api/apps/payment/tests/test_create_cash_plan_from_reconciliation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_parse_header_raise_validation_error2", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_parse_header_raise_validation_error", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_parse_header_assign_indexes", "rerun": "0"}}, "status": {"total_pass": 3, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "16": {"suite_name": "hct_mis_api/apps/payment/tests/test_finish_verification_plan.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_create_tickets_with_admin2_same_as_in_household", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "17": {"suite_name": "hct_mis_api/apps/payment/tests/test_split_payment_plan_mutation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_split_payment_plan_mutation", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "18": {"suite_name": "hct_mis_api/apps/payment/tests/test_invalid_xlsx_verification_mutation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_export_xlsx_payment_verification_plan_0_with_permission_was_downloaded_false", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_export_xlsx_payment_verification_plan_1_with_permission_was_downloaded_true", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_export_xlsx_payment_verification_plan_2_without_permission", "rerun": "0"}}, "status": {"total_pass": 3, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "19": {"suite_name": "hct_mis_api/apps/payment/tests/test_models.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_properties", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_unique_together", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_manager_annotations__pp_conflicts", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_create", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_manager_annotations_pp_no_conflicts_for_follow_up", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_update_population_count_fields", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_not_excluded_payments", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_update_money_fields", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_create", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_get_exchange_rate_for_usdc_currency", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_can_be_locked", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_properties", "rerun": "0"}}, "status": {"total_pass": 12, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "20": {"suite_name": "hct_mis_api/apps/payment/tests/test_update_payments_signature_in_batch.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_number_of_queries", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "21": {"suite_name": "hct_mis_api/apps/payment/tests/test_financial_service_provider.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_fetch_all_financial_service_providers", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_fetch_count_financial_service_providers", "rerun": "0"}}, "status": {"total_pass": 2, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "22": {"suite_name": "hct_mis_api/apps/payment/tests/test_recalculating_household_cash_received.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_household_cash_received_update", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "23": {"suite_name": "hct_mis_api/apps/payment/tests/test_delete_verification_mutation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_delete_active_verification_plan_1_without_permission", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_delete_active_verification_plan_0_with_permission", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_delete_pending_verification_plan_0_with_permission", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_delete_pending_verification_plan_1_without_permission", "rerun": "0"}}, "status": {"total_pass": 4, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "24": {"suite_name": "hct_mis_api/apps/payment/tests/test_payment_notification.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_prepare_user_recipients_for_authorize", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_prepare_user_recipients_for_send_for_approval", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_send_email_notification_subject_test_env", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_prepare_user_recipients_for_release", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_send_email_notification", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_send_email_notification_without_catch_all_email", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_send_email_notification_catch_all_email", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_prepare_user_recipients_for_approve", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_send_email_notification_subject_prod_env", "rerun": "0"}}, "status": {"total_pass": 9, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "25": {"suite_name": "hct_mis_api/apps/payment/tests/test_build_snapshot.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_build_snapshot", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_batching", "rerun": "0"}}, "status": {"total_pass": 2, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "26": {"suite_name": "hct_mis_api/apps/payment/tests/test_discard_verification_mutation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_discard_active_1_without_permission", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_discard_active_0_with_permission", "rerun": "0"}}, "status": {"total_pass": 2, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "27": {"suite_name": "hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_choosing_different_fsps_for_the_same_delivery_mechanism", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments_when_fsp_was_already_set_up", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_assigning_fsps_to_delivery_mechanism", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_successful_fsp_assigment_with_no_limit", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments", "rerun": "0"}, "5": {"status": "FAIL", "message": "E AssertionError: {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '... 'Please assign FSP to all delivery mechanisms before moving to next step', 'path': ['assignFspToDeliveryMechanism']}]}\nE assert 'errors' not in {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '... 'Please assign FSP to all delivery mechanisms before moving to next step', 'path': ['assignFspToDeliveryMechanism']}]}\n", "test_name": "test_delivery_mechanism_validation_for_usdc", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_getting_volume_by_delivery_mechanism", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_all_payments_covered_with_fsp_limit", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_not_all_payments_covered_because_of_fsp_limit", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_fsp_cannot_accept_any_volume", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_chosen_delivery_mechanism_not_supported_by_fsp", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_choosing_delivery_mechanism_order", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_being_able_to_get_possible_delivery_mechanisms", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_providing_non_unique_delivery_mechanisms", "rerun": "0"}}, "status": {"total_pass": 13, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 1, "total_error": 0}}, "28": {"suite_name": "hct_mis_api/apps/payment/tests/test_payment_plan_services.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_create_follow_up_pp", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_update", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_cannot_update_payment_plan_with_end_date_later_than_in_program", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_split", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_cannot_create_payment_plan_with_end_date_later_than_in_program", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_delete_locked", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_cannot_create_payment_plan_with_start_date_earlier_than_in_program", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_update_validation_errors", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_delete_open", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_create", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_create_validation_errors", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_cannot_update_payment_plan_with_start_date_earlier_than_in_program", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_send_to_payment_gateway", "rerun": "0"}}, "status": {"total_pass": 13, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "29": {"suite_name": "hct_mis_api/apps/payment/tests/test_create_payment_verification_mutation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_create_cash_plan_payment_verification_0_with_permission", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_can_t_create_cash_plan_payment_verification_when_there_are_not_available_payment_record", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_create_cash_plan_payment_verification_when_program_is_finished", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_create_cash_plan_payment_verification_when_invalid_arguments", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_create_cash_plan_payment_verification_1_without_permission", "rerun": "0"}}, "status": {"total_pass": 5, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "30": {"suite_name": "hct_mis_api/apps/payment/tests/test_payment_token_and_order_numbers.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_validation_save_payment_with_exists_token_or_order_number", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_validation_token_must_not_has_the_same_digit_more_than_three_times", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_generate_token_and_order_numbers_for_payments", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_check_if_token_or_order_number_exists_per_program", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_payments_created_payments", "rerun": "0"}}, "status": {"total_pass": 5, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "31": {"suite_name": "hct_mis_api/apps/payment/tests/test_sample_size.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_number_of_queries", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_sample_size_in_manual_verification_plan", "rerun": "0"}}, "status": {"total_pass": 2, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "32": {"suite_name": "hct_mis_api/apps/payment/tests/test_import_verifications.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_export_received_from_pending_0_from_pending", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_export_received_from_pending_1_from_not_received", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_validation_of_unordered_columns_2_unordered_columns_3", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_validation_valid_status_changed", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_import_valid_status_changed_received_yes_full", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_validation_wrong_type", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_import_valid_status_changed_received_yes_not_full", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_validation_payment_record_id", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_validation_of_unordered_columns_1_unordered_columns_2", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_validation_invalid_received_received_with_0_amount", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_validation_of_unordered_columns_0_unordered_columns_1", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_validation_invalid_version", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_validation_invalid_received_changed", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_export_received_from_pending_2_from_received", "rerun": "0"}, "14": {"status": "PASS", "message": "", "test_name": "test_validation_invalid_received_not_received_with_amount", "rerun": "0"}, "15": {"status": "PASS", "message": "", "test_name": "test_validation_valid_not_changed_file", "rerun": "0"}, "16": {"status": "PASS", "message": "", "test_name": "test_export_received_from_pending_3_from_received_with_issues", "rerun": "0"}, "17": {"status": "PASS", "message": "", "test_name": "test_import_valid_status_changed_received_no", "rerun": "0"}}, "status": {"total_pass": 18, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "33": {"suite_name": "hct_mis_api/apps/payment/tests/test_export_pdf_payment_plan_summary.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_export_pdf_payment_plan_summary_mutation", "rerun": "0"}}, "status": {"total_pass": 1, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "34": {"suite_name": "hct_mis_api/apps/payment/tests/test_fsp_xlsx_template_get_column_value.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_get_column_value_from_payment_0_field_payment_id", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_get_column_value_from_payment_1_field_household_id", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_get_column_value_from_payment_2_field_household_size", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_get_column_value_registration_token_empty", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_get_column_value_from_payment_3_field_collector_name", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_get_column_value_from_payment_5_field_registration_token", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_get_column_value_from_payment_4_field_currency", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_get_column_value_from_payment_6_test_wrong_column_name", "rerun": "0"}}, "status": {"total_pass": 8, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "35": {"suite_name": "hct_mis_api/apps/payment/tests/test_finance_service_provider_related_queries.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_query_all_financial_service_provider_xlsx_reports", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_query_single_financial_service_provider_xlsx_template", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_query_all_financial_service_provider_xlsx_templates", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_query_single_financial_service_provider", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_query_single_financial_service_provider_xlsx_report", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_query_all_financial_service_providers", "rerun": "0"}}, "status": {"total_pass": 6, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "36": {"suite_name": "hct_mis_api/apps/payment/tests/test_export_xlsx_verification_mutation.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_export_xlsx_cash_plan_payment_verification_0_with_permission", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_export_xlsx_cash_plan_payment_verification_1_without_permission", "rerun": "0"}}, "status": {"total_pass": 2, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}, "37": {"suite_name": "hct_mis_api/apps/payment/tests/test_update_reconciliation_data.py", "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_uploading_xlsx_file_with_existing_dates_throws_error", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_uploading_delivery_date_with_xlsx", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_uploading_xlsx_file_with_one_record_not_overrides_other_payments_dates", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_upload_reference_id", "rerun": "0"}}, "status": {"total_pass": 4, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}}}}, "date": "May 07, 2024", "start_time": 1715077076.884457, "total_suite": 38, "status": "FAIL", "status_list": {"pass": "199", "fail": "1", "skip": "1", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "201"} \ No newline at end of file diff --git a/backend/archive/output_1715078334.683505.json b/backend/archive/output_1715078334.683505.json deleted file mode 100644 index 2100d23ca7..0000000000 --- a/backend/archive/output_1715078334.683505.json +++ /dev/null @@ -1 +0,0 @@ -{"content": {"suites": {"0": {"status": {"total_pass": 13, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 1, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_all_payments_covered_with_fsp_limit", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_chosen_delivery_mechanism_not_supported_by_fsp", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_fsp_cannot_accept_any_volume", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_not_all_payments_covered_because_of_fsp_limit", "rerun": "0"}, "4": {"status": "FAIL", "message": "E AssertionError: {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], 'message': 'No DeliveryMechanismPerPaymentPlan matches the given query.', 'path': ['assignFspToDeliveryMechanism']}]}\nE assert 'errors' not in {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], 'message': 'No DeliveryMechanismPerPaymentPlan matches the given query.', 'path': ['assignFspToDeliveryMechanism']}]}\n", "test_name": "test_delivery_mechanism_validation_for_usdc", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_getting_volume_by_delivery_mechanism", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_assigning_fsps_to_delivery_mechanism", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_successful_fsp_assigment_with_no_limit", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_choosing_different_fsps_for_the_same_delivery_mechanism", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments_when_fsp_was_already_set_up", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_choosing_delivery_mechanism_order", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_providing_non_unique_delivery_mechanisms", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_being_able_to_get_possible_delivery_mechanisms", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py"}}}, "date": "May 07, 2024", "start_time": 1715077786.7695792, "total_suite": 1, "status": "FAIL", "status_list": {"pass": "13", "fail": "1", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "14"} \ No newline at end of file diff --git a/backend/archive/output_1715078584.4802363.json b/backend/archive/output_1715078584.4802363.json deleted file mode 100644 index ada28de2e1..0000000000 --- a/backend/archive/output_1715078584.4802363.json +++ /dev/null @@ -1 +0,0 @@ -{"content": {"suites": {"0": {"status": {"total_pass": 13, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 1, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments_when_fsp_was_already_set_up", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_choosing_different_fsps_for_the_same_delivery_mechanism", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_assigning_fsps_to_delivery_mechanism", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_successful_fsp_assigment_with_no_limit", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_getting_volume_by_delivery_mechanism", "rerun": "0"}, "6": {"status": "FAIL", "message": "E AssertionError: {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '... 'Please assign FSP to all delivery mechanisms before moving to next step', 'path': ['assignFspToDeliveryMechanism']}]}\nE assert 'errors' not in {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '... 'Please assign FSP to all delivery mechanisms before moving to next step', 'path': ['assignFspToDeliveryMechanism']}]}\n", "test_name": "test_delivery_mechanism_validation_for_usdc", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_providing_non_unique_delivery_mechanisms", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_choosing_delivery_mechanism_order", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_being_able_to_get_possible_delivery_mechanisms", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_not_all_payments_covered_because_of_fsp_limit", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_all_payments_covered_with_fsp_limit", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_chosen_delivery_mechanism_not_supported_by_fsp", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_fsp_cannot_accept_any_volume", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py"}}}, "date": "May 07, 2024", "start_time": 1715078334.683505, "total_suite": 1, "status": "FAIL", "status_list": {"pass": "13", "fail": "1", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "14"} \ No newline at end of file diff --git a/backend/archive/output_1715078647.6722705.json b/backend/archive/output_1715078647.6722705.json deleted file mode 100644 index 235b63a41a..0000000000 --- a/backend/archive/output_1715078647.6722705.json +++ /dev/null @@ -1 +0,0 @@ -{"content": {"suites": {"0": {"status": {"total_pass": 13, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 1, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_choosing_different_fsps_for_the_same_delivery_mechanism", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_successful_fsp_assigment_with_no_limit", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_assigning_fsps_to_delivery_mechanism", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments_when_fsp_was_already_set_up", "rerun": "0"}, "5": {"status": "FAIL", "message": "E AssertionError: {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '... 'Please assign FSP to all delivery mechanisms before moving to next step', 'path': ['assignFspToDeliveryMechanism']}]}\nE assert 'errors' not in {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '... 'Please assign FSP to all delivery mechanisms before moving to next step', 'path': ['assignFspToDeliveryMechanism']}]}\n", "test_name": "test_delivery_mechanism_validation_for_usdc", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_getting_volume_by_delivery_mechanism", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_fsp_cannot_accept_any_volume", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_all_payments_covered_with_fsp_limit", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_chosen_delivery_mechanism_not_supported_by_fsp", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_not_all_payments_covered_because_of_fsp_limit", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_being_able_to_get_possible_delivery_mechanisms", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_providing_non_unique_delivery_mechanisms", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_choosing_delivery_mechanism_order", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py"}}}, "date": "May 07, 2024", "start_time": 1715078584.4802363, "total_suite": 1, "status": "FAIL", "status_list": {"pass": "13", "fail": "1", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "14"} \ No newline at end of file diff --git a/backend/archive/output_1715078796.0063202.json b/backend/archive/output_1715078796.0063202.json deleted file mode 100644 index dcb41b7998..0000000000 --- a/backend/archive/output_1715078796.0063202.json +++ /dev/null @@ -1 +0,0 @@ -{"content": {"suites": {"0": {"status": {"total_pass": 13, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 1, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_getting_volume_by_delivery_mechanism", "rerun": "0"}, "1": {"status": "FAIL", "message": "E AssertionError: {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], 'message': 'No DeliveryMechanismPerPaymentPlan matches the given query.', 'path': ['assignFspToDeliveryMechanism']}]}\nE assert 'errors' not in {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], 'message': 'No DeliveryMechanismPerPaymentPlan matches the given query.', 'path': ['assignFspToDeliveryMechanism']}]}\n", "test_name": "test_delivery_mechanism_validation_for_usdc", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_successful_fsp_assigment_with_no_limit", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_choosing_different_fsps_for_the_same_delivery_mechanism", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments_when_fsp_was_already_set_up", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_assigning_fsps_to_delivery_mechanism", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_being_able_to_get_possible_delivery_mechanisms", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_providing_non_unique_delivery_mechanisms", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_choosing_delivery_mechanism_order", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_all_payments_covered_with_fsp_limit", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_not_all_payments_covered_because_of_fsp_limit", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_fsp_cannot_accept_any_volume", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_chosen_delivery_mechanism_not_supported_by_fsp", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py"}}}, "date": "May 07, 2024", "start_time": 1715078647.6722705, "total_suite": 1, "status": "FAIL", "status_list": {"pass": "13", "fail": "1", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "14"} \ No newline at end of file diff --git a/backend/archive/output_1715079032.8131428.json b/backend/archive/output_1715079032.8131428.json deleted file mode 100644 index 070c7e040e..0000000000 --- a/backend/archive/output_1715079032.8131428.json +++ /dev/null @@ -1 +0,0 @@ -{"content": {"suites": {"0": {"status": {"total_pass": 13, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 1, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_chosen_delivery_mechanism_not_supported_by_fsp", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_all_payments_covered_with_fsp_limit", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_fsp_cannot_accept_any_volume", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_not_all_payments_covered_because_of_fsp_limit", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_choosing_delivery_mechanism_order", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_providing_non_unique_delivery_mechanisms", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_being_able_to_get_possible_delivery_mechanisms", "rerun": "0"}, "7": {"status": "FAIL", "message": "E AssertionError: {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '...o Digital Wallet' is not supported by FSP 'Santander (417-46-3636): SFTP'\", 'path': ['assignFspToDeliveryMechanism']}]}\nE assert 'errors' not in {'data': OrderedDict([('assignFspToDeliveryMechanism', None)]), 'errors': [{'locations': [{'column': 5, 'line': 3}], '...o Digital Wallet' is not supported by FSP 'Santander (417-46-3636): SFTP'\", 'path': ['assignFspToDeliveryMechanism']}]}\n", "test_name": "test_delivery_mechanism_validation_for_usdc", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_getting_volume_by_delivery_mechanism", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_choosing_different_fsps_for_the_same_delivery_mechanism", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments_when_fsp_was_already_set_up", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_successful_fsp_assigment_with_no_limit", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_assigning_fsps_to_delivery_mechanism", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py"}}}, "date": "May 07, 2024", "start_time": 1715078796.0063202, "total_suite": 1, "status": "FAIL", "status_list": {"pass": "13", "fail": "1", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "14"} \ No newline at end of file diff --git a/backend/output.json b/backend/output.json deleted file mode 100644 index 30bee49897..0000000000 --- a/backend/output.json +++ /dev/null @@ -1 +0,0 @@ -{"content": {"suites": {"0": {"status": {"total_pass": 14, "total_skip": 0, "total_xpass": 0, "total_xfail": 0, "total_rerun": 0, "total_fail": 0, "total_error": 0}, "tests": {"0": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments_when_fsp_was_already_set_up", "rerun": "0"}, "1": {"status": "PASS", "message": "", "test_name": "test_assigning_fsps_to_delivery_mechanism", "rerun": "0"}, "2": {"status": "PASS", "message": "", "test_name": "test_choosing_different_fsps_for_the_same_delivery_mechanism", "rerun": "0"}, "3": {"status": "PASS", "message": "", "test_name": "test_successful_fsp_assigment_with_no_limit", "rerun": "0"}, "4": {"status": "PASS", "message": "", "test_name": "test_editing_fsps_assignments", "rerun": "0"}, "5": {"status": "PASS", "message": "", "test_name": "test_chosen_delivery_mechanism_not_supported_by_fsp", "rerun": "0"}, "6": {"status": "PASS", "message": "", "test_name": "test_fsp_cannot_accept_any_volume", "rerun": "0"}, "7": {"status": "PASS", "message": "", "test_name": "test_not_all_payments_covered_because_of_fsp_limit", "rerun": "0"}, "8": {"status": "PASS", "message": "", "test_name": "test_all_payments_covered_with_fsp_limit", "rerun": "0"}, "9": {"status": "PASS", "message": "", "test_name": "test_getting_volume_by_delivery_mechanism", "rerun": "0"}, "10": {"status": "PASS", "message": "", "test_name": "test_delivery_mechanism_validation_for_usdc", "rerun": "0"}, "11": {"status": "PASS", "message": "", "test_name": "test_being_able_to_get_possible_delivery_mechanisms", "rerun": "0"}, "12": {"status": "PASS", "message": "", "test_name": "test_choosing_delivery_mechanism_order", "rerun": "0"}, "13": {"status": "PASS", "message": "", "test_name": "test_providing_non_unique_delivery_mechanisms", "rerun": "0"}}, "suite_name": "hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py"}}}, "date": "May 07, 2024", "start_time": 1715079032.8131428, "total_suite": 1, "status": "PASS", "status_list": {"pass": "14", "fail": "0", "skip": "0", "error": "0", "xpass": "0", "xfail": "0", "rerun": "0"}, "total_tests": "14"} \ No newline at end of file diff --git a/backend/pytest_html_report.html b/backend/pytest_html_report.html deleted file mode 100644 index 9d92f0c1f3..0000000000 --- a/backend/pytest_html_report.html +++ /dev/null @@ -1,2247 +0,0 @@ - - - - - - Pytest HTML Reporter - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
-
-
-
-
- - - Time taken 35.68 secs - -
-
-
-
- PYTEST REPORT -
-
-
- May 07, 2024 -
-
- 14 -
-
- TEST CASES -
-
-
-
- -
-
-
-
- -
-
-
-
-
- -
- - - -
-
-
-
  Trends -
-
- -
-
-
- -
- -
-
-
-
- Test Suite - 1 -
-
- -
-
-
-
- - Suite Highlights -
-
-
-
- -

6 /7 Times

-
-
- MOST FAILED SUITE -
-
-
-
-
-
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
SuitePassFailSkipxPassxFailErrorRerun
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py14000000
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SuiteTest CaseStatusTime (s)Error Message
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_editing_fsps_assignments_when_fsp_was_already_set_upPASS8.15 - - -
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_assigning_fsps_to_delivery_mechanismPASS0.26 - - -
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_choosing_different_fsps_for_the_same_delivery_mechanismPASS0.33 - - -
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_successful_fsp_assigment_with_no_limitPASS0.16 - - -
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_editing_fsps_assignmentsPASS0.23 - - -
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_chosen_delivery_mechanism_not_supported_by_fspPASS1.71 - - -
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_fsp_cannot_accept_any_volumePASS0.97 - - -
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_not_all_payments_covered_because_of_fsp_limitPASS0.42 - - -
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_all_payments_covered_with_fsp_limitPASS0.78 - - -
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_getting_volume_by_delivery_mechanismPASS2.24 - - -
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_delivery_mechanism_validation_for_usdcPASS1.45 - - -
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_being_able_to_get_possible_delivery_mechanismsPASS1.39 - - -
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_choosing_delivery_mechanism_orderPASS0.43 - - -
hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.pytest_providing_non_unique_delivery_mechanismsPASS0.38 - - -
-
-
-
-
-
- - -
- -
-
-

- Build #7 -

-
-     - MAY 07, 2024 -
-
-
-
-
- 14 -
-
- TEST CASES -
-
-
- -
-
-
-
-
-
-
-
-

14

-

PASSED

-
-
-
-
-

0 -

-

FAILED

-
-
-
-
-

0

-

SKIPPED

-
-
-
-
-

0

-

XPASSED

-
-
-
-
-

0

-

XFAILED

-
-
-
-
-

0

-

ERROR

-
-
-
-
-

0

-

RERUN

-
-
-
-
-
-
-
- -
-
-

- Build #6 -

-
-     - MAY 07, 2024 -
-
-
-
-
- 14 -
-
- TEST CASES -
-
-
- -
-
-
-
-
-
-
-
-

13

-

PASSED

-
-
-
-
-

1 -

-

FAILED

-
-
-
-
-

0

-

SKIPPED

-
-
-
-
-

0

-

XPASSED

-
-
-
-
-

0

-

XFAILED

-
-
-
-
-

0

-

ERROR

-
-
-
-
-

0

-

RERUN

-
-
-
-
-
-
-
- -
-
-

- Build #5 -

-
-     - MAY 07, 2024 -
-
-
-
-
- 14 -
-
- TEST CASES -
-
-
- -
-
-
-
-
-
-
-
-

13

-

PASSED

-
-
-
-
-

1 -

-

FAILED

-
-
-
-
-

0

-

SKIPPED

-
-
-
-
-

0

-

XPASSED

-
-
-
-
-

0

-

XFAILED

-
-
-
-
-

0

-

ERROR

-
-
-
-
-

0

-

RERUN

-
-
-
-
-
-
-
- -
-
-

- Build #4 -

-
-     - MAY 07, 2024 -
-
-
-
-
- 14 -
-
- TEST CASES -
-
-
- -
-
-
-
-
-
-
-
-

13

-

PASSED

-
-
-
-
-

1 -

-

FAILED

-
-
-
-
-

0

-

SKIPPED

-
-
-
-
-

0

-

XPASSED

-
-
-
-
-

0

-

XFAILED

-
-
-
-
-

0

-

ERROR

-
-
-
-
-

0

-

RERUN

-
-
-
-
-
-
-
- -
-
-

- Build #3 -

-
-     - MAY 07, 2024 -
-
-
-
-
- 14 -
-
- TEST CASES -
-
-
- -
-
-
-
-
-
-
-
-

13

-

PASSED

-
-
-
-
-

1 -

-

FAILED

-
-
-
-
-

0

-

SKIPPED

-
-
-
-
-

0

-

XPASSED

-
-
-
-
-

0

-

XFAILED

-
-
-
-
-

0

-

ERROR

-
-
-
-
-

0

-

RERUN

-
-
-
-
-
-
-
- -
-
-

- Build #2 -

-
-     - MAY 07, 2024 -
-
-
-
-
- 14 -
-
- TEST CASES -
-
-
- -
-
-
-
-
-
-
-
-

13

-

PASSED

-
-
-
-
-

1 -

-

FAILED

-
-
-
-
-

0

-

SKIPPED

-
-
-
-
-

0

-

XPASSED

-
-
-
-
-

0

-

XFAILED

-
-
-
-
-

0

-

ERROR

-
-
-
-
-

0

-

RERUN

-
-
-
-
-
-
-
- -
-
-

- Build #1 -

-
-     - MAY 07, 2024 -
-
-
-
-
- 201 -
-
- TEST CASES -
-
-
- -
-
-
-
-
-
-
-
-

199

-

PASSED

-
-
-
-
-

1 -

-

FAILED

-
-
-
-
-

1

-

SKIPPED

-
-
-
-
-

0

-

XPASSED

-
-
-
-
-

0

-

XFAILED

-
-
-
-
-

0

-

ERROR

-
-
-
-
-

0

-

RERUN

-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - \ No newline at end of file From b48de4b3c35e4003861563cf194a861bb2b477db Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Wed, 8 May 2024 13:17:31 +0200 Subject: [PATCH 21/38] upd FE schema --- frontend/data/schema.graphql | 3 +++ frontend/src/__generated__/graphql.tsx | 3 +++ 2 files changed, 6 insertions(+) diff --git a/frontend/data/schema.graphql b/frontend/data/schema.graphql index 65806365fc..56170681f5 100644 --- a/frontend/data/schema.graphql +++ b/frontend/data/schema.graphql @@ -973,6 +973,7 @@ enum DeliveryMechanismPerPaymentPlanDeliveryMechanism { VOUCHER CASH_OVER_THE_COUNTER TRANSFER_TO_DIGITAL_WALLET + ATM_CARD } type DiscardPaymentVerificationPlan { @@ -2871,6 +2872,7 @@ enum PaymentDeliveryType { VOUCHER CASH_OVER_THE_COUNTER TRANSFER_TO_DIGITAL_WALLET + ATM_CARD } type PaymentDetailsApproveMutation { @@ -3258,6 +3260,7 @@ enum PaymentRecordDeliveryType { VOUCHER CASH_OVER_THE_COUNTER TRANSFER_TO_DIGITAL_WALLET + ATM_CARD } enum PaymentRecordEntitlementCardStatus { diff --git a/frontend/src/__generated__/graphql.tsx b/frontend/src/__generated__/graphql.tsx index 4dbbd2fd58..926f511434 100644 --- a/frontend/src/__generated__/graphql.tsx +++ b/frontend/src/__generated__/graphql.tsx @@ -1471,6 +1471,7 @@ export type DeliveryMechanismNodeEdge = { }; export enum DeliveryMechanismPerPaymentPlanDeliveryMechanism { + AtmCard = 'ATM_CARD', CardlessCashWithdrawal = 'CARDLESS_CASH_WITHDRAWAL', Cash = 'CASH', CashByFsp = 'CASH_BY_FSP', @@ -4631,6 +4632,7 @@ export type PaymentConflictDataNode = { }; export enum PaymentDeliveryType { + AtmCard = 'ATM_CARD', CardlessCashWithdrawal = 'CARDLESS_CASH_WITHDRAWAL', Cash = 'CASH', CashByFsp = 'CASH_BY_FSP', @@ -5073,6 +5075,7 @@ export type PaymentRecordAndPaymentNode = { }; export enum PaymentRecordDeliveryType { + AtmCard = 'ATM_CARD', CardlessCashWithdrawal = 'CARDLESS_CASH_WITHDRAWAL', Cash = 'CASH', CashByFsp = 'CASH_BY_FSP', From d80f72c66bd3795d00f5a46cd0091c3a078014ff Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk Date: Wed, 8 May 2024 14:52:09 +0200 Subject: [PATCH 22/38] upd tests --- .../test_file/pp_payment_list_invalid.xlsx | Bin 6571 -> 6641 bytes .../pp_payment_list_unexpected_column.xlsx | Bin 6665 -> 6729 bytes .../test_file/pp_payment_list_valid.xlsx | Bin 6634 -> 6703 bytes ...import_export_payment_plan_payment_list.py | 4 +++- 4 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/hct_mis_api/apps/payment/tests/test_file/pp_payment_list_invalid.xlsx b/backend/hct_mis_api/apps/payment/tests/test_file/pp_payment_list_invalid.xlsx index 39551a34e8211a26151081699ea76daf2512e0ae..b6fbe6abb200c6d6f6bcd8b43a5939f83eaf4bcd 100644 GIT binary patch delta 3526 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 D{rYpS delta 1853 zcmZ9Nc{JPU8pnT;FhZ+Jlu)$?)mBKTp%P3jZIU*s#Bz%fK`h0f6@#C3M5YL7HI^}! zUZb|wR!ggvHkPqmbEO?!sZ#r1`*z9vF=y`k&*wSkdEWOt=X}q3Ki$}5>`^iS3PS(@ zAPT7XhgBVwfj|$)(SU3Ts4CQR$eKkVw4hO=2GjbhxFVb&B5}}iRI*+C=mP@)6DiJ! zxB+;-&NzIFMo9ogUh8;)M?7y$z43yVr%n&fodPc;wM1-9Y$i>m3@DAmsl~xjwzz?; zXph+)ce(Msgq4Pq>6mjHjnD!{?}m!0JUA9)vu>okO-L2@%3m7N)9Ux==sbOOs*z8t zS84to!wXg|W_wrLpZYBk_bWhdPykv(PEqAP9M z{g>X*=(h3X_YPRnEqW}$Tq=^Oi!2+7^GtB7a0 z-~628k}&u=dCB!j<(#gD8iN#?@-N4Z&f!lw{S6MpqQ3A6){@igB?p%G*{kBVIh}ak z3`rt@v6DT7N1h<3KJcQIic}*WUb}ujd%pD=;hr<;A?9&t;bl$ILj(OAgG!EpWf9xE z-PC1+DG52-zR9(ueX@W z;H;B|*)!MQqs)6pH}7WTpl)iA${Bv1!;Qx`Chtv(Q+D(9 zCFrLt;p_R8sxe|^WsXl|GRedy*5eAUXyOO^^0#6xTDg^~aYYR`c=D;EV3|4O04-6 zDU_A9J1~EQf0g9Q(j1)RRi$f2HO`(aqdc`lSGbOue6@0ZonL!qk`~BHBgaMPczwTX z?R@+9A7{R&L!@m3O%qPoh=Z&8ZcfT)`8kA8?|j!Uer5ME>8V?Ox2bi|n&!PZ+Aio$ zj?1=xl^mq6)t)@54lZ=PMCkcd1L}Y$+@?gdv|G$a)$Db?ZxPd;Q=!Vqo_+g(8fV%C zbIE*{0%sYez++%BXCQEh6GRG9E#g_ke8dFcDN5&>ql~~-*f(6j2I!JvOR{B@ zk1P9`8A_nrASk22tPu(QHepmlE6hyDEHfq{rW{BHoS@agvG8-~wx}LhARB%P-3CPg zQb09K9p)))1M8A!r+hEcz%NLWMw~#zmEjI!smOYsmmt+Z9@Mlx1IicV+woH7mcQ;MBB@ zdhV&gLcV_Fi0d8ebL&Z$sbdf|?dQJ=nD)o$#tQP4mlm zKn5BA=}4`fxUaPp)!SY6E!E;@&{EFFV$4Z{k)5ZBu~9s4&|Un+D|P~DQ2#@T^v&t9 z2YV=v6I`?CCknD#_N(@h8h%B)=JkO27az3}O%>kxa^v~60> zUet$s8Rd(V?oOF2e}HpzidY0n#I>8!Qy!zQWNhoOVTIUa!%KoDG7E*k*(SaC*16TX zF1z%ms$k5@5)FSzk!kJD#APq!PeLM%M?7qPc!`>B6M4NrOv==5YW#L%vgfIeTa#r} zM0{I?mrMC_xg^`;w3uAI$NA8rlKy(y6P(`kj1T-6&IBMm zUkk{%GinFcwnCn5Mb01z>oz+S!ux&S{%E0p1XaV8B0>dPnUER!%Qx+^h63Mg%U%%B zSk6Sia5-ZE>*Op2+?B)qzjQ7kjg$^ObeO&%d?)}M3hnO`!O2Ie;SOia|440-Jm}A; z0Kn0|2M#KN6aa+#>xP6f{AnTQ!UO!t1c(q$@Q}ca9EiLEB%7lsj}i%yJ-qopTd+6{ diff --git a/backend/hct_mis_api/apps/payment/tests/test_file/pp_payment_list_valid.xlsx b/backend/hct_mis_api/apps/payment/tests/test_file/pp_payment_list_valid.xlsx index 94c7dc9949a691a00dd7e14d4313ebbb05b29394..cd04fb11deeb49cfa8e6a0f7b1edc4f7b888d281 100644 GIT binary patch delta 3588 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 None: self.assertEqual(service.errors, error_msg) def test_import_invalid_file_with_unexpected_column(self) -> None: - error_msg = XlsxError(sheet="Payment Plan - Payment List", coordinates="L3", message="Unexpected value") + error_msg = XlsxError(sheet="Payment Plan - Payment List", coordinates="M3", message="Unexpected value") content = Path( f"{settings.PROJECT_ROOT}/apps/payment/tests/test_file/pp_payment_list_unexpected_column.xlsx" ).read_bytes() @@ -170,6 +170,8 @@ def test_import_valid_file(self, mock_parent_init: Any) -> None: self.assertEqual(to_decimal(wb.active["I2"].value), payment_1.entitlement_quantity) self.assertEqual(to_decimal(wb.active["I3"].value), payment_2.entitlement_quantity) + self.assertEqual("test_text_link_text_text", payment_1.transaction_status_blockchain) + self.assertEqual("test_text_link_test222", payment_2.transaction_status_blockchain) def test_export_payment_plan_payment_list(self) -> None: export_service = XlsxPaymentPlanExportService(self.payment_plan) From 35fce31f43278b15849a600d6492db9f3462161e Mon Sep 17 00:00:00 2001 From: Maciej Szewczyk Date: Fri, 10 May 2024 15:37:04 +0200 Subject: [PATCH 23/38] add digital wallet info to individual --- frontend/src/__generated__/graphql.tsx | 15 +++++---- .../apollo/fragments/IndividualFragments.ts | 3 ++ .../IndividualBioData/IndividualBioData.tsx | 33 +++++++++++++++++++ .../pages/program/CreateProgramPage.tsx | 6 +--- .../pages/program/DuplicateProgramPage.tsx | 9 ++--- .../pages/program/EditProgramPage.tsx | 9 ++--- .../PeopleListTable/PeopleListTable.tsx | 9 ++--- 7 files changed, 55 insertions(+), 29 deletions(-) diff --git a/frontend/src/__generated__/graphql.tsx b/frontend/src/__generated__/graphql.tsx index 926f511434..006a1a7b22 100644 --- a/frontend/src/__generated__/graphql.tsx +++ b/frontend/src/__generated__/graphql.tsx @@ -9224,7 +9224,7 @@ export type _TableTotalCashTransferredDataNode = { totalHouseholds?: Maybe; }; -export type GrievanceTicketDetailedFragment = { __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, status: number, category: number, consent: boolean, createdAt: any, updatedAt: any, description: string, language: string, admin?: string | null, area: string, adminUrl?: string | null, issueType?: number | null, priority?: number | null, urgency?: number | null, comments?: string | null, partner?: { __typename?: 'PartnerType', id: string, name: string } | null, businessArea: { __typename?: 'UserBusinessAreaNode', postponeDeduplication: boolean }, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, pCode?: string | null } | null, assignedTo?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null, individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null, household?: { __typename?: 'HouseholdNode', activeIndividualsCount?: number | null, countryOrigin?: string | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, address: string, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, id: string, status?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unicefId?: string | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, paymentRecord?: { __typename?: 'PaymentRecordAndPaymentNode', id?: string | null, caId?: string | null, deliveredQuantity?: number | null, entitlementQuantity?: number | null, objType?: string | null, parent?: { __typename?: 'CashPlanAndPaymentPlanNode', id?: string | null, unicefId?: string | null, objType?: string | null } | null, verification?: { __typename?: 'PaymentVerificationNode', id: string } | null } | null, relatedTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, linkedTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, category: number, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, existingTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, category: number, unicefId?: string | null, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, addIndividualTicketDetails?: { __typename?: 'TicketAddIndividualDetailsNode', id: string, individualData?: any | null, approveStatus: boolean, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null, individualDataUpdateTicketDetails?: { __typename?: 'TicketIndividualDataUpdateDetailsNode', id: string, individualData?: any | null, roleReassignData: any, individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null } | null, householdDataUpdateTicketDetails?: { __typename?: 'TicketHouseholdDataUpdateDetailsNode', id: string, householdData?: any | null, household?: { __typename?: 'HouseholdNode', activeIndividualsCount?: number | null, countryOrigin?: string | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, address: string, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, id: string, status?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unicefId?: string | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null } | null, deleteIndividualTicketDetails?: { __typename?: 'TicketDeleteIndividualDetailsNode', id: string, roleReassignData: any, approveStatus: boolean } | null, deleteHouseholdTicketDetails?: { __typename?: 'TicketDeleteHouseholdDetailsNode', id: string, approveStatus: boolean, reasonHousehold?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null, systemFlaggingTicketDetails?: { __typename?: 'TicketSystemFlaggingDetailsNode', id: string, approveStatus: boolean, roleReassignData: any, goldenRecordsIndividual: { __typename?: 'IndividualNode', id: string, fullName: string, birthDate: any, lastRegistrationDate: any, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, documentNumber: string, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> } }, sanctionListIndividual: { __typename?: 'SanctionListIndividualNode', id: string, fullName: string, referenceNumber: string, datesOfBirth: { __typename?: 'SanctionListIndividualDateOfBirthNodeConnection', edges: Array<{ __typename?: 'SanctionListIndividualDateOfBirthNodeEdge', node?: { __typename?: 'SanctionListIndividualDateOfBirthNode', id: string, date: any } | null } | null> }, documents: { __typename?: 'SanctionListIndividualDocumentNodeConnection', edges: Array<{ __typename?: 'SanctionListIndividualDocumentNodeEdge', node?: { __typename?: 'SanctionListIndividualDocumentNode', id: string, documentNumber: string, typeOfDocument: string } | null } | null> } } } | null, paymentVerificationTicketDetails?: { __typename?: 'TicketPaymentVerificationDetailsNode', id: string, newStatus?: TicketPaymentVerificationDetailsNewStatus | null, oldReceivedAmount?: number | null, newReceivedAmount?: number | null, approveStatus: boolean, paymentVerificationStatus: TicketPaymentVerificationDetailsPaymentVerificationStatus, hasMultiplePaymentVerifications?: boolean | null, paymentVerification?: { __typename?: 'PaymentVerificationNode', id: string, receivedAmount?: number | null } | null, paymentVerifications: { __typename?: 'PaymentVerificationNodeConnection', edges: Array<{ __typename?: 'PaymentVerificationNodeEdge', node?: { __typename?: 'PaymentVerificationNode', id: string } | null } | null> } } | null, needsAdjudicationTicketDetails?: { __typename?: 'TicketNeedsAdjudicationDetailsNode', id: string, hasDuplicatedDocument?: boolean | null, isMultipleDuplicatesVersion: boolean, roleReassignData: any, extraData?: { __typename?: 'TicketNeedsAdjudicationDetailsExtraDataNode', goldenRecords?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null, possibleDuplicate?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null, goldenRecordsIndividual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string, birthDate: any, lastRegistrationDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null }, possibleDuplicate?: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, lastRegistrationDate: any, fullName: string, birthDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', unicefId?: string | null, id: string, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null, possibleDuplicates?: Array<{ __typename?: 'IndividualNode', id: string, unicefId?: string | null, lastRegistrationDate: any, fullName: string, birthDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', unicefId?: string | null, id: string, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null> | null, selectedIndividual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, activeIndividualsCount?: number | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null, selectedIndividuals?: Array<{ __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, activeIndividualsCount?: number | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null> | null } | null, ticketNotes: { __typename?: 'TicketNoteNodeConnection', edges: Array<{ __typename?: 'TicketNoteNodeEdge', node?: { __typename?: 'TicketNoteNode', id: string, createdAt: any, updatedAt: any, description: string, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null } | null } | null> }, programs?: Array<{ __typename?: 'ProgramNode', name: string, id: string } | null> | null, documentation?: Array<{ __typename?: 'GrievanceDocumentNode', id: string, createdAt: any, updatedAt: any, name?: string | null, fileSize?: number | null, contentType: string, filePath?: string | null, fileName?: string | null, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null } | null> | null }; +export type GrievanceTicketDetailedFragment = { __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, status: number, category: number, consent: boolean, createdAt: any, updatedAt: any, description: string, language: string, admin?: string | null, area: string, adminUrl?: string | null, issueType?: number | null, priority?: number | null, urgency?: number | null, comments?: string | null, partner?: { __typename?: 'PartnerType', id: string, name: string } | null, businessArea: { __typename?: 'UserBusinessAreaNode', postponeDeduplication: boolean }, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, pCode?: string | null } | null, assignedTo?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null, individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, walletName: string, walletAddress: string, blockchainName: string, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null, household?: { __typename?: 'HouseholdNode', activeIndividualsCount?: number | null, countryOrigin?: string | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, address: string, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, id: string, status?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unicefId?: string | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, paymentRecord?: { __typename?: 'PaymentRecordAndPaymentNode', id?: string | null, caId?: string | null, deliveredQuantity?: number | null, entitlementQuantity?: number | null, objType?: string | null, parent?: { __typename?: 'CashPlanAndPaymentPlanNode', id?: string | null, unicefId?: string | null, objType?: string | null } | null, verification?: { __typename?: 'PaymentVerificationNode', id: string } | null } | null, relatedTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, linkedTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, category: number, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, existingTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, category: number, unicefId?: string | null, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, addIndividualTicketDetails?: { __typename?: 'TicketAddIndividualDetailsNode', id: string, individualData?: any | null, approveStatus: boolean, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null, individualDataUpdateTicketDetails?: { __typename?: 'TicketIndividualDataUpdateDetailsNode', id: string, individualData?: any | null, roleReassignData: any, individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, walletName: string, walletAddress: string, blockchainName: string, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null } | null, householdDataUpdateTicketDetails?: { __typename?: 'TicketHouseholdDataUpdateDetailsNode', id: string, householdData?: any | null, household?: { __typename?: 'HouseholdNode', activeIndividualsCount?: number | null, countryOrigin?: string | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, address: string, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, id: string, status?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unicefId?: string | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null } | null, deleteIndividualTicketDetails?: { __typename?: 'TicketDeleteIndividualDetailsNode', id: string, roleReassignData: any, approveStatus: boolean } | null, deleteHouseholdTicketDetails?: { __typename?: 'TicketDeleteHouseholdDetailsNode', id: string, approveStatus: boolean, reasonHousehold?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null, systemFlaggingTicketDetails?: { __typename?: 'TicketSystemFlaggingDetailsNode', id: string, approveStatus: boolean, roleReassignData: any, goldenRecordsIndividual: { __typename?: 'IndividualNode', id: string, fullName: string, birthDate: any, lastRegistrationDate: any, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, documentNumber: string, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> } }, sanctionListIndividual: { __typename?: 'SanctionListIndividualNode', id: string, fullName: string, referenceNumber: string, datesOfBirth: { __typename?: 'SanctionListIndividualDateOfBirthNodeConnection', edges: Array<{ __typename?: 'SanctionListIndividualDateOfBirthNodeEdge', node?: { __typename?: 'SanctionListIndividualDateOfBirthNode', id: string, date: any } | null } | null> }, documents: { __typename?: 'SanctionListIndividualDocumentNodeConnection', edges: Array<{ __typename?: 'SanctionListIndividualDocumentNodeEdge', node?: { __typename?: 'SanctionListIndividualDocumentNode', id: string, documentNumber: string, typeOfDocument: string } | null } | null> } } } | null, paymentVerificationTicketDetails?: { __typename?: 'TicketPaymentVerificationDetailsNode', id: string, newStatus?: TicketPaymentVerificationDetailsNewStatus | null, oldReceivedAmount?: number | null, newReceivedAmount?: number | null, approveStatus: boolean, paymentVerificationStatus: TicketPaymentVerificationDetailsPaymentVerificationStatus, hasMultiplePaymentVerifications?: boolean | null, paymentVerification?: { __typename?: 'PaymentVerificationNode', id: string, receivedAmount?: number | null } | null, paymentVerifications: { __typename?: 'PaymentVerificationNodeConnection', edges: Array<{ __typename?: 'PaymentVerificationNodeEdge', node?: { __typename?: 'PaymentVerificationNode', id: string } | null } | null> } } | null, needsAdjudicationTicketDetails?: { __typename?: 'TicketNeedsAdjudicationDetailsNode', id: string, hasDuplicatedDocument?: boolean | null, isMultipleDuplicatesVersion: boolean, roleReassignData: any, extraData?: { __typename?: 'TicketNeedsAdjudicationDetailsExtraDataNode', goldenRecords?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null, possibleDuplicate?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null, goldenRecordsIndividual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string, birthDate: any, lastRegistrationDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null }, possibleDuplicate?: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, lastRegistrationDate: any, fullName: string, birthDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', unicefId?: string | null, id: string, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null, possibleDuplicates?: Array<{ __typename?: 'IndividualNode', id: string, unicefId?: string | null, lastRegistrationDate: any, fullName: string, birthDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', unicefId?: string | null, id: string, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null> | null, selectedIndividual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, walletName: string, walletAddress: string, blockchainName: string, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, activeIndividualsCount?: number | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null, selectedIndividuals?: Array<{ __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, walletName: string, walletAddress: string, blockchainName: string, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, activeIndividualsCount?: number | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null> | null } | null, ticketNotes: { __typename?: 'TicketNoteNodeConnection', edges: Array<{ __typename?: 'TicketNoteNodeEdge', node?: { __typename?: 'TicketNoteNode', id: string, createdAt: any, updatedAt: any, description: string, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null } | null } | null> }, programs?: Array<{ __typename?: 'ProgramNode', name: string, id: string } | null> | null, documentation?: Array<{ __typename?: 'GrievanceDocumentNode', id: string, createdAt: any, updatedAt: any, name?: string | null, fileSize?: number | null, contentType: string, filePath?: string | null, fileName?: string | null, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null } | null> | null }; export type HouseholdMinimalFragment = { __typename?: 'HouseholdNode', id: string, status?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unicefId?: string | null, flexFields?: any | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, address: string, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string }, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } }; @@ -9234,7 +9234,7 @@ export type MergedHouseholdMinimalFragment = { __typename?: 'HouseholdNode', id: export type IndividualMinimalFragment = { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null }; -export type IndividualDetailedFragment = { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } }; +export type IndividualDetailedFragment = { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, walletName: string, walletAddress: string, blockchainName: string, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } }; export type MergedIndividualMinimalFragment = { __typename?: 'IndividualNode', id: string, unicefId?: string | null, age?: number | null, fullName: string, birthDate: any, sex: IndividualSex, role?: string | null, relationship?: IndividualRelationship | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, fullName?: string | null, score?: number | null, proximityToScore?: number | null, age?: number | null, location?: string | null } | null> | null, deduplicationBatchResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, fullName?: string | null, score?: number | null, proximityToScore?: number | null, age?: number | null, location?: string | null } | null> | null, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', id: string, datahubId?: any | null } | null }; @@ -9355,7 +9355,7 @@ export type ApproveIndividualDataChangeMutationVariables = Exact<{ }>; -export type ApproveIndividualDataChangeMutation = { __typename?: 'Mutations', approveIndividualDataChange?: { __typename?: 'IndividualDataChangeApproveMutation', grievanceTicket?: { __typename?: 'GrievanceTicketNode', id: string, status: number, individualDataUpdateTicketDetails?: { __typename?: 'TicketIndividualDataUpdateDetailsNode', id: string, individualData?: any | null, individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null } | null } | null } | null }; +export type ApproveIndividualDataChangeMutation = { __typename?: 'Mutations', approveIndividualDataChange?: { __typename?: 'IndividualDataChangeApproveMutation', grievanceTicket?: { __typename?: 'GrievanceTicketNode', id: string, status: number, individualDataUpdateTicketDetails?: { __typename?: 'TicketIndividualDataUpdateDetailsNode', id: string, individualData?: any | null, individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, walletName: string, walletAddress: string, blockchainName: string, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null } | null } | null } | null }; export type ApproveNeedsAdjudicationMutationVariables = Exact<{ grievanceTicketId: Scalars['ID']['input']; @@ -9438,7 +9438,7 @@ export type GrievanceTicketStatusChangeMutationVariables = Exact<{ }>; -export type GrievanceTicketStatusChangeMutation = { __typename?: 'Mutations', grievanceStatusChange?: { __typename?: 'GrievanceStatusChangeMutation', grievanceTicket?: { __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, status: number, category: number, consent: boolean, createdAt: any, updatedAt: any, description: string, language: string, admin?: string | null, area: string, adminUrl?: string | null, issueType?: number | null, priority?: number | null, urgency?: number | null, comments?: string | null, partner?: { __typename?: 'PartnerType', id: string, name: string } | null, businessArea: { __typename?: 'UserBusinessAreaNode', postponeDeduplication: boolean }, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, pCode?: string | null } | null, assignedTo?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null, individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null, household?: { __typename?: 'HouseholdNode', activeIndividualsCount?: number | null, countryOrigin?: string | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, address: string, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, id: string, status?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unicefId?: string | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, paymentRecord?: { __typename?: 'PaymentRecordAndPaymentNode', id?: string | null, caId?: string | null, deliveredQuantity?: number | null, entitlementQuantity?: number | null, objType?: string | null, parent?: { __typename?: 'CashPlanAndPaymentPlanNode', id?: string | null, unicefId?: string | null, objType?: string | null } | null, verification?: { __typename?: 'PaymentVerificationNode', id: string } | null } | null, relatedTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, linkedTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, category: number, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, existingTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, category: number, unicefId?: string | null, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, addIndividualTicketDetails?: { __typename?: 'TicketAddIndividualDetailsNode', id: string, individualData?: any | null, approveStatus: boolean, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null, individualDataUpdateTicketDetails?: { __typename?: 'TicketIndividualDataUpdateDetailsNode', id: string, individualData?: any | null, roleReassignData: any, individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null } | null, householdDataUpdateTicketDetails?: { __typename?: 'TicketHouseholdDataUpdateDetailsNode', id: string, householdData?: any | null, household?: { __typename?: 'HouseholdNode', activeIndividualsCount?: number | null, countryOrigin?: string | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, address: string, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, id: string, status?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unicefId?: string | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null } | null, deleteIndividualTicketDetails?: { __typename?: 'TicketDeleteIndividualDetailsNode', id: string, roleReassignData: any, approveStatus: boolean } | null, deleteHouseholdTicketDetails?: { __typename?: 'TicketDeleteHouseholdDetailsNode', id: string, approveStatus: boolean, reasonHousehold?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null, systemFlaggingTicketDetails?: { __typename?: 'TicketSystemFlaggingDetailsNode', id: string, approveStatus: boolean, roleReassignData: any, goldenRecordsIndividual: { __typename?: 'IndividualNode', id: string, fullName: string, birthDate: any, lastRegistrationDate: any, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, documentNumber: string, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> } }, sanctionListIndividual: { __typename?: 'SanctionListIndividualNode', id: string, fullName: string, referenceNumber: string, datesOfBirth: { __typename?: 'SanctionListIndividualDateOfBirthNodeConnection', edges: Array<{ __typename?: 'SanctionListIndividualDateOfBirthNodeEdge', node?: { __typename?: 'SanctionListIndividualDateOfBirthNode', id: string, date: any } | null } | null> }, documents: { __typename?: 'SanctionListIndividualDocumentNodeConnection', edges: Array<{ __typename?: 'SanctionListIndividualDocumentNodeEdge', node?: { __typename?: 'SanctionListIndividualDocumentNode', id: string, documentNumber: string, typeOfDocument: string } | null } | null> } } } | null, paymentVerificationTicketDetails?: { __typename?: 'TicketPaymentVerificationDetailsNode', id: string, newStatus?: TicketPaymentVerificationDetailsNewStatus | null, oldReceivedAmount?: number | null, newReceivedAmount?: number | null, approveStatus: boolean, paymentVerificationStatus: TicketPaymentVerificationDetailsPaymentVerificationStatus, hasMultiplePaymentVerifications?: boolean | null, paymentVerification?: { __typename?: 'PaymentVerificationNode', id: string, receivedAmount?: number | null } | null, paymentVerifications: { __typename?: 'PaymentVerificationNodeConnection', edges: Array<{ __typename?: 'PaymentVerificationNodeEdge', node?: { __typename?: 'PaymentVerificationNode', id: string } | null } | null> } } | null, needsAdjudicationTicketDetails?: { __typename?: 'TicketNeedsAdjudicationDetailsNode', id: string, hasDuplicatedDocument?: boolean | null, isMultipleDuplicatesVersion: boolean, roleReassignData: any, extraData?: { __typename?: 'TicketNeedsAdjudicationDetailsExtraDataNode', goldenRecords?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null, possibleDuplicate?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null, goldenRecordsIndividual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string, birthDate: any, lastRegistrationDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null }, possibleDuplicate?: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, lastRegistrationDate: any, fullName: string, birthDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', unicefId?: string | null, id: string, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null, possibleDuplicates?: Array<{ __typename?: 'IndividualNode', id: string, unicefId?: string | null, lastRegistrationDate: any, fullName: string, birthDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', unicefId?: string | null, id: string, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null> | null, selectedIndividual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, activeIndividualsCount?: number | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null, selectedIndividuals?: Array<{ __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, activeIndividualsCount?: number | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null> | null } | null, ticketNotes: { __typename?: 'TicketNoteNodeConnection', edges: Array<{ __typename?: 'TicketNoteNodeEdge', node?: { __typename?: 'TicketNoteNode', id: string, createdAt: any, updatedAt: any, description: string, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null } | null } | null> }, programs?: Array<{ __typename?: 'ProgramNode', name: string, id: string } | null> | null, documentation?: Array<{ __typename?: 'GrievanceDocumentNode', id: string, createdAt: any, updatedAt: any, name?: string | null, fileSize?: number | null, contentType: string, filePath?: string | null, fileName?: string | null, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null } | null> | null } | null } | null }; +export type GrievanceTicketStatusChangeMutation = { __typename?: 'Mutations', grievanceStatusChange?: { __typename?: 'GrievanceStatusChangeMutation', grievanceTicket?: { __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, status: number, category: number, consent: boolean, createdAt: any, updatedAt: any, description: string, language: string, admin?: string | null, area: string, adminUrl?: string | null, issueType?: number | null, priority?: number | null, urgency?: number | null, comments?: string | null, partner?: { __typename?: 'PartnerType', id: string, name: string } | null, businessArea: { __typename?: 'UserBusinessAreaNode', postponeDeduplication: boolean }, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, pCode?: string | null } | null, assignedTo?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null, individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, walletName: string, walletAddress: string, blockchainName: string, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null, household?: { __typename?: 'HouseholdNode', activeIndividualsCount?: number | null, countryOrigin?: string | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, address: string, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, id: string, status?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unicefId?: string | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, paymentRecord?: { __typename?: 'PaymentRecordAndPaymentNode', id?: string | null, caId?: string | null, deliveredQuantity?: number | null, entitlementQuantity?: number | null, objType?: string | null, parent?: { __typename?: 'CashPlanAndPaymentPlanNode', id?: string | null, unicefId?: string | null, objType?: string | null } | null, verification?: { __typename?: 'PaymentVerificationNode', id: string } | null } | null, relatedTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, linkedTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, category: number, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, existingTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, category: number, unicefId?: string | null, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, addIndividualTicketDetails?: { __typename?: 'TicketAddIndividualDetailsNode', id: string, individualData?: any | null, approveStatus: boolean, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null, individualDataUpdateTicketDetails?: { __typename?: 'TicketIndividualDataUpdateDetailsNode', id: string, individualData?: any | null, roleReassignData: any, individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, walletName: string, walletAddress: string, blockchainName: string, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null } | null, householdDataUpdateTicketDetails?: { __typename?: 'TicketHouseholdDataUpdateDetailsNode', id: string, householdData?: any | null, household?: { __typename?: 'HouseholdNode', activeIndividualsCount?: number | null, countryOrigin?: string | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, address: string, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, id: string, status?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unicefId?: string | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null } | null, deleteIndividualTicketDetails?: { __typename?: 'TicketDeleteIndividualDetailsNode', id: string, roleReassignData: any, approveStatus: boolean } | null, deleteHouseholdTicketDetails?: { __typename?: 'TicketDeleteHouseholdDetailsNode', id: string, approveStatus: boolean, reasonHousehold?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null, systemFlaggingTicketDetails?: { __typename?: 'TicketSystemFlaggingDetailsNode', id: string, approveStatus: boolean, roleReassignData: any, goldenRecordsIndividual: { __typename?: 'IndividualNode', id: string, fullName: string, birthDate: any, lastRegistrationDate: any, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, documentNumber: string, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> } }, sanctionListIndividual: { __typename?: 'SanctionListIndividualNode', id: string, fullName: string, referenceNumber: string, datesOfBirth: { __typename?: 'SanctionListIndividualDateOfBirthNodeConnection', edges: Array<{ __typename?: 'SanctionListIndividualDateOfBirthNodeEdge', node?: { __typename?: 'SanctionListIndividualDateOfBirthNode', id: string, date: any } | null } | null> }, documents: { __typename?: 'SanctionListIndividualDocumentNodeConnection', edges: Array<{ __typename?: 'SanctionListIndividualDocumentNodeEdge', node?: { __typename?: 'SanctionListIndividualDocumentNode', id: string, documentNumber: string, typeOfDocument: string } | null } | null> } } } | null, paymentVerificationTicketDetails?: { __typename?: 'TicketPaymentVerificationDetailsNode', id: string, newStatus?: TicketPaymentVerificationDetailsNewStatus | null, oldReceivedAmount?: number | null, newReceivedAmount?: number | null, approveStatus: boolean, paymentVerificationStatus: TicketPaymentVerificationDetailsPaymentVerificationStatus, hasMultiplePaymentVerifications?: boolean | null, paymentVerification?: { __typename?: 'PaymentVerificationNode', id: string, receivedAmount?: number | null } | null, paymentVerifications: { __typename?: 'PaymentVerificationNodeConnection', edges: Array<{ __typename?: 'PaymentVerificationNodeEdge', node?: { __typename?: 'PaymentVerificationNode', id: string } | null } | null> } } | null, needsAdjudicationTicketDetails?: { __typename?: 'TicketNeedsAdjudicationDetailsNode', id: string, hasDuplicatedDocument?: boolean | null, isMultipleDuplicatesVersion: boolean, roleReassignData: any, extraData?: { __typename?: 'TicketNeedsAdjudicationDetailsExtraDataNode', goldenRecords?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null, possibleDuplicate?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null, goldenRecordsIndividual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string, birthDate: any, lastRegistrationDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null }, possibleDuplicate?: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, lastRegistrationDate: any, fullName: string, birthDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', unicefId?: string | null, id: string, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null, possibleDuplicates?: Array<{ __typename?: 'IndividualNode', id: string, unicefId?: string | null, lastRegistrationDate: any, fullName: string, birthDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', unicefId?: string | null, id: string, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null> | null, selectedIndividual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, walletName: string, walletAddress: string, blockchainName: string, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, activeIndividualsCount?: number | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null, selectedIndividuals?: Array<{ __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, walletName: string, walletAddress: string, blockchainName: string, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, activeIndividualsCount?: number | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null> | null } | null, ticketNotes: { __typename?: 'TicketNoteNodeConnection', edges: Array<{ __typename?: 'TicketNoteNodeEdge', node?: { __typename?: 'TicketNoteNode', id: string, createdAt: any, updatedAt: any, description: string, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null } | null } | null> }, programs?: Array<{ __typename?: 'ProgramNode', name: string, id: string } | null> | null, documentation?: Array<{ __typename?: 'GrievanceDocumentNode', id: string, createdAt: any, updatedAt: any, name?: string | null, fileSize?: number | null, contentType: string, filePath?: string | null, fileName?: string | null, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null } | null> | null } | null } | null }; export type ReassignRoleGrievanceMutationVariables = Exact<{ grievanceTicketId: Scalars['ID']['input']; @@ -10188,7 +10188,7 @@ export type GrievanceTicketQueryVariables = Exact<{ }>; -export type GrievanceTicketQuery = { __typename?: 'Query', grievanceTicket?: { __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, status: number, category: number, consent: boolean, createdAt: any, updatedAt: any, description: string, language: string, admin?: string | null, area: string, adminUrl?: string | null, issueType?: number | null, priority?: number | null, urgency?: number | null, comments?: string | null, partner?: { __typename?: 'PartnerType', id: string, name: string } | null, businessArea: { __typename?: 'UserBusinessAreaNode', postponeDeduplication: boolean }, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, pCode?: string | null } | null, assignedTo?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null, individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null, household?: { __typename?: 'HouseholdNode', activeIndividualsCount?: number | null, countryOrigin?: string | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, address: string, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, id: string, status?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unicefId?: string | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, paymentRecord?: { __typename?: 'PaymentRecordAndPaymentNode', id?: string | null, caId?: string | null, deliveredQuantity?: number | null, entitlementQuantity?: number | null, objType?: string | null, parent?: { __typename?: 'CashPlanAndPaymentPlanNode', id?: string | null, unicefId?: string | null, objType?: string | null } | null, verification?: { __typename?: 'PaymentVerificationNode', id: string } | null } | null, relatedTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, linkedTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, category: number, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, existingTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, category: number, unicefId?: string | null, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, addIndividualTicketDetails?: { __typename?: 'TicketAddIndividualDetailsNode', id: string, individualData?: any | null, approveStatus: boolean, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null, individualDataUpdateTicketDetails?: { __typename?: 'TicketIndividualDataUpdateDetailsNode', id: string, individualData?: any | null, roleReassignData: any, individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null } | null, householdDataUpdateTicketDetails?: { __typename?: 'TicketHouseholdDataUpdateDetailsNode', id: string, householdData?: any | null, household?: { __typename?: 'HouseholdNode', activeIndividualsCount?: number | null, countryOrigin?: string | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, address: string, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, id: string, status?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unicefId?: string | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null } | null, deleteIndividualTicketDetails?: { __typename?: 'TicketDeleteIndividualDetailsNode', id: string, roleReassignData: any, approveStatus: boolean } | null, deleteHouseholdTicketDetails?: { __typename?: 'TicketDeleteHouseholdDetailsNode', id: string, approveStatus: boolean, reasonHousehold?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null, systemFlaggingTicketDetails?: { __typename?: 'TicketSystemFlaggingDetailsNode', id: string, approveStatus: boolean, roleReassignData: any, goldenRecordsIndividual: { __typename?: 'IndividualNode', id: string, fullName: string, birthDate: any, lastRegistrationDate: any, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, documentNumber: string, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> } }, sanctionListIndividual: { __typename?: 'SanctionListIndividualNode', id: string, fullName: string, referenceNumber: string, datesOfBirth: { __typename?: 'SanctionListIndividualDateOfBirthNodeConnection', edges: Array<{ __typename?: 'SanctionListIndividualDateOfBirthNodeEdge', node?: { __typename?: 'SanctionListIndividualDateOfBirthNode', id: string, date: any } | null } | null> }, documents: { __typename?: 'SanctionListIndividualDocumentNodeConnection', edges: Array<{ __typename?: 'SanctionListIndividualDocumentNodeEdge', node?: { __typename?: 'SanctionListIndividualDocumentNode', id: string, documentNumber: string, typeOfDocument: string } | null } | null> } } } | null, paymentVerificationTicketDetails?: { __typename?: 'TicketPaymentVerificationDetailsNode', id: string, newStatus?: TicketPaymentVerificationDetailsNewStatus | null, oldReceivedAmount?: number | null, newReceivedAmount?: number | null, approveStatus: boolean, paymentVerificationStatus: TicketPaymentVerificationDetailsPaymentVerificationStatus, hasMultiplePaymentVerifications?: boolean | null, paymentVerification?: { __typename?: 'PaymentVerificationNode', id: string, receivedAmount?: number | null } | null, paymentVerifications: { __typename?: 'PaymentVerificationNodeConnection', edges: Array<{ __typename?: 'PaymentVerificationNodeEdge', node?: { __typename?: 'PaymentVerificationNode', id: string } | null } | null> } } | null, needsAdjudicationTicketDetails?: { __typename?: 'TicketNeedsAdjudicationDetailsNode', id: string, hasDuplicatedDocument?: boolean | null, isMultipleDuplicatesVersion: boolean, roleReassignData: any, extraData?: { __typename?: 'TicketNeedsAdjudicationDetailsExtraDataNode', goldenRecords?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null, possibleDuplicate?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null, goldenRecordsIndividual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string, birthDate: any, lastRegistrationDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null }, possibleDuplicate?: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, lastRegistrationDate: any, fullName: string, birthDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', unicefId?: string | null, id: string, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null, possibleDuplicates?: Array<{ __typename?: 'IndividualNode', id: string, unicefId?: string | null, lastRegistrationDate: any, fullName: string, birthDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', unicefId?: string | null, id: string, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null> | null, selectedIndividual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, activeIndividualsCount?: number | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null, selectedIndividuals?: Array<{ __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, activeIndividualsCount?: number | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null> | null } | null, ticketNotes: { __typename?: 'TicketNoteNodeConnection', edges: Array<{ __typename?: 'TicketNoteNodeEdge', node?: { __typename?: 'TicketNoteNode', id: string, createdAt: any, updatedAt: any, description: string, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null } | null } | null> }, programs?: Array<{ __typename?: 'ProgramNode', name: string, id: string } | null> | null, documentation?: Array<{ __typename?: 'GrievanceDocumentNode', id: string, createdAt: any, updatedAt: any, name?: string | null, fileSize?: number | null, contentType: string, filePath?: string | null, fileName?: string | null, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null } | null> | null } | null }; +export type GrievanceTicketQuery = { __typename?: 'Query', grievanceTicket?: { __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, status: number, category: number, consent: boolean, createdAt: any, updatedAt: any, description: string, language: string, admin?: string | null, area: string, adminUrl?: string | null, issueType?: number | null, priority?: number | null, urgency?: number | null, comments?: string | null, partner?: { __typename?: 'PartnerType', id: string, name: string } | null, businessArea: { __typename?: 'UserBusinessAreaNode', postponeDeduplication: boolean }, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, pCode?: string | null } | null, assignedTo?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null, individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, walletName: string, walletAddress: string, blockchainName: string, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null, household?: { __typename?: 'HouseholdNode', activeIndividualsCount?: number | null, countryOrigin?: string | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, address: string, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, id: string, status?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unicefId?: string | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, paymentRecord?: { __typename?: 'PaymentRecordAndPaymentNode', id?: string | null, caId?: string | null, deliveredQuantity?: number | null, entitlementQuantity?: number | null, objType?: string | null, parent?: { __typename?: 'CashPlanAndPaymentPlanNode', id?: string | null, unicefId?: string | null, objType?: string | null } | null, verification?: { __typename?: 'PaymentVerificationNode', id: string } | null } | null, relatedTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, linkedTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, unicefId?: string | null, category: number, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, existingTickets?: Array<{ __typename?: 'GrievanceTicketNode', id: string, category: number, unicefId?: string | null, status: number, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null> | null, addIndividualTicketDetails?: { __typename?: 'TicketAddIndividualDetailsNode', id: string, individualData?: any | null, approveStatus: boolean, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null, individualDataUpdateTicketDetails?: { __typename?: 'TicketIndividualDataUpdateDetailsNode', id: string, individualData?: any | null, roleReassignData: any, individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, walletName: string, walletAddress: string, blockchainName: string, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null } | null, householdDataUpdateTicketDetails?: { __typename?: 'TicketHouseholdDataUpdateDetailsNode', id: string, householdData?: any | null, household?: { __typename?: 'HouseholdNode', activeIndividualsCount?: number | null, countryOrigin?: string | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, address: string, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, id: string, status?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unicefId?: string | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null } | null, deleteIndividualTicketDetails?: { __typename?: 'TicketDeleteIndividualDetailsNode', id: string, roleReassignData: any, approveStatus: boolean } | null, deleteHouseholdTicketDetails?: { __typename?: 'TicketDeleteHouseholdDetailsNode', id: string, approveStatus: boolean, reasonHousehold?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } | null } | null, systemFlaggingTicketDetails?: { __typename?: 'TicketSystemFlaggingDetailsNode', id: string, approveStatus: boolean, roleReassignData: any, goldenRecordsIndividual: { __typename?: 'IndividualNode', id: string, fullName: string, birthDate: any, lastRegistrationDate: any, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, documentNumber: string, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> } }, sanctionListIndividual: { __typename?: 'SanctionListIndividualNode', id: string, fullName: string, referenceNumber: string, datesOfBirth: { __typename?: 'SanctionListIndividualDateOfBirthNodeConnection', edges: Array<{ __typename?: 'SanctionListIndividualDateOfBirthNodeEdge', node?: { __typename?: 'SanctionListIndividualDateOfBirthNode', id: string, date: any } | null } | null> }, documents: { __typename?: 'SanctionListIndividualDocumentNodeConnection', edges: Array<{ __typename?: 'SanctionListIndividualDocumentNodeEdge', node?: { __typename?: 'SanctionListIndividualDocumentNode', id: string, documentNumber: string, typeOfDocument: string } | null } | null> } } } | null, paymentVerificationTicketDetails?: { __typename?: 'TicketPaymentVerificationDetailsNode', id: string, newStatus?: TicketPaymentVerificationDetailsNewStatus | null, oldReceivedAmount?: number | null, newReceivedAmount?: number | null, approveStatus: boolean, paymentVerificationStatus: TicketPaymentVerificationDetailsPaymentVerificationStatus, hasMultiplePaymentVerifications?: boolean | null, paymentVerification?: { __typename?: 'PaymentVerificationNode', id: string, receivedAmount?: number | null } | null, paymentVerifications: { __typename?: 'PaymentVerificationNodeConnection', edges: Array<{ __typename?: 'PaymentVerificationNodeEdge', node?: { __typename?: 'PaymentVerificationNode', id: string } | null } | null> } } | null, needsAdjudicationTicketDetails?: { __typename?: 'TicketNeedsAdjudicationDetailsNode', id: string, hasDuplicatedDocument?: boolean | null, isMultipleDuplicatesVersion: boolean, roleReassignData: any, extraData?: { __typename?: 'TicketNeedsAdjudicationDetailsExtraDataNode', goldenRecords?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null, possibleDuplicate?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null, goldenRecordsIndividual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string, birthDate: any, lastRegistrationDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null }, possibleDuplicate?: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, lastRegistrationDate: any, fullName: string, birthDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', unicefId?: string | null, id: string, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null, possibleDuplicates?: Array<{ __typename?: 'IndividualNode', id: string, unicefId?: string | null, lastRegistrationDate: any, fullName: string, birthDate: any, sex: IndividualSex, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', unicefId?: string | null, id: string, village: string, admin2?: { __typename?: 'AreaNode', id: string, name: string } | null } | null, deduplicationGoldenRecordResults?: Array<{ __typename?: 'DeduplicationResultNode', hitId?: string | null, proximityToScore?: number | null, score?: number | null } | null> | null } | null> | null, selectedIndividual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, walletName: string, walletAddress: string, blockchainName: string, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, activeIndividualsCount?: number | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null, selectedIndividuals?: Array<{ __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, walletName: string, walletAddress: string, blockchainName: string, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, activeIndividualsCount?: number | null, country?: string | null, zipCode?: string | null, femaleAgeGroup05Count?: number | null, femaleAgeGroup611Count?: number | null, femaleAgeGroup1217Count?: number | null, femaleAgeGroup1859Count?: number | null, femaleAgeGroup60Count?: number | null, pregnantCount?: number | null, maleAgeGroup05Count?: number | null, maleAgeGroup611Count?: number | null, maleAgeGroup1217Count?: number | null, maleAgeGroup1859Count?: number | null, maleAgeGroup60Count?: number | null, femaleAgeGroup05DisabledCount?: number | null, femaleAgeGroup611DisabledCount?: number | null, femaleAgeGroup1217DisabledCount?: number | null, femaleAgeGroup1859DisabledCount?: number | null, femaleAgeGroup60DisabledCount?: number | null, maleAgeGroup05DisabledCount?: number | null, maleAgeGroup611DisabledCount?: number | null, maleAgeGroup1217DisabledCount?: number | null, maleAgeGroup1859DisabledCount?: number | null, maleAgeGroup60DisabledCount?: number | null, fchildHoh?: boolean | null, childHoh?: boolean | null, start?: any | null, deviceid: string, orgNameEnumerator: string, returnee?: boolean | null, nameEnumerator: string, lastSyncAt?: any | null, consentSharing?: Array | null, orgEnumerator: HouseholdOrgEnumerator, updatedAt: any, consent?: boolean | null, collectIndividualData: HouseholdCollectIndividualData, flexFields?: any | null, registrationId?: string | null, adminUrl?: string | null, createdAt: any, residenceStatus?: string | null, maleChildrenCount?: number | null, femaleChildrenCount?: number | null, childrenDisabledCount?: number | null, size?: number | null, totalCashReceived?: any | null, totalCashReceivedUsd?: any | null, currency?: string | null, firstRegistrationDate: any, lastRegistrationDate: any, sanctionListPossibleMatch?: boolean | null, sanctionListConfirmedMatch?: boolean | null, hasDuplicates?: boolean | null, unhcrId: string, geopoint?: any | null, village: string, adminAreaTitle?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> }, individuals?: { __typename?: 'IndividualNodeConnection', totalCount?: number | null, edges: Array<{ __typename?: 'IndividualNodeEdge', node?: { __typename?: 'IndividualNode', id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, email: string, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, countryIso3?: string | null, documentNumber: string, photo?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> }, household?: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null, status?: string | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null } | null } | null> } | null, registrationDataImport?: { __typename?: 'RegistrationDataImportNode', name: string, dataSource: RegistrationDataImportDataSource, importDate: any, importedBy?: { __typename?: 'UserNode', firstName: string, lastName: string, email: string, username: string } | null } | null, paymentrecordSet: { __typename?: 'PaymentRecordNodeConnection', edges: Array<{ __typename?: 'PaymentRecordNodeEdge', node?: { __typename?: 'PaymentRecordNode', id: string, fullName: string, parent?: { __typename?: 'CashPlanNode', id: string, totalPersonsCovered: number, totalDeliveredQuantity?: number | null, assistanceMeasurement: string, program: { __typename?: 'ProgramNode', id: string, name: string } } | null } | null } | null> }, deliveredQuantities?: Array<{ __typename?: 'DeliveredQuantityNode', totalDeliveredQuantity?: any | null, currency?: string | null } | null> | null, admin3?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin4?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, headOfHousehold: { __typename?: 'IndividualNode', id: string, fullName: string, givenName: string, familyName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, individual: { __typename?: 'IndividualNode', id: string, unicefId?: string | null, fullName: string }, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null> | null } | null, ticketNotes: { __typename?: 'TicketNoteNodeConnection', edges: Array<{ __typename?: 'TicketNoteNodeEdge', node?: { __typename?: 'TicketNoteNode', id: string, createdAt: any, updatedAt: any, description: string, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null } | null } | null> }, programs?: Array<{ __typename?: 'ProgramNode', name: string, id: string } | null> | null, documentation?: Array<{ __typename?: 'GrievanceDocumentNode', id: string, createdAt: any, updatedAt: any, name?: string | null, fileSize?: number | null, contentType: string, filePath?: string | null, fileName?: string | null, createdBy?: { __typename?: 'UserNode', id: string, firstName: string, lastName: string, email: string } | null } | null> | null } | null }; export type GrievanceTicketFlexFieldsQueryVariables = Exact<{ id: Scalars['ID']['input']; @@ -10598,7 +10598,7 @@ export type IndividualQueryVariables = Exact<{ }>; -export type IndividualQuery = { __typename?: 'Query', individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null }; +export type IndividualQuery = { __typename?: 'Query', individual?: { __typename?: 'IndividualNode', givenName: string, familyName: string, estimatedBirthDate?: boolean | null, pregnant?: boolean | null, lastSyncAt?: any | null, deduplicationBatchStatus: IndividualDeduplicationBatchStatus, disability: IndividualDisability, importedIndividualId?: any | null, commsDisability: string, firstRegistrationDate: any, whoAnswersAltPhone: string, memoryDisability: string, middleName: string, whoAnswersPhone: string, phoneNoAlternative: string, phoneNoAlternativeValid?: boolean | null, email: string, hearingDisability: string, observedDisability?: Array | null, individualId: string, seeingDisability: string, physicalDisability: string, selfcareDisability: string, photo?: string | null, workStatus: string, enrolledInNutritionProgramme?: boolean | null, administrationOfRutf?: boolean | null, flexFields?: any | null, preferredLanguage?: string | null, paymentDeliveryPhoneNo?: string | null, walletName: string, walletAddress: string, blockchainName: string, id: string, age?: number | null, lastRegistrationDate: any, adminUrl?: string | null, createdAt: any, updatedAt: any, fullName: string, sex: IndividualSex, unicefId?: string | null, birthDate: any, maritalStatus: IndividualMaritalStatus, phoneNo: string, phoneNoValid?: boolean | null, sanctionListPossibleMatch: boolean, sanctionListConfirmedMatch: boolean, deduplicationGoldenRecordStatus: IndividualDeduplicationGoldenRecordStatus, sanctionListLastCheck?: any | null, role?: string | null, relationship?: IndividualRelationship | null, status?: string | null, paymentChannels?: Array<{ __typename?: 'BankAccountInfoNode', id: string, bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null> | null, documents: { __typename?: 'DocumentNodeConnection', edges: Array<{ __typename?: 'DocumentNodeEdge', node?: { __typename?: 'DocumentNode', id: string, country?: string | null, photo?: string | null, documentNumber: string, countryIso3?: string | null, type: { __typename?: 'DocumentTypeNode', label: string, key: string } } | null } | null> }, household?: { __typename?: 'HouseholdNode', status?: string | null, id: string, address: string, countryOrigin?: string | null, unicefId?: string | null, adminArea?: { __typename?: 'AreaNode', id: string, name: string, level: number } | null, admin1?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, admin2?: { __typename?: 'AreaNode', id: string, name: string, level: number, pCode?: string | null } | null, programs: { __typename?: 'ProgramNodeConnection', edges: Array<{ __typename?: 'ProgramNodeEdge', node?: { __typename?: 'ProgramNode', id: string, name: string } | null } | null> } } | null, headingHousehold?: { __typename?: 'HouseholdNode', id: string, headOfHousehold: { __typename?: 'IndividualNode', id: string, givenName: string, familyName: string, fullName: string } } | null, householdsAndRoles: Array<{ __typename?: 'IndividualRoleInHouseholdNode', id: any, role?: IndividualRoleInHouseholdRole | null, household: { __typename?: 'HouseholdNode', id: string, unicefId?: string | null } }>, bankAccountInfo?: { __typename?: 'BankAccountInfoNode', bankName: string, bankAccountNumber: string, accountHolderName: string, bankBranchName: string } | null, identities: { __typename?: 'IndividualIdentityNodeConnection', edges: Array<{ __typename?: 'IndividualIdentityNodeEdge', node?: { __typename?: 'IndividualIdentityNode', id: string, partner?: string | null, country?: string | null, number: string } | null } | null> } } | null }; export type IndividualChoiceDataQueryVariables = Exact<{ [key: string]: never; }>; @@ -11215,6 +11215,9 @@ export const IndividualDetailedFragmentDoc = gql` } preferredLanguage paymentDeliveryPhoneNo + walletName + walletAddress + blockchainName } ${IndividualMinimalFragmentDoc}`; export const HouseholdMinimalFragmentDoc = gql` diff --git a/frontend/src/apollo/fragments/IndividualFragments.ts b/frontend/src/apollo/fragments/IndividualFragments.ts index e6fe557b68..793ac7c2d2 100644 --- a/frontend/src/apollo/fragments/IndividualFragments.ts +++ b/frontend/src/apollo/fragments/IndividualFragments.ts @@ -165,6 +165,9 @@ export const individualDetailed = gql` } preferredLanguage paymentDeliveryPhoneNo + walletName + walletAddress + blockchainName } `; diff --git a/frontend/src/components/population/IndividualBioData/IndividualBioData.tsx b/frontend/src/components/population/IndividualBioData/IndividualBioData.tsx index b13eab5f2f..868b20cbe6 100644 --- a/frontend/src/components/population/IndividualBioData/IndividualBioData.tsx +++ b/frontend/src/components/population/IndividualBioData/IndividualBioData.tsx @@ -144,6 +144,38 @@ export function IndividualBioData({ ); }; + const renderDigitalWalletInfo = (): React.ReactNode => { + if ( + !individual?.walletName || + !individual?.blockchainName || + !individual?.walletAddress + ) { + return null; + } + return ( + <> + + + + + + {individual?.walletName} + + + + + {individual?.blockchainName} + + + + + {individual?.walletAddress} + + + + ); + }; + return ( @@ -335,6 +367,7 @@ export function IndividualBioData({ )} </Grid> {renderBankAccountInfo()} + {renderDigitalWalletInfo()} </Grid> </Overview> ); diff --git a/frontend/src/containers/pages/program/CreateProgramPage.tsx b/frontend/src/containers/pages/program/CreateProgramPage.tsx index 09e8525dd3..2b2e5038ba 100644 --- a/frontend/src/containers/pages/program/CreateProgramPage.tsx +++ b/frontend/src/containers/pages/program/CreateProgramPage.tsx @@ -17,14 +17,10 @@ import { PartnersStep } from '@components/programs/CreateProgram/PartnersStep'; import { programValidationSchema } from '@components/programs/CreateProgram/programValidationSchema'; import { useBaseUrl } from '@hooks/useBaseUrl'; import { useSnackbar } from '@hooks/useSnackBar'; -import { - hasPermissionInModule, - PERMISSIONS, -} from '../../../config/permissions'; +import { hasPermissionInModule } from '../../../config/permissions'; import { usePermissions } from '@hooks/usePermissions'; import { BreadCrumbsItem } from '@components/core/BreadCrumbs'; import { useNavigate } from 'react-router-dom'; -import { decodeIdString } from '@utils/utils'; export const CreateProgramPage = (): ReactElement => { const navigate = useNavigate(); diff --git a/frontend/src/containers/pages/program/DuplicateProgramPage.tsx b/frontend/src/containers/pages/program/DuplicateProgramPage.tsx index a1ab3cbcd9..b7c62acc96 100644 --- a/frontend/src/containers/pages/program/DuplicateProgramPage.tsx +++ b/frontend/src/containers/pages/program/DuplicateProgramPage.tsx @@ -19,10 +19,7 @@ import { programValidationSchema } from '@components/programs/CreateProgram/prog import { useBaseUrl } from '@hooks/useBaseUrl'; import { useSnackbar } from '@hooks/useSnackBar'; import { BreadCrumbsItem } from '@components/core/BreadCrumbs'; -import { - hasPermissionInModule, - PERMISSIONS, -} from '../../../config/permissions'; +import { hasPermissionInModule } from '../../../config/permissions'; import { usePermissions } from '@hooks/usePermissions'; import { decodeIdString } from '@utils/utils'; @@ -53,8 +50,8 @@ export const DuplicateProgramPage = (): ReactElement => { : 0; const partnersToSet = values.partnerAccess === ProgramPartnerAccess.SelectedPartnersAccess - ? values.partners.map(({ id, areas, areaAccess }) => ({ - partner: id, + ? values.partners.map(({ id: partnerId, areas, areaAccess }) => ({ + partner: partnerId, areas: areaAccess === 'ADMIN_AREA' ? areas : [], areaAccess, })) diff --git a/frontend/src/containers/pages/program/EditProgramPage.tsx b/frontend/src/containers/pages/program/EditProgramPage.tsx index 255d021898..1222ddfe72 100644 --- a/frontend/src/containers/pages/program/EditProgramPage.tsx +++ b/frontend/src/containers/pages/program/EditProgramPage.tsx @@ -21,10 +21,7 @@ import { useBaseUrl } from '@hooks/useBaseUrl'; import { useSnackbar } from '@hooks/useSnackBar'; import { decodeIdString } from '@utils/utils'; import { BreadCrumbsItem } from '@components/core/BreadCrumbs'; -import { - hasPermissionInModule, - PERMISSIONS, -} from '../../../config/permissions'; +import { hasPermissionInModule } from '../../../config/permissions'; import { usePermissions } from '@hooks/usePermissions'; export const EditProgramPage = (): ReactElement => { @@ -98,8 +95,8 @@ export const EditProgramPage = (): ReactElement => { : 0; const partnersToSet = values.partnerAccess === ProgramPartnerAccess.SelectedPartnersAccess - ? values.partners.map(({ id, areas, areaAccess }) => ({ - partner: id, + ? values.partners.map(({ id: partnerId, areas, areaAccess }) => ({ + partner: partnerId, areas: areaAccess === 'ADMIN_AREA' ? areas : [], areaAccess, })) diff --git a/frontend/src/containers/tables/people/PeopleListTable/PeopleListTable.tsx b/frontend/src/containers/tables/people/PeopleListTable/PeopleListTable.tsx index 4a24d46fe4..076e2e015f 100644 --- a/frontend/src/containers/tables/people/PeopleListTable/PeopleListTable.tsx +++ b/frontend/src/containers/tables/people/PeopleListTable/PeopleListTable.tsx @@ -3,7 +3,6 @@ import { useTranslation } from 'react-i18next'; import { AllIndividualsForPopulationTableQueryVariables, AllIndividualsQueryVariables, - HouseholdChoiceDataQuery, IndividualNode, useAllIndividualsForPopulationTableQuery, } from '@generated/graphql'; @@ -18,15 +17,13 @@ interface PeopleListTableProps { filter; businessArea: string; canViewDetails: boolean; - choicesData: HouseholdChoiceDataQuery; } -export function PeopleListTable({ +export const PeopleListTable = ({ businessArea, filter, canViewDetails, - choicesData, -}: PeopleListTableProps): React.ReactElement { +}: PeopleListTableProps): React.ReactElement => { const { t } = useTranslation(); const { programId } = useBaseUrl(); const initialVariables: AllIndividualsForPopulationTableQueryVariables = { @@ -67,4 +64,4 @@ export function PeopleListTable({ /> </TableWrapper> ); -} +}; From 365512b262bcc7e02ca173c4196bae712e476907 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk <pv.pasha.pv@gmail.com> Date: Fri, 10 May 2024 23:29:36 +0200 Subject: [PATCH 24/38] upd transaction_status_blockchain --- backend/hct_mis_api/apps/core/currencies.py | 4 ++++ .../xlsx/xlsx_payment_plan_per_fsp_import_service.py | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/backend/hct_mis_api/apps/core/currencies.py b/backend/hct_mis_api/apps/core/currencies.py index 6b411553c7..3c2acc8e12 100644 --- a/backend/hct_mis_api/apps/core/currencies.py +++ b/backend/hct_mis_api/apps/core/currencies.py @@ -328,3 +328,7 @@ (ZWL, _("Zimbabwean dollar")), (USDC, _("Digital currency")), ) + +# TODO: add in future in case to have more 'digital currency' method for checking currency have a type/flag digital +# currency like is_digital_currency(currency: str) -> bool +# For now only USDC is digital currency diff --git a/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_per_fsp_import_service.py b/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_per_fsp_import_service.py index 5d98c25845..189229b46a 100644 --- a/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_per_fsp_import_service.py +++ b/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_per_fsp_import_service.py @@ -231,6 +231,7 @@ def import_payment_list(self) -> None: "additional_collector_name", "additional_document_type", "additional_document_number", + "transaction_status_blockchain", ), batch_size=500, ) @@ -305,6 +306,11 @@ def _import_row(self, row: Row, exchange_rate: float) -> None: else: additional_document_number = None + if "transaction_status_blockchain" in self.xlsx_headers: + transaction_status_blockchain = row[self.xlsx_headers.index("transaction_status_blockchain")].value + else: + transaction_status_blockchain = None + if isinstance(delivery_date, str): delivery_date = parse(delivery_date) @@ -328,6 +334,7 @@ def _import_row(self, row: Row, exchange_rate: float) -> None: or (additional_document_type != payment.additional_document_type) or (additional_document_number != payment.additional_document_number) or (reference_id != payment.transaction_reference_id) + or (transaction_status_blockchain != payment.transaction_status_blockchain) ): payment.delivered_quantity = delivered_quantity payment.delivered_quantity_usd = get_quantity_in_usd( @@ -348,6 +355,7 @@ def _import_row(self, row: Row, exchange_rate: float) -> None: payment.additional_document_type = additional_document_type payment.additional_document_number = additional_document_number payment.transaction_reference_id = reference_id + payment.transaction_status_blockchain = transaction_status_blockchain self.payments_to_save.append(payment) # update PaymentVerification status From c6b9224cc2d8c3e20fad7521953e5733304a3a4b Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk <pv.pasha.pv@gmail.com> Date: Fri, 10 May 2024 23:31:38 +0200 Subject: [PATCH 25/38] merge develop gitignore --- backend/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/.gitignore b/backend/.gitignore index 0e61d759a3..4038fbf07d 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -3,6 +3,7 @@ Makefile *.isorted test_times.txt screenshot +pytest_screenshots report archive output.json From 2ce961e0c48ff9f35e6825e4952c5949aa326342 Mon Sep 17 00:00:00 2001 From: Maciej Szewczyk <maciej.szewczyk@tivix.com> Date: Sat, 11 May 2024 08:42:16 +0200 Subject: [PATCH 26/38] fix currency display in utils --- frontend/src/utils/utils.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/src/utils/utils.ts b/frontend/src/utils/utils.ts index 2770354563..469277a943 100644 --- a/frontend/src/utils/utils.ts +++ b/frontend/src/utils/utils.ts @@ -500,6 +500,7 @@ export function formatCurrencyWithSymbol( currency = 'USD', ): string { const amountCleared = amount || 0; + if (currency === 'USDC') return `${amountCleared} ${currency}`; // if currency is unknown, simply format using most common formatting option, and don't show currency symbol if (!currency) return formatCurrency(amountCleared, true); // undefined forces to use local browser settings @@ -647,9 +648,9 @@ export const anon = (inputStr: string, shouldAnonymize: boolean): string => { if (!inputStr) return null; return shouldAnonymize ? inputStr - .split(' ') - .map((el) => el.substring(0, 2) + '*'.repeat(3)) - .join(' ') + .split(' ') + .map((el) => el.substring(0, 2) + '*'.repeat(3)) + .join(' ') : inputStr; }; From 2b143c1a396b0431199b09df6a03db6b559a729e Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk <pv.pasha.pv@gmail.com> Date: Sat, 11 May 2024 12:38:37 +0200 Subject: [PATCH 27/38] add more test & cleanup --- .../test_file/import_file_reference_id.xlsx | Bin 6341 -> 6412 bytes .../test_file/pp_payment_list_invalid.xlsx | Bin 6641 -> 6560 bytes .../pp_payment_list_unexpected_column.xlsx | Bin 6729 -> 6665 bytes .../test_file/pp_payment_list_valid.xlsx | Bin 6703 -> 6623 bytes ...import_export_payment_plan_payment_list.py | 4 +-- .../tests/test_update_reconciliation_data.py | 30 ++++++++++++++++++ .../xlsx/xlsx_payment_plan_base_service.py | 1 - .../xlsx/xlsx_payment_plan_import_service.py | 5 +-- 8 files changed, 32 insertions(+), 8 deletions(-) diff --git a/backend/hct_mis_api/apps/payment/tests/test_file/import_file_reference_id.xlsx b/backend/hct_mis_api/apps/payment/tests/test_file/import_file_reference_id.xlsx index b876c10e16567b9a4618bd148716c3f47935689f..a9eaa7377a58c3992135249c1fc1887bf567d0ed 100644 GIT binary patch delta 3341 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 Rl#MJKoemYC_G0;M`4_jjFpK~I delta 3277 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 diff --git a/backend/hct_mis_api/apps/payment/tests/test_file/pp_payment_list_invalid.xlsx b/backend/hct_mis_api/apps/payment/tests/test_file/pp_payment_list_invalid.xlsx index b6fbe6abb200c6d6f6bcd8b43a5939f83eaf4bcd..ca2b77c08c9de2b956ecd74687ce34eb57d7820e 100644 GIT binary patch delta 1703 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 X2dX7r-iK-dk5f5NLuomU@5lcG!kQLh delta 1808 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 HgUf#aiPJ9v diff --git a/backend/hct_mis_api/apps/payment/tests/test_file/pp_payment_list_unexpected_column.xlsx b/backend/hct_mis_api/apps/payment/tests/test_file/pp_payment_list_unexpected_column.xlsx index 365fc2ea34f7dfc386d417a6db5287f11a457f54..b7bdda9aa56b46e218b7d6b19a123bc51d92547b 100644 GIT binary patch delta 1853 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 delta 1917 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 D{rYpS diff --git a/backend/hct_mis_api/apps/payment/tests/test_file/pp_payment_list_valid.xlsx b/backend/hct_mis_api/apps/payment/tests/test_file/pp_payment_list_valid.xlsx index cd04fb11deeb49cfa8e6a0f7b1edc4f7b888d281..3aa1c185528fee5e7187d8ef15fb6107b0363a45 100644 GIT binary patch delta 1788 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 delta 1869 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 N3?4>PoQ3*!`CoB9TY>-p diff --git a/backend/hct_mis_api/apps/payment/tests/test_import_export_payment_plan_payment_list.py b/backend/hct_mis_api/apps/payment/tests/test_import_export_payment_plan_payment_list.py index e1d0886399..51e3455fb4 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_import_export_payment_plan_payment_list.py +++ b/backend/hct_mis_api/apps/payment/tests/test_import_export_payment_plan_payment_list.py @@ -132,7 +132,7 @@ def test_import_invalid_file(self) -> None: self.assertEqual(service.errors, error_msg) def test_import_invalid_file_with_unexpected_column(self) -> None: - error_msg = XlsxError(sheet="Payment Plan - Payment List", coordinates="M3", message="Unexpected value") + error_msg = XlsxError(sheet="Payment Plan - Payment List", coordinates="L3", message="Unexpected value") content = Path( f"{settings.PROJECT_ROOT}/apps/payment/tests/test_file/pp_payment_list_unexpected_column.xlsx" ).read_bytes() @@ -170,8 +170,6 @@ def test_import_valid_file(self, mock_parent_init: Any) -> None: self.assertEqual(to_decimal(wb.active["I2"].value), payment_1.entitlement_quantity) self.assertEqual(to_decimal(wb.active["I3"].value), payment_2.entitlement_quantity) - self.assertEqual("test_text_link_text_text", payment_1.transaction_status_blockchain) - self.assertEqual("test_text_link_test222", payment_2.transaction_status_blockchain) def test_export_payment_plan_payment_list(self) -> None: export_service = XlsxPaymentPlanExportService(self.payment_plan) diff --git a/backend/hct_mis_api/apps/payment/tests/test_update_reconciliation_data.py b/backend/hct_mis_api/apps/payment/tests/test_update_reconciliation_data.py index 69b469b17f..5af4db83ad 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_update_reconciliation_data.py +++ b/backend/hct_mis_api/apps/payment/tests/test_update_reconciliation_data.py @@ -207,3 +207,33 @@ def test_upload_reference_id(self, mock_exchange_rate: Any) -> None: self.assertEqual(payment_1.transaction_reference_id, "ref1") self.assertEqual(payment_2.transaction_reference_id, "ref2") + + def test_upload_transaction_status_blockchain(self) -> None: + pp = PaymentPlanFactory( + dispersion_start_date=datetime(2024, 2, 10).date(), + dispersion_end_date=datetime(2024, 12, 10).date(), + status=PaymentPlan.Status.ACCEPTED, + ) + + payment_1 = PaymentFactory(parent=pp) + payment_1.unicef_id = "RCPT-0060-24-0.000.665" + payment_1.entitlement_quantity = 212 # the same value like in file + payment_1.save() + + payment_2 = PaymentFactory(parent=pp) + payment_2.unicef_id = "RCPT-0060-24-0.000.666" + payment_2.entitlement_quantity = 212 # the same value like in file + payment_2.save() + + file_with_reference_id = file_reference_id() + + import_service = XlsxPaymentPlanImportPerFspService(pp, file_with_reference_id) + import_service.open_workbook() + import_service.validate() + import_service.import_payment_list() + + payment_1.refresh_from_db(fields=["transaction_status_blockchain"]) + payment_2.refresh_from_db(fields=["transaction_status_blockchain"]) + + self.assertEqual(payment_1.transaction_status_blockchain, "transaction_status_blockchain_link") + self.assertEqual(payment_2.transaction_status_blockchain, "www_link") diff --git a/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_base_service.py b/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_base_service.py index 36f558e9a6..dbb5491fb8 100644 --- a/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_base_service.py +++ b/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_base_service.py @@ -12,5 +12,4 @@ class XlsxPaymentPlanBaseService: "entitlement_quantity", "entitlement_quantity_usd", "status", - "transaction_status_blockchain", ) diff --git a/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_import_service.py b/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_import_service.py index 22e51956c3..d194057d3f 100644 --- a/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_import_service.py +++ b/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_import_service.py @@ -24,7 +24,7 @@ class XlsxPaymentPlanImportService(XlsxPaymentPlanBaseService, XlsxImportBaseService): - COLUMNS_TYPES = ("s", "s", "n", "s", "s", "s", "s", "s", "n", "n", "s", "s") + COLUMNS_TYPES = ("s", "s", "n", "s", "s", "s", "s", "s", "n", "n", "s") BATCH_SIZE = 1000 def __init__(self, payment_plan: PaymentPlan, file: io.BytesIO) -> None: @@ -71,7 +71,6 @@ def _save_payments(self, payments_to_save: List[Payment]) -> None: "entitlement_quantity", "entitlement_quantity_usd", "entitlement_date", - "transaction_status_blockchain", ), ) payments_ids = [payment.id for payment in payments_to_save] @@ -192,7 +191,6 @@ def _validate_rows(self) -> None: def _import_row(self, row: Row, exchange_rate: float) -> Optional[Payment]: payment_id = row[self.HEADERS.index("payment_id")].value entitlement_amount = row[self.HEADERS.index("entitlement_quantity")].value - transaction_status_blockchain = row[self.HEADERS.index("transaction_status_blockchain")].value payment = self.payments_dict.get(str(payment_id)) @@ -214,7 +212,6 @@ def _import_row(self, row: Row, exchange_rate: float) -> Optional[Payment]: entitlement_quantity=converted_entitlement_amount, entitlement_date=entitlement_date, entitlement_quantity_usd=entitlement_quantity_usd, - transaction_status_blockchain=transaction_status_blockchain, ) return None From 95de33a863d01726cc997989cd240ec01c4f2866 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk <pv.pasha.pv@gmail.com> Date: Sat, 11 May 2024 22:50:50 +0200 Subject: [PATCH 28/38] upd test --- .../apps/payment/tests/test_update_reconciliation_data.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/hct_mis_api/apps/payment/tests/test_update_reconciliation_data.py b/backend/hct_mis_api/apps/payment/tests/test_update_reconciliation_data.py index 5af4db83ad..657ec72f1e 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_update_reconciliation_data.py +++ b/backend/hct_mis_api/apps/payment/tests/test_update_reconciliation_data.py @@ -208,7 +208,8 @@ def test_upload_reference_id(self, mock_exchange_rate: Any) -> None: self.assertEqual(payment_1.transaction_reference_id, "ref1") self.assertEqual(payment_2.transaction_reference_id, "ref2") - def test_upload_transaction_status_blockchain(self) -> None: + @patch("hct_mis_api.apps.payment.models.PaymentPlan.get_exchange_rate", return_value=1.0) + def test_upload_transaction_status_blockchain(self, mock_exchange_rate: Any) -> None: pp = PaymentPlanFactory( dispersion_start_date=datetime(2024, 2, 10).date(), dispersion_end_date=datetime(2024, 12, 10).date(), From d70710afe68cc68abdcdec68948e198267c15ebd Mon Sep 17 00:00:00 2001 From: Domenico <dom.dinicola@gmail.com> Date: Mon, 13 May 2024 11:17:09 +0200 Subject: [PATCH 29/38] tweaks (#3856) --- .../hct_mis_api/apps/payment/services/payment_gateway.py | 8 ++++---- backend/hct_mis_api/config/env.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/hct_mis_api/apps/payment/services/payment_gateway.py b/backend/hct_mis_api/apps/payment/services/payment_gateway.py index 155daf63f1..8551c5683d 100644 --- a/backend/hct_mis_api/apps/payment/services/payment_gateway.py +++ b/backend/hct_mis_api/apps/payment/services/payment_gateway.py @@ -117,7 +117,7 @@ def get_payload(self, obj: Payment) -> Dict: destination_currency: str # "USD" """ return { - "amount": int(obj.entitlement_quantity * 100), + "amount": obj.entitlement_quantity, "phone_no": str(obj.collector.phone_no), "last_name": obj.collector.family_name, "first_name": obj.collector.given_name, @@ -145,7 +145,8 @@ class PaymentRecordData(FlexibleArgumentsDataclassMixin): parent: str status: str hope_status: str - extra_data: dict + auth_code: str + payout_amount: float fsp_code: str message: Optional[str] = None @@ -391,7 +392,7 @@ def update_payment( _payment.reason_for_unsuccessful_payment = matching_pg_payment.message update_fields.append("reason_for_unsuccessful_payment") - delivered_quantity = matching_pg_payment.extra_data.get("delivered_quantity", None) + delivered_quantity = matching_pg_payment.payout_amount if _payment.status in [ Payment.STATUS_SUCCESS, Payment.STATUS_DISTRIBUTION_SUCCESS, @@ -399,7 +400,6 @@ def update_payment( ]: update_fields.extend(["delivered_quantity", "delivered_quantity_usd"]) try: - delivered_quantity = int(delivered_quantity) / 100 _payment.delivered_quantity = delivered_quantity _payment.delivered_quantity_usd = get_quantity_in_usd( amount=Decimal(delivered_quantity), diff --git a/backend/hct_mis_api/config/env.py b/backend/hct_mis_api/config/env.py index aef3ca842b..4c291e862c 100644 --- a/backend/hct_mis_api/config/env.py +++ b/backend/hct_mis_api/config/env.py @@ -102,7 +102,7 @@ ), "MATOMO_TRACKER_URL": ( str, - "", + "https://unisitetracker.unicef.io/", ), "MATOMO_SCRIPT_URL": ( str, From 14baed786b9d2149265598dd1a0d8af7893951e6 Mon Sep 17 00:00:00 2001 From: Jan Romaniak <jan.romaniak@kellton.com> Date: Mon, 13 May 2024 11:58:33 +0200 Subject: [PATCH 30/38] fix filtering by rdi --- .../apps/core/field_attributes/core_fields_attributes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py b/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py index a962eea72b..7e9bb652cf 100644 --- a/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py +++ b/backend/hct_mis_api/apps/core/field_attributes/core_fields_attributes.py @@ -1602,7 +1602,7 @@ "choices": [], "associated_with": _HOUSEHOLD, "xlsx_field": "registration_data_import", - "scope": [Scope.TARGETING], + "scope": [Scope.TARGETING, Scope.XLSX_PEOPLE], }, { "id": "e4aa9cdf-2c9e-4e22-9928-2b63a6ea4ef0", From b4cd90f145acf9870c861d3106a5df115edd8dbe Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk <pv.pasha.pv@gmail.com> Date: Tue, 14 May 2024 14:34:39 +0200 Subject: [PATCH 31/38] add people unicef_id --- .../field_attributes/people_fields_attributes.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py b/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py index 721c5f21d6..459408e3bd 100644 --- a/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py +++ b/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py @@ -87,6 +87,19 @@ "xlsx_field": "pp_index_id", "scope": [Scope.XLSX_PEOPLE], }, + { + "id": "606d526b-b077-4e64-9350-72e3a869773d", + "type": TYPE_STRING, + "name": "unicef_id", + "lookup": "unicef_id", + "required": False, + "label": {"English(EN)": "Individual unicef id"}, + "hint": "", + "choices": [], + "associated_with": _INDIVIDUAL, + "xlsx_field": "pp_unicef_id_i_c", + "scope": [Scope.XLSX_PEOPLE], + }, { "id": "4a054660-ca29-4ccc-9223-3a0ed64c0488", "type": TYPE_STRING, From eaaad1675a2f0e4185f7f70d11249ff567ba9000 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk <pv.pasha.pv@gmail.com> Date: Tue, 14 May 2024 15:30:49 +0200 Subject: [PATCH 32/38] people export core fields fsp --- .../field_attributes/people_fields_attributes.py | 13 ------------- backend/hct_mis_api/apps/payment/models.py | 6 +++++- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py b/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py index 459408e3bd..721c5f21d6 100644 --- a/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py +++ b/backend/hct_mis_api/apps/core/field_attributes/people_fields_attributes.py @@ -87,19 +87,6 @@ "xlsx_field": "pp_index_id", "scope": [Scope.XLSX_PEOPLE], }, - { - "id": "606d526b-b077-4e64-9350-72e3a869773d", - "type": TYPE_STRING, - "name": "unicef_id", - "lookup": "unicef_id", - "required": False, - "label": {"English(EN)": "Individual unicef id"}, - "hint": "", - "choices": [], - "associated_with": _INDIVIDUAL, - "xlsx_field": "pp_unicef_id_i_c", - "scope": [Scope.XLSX_PEOPLE], - }, { "id": "4a054660-ca29-4ccc-9223-3a0ed64c0488", "type": TYPE_STRING, diff --git a/backend/hct_mis_api/apps/payment/models.py b/backend/hct_mis_api/apps/payment/models.py index 654b829eb9..d78309eddd 100644 --- a/backend/hct_mis_api/apps/payment/models.py +++ b/backend/hct_mis_api/apps/payment/models.py @@ -1153,7 +1153,11 @@ def parse_admin_area(obj: "Area") -> str: core_fields_attributes = FieldFactory.from_scope(Scope.XLSX_PEOPLE).to_dict_by("name") else: core_fields_attributes = FieldFactory.not_from_scope(Scope.XLSX_PEOPLE).to_dict_by("name") - attr = core_fields_attributes[core_field_name] + attr = core_fields_attributes.get(core_field_name) + if not attr: + # Some fields can be added to the template, such as 'size' or 'collect_individual_data' + # which are not applicable to "People" export. + return None lookup = attr["lookup"] lookup = lookup.replace("__", ".") if attr["associated_with"] == _INDIVIDUAL: From 69c8b320ce70833e8b8be1f6535cd99f1e44fb86 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk <pv.pasha.pv@gmail.com> Date: Tue, 14 May 2024 16:21:39 +0200 Subject: [PATCH 33/38] add test --- backend/hct_mis_api/apps/payment/tests/test_models.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/backend/hct_mis_api/apps/payment/tests/test_models.py b/backend/hct_mis_api/apps/payment/tests/test_models.py index 038c5222dd..ea05945c10 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_models.py +++ b/backend/hct_mis_api/apps/payment/tests/test_models.py @@ -21,6 +21,7 @@ ) from hct_mis_api.apps.payment.models import ( FinancialServiceProvider, + FinancialServiceProviderXlsxTemplate, Payment, PaymentPlan, PaymentPlanSplit, @@ -323,3 +324,12 @@ def test_properties(self) -> None: self.assertEqual(fsp1.configurations, []) self.assertEqual(fsp2.configurations, []) + + def test_fsp_template_get_column_from_core_field(self) -> None: + payment = PaymentFactory() + fsp_xlsx_template = FinancialServiceProviderXlsxTemplate + result = fsp_xlsx_template.get_column_from_core_field(payment, "invalid_people_field_name", True) + self.assertIsNone(result) + + result = fsp_xlsx_template.get_column_from_core_field(payment, "size", False) + self.assertIsNone(result) From 292e60bd448a230d5b9dcbcd7e18a8d9b476f833 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk <pv.pasha.pv@gmail.com> Date: Tue, 14 May 2024 16:46:13 +0200 Subject: [PATCH 34/38] fix test --- backend/hct_mis_api/apps/payment/tests/test_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/hct_mis_api/apps/payment/tests/test_models.py b/backend/hct_mis_api/apps/payment/tests/test_models.py index ea05945c10..0ef8e322e5 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_models.py +++ b/backend/hct_mis_api/apps/payment/tests/test_models.py @@ -332,4 +332,4 @@ def test_fsp_template_get_column_from_core_field(self) -> None: self.assertIsNone(result) result = fsp_xlsx_template.get_column_from_core_field(payment, "size", False) - self.assertIsNone(result) + self.assertIsNotNone(result) From 5beb807c1791f00a5b30e97f83d6aadf81eadd99 Mon Sep 17 00:00:00 2001 From: Paulina Kujawa <42150286+pkujawa@users.noreply.github.com> Date: Tue, 14 May 2024 17:15:59 +0200 Subject: [PATCH 35/38] [200749] Add email sender settings (#3865) --- .env.example | 7 +++++++ .../tests/test_individual_iban_xlsx_update.py | 2 +- .../tests/test_generate_dashboard_report_service.py | 2 +- .../tests/test_check_against_sanction_list_task.py | 2 +- backend/hct_mis_api/apps/utils/mailjet.py | 4 ++-- backend/hct_mis_api/config/fragments/mailjet.py | 2 ++ backend/hct_mis_api/conftest.py | 1 + backend/tests/apps/utils/test_mailjet.py | 10 +++++----- 8 files changed, 20 insertions(+), 10 deletions(-) diff --git a/.env.example b/.env.example index 27f13aa2c0..9537ecc450 100644 --- a/.env.example +++ b/.env.example @@ -20,6 +20,13 @@ EMAIL_BACKEND="django.core.mail.backends.console.EmailBackend" EMAIL_HOST=TBD EMAIL_HOST_USER=TBD EMAIL_HOST_PASSWORD=TBD + +MAILJET_API_KEY= +MAILJET_SECRET_KEY= +CATCH_ALL_EMAIL= +DEFAULT_EMAIL_DISPLAY= +DEFAULT_EMAIL= + MAP_BOX_KEY=MAP_BOX_KEY_HERE DJANGO_ALLOWED_HOST=127.0.0.1 # Optional, defaults to localhost HCT_MIS_FRONTEND_HOST=127.0.0.1:8080 # Optional, defaults to DJANGO_ALLOWED_HOST diff --git a/backend/hct_mis_api/apps/household/tests/test_individual_iban_xlsx_update.py b/backend/hct_mis_api/apps/household/tests/test_individual_iban_xlsx_update.py index c1838c0742..6febb26826 100644 --- a/backend/hct_mis_api/apps/household/tests/test_individual_iban_xlsx_update.py +++ b/backend/hct_mis_api/apps/household/tests/test_individual_iban_xlsx_update.py @@ -265,7 +265,7 @@ def _get_expected_email_body(self, context: dict) -> str: { "Messages": [ { - "From": {"Email": settings.EMAIL_HOST_USER, "Name": settings.DEFAULT_FROM_EMAIL}, + "From": {"Email": settings.DEFAULT_EMAIL, "Name": settings.DEFAULT_EMAIL_DISPLAY}, "Subject": f"[test] Individual IBANs xlsx [{context['upload_file_id']}] update result", "To": [ { diff --git a/backend/hct_mis_api/apps/reporting/tests/test_generate_dashboard_report_service.py b/backend/hct_mis_api/apps/reporting/tests/test_generate_dashboard_report_service.py index a8653ad39e..eb965b3f9f 100644 --- a/backend/hct_mis_api/apps/reporting/tests/test_generate_dashboard_report_service.py +++ b/backend/hct_mis_api/apps/reporting/tests/test_generate_dashboard_report_service.py @@ -90,7 +90,7 @@ def test_email_body_for_generate_report(self, mocked_requests_post: Any) -> None { "Messages": [ { - "From": {"Email": settings.EMAIL_HOST_USER, "Name": settings.DEFAULT_FROM_EMAIL}, + "From": {"Email": settings.DEFAULT_EMAIL, "Name": settings.DEFAULT_EMAIL_DISPLAY}, "Subject": "[test] HOPE report generated", "To": [ { diff --git a/backend/hct_mis_api/apps/sanction_list/tests/test_check_against_sanction_list_task.py b/backend/hct_mis_api/apps/sanction_list/tests/test_check_against_sanction_list_task.py index 5b92315aa9..627dd5e360 100644 --- a/backend/hct_mis_api/apps/sanction_list/tests/test_check_against_sanction_list_task.py +++ b/backend/hct_mis_api/apps/sanction_list/tests/test_check_against_sanction_list_task.py @@ -86,7 +86,7 @@ def __getitem__(self, key: int) -> list: { "Messages": [ { - "From": {"Email": settings.EMAIL_HOST_USER, "Name": settings.DEFAULT_FROM_EMAIL}, + "From": {"Email": settings.DEFAULT_EMAIL, "Name": settings.DEFAULT_EMAIL_DISPLAY}, "Subject": f"[test] {subject}", "To": [{"Email": "test_email@email.com"}], "Cc": [{"Email": settings.SANCTION_LIST_CC_MAIL}], diff --git a/backend/hct_mis_api/apps/utils/mailjet.py b/backend/hct_mis_api/apps/utils/mailjet.py index 8733848631..78ce602381 100644 --- a/backend/hct_mis_api/apps/utils/mailjet.py +++ b/backend/hct_mis_api/apps/utils/mailjet.py @@ -32,8 +32,8 @@ def __init__( self.recipients = settings.CATCH_ALL_EMAIL if settings.CATCH_ALL_EMAIL else recipients self.ccs = ccs or [] self.variables = variables - self.from_email = from_email or settings.EMAIL_HOST_USER - self.from_email_display = from_email_display or settings.DEFAULT_FROM_EMAIL + self.from_email = from_email or settings.DEFAULT_EMAIL + self.from_email_display = from_email_display or settings.DEFAULT_EMAIL_DISPLAY self.attachments = [] def _validate_email_data(self) -> None: diff --git a/backend/hct_mis_api/config/fragments/mailjet.py b/backend/hct_mis_api/config/fragments/mailjet.py index 612e87bc6c..a70c6b2fa3 100644 --- a/backend/hct_mis_api/config/fragments/mailjet.py +++ b/backend/hct_mis_api/config/fragments/mailjet.py @@ -3,3 +3,5 @@ MAILJET_API_KEY = env("MAILJET_API_KEY") MAILJET_SECRET_KEY = env("MAILJET_SECRET_KEY") CATCH_ALL_EMAIL = env.list("CATCH_ALL_EMAIL", default=[]) +DEFAULT_EMAIL_DISPLAY = env("DEFAULT_EMAIL_DISPLAY", default="") +DEFAULT_EMAIL = env("DEFAULT_EMAIL", default="") diff --git a/backend/hct_mis_api/conftest.py b/backend/hct_mis_api/conftest.py index 761e1a1d3c..a6bcf0aff6 100644 --- a/backend/hct_mis_api/conftest.py +++ b/backend/hct_mis_api/conftest.py @@ -33,6 +33,7 @@ def pytest_configure(config: Config) -> None: settings.ELASTICSEARCH_INDEX_PREFIX = "test_" settings.EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" settings.CATCH_ALL_EMAIL = [] + settings.DEFAULT_EMAIL = "testemail@email.com" settings.EXCHANGE_RATE_CACHE_EXPIRY = 0 settings.USE_DUMMY_EXCHANGE_RATES = True diff --git a/backend/tests/apps/utils/test_mailjet.py b/backend/tests/apps/utils/test_mailjet.py index ec7af49ff9..c613fc0acf 100644 --- a/backend/tests/apps/utils/test_mailjet.py +++ b/backend/tests/apps/utils/test_mailjet.py @@ -33,7 +33,7 @@ def test_mailjet_body_with_template(self, mocked_requests_post: Any) -> None: { "Messages": [ { - "From": {"Email": settings.EMAIL_HOST_USER, "Name": settings.DEFAULT_FROM_EMAIL}, + "From": {"Email": settings.DEFAULT_EMAIL, "Name": settings.DEFAULT_EMAIL_DISPLAY}, "Subject": "[test] Subject for email with Template", "To": [ { @@ -81,7 +81,7 @@ def test_mailjet_body_with_template_with_catch_all(self, mocked_requests_post: A { "Messages": [ { - "From": {"Email": settings.EMAIL_HOST_USER, "Name": settings.DEFAULT_FROM_EMAIL}, + "From": {"Email": settings.DEFAULT_EMAIL, "Name": settings.DEFAULT_EMAIL_DISPLAY}, "Subject": "[test] Subject for email with Template for Catch All", "To": [ { @@ -127,7 +127,7 @@ def test_mailjet_body_with_html_and_text_body(self, mocked_requests_post: Any) - { "Messages": [ { - "From": {"Email": settings.EMAIL_HOST_USER, "Name": settings.DEFAULT_FROM_EMAIL}, + "From": {"Email": settings.DEFAULT_EMAIL, "Name": settings.DEFAULT_EMAIL_DISPLAY}, "Subject": "[test] Subject for email with HTML and Text body", "To": [ { @@ -171,7 +171,7 @@ def test_mailjet_body_with_text_body(self, mocked_requests_post: Any) -> None: { "Messages": [ { - "From": {"Email": settings.EMAIL_HOST_USER, "Name": settings.DEFAULT_FROM_EMAIL}, + "From": {"Email": settings.DEFAULT_EMAIL, "Name": settings.DEFAULT_EMAIL_DISPLAY}, "Subject": "[test] Subject for email with Text body", "To": [ { @@ -238,7 +238,7 @@ def test_mailjet_body_with_template_and_attachment(self, mocked_requests_post: A { "Messages": [ { - "From": {"Email": settings.EMAIL_HOST_USER, "Name": settings.DEFAULT_FROM_EMAIL}, + "From": {"Email": settings.DEFAULT_EMAIL, "Name": settings.DEFAULT_EMAIL_DISPLAY}, "Subject": "[test] Subject for email with Template and Attachments", "To": [ { From 72b496a66d257ce9c415a11f3af95c4efe07ed95 Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk <pv.pasha.pv@gmail.com> Date: Thu, 16 May 2024 08:48:40 +0200 Subject: [PATCH 36/38] review --- backend/hct_mis_api/apps/core/currencies.py | 2 +- .../snap_test_all_fields_attributes_query.py | 4 +-- .../household/migrations/0175_migration.py | 2 +- .../apps/payment/migrations/0128_migration.py | 8 +++--- backend/hct_mis_api/apps/payment/models.py | 6 ++-- backend/hct_mis_api/apps/payment/mutations.py | 7 +++++ .../test_file/import_file_reference_id.xlsx | Bin 6412 -> 6415 bytes .../payment/tests/test_fsp_in_payment_plan.py | 27 ++++++++++++++++++ .../tests/test_update_reconciliation_data.py | 10 +++---- ...lsx_payment_plan_per_fsp_import_service.py | 14 +++++---- .../migrations/0112_migration.py | 2 +- frontend/data/schema.graphql | 4 +-- frontend/src/__generated__/graphql.tsx | 8 +++--- 13 files changed, 65 insertions(+), 29 deletions(-) diff --git a/backend/hct_mis_api/apps/core/currencies.py b/backend/hct_mis_api/apps/core/currencies.py index 3c2acc8e12..dba950b2db 100644 --- a/backend/hct_mis_api/apps/core/currencies.py +++ b/backend/hct_mis_api/apps/core/currencies.py @@ -326,7 +326,7 @@ (ZAR, _("South African rand")), (ZMW, _("Zambian kwacha")), (ZWL, _("Zimbabwean dollar")), - (USDC, _("Digital currency")), + (USDC, _("USD Coin")), ) # TODO: add in future in case to have more 'digital currency' method for checking currency have a type/flag digital diff --git a/backend/hct_mis_api/apps/core/tests/snapshots/snap_test_all_fields_attributes_query.py b/backend/hct_mis_api/apps/core/tests/snapshots/snap_test_all_fields_attributes_query.py index 508ed19481..90e99e29ef 100644 --- a/backend/hct_mis_api/apps/core/tests/snapshots/snap_test_all_fields_attributes_query.py +++ b/backend/hct_mis_api/apps/core/tests/snapshots/snap_test_all_fields_attributes_query.py @@ -52323,10 +52323,10 @@ 'value': 'DKK' }, { - 'labelEn': 'Digital currency', + 'labelEn': 'USD Coin', 'labels': [ { - 'label': 'Digital currency', + 'label': 'USD Coin', 'language': 'English(EN)' } ], diff --git a/backend/hct_mis_api/apps/household/migrations/0175_migration.py b/backend/hct_mis_api/apps/household/migrations/0175_migration.py index 8b6591828f..2418deb3d2 100644 --- a/backend/hct_mis_api/apps/household/migrations/0175_migration.py +++ b/backend/hct_mis_api/apps/household/migrations/0175_migration.py @@ -28,6 +28,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='household', name='currency', - field=models.CharField(choices=[('', 'None'), ('AED', 'United Arab Emirates dirham'), ('AFN', 'Afghan afghani'), ('ALL', 'Albanian lek'), ('AMD', 'Armenian dram'), ('ANG', 'Netherlands Antillean guilder'), ('AOA', 'Angolan kwanza'), ('ARS', 'Argentine peso'), ('AUD', 'Australian dollar'), ('AWG', 'Aruban florin'), ('AZN', 'Azerbaijani manat'), ('BAM', 'Bosnia and Herzegovina convertible mark'), ('BBD', 'Barbados dollar'), ('BDT', 'Bangladeshi taka'), ('BGN', 'Bulgarian lev'), ('BHD', 'Bahraini dinar'), ('BIF', 'Burundian franc'), ('BMD', 'Bermudian dollar'), ('BND', 'Brunei dollar'), ('BOB', 'Boliviano'), ('BOV', 'Bolivian Mvdol (funds code)'), ('BRL', 'Brazilian real'), ('BSD', 'Bahamian dollar'), ('BTN', 'Bhutanese ngultrum'), ('BWP', 'Botswana pula'), ('BYN', 'Belarusian ruble'), ('BZD', 'Belize dollar'), ('CAD', 'Canadian dollar'), ('CDF', 'Congolese franc'), ('CHF', 'Swiss franc'), ('CLP', 'Chilean peso'), ('CNY', 'Chinese yuan'), ('COP', 'Colombian peso'), ('CRC', 'Costa Rican colon'), ('CUC', 'Cuban convertible peso'), ('CUP', 'Cuban peso'), ('CVE', 'Cape Verdean escudo'), ('CZK', 'Czech koruna'), ('DJF', 'Djiboutian franc'), ('DKK', 'Danish krone'), ('DOP', 'Dominican peso'), ('DZD', 'Algerian dinar'), ('EGP', 'Egyptian pound'), ('ERN', 'Eritrean nakfa'), ('ETB', 'Ethiopian birr'), ('EUR', 'Euro'), ('FJD', 'Fiji dollar'), ('FKP', 'Falkland Islands pound'), ('GBP', 'Pound sterling'), ('GEL', 'Georgian lari'), ('GHS', 'Ghanaian cedi'), ('GIP', 'Gibraltar pound'), ('GMD', 'Gambian dalasi'), ('GNF', 'Guinean franc'), ('GTQ', 'Guatemalan quetzal'), ('GYD', 'Guyanese dollar'), ('HKD', 'Hong Kong dollar'), ('HNL', 'Honduran lempira'), ('HRK', 'Croatian kuna'), ('HTG', 'Haitian gourde'), ('HUF', 'Hungarian forint'), ('IDR', 'Indonesian rupiah'), ('ILS', 'Israeli new shekel'), ('INR', 'Indian rupee'), ('IQD', 'Iraqi dinar'), ('IRR', 'Iranian rial'), ('ISK', 'Icelandic króna'), ('JMD', 'Jamaican dollar'), ('JOD', 'Jordanian dinar'), ('JPY', 'Japanese yen'), ('KES', 'Kenyan shilling'), ('KGS', 'Kyrgyzstani som'), ('KHR', 'Cambodian riel'), ('KMF', 'Comoro franc'), ('KPW', 'North Korean won'), ('KRW', 'South Korean won'), ('KWD', 'Kuwaiti dinar'), ('KYD', 'Cayman Islands dollar'), ('KZT', 'Kazakhstani tenge'), ('LAK', 'Lao kip'), ('LBP', 'Lebanese pound'), ('LKR', 'Sri Lankan rupee'), ('LRD', 'Liberian dollar'), ('LSL', 'Lesotho loti'), ('LYD', 'Libyan dinar'), ('MAD', 'Moroccan dirham'), ('MDL', 'Moldovan leu'), ('MGA', 'Malagasy ariary'), ('MKD', 'Macedonian denar'), ('MMK', 'Myanmar kyat'), ('MNT', 'Mongolian tögrög'), ('MOP', 'Macanese pataca'), ('MRU', 'Mauritanian ouguiya'), ('MUR', 'Mauritian rupee'), ('MVR', 'Maldivian rufiyaa'), ('MWK', 'Malawian kwacha'), ('MXN', 'Mexican peso'), ('MYR', 'Malaysian ringgit'), ('MZN', 'Mozambican metical'), ('NAD', 'Namibian dollar'), ('NGN', 'Nigerian naira'), ('NIO', 'Nicaraguan córdoba'), ('NOK', 'Norwegian krone'), ('NPR', 'Nepalese rupee'), ('NZD', 'New Zealand dollar'), ('OMR', 'Omani rial'), ('PAB', 'Panamanian balboa'), ('PEN', 'Peruvian sol'), ('PGK', 'Papua New Guinean kina'), ('PHP', 'Philippine peso'), ('PKR', 'Pakistani rupee'), ('PLN', 'Polish złoty'), ('PYG', 'Paraguayan guaraní'), ('QAR', 'Qatari riyal'), ('RON', 'Romanian leu'), ('RSD', 'Serbian dinar'), ('RUB', 'Russian ruble'), ('RWF', 'Rwandan franc'), ('SAR', 'Saudi riyal'), ('SBD', 'Solomon Islands dollar'), ('SCR', 'Seychelles rupee'), ('SDG', 'Sudanese pound'), ('SEK', 'Swedish krona/kronor'), ('SGD', 'Singapore dollar'), ('SHP', 'Saint Helena pound'), ('SLL', 'Sierra Leonean leone'), ('SOS', 'Somali shilling'), ('SRD', 'Surinamese dollar'), ('SSP', 'South Sudanese pound'), ('STN', 'São Tomé and Príncipe dobra'), ('SVC', 'Salvadoran colón'), ('SYP', 'Syrian pound'), ('SZL', 'Swazi lilangeni'), ('THB', 'Thai baht'), ('TJS', 'Tajikistani somoni'), ('TMT', 'Turkmenistan manat'), ('TND', 'Tunisian dinar'), ('TOP', 'Tongan paʻanga'), ('TRY', 'Turkish lira'), ('TTD', 'Trinidad and Tobago dollar'), ('TWD', 'New Taiwan dollar'), ('TZS', 'Tanzanian shilling'), ('UAH', 'Ukrainian hryvnia'), ('UGX', 'Ugandan shilling'), ('USD', 'United States dollar'), ('UYU', 'Uruguayan peso'), ('UYW', 'Unidad previsional[14]'), ('UZS', 'Uzbekistan som'), ('VES', 'Venezuelan bolívar soberano'), ('VND', 'Vietnamese đồng'), ('VUV', 'Vanuatu vatu'), ('WST', 'Samoan tala'), ('XAF', 'CFA franc BEAC'), ('XAG', 'Silver (one troy ounce)'), ('XAU', 'Gold (one troy ounce)'), ('XCD', 'East Caribbean dollar'), ('XOF', 'CFA franc BCEAO'), ('XPF', 'CFP franc (franc Pacifique)'), ('YER', 'Yemeni rial'), ('ZAR', 'South African rand'), ('ZMW', 'Zambian kwacha'), ('ZWL', 'Zimbabwean dollar'), ('USDC', 'Digital currency')], default='', max_length=250), + field=models.CharField(choices=[('', 'None'), ('AED', 'United Arab Emirates dirham'), ('AFN', 'Afghan afghani'), ('ALL', 'Albanian lek'), ('AMD', 'Armenian dram'), ('ANG', 'Netherlands Antillean guilder'), ('AOA', 'Angolan kwanza'), ('ARS', 'Argentine peso'), ('AUD', 'Australian dollar'), ('AWG', 'Aruban florin'), ('AZN', 'Azerbaijani manat'), ('BAM', 'Bosnia and Herzegovina convertible mark'), ('BBD', 'Barbados dollar'), ('BDT', 'Bangladeshi taka'), ('BGN', 'Bulgarian lev'), ('BHD', 'Bahraini dinar'), ('BIF', 'Burundian franc'), ('BMD', 'Bermudian dollar'), ('BND', 'Brunei dollar'), ('BOB', 'Boliviano'), ('BOV', 'Bolivian Mvdol (funds code)'), ('BRL', 'Brazilian real'), ('BSD', 'Bahamian dollar'), ('BTN', 'Bhutanese ngultrum'), ('BWP', 'Botswana pula'), ('BYN', 'Belarusian ruble'), ('BZD', 'Belize dollar'), ('CAD', 'Canadian dollar'), ('CDF', 'Congolese franc'), ('CHF', 'Swiss franc'), ('CLP', 'Chilean peso'), ('CNY', 'Chinese yuan'), ('COP', 'Colombian peso'), ('CRC', 'Costa Rican colon'), ('CUC', 'Cuban convertible peso'), ('CUP', 'Cuban peso'), ('CVE', 'Cape Verdean escudo'), ('CZK', 'Czech koruna'), ('DJF', 'Djiboutian franc'), ('DKK', 'Danish krone'), ('DOP', 'Dominican peso'), ('DZD', 'Algerian dinar'), ('EGP', 'Egyptian pound'), ('ERN', 'Eritrean nakfa'), ('ETB', 'Ethiopian birr'), ('EUR', 'Euro'), ('FJD', 'Fiji dollar'), ('FKP', 'Falkland Islands pound'), ('GBP', 'Pound sterling'), ('GEL', 'Georgian lari'), ('GHS', 'Ghanaian cedi'), ('GIP', 'Gibraltar pound'), ('GMD', 'Gambian dalasi'), ('GNF', 'Guinean franc'), ('GTQ', 'Guatemalan quetzal'), ('GYD', 'Guyanese dollar'), ('HKD', 'Hong Kong dollar'), ('HNL', 'Honduran lempira'), ('HRK', 'Croatian kuna'), ('HTG', 'Haitian gourde'), ('HUF', 'Hungarian forint'), ('IDR', 'Indonesian rupiah'), ('ILS', 'Israeli new shekel'), ('INR', 'Indian rupee'), ('IQD', 'Iraqi dinar'), ('IRR', 'Iranian rial'), ('ISK', 'Icelandic króna'), ('JMD', 'Jamaican dollar'), ('JOD', 'Jordanian dinar'), ('JPY', 'Japanese yen'), ('KES', 'Kenyan shilling'), ('KGS', 'Kyrgyzstani som'), ('KHR', 'Cambodian riel'), ('KMF', 'Comoro franc'), ('KPW', 'North Korean won'), ('KRW', 'South Korean won'), ('KWD', 'Kuwaiti dinar'), ('KYD', 'Cayman Islands dollar'), ('KZT', 'Kazakhstani tenge'), ('LAK', 'Lao kip'), ('LBP', 'Lebanese pound'), ('LKR', 'Sri Lankan rupee'), ('LRD', 'Liberian dollar'), ('LSL', 'Lesotho loti'), ('LYD', 'Libyan dinar'), ('MAD', 'Moroccan dirham'), ('MDL', 'Moldovan leu'), ('MGA', 'Malagasy ariary'), ('MKD', 'Macedonian denar'), ('MMK', 'Myanmar kyat'), ('MNT', 'Mongolian tögrög'), ('MOP', 'Macanese pataca'), ('MRU', 'Mauritanian ouguiya'), ('MUR', 'Mauritian rupee'), ('MVR', 'Maldivian rufiyaa'), ('MWK', 'Malawian kwacha'), ('MXN', 'Mexican peso'), ('MYR', 'Malaysian ringgit'), ('MZN', 'Mozambican metical'), ('NAD', 'Namibian dollar'), ('NGN', 'Nigerian naira'), ('NIO', 'Nicaraguan córdoba'), ('NOK', 'Norwegian krone'), ('NPR', 'Nepalese rupee'), ('NZD', 'New Zealand dollar'), ('OMR', 'Omani rial'), ('PAB', 'Panamanian balboa'), ('PEN', 'Peruvian sol'), ('PGK', 'Papua New Guinean kina'), ('PHP', 'Philippine peso'), ('PKR', 'Pakistani rupee'), ('PLN', 'Polish złoty'), ('PYG', 'Paraguayan guaraní'), ('QAR', 'Qatari riyal'), ('RON', 'Romanian leu'), ('RSD', 'Serbian dinar'), ('RUB', 'Russian ruble'), ('RWF', 'Rwandan franc'), ('SAR', 'Saudi riyal'), ('SBD', 'Solomon Islands dollar'), ('SCR', 'Seychelles rupee'), ('SDG', 'Sudanese pound'), ('SEK', 'Swedish krona/kronor'), ('SGD', 'Singapore dollar'), ('SHP', 'Saint Helena pound'), ('SLL', 'Sierra Leonean leone'), ('SOS', 'Somali shilling'), ('SRD', 'Surinamese dollar'), ('SSP', 'South Sudanese pound'), ('STN', 'São Tomé and Príncipe dobra'), ('SVC', 'Salvadoran colón'), ('SYP', 'Syrian pound'), ('SZL', 'Swazi lilangeni'), ('THB', 'Thai baht'), ('TJS', 'Tajikistani somoni'), ('TMT', 'Turkmenistan manat'), ('TND', 'Tunisian dinar'), ('TOP', 'Tongan paʻanga'), ('TRY', 'Turkish lira'), ('TTD', 'Trinidad and Tobago dollar'), ('TWD', 'New Taiwan dollar'), ('TZS', 'Tanzanian shilling'), ('UAH', 'Ukrainian hryvnia'), ('UGX', 'Ugandan shilling'), ('USD', 'United States dollar'), ('UYU', 'Uruguayan peso'), ('UYW', 'Unidad previsional[14]'), ('UZS', 'Uzbekistan som'), ('VES', 'Venezuelan bolívar soberano'), ('VND', 'Vietnamese đồng'), ('VUV', 'Vanuatu vatu'), ('WST', 'Samoan tala'), ('XAF', 'CFA franc BEAC'), ('XAG', 'Silver (one troy ounce)'), ('XAU', 'Gold (one troy ounce)'), ('XCD', 'East Caribbean dollar'), ('XOF', 'CFA franc BCEAO'), ('XPF', 'CFP franc (franc Pacifique)'), ('YER', 'Yemeni rial'), ('ZAR', 'South African rand'), ('ZMW', 'Zambian kwacha'), ('ZWL', 'Zimbabwean dollar'), ('USDC', 'USD Coin')], default='', max_length=250), ), ] diff --git a/backend/hct_mis_api/apps/payment/migrations/0128_migration.py b/backend/hct_mis_api/apps/payment/migrations/0128_migration.py index 79f5a03678..6ad75b590b 100644 --- a/backend/hct_mis_api/apps/payment/migrations/0128_migration.py +++ b/backend/hct_mis_api/apps/payment/migrations/0128_migration.py @@ -14,12 +14,12 @@ class Migration(migrations.Migration): operations = [ migrations.AddField( model_name='payment', - name='transaction_status_blockchain', + name='transaction_status_blockchain_link', field=models.CharField(max_length=255, null=True), ), migrations.AddField( model_name='paymentrecord', - name='transaction_status_blockchain', + name='transaction_status_blockchain_link', field=models.CharField(max_length=255, null=True), ), migrations.AlterField( @@ -40,7 +40,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='financialserviceproviderxlsxtemplate', name='columns', - field=multiselectfield.db.fields.MultiSelectField(choices=[('payment_id', 'Payment ID'), ('household_id', 'Household ID'), ('household_size', 'Household Size'), ('collector_name', 'Collector Name'), ('alternate_collector_full_name', 'Alternate collector Full Name'), ('alternate_collector_given_name', 'Alternate collector Given Name'), ('alternate_collector_middle_name', 'Alternate collector Middle Name'), ('alternate_collector_phone_no', 'Alternate collector phone number'), ('alternate_collector_document_numbers', 'Alternate collector Document numbers'), ('alternate_collector_sex', 'Alternate collector Gender'), ('payment_channel', 'Payment Channel'), ('fsp_name', 'FSP Name'), ('currency', 'Currency'), ('entitlement_quantity', 'Entitlement Quantity'), ('entitlement_quantity_usd', 'Entitlement Quantity USD'), ('delivered_quantity', 'Delivered Quantity'), ('delivery_date', 'Delivery Date'), ('reference_id', 'Reference id'), ('reason_for_unsuccessful_payment', 'Reason for unsuccessful payment'), ('order_number', 'Order Number'), ('token_number', 'Token Number'), ('additional_collector_name', 'Additional Collector Name'), ('additional_document_type', 'Additional Document Type'), ('additional_document_number', 'Additional Document Number'), ('registration_token', 'Registration Token'), ('status', 'Status'), ('transaction_status_blockchain', 'Transaction Status on the Blockchain')], default=['payment_id', 'household_id', 'household_size', 'collector_name', 'alternate_collector_full_name', 'alternate_collector_given_name', 'alternate_collector_middle_name', 'alternate_collector_phone_no', 'alternate_collector_document_numbers', 'alternate_collector_sex', 'payment_channel', 'fsp_name', 'currency', 'entitlement_quantity', 'entitlement_quantity_usd', 'delivered_quantity', 'delivery_date', 'reference_id', 'reason_for_unsuccessful_payment', 'order_number', 'token_number', 'additional_collector_name', 'additional_document_type', 'additional_document_number', 'registration_token', 'status', 'transaction_status_blockchain'], help_text='Select the columns to include in the report', max_length=1000, verbose_name='Columns'), + field=multiselectfield.db.fields.MultiSelectField(choices=[('payment_id', 'Payment ID'), ('household_id', 'Household ID'), ('household_size', 'Household Size'), ('collector_name', 'Collector Name'), ('alternate_collector_full_name', 'Alternate collector Full Name'), ('alternate_collector_given_name', 'Alternate collector Given Name'), ('alternate_collector_middle_name', 'Alternate collector Middle Name'), ('alternate_collector_phone_no', 'Alternate collector phone number'), ('alternate_collector_document_numbers', 'Alternate collector Document numbers'), ('alternate_collector_sex', 'Alternate collector Gender'), ('payment_channel', 'Payment Channel'), ('fsp_name', 'FSP Name'), ('currency', 'Currency'), ('entitlement_quantity', 'Entitlement Quantity'), ('entitlement_quantity_usd', 'Entitlement Quantity USD'), ('delivered_quantity', 'Delivered Quantity'), ('delivery_date', 'Delivery Date'), ('reference_id', 'Reference id'), ('reason_for_unsuccessful_payment', 'Reason for unsuccessful payment'), ('order_number', 'Order Number'), ('token_number', 'Token Number'), ('additional_collector_name', 'Additional Collector Name'), ('additional_document_type', 'Additional Document Type'), ('additional_document_number', 'Additional Document Number'), ('registration_token', 'Registration Token'), ('status', 'Status'), ('transaction_status_blockchain_link', 'Transaction Status on the Blockchain')], default=['payment_id', 'household_id', 'household_size', 'collector_name', 'alternate_collector_full_name', 'alternate_collector_given_name', 'alternate_collector_middle_name', 'alternate_collector_phone_no', 'alternate_collector_document_numbers', 'alternate_collector_sex', 'payment_channel', 'fsp_name', 'currency', 'entitlement_quantity', 'entitlement_quantity_usd', 'delivered_quantity', 'delivery_date', 'reference_id', 'reason_for_unsuccessful_payment', 'order_number', 'token_number', 'additional_collector_name', 'additional_document_type', 'additional_document_number', 'registration_token', 'status', 'transaction_status_blockchain_link'], help_text='Select the columns to include in the report', max_length=1000, verbose_name='Columns'), ), migrations.AlterField( model_name='fspxlsxtemplateperdeliverymechanism', @@ -55,7 +55,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='paymentplan', name='currency', - field=models.CharField(choices=[('', 'None'), ('AED', 'United Arab Emirates dirham'), ('AFN', 'Afghan afghani'), ('ALL', 'Albanian lek'), ('AMD', 'Armenian dram'), ('ANG', 'Netherlands Antillean guilder'), ('AOA', 'Angolan kwanza'), ('ARS', 'Argentine peso'), ('AUD', 'Australian dollar'), ('AWG', 'Aruban florin'), ('AZN', 'Azerbaijani manat'), ('BAM', 'Bosnia and Herzegovina convertible mark'), ('BBD', 'Barbados dollar'), ('BDT', 'Bangladeshi taka'), ('BGN', 'Bulgarian lev'), ('BHD', 'Bahraini dinar'), ('BIF', 'Burundian franc'), ('BMD', 'Bermudian dollar'), ('BND', 'Brunei dollar'), ('BOB', 'Boliviano'), ('BOV', 'Bolivian Mvdol (funds code)'), ('BRL', 'Brazilian real'), ('BSD', 'Bahamian dollar'), ('BTN', 'Bhutanese ngultrum'), ('BWP', 'Botswana pula'), ('BYN', 'Belarusian ruble'), ('BZD', 'Belize dollar'), ('CAD', 'Canadian dollar'), ('CDF', 'Congolese franc'), ('CHF', 'Swiss franc'), ('CLP', 'Chilean peso'), ('CNY', 'Chinese yuan'), ('COP', 'Colombian peso'), ('CRC', 'Costa Rican colon'), ('CUC', 'Cuban convertible peso'), ('CUP', 'Cuban peso'), ('CVE', 'Cape Verdean escudo'), ('CZK', 'Czech koruna'), ('DJF', 'Djiboutian franc'), ('DKK', 'Danish krone'), ('DOP', 'Dominican peso'), ('DZD', 'Algerian dinar'), ('EGP', 'Egyptian pound'), ('ERN', 'Eritrean nakfa'), ('ETB', 'Ethiopian birr'), ('EUR', 'Euro'), ('FJD', 'Fiji dollar'), ('FKP', 'Falkland Islands pound'), ('GBP', 'Pound sterling'), ('GEL', 'Georgian lari'), ('GHS', 'Ghanaian cedi'), ('GIP', 'Gibraltar pound'), ('GMD', 'Gambian dalasi'), ('GNF', 'Guinean franc'), ('GTQ', 'Guatemalan quetzal'), ('GYD', 'Guyanese dollar'), ('HKD', 'Hong Kong dollar'), ('HNL', 'Honduran lempira'), ('HRK', 'Croatian kuna'), ('HTG', 'Haitian gourde'), ('HUF', 'Hungarian forint'), ('IDR', 'Indonesian rupiah'), ('ILS', 'Israeli new shekel'), ('INR', 'Indian rupee'), ('IQD', 'Iraqi dinar'), ('IRR', 'Iranian rial'), ('ISK', 'Icelandic króna'), ('JMD', 'Jamaican dollar'), ('JOD', 'Jordanian dinar'), ('JPY', 'Japanese yen'), ('KES', 'Kenyan shilling'), ('KGS', 'Kyrgyzstani som'), ('KHR', 'Cambodian riel'), ('KMF', 'Comoro franc'), ('KPW', 'North Korean won'), ('KRW', 'South Korean won'), ('KWD', 'Kuwaiti dinar'), ('KYD', 'Cayman Islands dollar'), ('KZT', 'Kazakhstani tenge'), ('LAK', 'Lao kip'), ('LBP', 'Lebanese pound'), ('LKR', 'Sri Lankan rupee'), ('LRD', 'Liberian dollar'), ('LSL', 'Lesotho loti'), ('LYD', 'Libyan dinar'), ('MAD', 'Moroccan dirham'), ('MDL', 'Moldovan leu'), ('MGA', 'Malagasy ariary'), ('MKD', 'Macedonian denar'), ('MMK', 'Myanmar kyat'), ('MNT', 'Mongolian tögrög'), ('MOP', 'Macanese pataca'), ('MRU', 'Mauritanian ouguiya'), ('MUR', 'Mauritian rupee'), ('MVR', 'Maldivian rufiyaa'), ('MWK', 'Malawian kwacha'), ('MXN', 'Mexican peso'), ('MYR', 'Malaysian ringgit'), ('MZN', 'Mozambican metical'), ('NAD', 'Namibian dollar'), ('NGN', 'Nigerian naira'), ('NIO', 'Nicaraguan córdoba'), ('NOK', 'Norwegian krone'), ('NPR', 'Nepalese rupee'), ('NZD', 'New Zealand dollar'), ('OMR', 'Omani rial'), ('PAB', 'Panamanian balboa'), ('PEN', 'Peruvian sol'), ('PGK', 'Papua New Guinean kina'), ('PHP', 'Philippine peso'), ('PKR', 'Pakistani rupee'), ('PLN', 'Polish złoty'), ('PYG', 'Paraguayan guaraní'), ('QAR', 'Qatari riyal'), ('RON', 'Romanian leu'), ('RSD', 'Serbian dinar'), ('RUB', 'Russian ruble'), ('RWF', 'Rwandan franc'), ('SAR', 'Saudi riyal'), ('SBD', 'Solomon Islands dollar'), ('SCR', 'Seychelles rupee'), ('SDG', 'Sudanese pound'), ('SEK', 'Swedish krona/kronor'), ('SGD', 'Singapore dollar'), ('SHP', 'Saint Helena pound'), ('SLL', 'Sierra Leonean leone'), ('SOS', 'Somali shilling'), ('SRD', 'Surinamese dollar'), ('SSP', 'South Sudanese pound'), ('STN', 'São Tomé and Príncipe dobra'), ('SVC', 'Salvadoran colón'), ('SYP', 'Syrian pound'), ('SZL', 'Swazi lilangeni'), ('THB', 'Thai baht'), ('TJS', 'Tajikistani somoni'), ('TMT', 'Turkmenistan manat'), ('TND', 'Tunisian dinar'), ('TOP', 'Tongan paʻanga'), ('TRY', 'Turkish lira'), ('TTD', 'Trinidad and Tobago dollar'), ('TWD', 'New Taiwan dollar'), ('TZS', 'Tanzanian shilling'), ('UAH', 'Ukrainian hryvnia'), ('UGX', 'Ugandan shilling'), ('USD', 'United States dollar'), ('UYU', 'Uruguayan peso'), ('UYW', 'Unidad previsional[14]'), ('UZS', 'Uzbekistan som'), ('VES', 'Venezuelan bolívar soberano'), ('VND', 'Vietnamese đồng'), ('VUV', 'Vanuatu vatu'), ('WST', 'Samoan tala'), ('XAF', 'CFA franc BEAC'), ('XAG', 'Silver (one troy ounce)'), ('XAU', 'Gold (one troy ounce)'), ('XCD', 'East Caribbean dollar'), ('XOF', 'CFA franc BCEAO'), ('XPF', 'CFP franc (franc Pacifique)'), ('YER', 'Yemeni rial'), ('ZAR', 'South African rand'), ('ZMW', 'Zambian kwacha'), ('ZWL', 'Zimbabwean dollar'), ('USDC', 'Digital currency')], max_length=4), + field=models.CharField(choices=[('', 'None'), ('AED', 'United Arab Emirates dirham'), ('AFN', 'Afghan afghani'), ('ALL', 'Albanian lek'), ('AMD', 'Armenian dram'), ('ANG', 'Netherlands Antillean guilder'), ('AOA', 'Angolan kwanza'), ('ARS', 'Argentine peso'), ('AUD', 'Australian dollar'), ('AWG', 'Aruban florin'), ('AZN', 'Azerbaijani manat'), ('BAM', 'Bosnia and Herzegovina convertible mark'), ('BBD', 'Barbados dollar'), ('BDT', 'Bangladeshi taka'), ('BGN', 'Bulgarian lev'), ('BHD', 'Bahraini dinar'), ('BIF', 'Burundian franc'), ('BMD', 'Bermudian dollar'), ('BND', 'Brunei dollar'), ('BOB', 'Boliviano'), ('BOV', 'Bolivian Mvdol (funds code)'), ('BRL', 'Brazilian real'), ('BSD', 'Bahamian dollar'), ('BTN', 'Bhutanese ngultrum'), ('BWP', 'Botswana pula'), ('BYN', 'Belarusian ruble'), ('BZD', 'Belize dollar'), ('CAD', 'Canadian dollar'), ('CDF', 'Congolese franc'), ('CHF', 'Swiss franc'), ('CLP', 'Chilean peso'), ('CNY', 'Chinese yuan'), ('COP', 'Colombian peso'), ('CRC', 'Costa Rican colon'), ('CUC', 'Cuban convertible peso'), ('CUP', 'Cuban peso'), ('CVE', 'Cape Verdean escudo'), ('CZK', 'Czech koruna'), ('DJF', 'Djiboutian franc'), ('DKK', 'Danish krone'), ('DOP', 'Dominican peso'), ('DZD', 'Algerian dinar'), ('EGP', 'Egyptian pound'), ('ERN', 'Eritrean nakfa'), ('ETB', 'Ethiopian birr'), ('EUR', 'Euro'), ('FJD', 'Fiji dollar'), ('FKP', 'Falkland Islands pound'), ('GBP', 'Pound sterling'), ('GEL', 'Georgian lari'), ('GHS', 'Ghanaian cedi'), ('GIP', 'Gibraltar pound'), ('GMD', 'Gambian dalasi'), ('GNF', 'Guinean franc'), ('GTQ', 'Guatemalan quetzal'), ('GYD', 'Guyanese dollar'), ('HKD', 'Hong Kong dollar'), ('HNL', 'Honduran lempira'), ('HRK', 'Croatian kuna'), ('HTG', 'Haitian gourde'), ('HUF', 'Hungarian forint'), ('IDR', 'Indonesian rupiah'), ('ILS', 'Israeli new shekel'), ('INR', 'Indian rupee'), ('IQD', 'Iraqi dinar'), ('IRR', 'Iranian rial'), ('ISK', 'Icelandic króna'), ('JMD', 'Jamaican dollar'), ('JOD', 'Jordanian dinar'), ('JPY', 'Japanese yen'), ('KES', 'Kenyan shilling'), ('KGS', 'Kyrgyzstani som'), ('KHR', 'Cambodian riel'), ('KMF', 'Comoro franc'), ('KPW', 'North Korean won'), ('KRW', 'South Korean won'), ('KWD', 'Kuwaiti dinar'), ('KYD', 'Cayman Islands dollar'), ('KZT', 'Kazakhstani tenge'), ('LAK', 'Lao kip'), ('LBP', 'Lebanese pound'), ('LKR', 'Sri Lankan rupee'), ('LRD', 'Liberian dollar'), ('LSL', 'Lesotho loti'), ('LYD', 'Libyan dinar'), ('MAD', 'Moroccan dirham'), ('MDL', 'Moldovan leu'), ('MGA', 'Malagasy ariary'), ('MKD', 'Macedonian denar'), ('MMK', 'Myanmar kyat'), ('MNT', 'Mongolian tögrög'), ('MOP', 'Macanese pataca'), ('MRU', 'Mauritanian ouguiya'), ('MUR', 'Mauritian rupee'), ('MVR', 'Maldivian rufiyaa'), ('MWK', 'Malawian kwacha'), ('MXN', 'Mexican peso'), ('MYR', 'Malaysian ringgit'), ('MZN', 'Mozambican metical'), ('NAD', 'Namibian dollar'), ('NGN', 'Nigerian naira'), ('NIO', 'Nicaraguan córdoba'), ('NOK', 'Norwegian krone'), ('NPR', 'Nepalese rupee'), ('NZD', 'New Zealand dollar'), ('OMR', 'Omani rial'), ('PAB', 'Panamanian balboa'), ('PEN', 'Peruvian sol'), ('PGK', 'Papua New Guinean kina'), ('PHP', 'Philippine peso'), ('PKR', 'Pakistani rupee'), ('PLN', 'Polish złoty'), ('PYG', 'Paraguayan guaraní'), ('QAR', 'Qatari riyal'), ('RON', 'Romanian leu'), ('RSD', 'Serbian dinar'), ('RUB', 'Russian ruble'), ('RWF', 'Rwandan franc'), ('SAR', 'Saudi riyal'), ('SBD', 'Solomon Islands dollar'), ('SCR', 'Seychelles rupee'), ('SDG', 'Sudanese pound'), ('SEK', 'Swedish krona/kronor'), ('SGD', 'Singapore dollar'), ('SHP', 'Saint Helena pound'), ('SLL', 'Sierra Leonean leone'), ('SOS', 'Somali shilling'), ('SRD', 'Surinamese dollar'), ('SSP', 'South Sudanese pound'), ('STN', 'São Tomé and Príncipe dobra'), ('SVC', 'Salvadoran colón'), ('SYP', 'Syrian pound'), ('SZL', 'Swazi lilangeni'), ('THB', 'Thai baht'), ('TJS', 'Tajikistani somoni'), ('TMT', 'Turkmenistan manat'), ('TND', 'Tunisian dinar'), ('TOP', 'Tongan paʻanga'), ('TRY', 'Turkish lira'), ('TTD', 'Trinidad and Tobago dollar'), ('TWD', 'New Taiwan dollar'), ('TZS', 'Tanzanian shilling'), ('UAH', 'Ukrainian hryvnia'), ('UGX', 'Ugandan shilling'), ('USD', 'United States dollar'), ('UYU', 'Uruguayan peso'), ('UYW', 'Unidad previsional[14]'), ('UZS', 'Uzbekistan som'), ('VES', 'Venezuelan bolívar soberano'), ('VND', 'Vietnamese đồng'), ('VUV', 'Vanuatu vatu'), ('WST', 'Samoan tala'), ('XAF', 'CFA franc BEAC'), ('XAG', 'Silver (one troy ounce)'), ('XAU', 'Gold (one troy ounce)'), ('XCD', 'East Caribbean dollar'), ('XOF', 'CFA franc BCEAO'), ('XPF', 'CFP franc (franc Pacifique)'), ('YER', 'Yemeni rial'), ('ZAR', 'South African rand'), ('ZMW', 'Zambian kwacha'), ('ZWL', 'Zimbabwean dollar'), ('USDC', 'USD Coin')], max_length=4), ), migrations.AlterField( model_name='paymentrecord', diff --git a/backend/hct_mis_api/apps/payment/models.py b/backend/hct_mis_api/apps/payment/models.py index d480f620e1..99008aafec 100644 --- a/backend/hct_mis_api/apps/payment/models.py +++ b/backend/hct_mis_api/apps/payment/models.py @@ -340,7 +340,7 @@ class GenericPayment(TimeStampedUUIDModel): ) delivery_date = models.DateTimeField(null=True, blank=True) transaction_reference_id = models.CharField(max_length=255, null=True) # transaction_id - transaction_status_blockchain = models.CharField(max_length=255, null=True) + transaction_status_blockchain_link = models.CharField(max_length=255, null=True) class Meta: abstract = True @@ -1126,7 +1126,7 @@ class FinancialServiceProviderXlsxTemplate(TimeStampedUUIDModel): ("additional_document_number", _("Additional Document Number")), ("registration_token", _("Registration Token")), ("status", _("Status")), - ("transaction_status_blockchain", _("Transaction Status on the Blockchain")), + ("transaction_status_blockchain_link", _("Transaction Status on the Blockchain")), ) DEFAULT_COLUMNS = [col[0] for col in COLUMNS_CHOICES] @@ -1227,7 +1227,7 @@ def get_column_value_from_payment(cls, payment: "Payment", column_name: str) -> "additional_document_type": (payment, "additional_document_type"), "additional_document_number": (payment, "additional_document_number"), "status": (payment, "payment_status"), - "transaction_status_blockchain": (payment, "transaction_status_blockchain"), + "transaction_status_blockchain_link": (payment, "transaction_status_blockchain_link"), } additional_columns = {"registration_token": cls.get_registration_token_doc_number} if column_name in additional_columns: diff --git a/backend/hct_mis_api/apps/payment/mutations.py b/backend/hct_mis_api/apps/payment/mutations.py index bc1c511328..39512013ce 100644 --- a/backend/hct_mis_api/apps/payment/mutations.py +++ b/backend/hct_mis_api/apps/payment/mutations.py @@ -917,6 +917,13 @@ def mutate( raise GraphQLError("Delivery mechanism cannot be empty.") if delivery_mechanism not in [choice[0] for choice in GenericPayment.DELIVERY_TYPE_CHOICE]: raise GraphQLError(f"Delivery mechanism '{delivery_mechanism}' is not valid.") + if ( + payment_plan.currency == USDC + and delivery_mechanism != GenericPayment.DELIVERY_TYPE_TRANSFER_TO_DIGITAL_WALLET + ): + raise GraphQLError( + "For currency USDC can be assigned only delivery mechanism Transfer to Digital Wallet" + ) DeliveryMechanismPerPaymentPlan.objects.filter(payment_plan=payment_plan).delete() current_time = timezone.now() diff --git a/backend/hct_mis_api/apps/payment/tests/test_file/import_file_reference_id.xlsx b/backend/hct_mis_api/apps/payment/tests/test_file/import_file_reference_id.xlsx index a9eaa7377a58c3992135249c1fc1887bf567d0ed..ca1c904066da68e3b79a63e8c93c0db7d4c5d6dd 100644 GIT binary patch delta 1296 zcmeA%>NnyI@MdNaVPIh3V3_2%VI!|7BQubmtjhQcOe-;+2GN^8Flm4#HcPWW8E&jC zY{EdPh{U?-dAuwP42=Q|3=#|?ljS8OH-F>KVyyQ$D;1qswK_ra+ZJ7?@cgW2`CS?{ zsy<7ECs%CM_~@FnNj2^0j2X<UUcB&q!R>p|?5@j~c`v8T3xDNgX`Z^i(|yK;U!CeR zF8t<XSL>-e)Y_S8|L|bTP5&PTiC={oea`&q6i|Cpm&7alxlT#SK+WSWj|<D{+l?N} zLl>Iw+<W;~{R-=~hpP_xR$Pf(e(;;x?#)UCE)Tj62si3CH8gA9*O;{-^w96P+$8SZ z33p$cv91+-Z~F6}VQ6r{F3AD~o(-}cGY;SC4ZOu0;eTUlf7^;!mOhRc!3w1ht^yM8 zv&`>Z&)c*5?vLJYjO>Tr=UEGEY~Skdo;iP$SJ>`9?tE!;Qv~ZRlnPuQbRH0QRA>rd z$rf~xxuJWbz##wNH@+`EGZy>Ic$4+d<hj;5m)9{2j~E^?Jz{*sEW{whw24h+m(bqH zMXGn}?%kU_Pb_<i7<b0T1~CU2hZqMNhZ+Ya2PcPX4K89Ak{ETbMMtGA-g2g4n&bth z4(1N-4)zXy4+am86H*iEGuS{9H>0E81V-g7ILa2qP{>fo_>tiwBPRnVV<fZCO^0sY zEjRKrXZBw*Vvl;}z^%Zipr;_GV5h*Sps0}Tu*mWPNIXAtp||YU@U5q~eXI@5Q_9j5 ziWG_zKPh}t<Wk^LjB*ya8}R+hojU>F@7($(Fn!6LxlVo`8FL@kf0`gRb;?59tBd{8 zLLyJbeq=kSUKUV!w594vx>%KyYpU>qztue_*Dm}pt6ni^{*v0LuqQLk_Fwy{{b>2z zTCcbdcM~UUy}fu+$lIi{j-Z!&UUO9@wLV)BvFuCF*}iMuKU=(mj%iL@nsy^!b#`cz z{?XHdqW529?w=_*f9>&QJEI;1tL&`%EAf1}zyF)RkLyj<<}*#1E9hCi@r&ry7ya*F z1f&<9{2k$Q`KJ4lP2#`*?Frb`#l6&i+NFQyiC-VqqvVQ+W6#5yG#MEf9!=I0u&%$p zL^z~j*E@qwW2eV5tyiKKFZC0*?)muo<c}RCti6l>{`r$*fBp3Kd#URMPE^G_NmcyJ zbK%FeM`aW3*UP7E|G8=Bs!ogUjPHVBc1p`n?Y8j_S>k%nkpH{WgqI7hhx}kPP?VOh zI;+VO?dZ&KH;DbfUg2U*?TgvnmBEv9v+~$#>)$X&-rOd3=gOlgf1Rx4Ij!E`vNzoH z-oUN5oR8=Cf`ISoFZvg~G*Q}NxMyMFq_iZCmo~=>?Y3@u^I-E+yH~*_fxTTN+rqfd zsW~tByY+JU(ZH><&b#q!XuRBGP-w^}<tgnKr=4_m;+5{tY17vw1X_0QHhi4<b;mr_ z{ZDf0Y$vzsOxd(z)ojkQpZ-U!(mCDzWfkY%pBCj7GH%ixU$&gR%8n9rn<og0GlNTz zRU$VaMN6xg8MtWKCuRet|B6|IX=`ySFkK<;3Z@T;+i}3km&t4rcDx`CA|?VQOu@=J zC8TZI1Q{4Aa`cN!Dsxhc^(u060=yZS>=@w1TEv|@U7x1_BX9>B1A{QIutR_alOIT^ Ju~mwJL;$O=IJW=* delta 1254 zcmeA->M`OC@MdNaVPIh3U}#QWy^&Xxkr_x&R%QGJrj?jZgXqm4m^8o=o26Nx3^&#m zHV&XvgogOLvdx#c`xxt=tuozq=u6l^qc@q+E$i-GIdfkm@Q2q74|TPVS%HtbkED2? z=`u8A54m`8_66}-i*k2$zOcQlX}kVPYf;{*IN^SSg<pmJ4HkYE=JS#G+rlk;x$aOi z=jQnz5)ZvnXPPnNtFWTajlV~v)SmryF-h>5uuHOoBWyeKM8DNe`9;;szt#tqN40-# znf+nKX20gQzGdmI4>}HrHmWnlvoNv;?+Y|ZT;1}0@2w+ZWe0a%&*h3zzL)*!Z}O^T z4@!(5I7lQ|3mCR<m0r9>dc(X8+VZ@CyE$Y8cPM>udC;w3aPMl~p7nPt!gqg^e#^|) za{q3bLK1)W{Ju+esZ-aK{p^=HV|7xgzQE-{*8$;1{U!&Ng&fzEIxIFsZ+Mt+uj#Gq zi<t)QGYxKD{gZhvG^X>~PKG0lM_7+AA7NKvP+>{o^(axTQh(~T>+hbu>bAPqG<3x- zBr)nXSTyWtsA%}nz|zptu!gZyXTedXs5RTSoN>#X$*60*fK`B9KwN-dKz;(l1c3>r z3iTIxGJq1Bw{N+zc*_lkZr&{nj~E^?Jz{*sEW{whw24h+Q=^!4#>V@XjO3T5@@+ZO zDCQvJ5aVFuP~*Vl;N)<v!KHWsNc{dKr|DL&)@Mx>pHY^ScjC<%hbInCoSry7aTak9 zaoW<Rv1{SGmpgYZe7AG!TSYz3oz|^$9x>lKR{vB{S4-2mdX@X!Gb=Vt+Wm;P$^XrQ zPhFf}Pn_5J($aNG&EfZViOJE<4^96&EwS_by=Bb_<J`KnpTm#%TmPQ2=fUp73fbG; zRaf3R`bJ>srONA~pN?>y4czGSQgXKJ+UcJ-r!VOVR`Nc(;l7vIYL@t}>B?IBE?%xP zR<?`o_buLfAlS3$?=Qo1{`2SE_<j6;mX95)hPCpfcS$d`S6!69e{tctN0Yv9oUv?k zzelS6x4)GOOGL%J>UEa>%|G<&@PCwS5Yg!J^q?9e1H;Y9dIHw<w^M{e8g{)i=rneE z9MgIwda<gXxOLCR*C&7MC}Hhge80Nx{KjDY`*Y65DNgvf<3#$>GsX^Yt($MV{@YWh zk@q>ZI8?Y$?BW~cH8n1Nr*_+Tul4BOlP>qJRpD-PaL6x414C)~Igdix)-F(Nc(sB( zA^m8~DKCpugZwNb-?L{I^wslCh`xNaX?E0{3;N5xPh9YQ+waNBpZSu*s<Rz8^XqDr zAN!~BDo(LU_Oi5;+U*h^#kJ2Zj!mAL$UT4B?-hPmU1ynHy1ChEgPJVMuK2n8M2~L^ zt}#n$;GL7!(%D-W;NexgtJHgqMbPi0z4w;tO2~B259@!eG}lY)^J}MRL8msY(#%tP zl=i<XbM3*qu8~(=uGRF&^0iM~>`}jU=Pw47aN9gtP@EZDUaS?l0Vzm2#LU12$w4t2 z5IsrU8qBp5w*u4E;;vx&u(%z(FqzCLVaE$9SrD-hB4G+v)*~U!*gScKgp52${?47Q c&r^W0w1bU-K^RzsA;8?pk0sRD%EUk-08CRgpa1{> diff --git a/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py b/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py index 7bcf95a872..1bc4738a3d 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py +++ b/backend/hct_mis_api/apps/payment/tests/test_fsp_in_payment_plan.py @@ -311,6 +311,33 @@ def test_choosing_delivery_mechanism_order(self) -> None: {"name": GenericPayment.DELIVERY_TYPE_VOUCHER, "order": 2}, ) + def test_error_when_choosing_delivery_mechanism_with_usdc_currency(self) -> None: + payment_plan = PaymentPlanFactory( + total_households_count=1, + status=PaymentPlan.Status.LOCKED, + program=self.program, + currency=USDC, + ) + assert payment_plan.currency == USDC + encoded_payment_plan_id = encode_id_base64(payment_plan.id, "PaymentPlan") + variables = dict( + input=dict( + paymentPlanId=encoded_payment_plan_id, + deliveryMechanisms=[GenericPayment.DELIVERY_TYPE_TRANSFER, GenericPayment.DELIVERY_TYPE_VOUCHER], + ) + ) + response_with_error = self.graphql_request( + request_string=CHOOSE_DELIVERY_MECHANISMS_MUTATION, + context=self.context, + variables=variables, + ) + + assert "errors" in response_with_error, response_with_error + assert ( + response_with_error["errors"][0]["message"] + == "For currency USDC can be assigned only delivery mechanism Transfer to Digital Wallet" + ) + def test_being_able_to_get_possible_delivery_mechanisms(self) -> None: query = """ query AllDeliveryMechanisms { diff --git a/backend/hct_mis_api/apps/payment/tests/test_update_reconciliation_data.py b/backend/hct_mis_api/apps/payment/tests/test_update_reconciliation_data.py index 657ec72f1e..6bc4e16efd 100644 --- a/backend/hct_mis_api/apps/payment/tests/test_update_reconciliation_data.py +++ b/backend/hct_mis_api/apps/payment/tests/test_update_reconciliation_data.py @@ -209,7 +209,7 @@ def test_upload_reference_id(self, mock_exchange_rate: Any) -> None: self.assertEqual(payment_2.transaction_reference_id, "ref2") @patch("hct_mis_api.apps.payment.models.PaymentPlan.get_exchange_rate", return_value=1.0) - def test_upload_transaction_status_blockchain(self, mock_exchange_rate: Any) -> None: + def test_upload_transaction_status_blockchain_link(self, mock_exchange_rate: Any) -> None: pp = PaymentPlanFactory( dispersion_start_date=datetime(2024, 2, 10).date(), dispersion_end_date=datetime(2024, 12, 10).date(), @@ -233,8 +233,8 @@ def test_upload_transaction_status_blockchain(self, mock_exchange_rate: Any) -> import_service.validate() import_service.import_payment_list() - payment_1.refresh_from_db(fields=["transaction_status_blockchain"]) - payment_2.refresh_from_db(fields=["transaction_status_blockchain"]) + payment_1.refresh_from_db(fields=["transaction_status_blockchain_link"]) + payment_2.refresh_from_db(fields=["transaction_status_blockchain_link"]) - self.assertEqual(payment_1.transaction_status_blockchain, "transaction_status_blockchain_link") - self.assertEqual(payment_2.transaction_status_blockchain, "www_link") + self.assertEqual(payment_1.transaction_status_blockchain_link, "transaction_status_blockchain_link_111") + self.assertEqual(payment_2.transaction_status_blockchain_link, "www_link") diff --git a/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_per_fsp_import_service.py b/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_per_fsp_import_service.py index 189229b46a..58525f7733 100644 --- a/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_per_fsp_import_service.py +++ b/backend/hct_mis_api/apps/payment/xlsx/xlsx_payment_plan_per_fsp_import_service.py @@ -231,7 +231,7 @@ def import_payment_list(self) -> None: "additional_collector_name", "additional_document_type", "additional_document_number", - "transaction_status_blockchain", + "transaction_status_blockchain_link", ), batch_size=500, ) @@ -306,10 +306,12 @@ def _import_row(self, row: Row, exchange_rate: float) -> None: else: additional_document_number = None - if "transaction_status_blockchain" in self.xlsx_headers: - transaction_status_blockchain = row[self.xlsx_headers.index("transaction_status_blockchain")].value + if "transaction_status_blockchain_link" in self.xlsx_headers: + transaction_status_blockchain_link = row[ + self.xlsx_headers.index("transaction_status_blockchain_link") + ].value else: - transaction_status_blockchain = None + transaction_status_blockchain_link = None if isinstance(delivery_date, str): delivery_date = parse(delivery_date) @@ -334,7 +336,7 @@ def _import_row(self, row: Row, exchange_rate: float) -> None: or (additional_document_type != payment.additional_document_type) or (additional_document_number != payment.additional_document_number) or (reference_id != payment.transaction_reference_id) - or (transaction_status_blockchain != payment.transaction_status_blockchain) + or (transaction_status_blockchain_link != payment.transaction_status_blockchain_link) ): payment.delivered_quantity = delivered_quantity payment.delivered_quantity_usd = get_quantity_in_usd( @@ -355,7 +357,7 @@ def _import_row(self, row: Row, exchange_rate: float) -> None: payment.additional_document_type = additional_document_type payment.additional_document_number = additional_document_number payment.transaction_reference_id = reference_id - payment.transaction_status_blockchain = transaction_status_blockchain + payment.transaction_status_blockchain_link = transaction_status_blockchain_link self.payments_to_save.append(payment) # update PaymentVerification status diff --git a/backend/hct_mis_api/apps/registration_datahub/migrations/0112_migration.py b/backend/hct_mis_api/apps/registration_datahub/migrations/0112_migration.py index ff98779dac..ff93833ed3 100644 --- a/backend/hct_mis_api/apps/registration_datahub/migrations/0112_migration.py +++ b/backend/hct_mis_api/apps/registration_datahub/migrations/0112_migration.py @@ -28,6 +28,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='importedhousehold', name='currency', - field=models.CharField(choices=[('', 'None'), ('AED', 'United Arab Emirates dirham'), ('AFN', 'Afghan afghani'), ('ALL', 'Albanian lek'), ('AMD', 'Armenian dram'), ('ANG', 'Netherlands Antillean guilder'), ('AOA', 'Angolan kwanza'), ('ARS', 'Argentine peso'), ('AUD', 'Australian dollar'), ('AWG', 'Aruban florin'), ('AZN', 'Azerbaijani manat'), ('BAM', 'Bosnia and Herzegovina convertible mark'), ('BBD', 'Barbados dollar'), ('BDT', 'Bangladeshi taka'), ('BGN', 'Bulgarian lev'), ('BHD', 'Bahraini dinar'), ('BIF', 'Burundian franc'), ('BMD', 'Bermudian dollar'), ('BND', 'Brunei dollar'), ('BOB', 'Boliviano'), ('BOV', 'Bolivian Mvdol (funds code)'), ('BRL', 'Brazilian real'), ('BSD', 'Bahamian dollar'), ('BTN', 'Bhutanese ngultrum'), ('BWP', 'Botswana pula'), ('BYN', 'Belarusian ruble'), ('BZD', 'Belize dollar'), ('CAD', 'Canadian dollar'), ('CDF', 'Congolese franc'), ('CHF', 'Swiss franc'), ('CLP', 'Chilean peso'), ('CNY', 'Chinese yuan'), ('COP', 'Colombian peso'), ('CRC', 'Costa Rican colon'), ('CUC', 'Cuban convertible peso'), ('CUP', 'Cuban peso'), ('CVE', 'Cape Verdean escudo'), ('CZK', 'Czech koruna'), ('DJF', 'Djiboutian franc'), ('DKK', 'Danish krone'), ('DOP', 'Dominican peso'), ('DZD', 'Algerian dinar'), ('EGP', 'Egyptian pound'), ('ERN', 'Eritrean nakfa'), ('ETB', 'Ethiopian birr'), ('EUR', 'Euro'), ('FJD', 'Fiji dollar'), ('FKP', 'Falkland Islands pound'), ('GBP', 'Pound sterling'), ('GEL', 'Georgian lari'), ('GHS', 'Ghanaian cedi'), ('GIP', 'Gibraltar pound'), ('GMD', 'Gambian dalasi'), ('GNF', 'Guinean franc'), ('GTQ', 'Guatemalan quetzal'), ('GYD', 'Guyanese dollar'), ('HKD', 'Hong Kong dollar'), ('HNL', 'Honduran lempira'), ('HRK', 'Croatian kuna'), ('HTG', 'Haitian gourde'), ('HUF', 'Hungarian forint'), ('IDR', 'Indonesian rupiah'), ('ILS', 'Israeli new shekel'), ('INR', 'Indian rupee'), ('IQD', 'Iraqi dinar'), ('IRR', 'Iranian rial'), ('ISK', 'Icelandic króna'), ('JMD', 'Jamaican dollar'), ('JOD', 'Jordanian dinar'), ('JPY', 'Japanese yen'), ('KES', 'Kenyan shilling'), ('KGS', 'Kyrgyzstani som'), ('KHR', 'Cambodian riel'), ('KMF', 'Comoro franc'), ('KPW', 'North Korean won'), ('KRW', 'South Korean won'), ('KWD', 'Kuwaiti dinar'), ('KYD', 'Cayman Islands dollar'), ('KZT', 'Kazakhstani tenge'), ('LAK', 'Lao kip'), ('LBP', 'Lebanese pound'), ('LKR', 'Sri Lankan rupee'), ('LRD', 'Liberian dollar'), ('LSL', 'Lesotho loti'), ('LYD', 'Libyan dinar'), ('MAD', 'Moroccan dirham'), ('MDL', 'Moldovan leu'), ('MGA', 'Malagasy ariary'), ('MKD', 'Macedonian denar'), ('MMK', 'Myanmar kyat'), ('MNT', 'Mongolian tögrög'), ('MOP', 'Macanese pataca'), ('MRU', 'Mauritanian ouguiya'), ('MUR', 'Mauritian rupee'), ('MVR', 'Maldivian rufiyaa'), ('MWK', 'Malawian kwacha'), ('MXN', 'Mexican peso'), ('MYR', 'Malaysian ringgit'), ('MZN', 'Mozambican metical'), ('NAD', 'Namibian dollar'), ('NGN', 'Nigerian naira'), ('NIO', 'Nicaraguan córdoba'), ('NOK', 'Norwegian krone'), ('NPR', 'Nepalese rupee'), ('NZD', 'New Zealand dollar'), ('OMR', 'Omani rial'), ('PAB', 'Panamanian balboa'), ('PEN', 'Peruvian sol'), ('PGK', 'Papua New Guinean kina'), ('PHP', 'Philippine peso'), ('PKR', 'Pakistani rupee'), ('PLN', 'Polish złoty'), ('PYG', 'Paraguayan guaraní'), ('QAR', 'Qatari riyal'), ('RON', 'Romanian leu'), ('RSD', 'Serbian dinar'), ('RUB', 'Russian ruble'), ('RWF', 'Rwandan franc'), ('SAR', 'Saudi riyal'), ('SBD', 'Solomon Islands dollar'), ('SCR', 'Seychelles rupee'), ('SDG', 'Sudanese pound'), ('SEK', 'Swedish krona/kronor'), ('SGD', 'Singapore dollar'), ('SHP', 'Saint Helena pound'), ('SLL', 'Sierra Leonean leone'), ('SOS', 'Somali shilling'), ('SRD', 'Surinamese dollar'), ('SSP', 'South Sudanese pound'), ('STN', 'São Tomé and Príncipe dobra'), ('SVC', 'Salvadoran colón'), ('SYP', 'Syrian pound'), ('SZL', 'Swazi lilangeni'), ('THB', 'Thai baht'), ('TJS', 'Tajikistani somoni'), ('TMT', 'Turkmenistan manat'), ('TND', 'Tunisian dinar'), ('TOP', 'Tongan paʻanga'), ('TRY', 'Turkish lira'), ('TTD', 'Trinidad and Tobago dollar'), ('TWD', 'New Taiwan dollar'), ('TZS', 'Tanzanian shilling'), ('UAH', 'Ukrainian hryvnia'), ('UGX', 'Ugandan shilling'), ('USD', 'United States dollar'), ('UYU', 'Uruguayan peso'), ('UYW', 'Unidad previsional[14]'), ('UZS', 'Uzbekistan som'), ('VES', 'Venezuelan bolívar soberano'), ('VND', 'Vietnamese đồng'), ('VUV', 'Vanuatu vatu'), ('WST', 'Samoan tala'), ('XAF', 'CFA franc BEAC'), ('XAG', 'Silver (one troy ounce)'), ('XAU', 'Gold (one troy ounce)'), ('XCD', 'East Caribbean dollar'), ('XOF', 'CFA franc BCEAO'), ('XPF', 'CFP franc (franc Pacifique)'), ('YER', 'Yemeni rial'), ('ZAR', 'South African rand'), ('ZMW', 'Zambian kwacha'), ('ZWL', 'Zimbabwean dollar'), ('USDC', 'Digital currency')], default='', max_length=250), + field=models.CharField(choices=[('', 'None'), ('AED', 'United Arab Emirates dirham'), ('AFN', 'Afghan afghani'), ('ALL', 'Albanian lek'), ('AMD', 'Armenian dram'), ('ANG', 'Netherlands Antillean guilder'), ('AOA', 'Angolan kwanza'), ('ARS', 'Argentine peso'), ('AUD', 'Australian dollar'), ('AWG', 'Aruban florin'), ('AZN', 'Azerbaijani manat'), ('BAM', 'Bosnia and Herzegovina convertible mark'), ('BBD', 'Barbados dollar'), ('BDT', 'Bangladeshi taka'), ('BGN', 'Bulgarian lev'), ('BHD', 'Bahraini dinar'), ('BIF', 'Burundian franc'), ('BMD', 'Bermudian dollar'), ('BND', 'Brunei dollar'), ('BOB', 'Boliviano'), ('BOV', 'Bolivian Mvdol (funds code)'), ('BRL', 'Brazilian real'), ('BSD', 'Bahamian dollar'), ('BTN', 'Bhutanese ngultrum'), ('BWP', 'Botswana pula'), ('BYN', 'Belarusian ruble'), ('BZD', 'Belize dollar'), ('CAD', 'Canadian dollar'), ('CDF', 'Congolese franc'), ('CHF', 'Swiss franc'), ('CLP', 'Chilean peso'), ('CNY', 'Chinese yuan'), ('COP', 'Colombian peso'), ('CRC', 'Costa Rican colon'), ('CUC', 'Cuban convertible peso'), ('CUP', 'Cuban peso'), ('CVE', 'Cape Verdean escudo'), ('CZK', 'Czech koruna'), ('DJF', 'Djiboutian franc'), ('DKK', 'Danish krone'), ('DOP', 'Dominican peso'), ('DZD', 'Algerian dinar'), ('EGP', 'Egyptian pound'), ('ERN', 'Eritrean nakfa'), ('ETB', 'Ethiopian birr'), ('EUR', 'Euro'), ('FJD', 'Fiji dollar'), ('FKP', 'Falkland Islands pound'), ('GBP', 'Pound sterling'), ('GEL', 'Georgian lari'), ('GHS', 'Ghanaian cedi'), ('GIP', 'Gibraltar pound'), ('GMD', 'Gambian dalasi'), ('GNF', 'Guinean franc'), ('GTQ', 'Guatemalan quetzal'), ('GYD', 'Guyanese dollar'), ('HKD', 'Hong Kong dollar'), ('HNL', 'Honduran lempira'), ('HRK', 'Croatian kuna'), ('HTG', 'Haitian gourde'), ('HUF', 'Hungarian forint'), ('IDR', 'Indonesian rupiah'), ('ILS', 'Israeli new shekel'), ('INR', 'Indian rupee'), ('IQD', 'Iraqi dinar'), ('IRR', 'Iranian rial'), ('ISK', 'Icelandic króna'), ('JMD', 'Jamaican dollar'), ('JOD', 'Jordanian dinar'), ('JPY', 'Japanese yen'), ('KES', 'Kenyan shilling'), ('KGS', 'Kyrgyzstani som'), ('KHR', 'Cambodian riel'), ('KMF', 'Comoro franc'), ('KPW', 'North Korean won'), ('KRW', 'South Korean won'), ('KWD', 'Kuwaiti dinar'), ('KYD', 'Cayman Islands dollar'), ('KZT', 'Kazakhstani tenge'), ('LAK', 'Lao kip'), ('LBP', 'Lebanese pound'), ('LKR', 'Sri Lankan rupee'), ('LRD', 'Liberian dollar'), ('LSL', 'Lesotho loti'), ('LYD', 'Libyan dinar'), ('MAD', 'Moroccan dirham'), ('MDL', 'Moldovan leu'), ('MGA', 'Malagasy ariary'), ('MKD', 'Macedonian denar'), ('MMK', 'Myanmar kyat'), ('MNT', 'Mongolian tögrög'), ('MOP', 'Macanese pataca'), ('MRU', 'Mauritanian ouguiya'), ('MUR', 'Mauritian rupee'), ('MVR', 'Maldivian rufiyaa'), ('MWK', 'Malawian kwacha'), ('MXN', 'Mexican peso'), ('MYR', 'Malaysian ringgit'), ('MZN', 'Mozambican metical'), ('NAD', 'Namibian dollar'), ('NGN', 'Nigerian naira'), ('NIO', 'Nicaraguan córdoba'), ('NOK', 'Norwegian krone'), ('NPR', 'Nepalese rupee'), ('NZD', 'New Zealand dollar'), ('OMR', 'Omani rial'), ('PAB', 'Panamanian balboa'), ('PEN', 'Peruvian sol'), ('PGK', 'Papua New Guinean kina'), ('PHP', 'Philippine peso'), ('PKR', 'Pakistani rupee'), ('PLN', 'Polish złoty'), ('PYG', 'Paraguayan guaraní'), ('QAR', 'Qatari riyal'), ('RON', 'Romanian leu'), ('RSD', 'Serbian dinar'), ('RUB', 'Russian ruble'), ('RWF', 'Rwandan franc'), ('SAR', 'Saudi riyal'), ('SBD', 'Solomon Islands dollar'), ('SCR', 'Seychelles rupee'), ('SDG', 'Sudanese pound'), ('SEK', 'Swedish krona/kronor'), ('SGD', 'Singapore dollar'), ('SHP', 'Saint Helena pound'), ('SLL', 'Sierra Leonean leone'), ('SOS', 'Somali shilling'), ('SRD', 'Surinamese dollar'), ('SSP', 'South Sudanese pound'), ('STN', 'São Tomé and Príncipe dobra'), ('SVC', 'Salvadoran colón'), ('SYP', 'Syrian pound'), ('SZL', 'Swazi lilangeni'), ('THB', 'Thai baht'), ('TJS', 'Tajikistani somoni'), ('TMT', 'Turkmenistan manat'), ('TND', 'Tunisian dinar'), ('TOP', 'Tongan paʻanga'), ('TRY', 'Turkish lira'), ('TTD', 'Trinidad and Tobago dollar'), ('TWD', 'New Taiwan dollar'), ('TZS', 'Tanzanian shilling'), ('UAH', 'Ukrainian hryvnia'), ('UGX', 'Ugandan shilling'), ('USD', 'United States dollar'), ('UYU', 'Uruguayan peso'), ('UYW', 'Unidad previsional[14]'), ('UZS', 'Uzbekistan som'), ('VES', 'Venezuelan bolívar soberano'), ('VND', 'Vietnamese đồng'), ('VUV', 'Vanuatu vatu'), ('WST', 'Samoan tala'), ('XAF', 'CFA franc BEAC'), ('XAG', 'Silver (one troy ounce)'), ('XAU', 'Gold (one troy ounce)'), ('XCD', 'East Caribbean dollar'), ('XOF', 'CFA franc BCEAO'), ('XPF', 'CFP franc (franc Pacifique)'), ('YER', 'Yemeni rial'), ('ZAR', 'South African rand'), ('ZMW', 'Zambian kwacha'), ('ZWL', 'Zimbabwean dollar'), ('USDC', 'USD Coin')], default='', max_length=250), ), ] diff --git a/frontend/data/schema.graphql b/frontend/data/schema.graphql index 4973f40a44..18f6235aab 100644 --- a/frontend/data/schema.graphql +++ b/frontend/data/schema.graphql @@ -2919,7 +2919,7 @@ type PaymentNode implements Node { deliveredQuantityUsd: Float deliveryDate: DateTime transactionReferenceId: String - transactionStatusBlockchain: String + transactionStatusBlockchainLink: String parent: PaymentPlanNode! conflicted: Boolean! excluded: Boolean! @@ -3297,7 +3297,7 @@ type PaymentRecordNode implements Node { deliveredQuantityUsd: Float deliveryDate: DateTime transactionReferenceId: String - transactionStatusBlockchain: String + transactionStatusBlockchainLink: String caId: String caHashId: UUID parent: CashPlanNode diff --git a/frontend/src/__generated__/graphql.tsx b/frontend/src/__generated__/graphql.tsx index 2c964d71f4..586024e504 100644 --- a/frontend/src/__generated__/graphql.tsx +++ b/frontend/src/__generated__/graphql.tsx @@ -4728,7 +4728,7 @@ export type PaymentNode = Node & { tokenNumber?: Maybe<Scalars['Int']['output']>; totalPersonsCovered?: Maybe<Scalars['Int']['output']>; transactionReferenceId?: Maybe<Scalars['String']['output']>; - transactionStatusBlockchain?: Maybe<Scalars['String']['output']>; + transactionStatusBlockchainLink?: Maybe<Scalars['String']['output']>; unicefId?: Maybe<Scalars['String']['output']>; updatedAt: Scalars['DateTime']['output']; verification?: Maybe<PaymentVerificationNode>; @@ -5139,7 +5139,7 @@ export type PaymentRecordNode = Node & { targetPopulationCashAssistId: Scalars['String']['output']; totalPersonsCovered: Scalars['Int']['output']; transactionReferenceId?: Maybe<Scalars['String']['output']>; - transactionStatusBlockchain?: Maybe<Scalars['String']['output']>; + transactionStatusBlockchainLink?: Maybe<Scalars['String']['output']>; unicefId?: Maybe<Scalars['String']['output']>; updatedAt: Scalars['DateTime']['output']; verification?: Maybe<PaymentVerificationNode>; @@ -26679,7 +26679,7 @@ export type PaymentNodeResolvers<ContextType = any, ParentType extends Resolvers tokenNumber?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>; totalPersonsCovered?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>; transactionReferenceId?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>; - transactionStatusBlockchain?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>; + transactionStatusBlockchainLink?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>; unicefId?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>; updatedAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>; verification?: Resolver<Maybe<ResolversTypes['PaymentVerificationNode']>, ParentType, ContextType>; @@ -26830,7 +26830,7 @@ export type PaymentRecordNodeResolvers<ContextType = any, ParentType extends Res targetPopulationCashAssistId?: Resolver<ResolversTypes['String'], ParentType, ContextType>; totalPersonsCovered?: Resolver<ResolversTypes['Int'], ParentType, ContextType>; transactionReferenceId?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>; - transactionStatusBlockchain?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>; + transactionStatusBlockchainLink?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>; unicefId?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>; updatedAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>; verification?: Resolver<Maybe<ResolversTypes['PaymentVerificationNode']>, ParentType, ContextType>; From 6ba0fe65423113fbccab2bfd3e468ed5ff92295b Mon Sep 17 00:00:00 2001 From: Pavlo Mokiichuk <pv.pasha.pv@gmail.com> Date: Thu, 16 May 2024 09:16:51 +0200 Subject: [PATCH 37/38] update test snapshot --- .../snap_test_all_fields_attributes_query.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/backend/hct_mis_api/apps/core/tests/snapshots/snap_test_all_fields_attributes_query.py b/backend/hct_mis_api/apps/core/tests/snapshots/snap_test_all_fields_attributes_query.py index 90e99e29ef..19ce95f9db 100644 --- a/backend/hct_mis_api/apps/core/tests/snapshots/snap_test_all_fields_attributes_query.py +++ b/backend/hct_mis_api/apps/core/tests/snapshots/snap_test_all_fields_attributes_query.py @@ -52322,16 +52322,6 @@ ], 'value': 'DKK' }, - { - 'labelEn': 'USD Coin', - 'labels': [ - { - 'label': 'USD Coin', - 'language': 'English(EN)' - } - ], - 'value': 'USDC' - }, { 'labelEn': 'Djiboutian franc', 'labels': [ @@ -53382,6 +53372,16 @@ ], 'value': 'TMT' }, + { + 'labelEn': 'USD Coin', + 'labels': [ + { + 'label': 'USD Coin', + 'language': 'English(EN)' + } + ], + 'value': 'USDC' + }, { 'labelEn': 'Ugandan shilling', 'labels': [ From 6c8e233264cc5d29c4809a80efc81977b35a582f Mon Sep 17 00:00:00 2001 From: Maciej Szewczyk <maciej.szewczyk@tivix.com> Date: Thu, 16 May 2024 11:35:41 +0200 Subject: [PATCH 38/38] fix global program select --- frontend/src/containers/GlobalProgramSelect.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/containers/GlobalProgramSelect.tsx b/frontend/src/containers/GlobalProgramSelect.tsx index 161321d2ca..84ae527dfb 100644 --- a/frontend/src/containers/GlobalProgramSelect.tsx +++ b/frontend/src/containers/GlobalProgramSelect.tsx @@ -227,7 +227,8 @@ export const GlobalProgramSelect = () => { ); setPrograms(newProgramsList); } - }, [programsList?.allPrograms, inputValue]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [programsList?.allPrograms]); const handleClose = () => { setAnchorEl(null);