diff --git a/.cspell.json b/.cspell.json index ebeec149d4..35fc92031e 100644 --- a/.cspell.json +++ b/.cspell.json @@ -147,7 +147,12 @@ "venv", "VNET", "vnets", - "XLSX" + "XLSX", + "eg9qxlqw4edxa8b5mwbybsrfp", + "mzwp337piamg1mei7fqh1o73s", + "qnqrle4xwsj5go8pchj31sat4", + "qw2hp8khykctdic2z58z70ru8", + "tn8k8lot1bvirmztmmgq2u8hn" ], "dictionaries": [ "en-gb", diff --git a/CHANGELOG.md b/CHANGELOG.md index 79ef59a498..a3bdbda706 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,9 @@ ## [2.25.0](https://github.com/UK-Export-Finance/exip/compare/v2.24.0...v2.25.0) (2024-07-31) - ### Features -* **EMS-3670-72:** eligibility - Party to consortium and Member of a group exit pages ([#2851](https://github.com/UK-Export-Finance/exip/issues/2851)) ([5eabbb5](https://github.com/UK-Export-Finance/exip/commit/5eabbb56aaf7d0d64f039b3b7d1bce031f5be8f8)) +- **EMS-3670-72:** eligibility - Party to consortium and Member of a group exit pages ([#2851](https://github.com/UK-Export-Finance/exip/issues/2851)) ([5eabbb5](https://github.com/UK-Export-Finance/exip/commit/5eabbb56aaf7d0d64f039b3b7d1bce031f5be8f8)) ## [2.24.0](https://github.com/UK-Export-Finance/exip/compare/v2.23.0...v2.24.0) (2024-07-31) diff --git a/database/exip.sql b/database/exip.sql index 5688ea3a3b..7d6141c33b 100644 --- a/database/exip.sql +++ b/database/exip.sql @@ -687,19 +687,25 @@ CREATE TABLE `ExportContract` ( `id` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `application` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `goodsOrServicesDescription` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `finalDestinationCountryCode` varchar(3) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', + `finalDestinationCountryCode` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', `finalDestinationKnown` tinyint(1) DEFAULT NULL, - `paymentTermsDescription` varchar(1000) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `privateMarket` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `agent` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `paymentTermsDescription` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', + `privateMarket` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `agent` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `awardMethod` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `otherAwardMethod` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', PRIMARY KEY (`id`), UNIQUE KEY `ExportContract_privateMarket_key` (`privateMarket`), UNIQUE KEY `ExportContract_agent_key` (`agent`), KEY `ExportContract_application_idx` (`application`), + KEY `ExportContract_awardMethod_idx` (`awardMethod`), CONSTRAINT `ExportContract_agent_fkey` FOREIGN KEY (`agent`) REFERENCES `ExportContractAgent` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT `ExportContract_application_fkey` FOREIGN KEY (`application`) REFERENCES `Application` (`id`) ON DELETE + SET + NULL ON UPDATE CASCADE, + CONSTRAINT `ExportContract_awardMethod_fkey` FOREIGN KEY (`awardMethod`) REFERENCES `ExportContractAwardMethod` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT `ExportContract_privateMarket_fkey` FOREIGN KEY (`privateMarket`) REFERENCES `PrivateMarket` (`id`) ON DELETE @@ -763,6 +769,40 @@ CREATE TABLE `ExportContractAgentServiceCharge` ( +# Dump of table ExportContractAwardMethod +# ------------------------------------------------------------ +DROP TABLE IF EXISTS `ExportContractAwardMethod`; + +CREATE TABLE `ExportContractAwardMethod` ( + `id` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, + `value` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +LOCK TABLES `ExportContractAwardMethod` WRITE; + +/*!40000 ALTER TABLE `ExportContractAwardMethod` DISABLE KEYS */ +; + +INSERT INTO + `ExportContractAwardMethod` (`id`, `value`) +VALUES + ('eg9qxlqw4edxa8b5mwbybsrfp', 'Open tender'), + ( + 'mzwp337piamg1mei7fqh1o73s', + 'Negotiated contract' + ), + ('qnqrle4xwsj5go8pchj31sat4', 'Direct award'), + ( + 'qw2hp8khykctdic2z58z70ru8', + 'Competitive bidding' + ), + ('tn8k8lot1bvirmztmmgq2u8hn', 'Other'); + +/*!40000 ALTER TABLE `ExportContractAwardMethod` ENABLE KEYS */ +; + +UNLOCK TABLES; # Dump of table Broker # ------------------------------------------------------------ diff --git a/e2e-tests/constants/export-contract-award-method.js b/e2e-tests/constants/export-contract-award-method.js new file mode 100644 index 0000000000..27e5361034 --- /dev/null +++ b/e2e-tests/constants/export-contract-award-method.js @@ -0,0 +1,25 @@ +/** + * List of custom "export contract award method" database IDs and values. + */ +export const EXPORT_CONTRACT_AWARD_METHOD = { + OPEN_TENDER: { + DB_ID: 'eg9qxlqw4edxa8b5mwbybsrfp', + VALUE: 'Open tender', + }, + NEGOTIATED_CONTRACT: { + DB_ID: 'mzwp337piamg1mei7fqh1o73s', + VALUE: 'Negotiated contract', + }, + DIRECT_AWARD: { + DB_ID: 'qnqrle4xwsj5go8pchj31sat4', + VALUE: 'Direct award', + }, + COMPETITIVE_BIDDING: { + DB_ID: 'qw2hp8khykctdic2z58z70ru8', + VALUE: 'Competitive bidding', + }, + OTHER: { + DB_ID: 'tn8k8lot1bvirmztmmgq2u8hn', + VALUE: 'Other', + }, +}; diff --git a/e2e-tests/constants/index.js b/e2e-tests/constants/index.js index d4900f18df..6c1eaf77fa 100644 --- a/e2e-tests/constants/index.js +++ b/e2e-tests/constants/index.js @@ -9,6 +9,7 @@ export * from './date-format'; export * from './dates'; export * from './eligibility'; export * from './examples'; +export * from './export-contract-award-method'; export * from './field-ids'; export * from './field-values'; export * from './pagination'; diff --git a/src/api/.keystone/config.js b/src/api/.keystone/config.js index bae839fbcf..38d4560289 100644 --- a/src/api/.keystone/config.js +++ b/src/api/.keystone/config.js @@ -2009,6 +2009,10 @@ var lists = { application: (0, import_fields.relationship)({ ref: "Application" }), agent: (0, import_fields.relationship)({ ref: "ExportContractAgent.exportContract" }), privateMarket: (0, import_fields.relationship)({ ref: "PrivateMarket.exportContract" }), + awardMethod: (0, import_fields.relationship)({ ref: "ExportContractAwardMethod" }), + otherAwardMethod: (0, import_fields.text)({ + db: { nativeType: "VarChar(200)" } + }), finalDestinationKnown: nullable_checkbox_default(), finalDestinationCountryCode: (0, import_fields.text)({ db: { nativeType: "VarChar(3)" } @@ -2078,6 +2082,14 @@ var lists = { }, access: import_access.allowAll }, + ExportContractAwardMethod: (0, import_core2.list)({ + fields: { + value: (0, import_fields.text)({ + db: { nativeType: "VarChar(50)" } + }) + }, + access: import_access.allowAll + }), PrivateMarket: (0, import_core2.list)({ fields: { exportContract: (0, import_fields.relationship)({ ref: "ExportContract.privateMarket" }), diff --git a/src/api/constants/export-contract-award-method/index.ts b/src/api/constants/export-contract-award-method/index.ts new file mode 100644 index 0000000000..27e5361034 --- /dev/null +++ b/src/api/constants/export-contract-award-method/index.ts @@ -0,0 +1,25 @@ +/** + * List of custom "export contract award method" database IDs and values. + */ +export const EXPORT_CONTRACT_AWARD_METHOD = { + OPEN_TENDER: { + DB_ID: 'eg9qxlqw4edxa8b5mwbybsrfp', + VALUE: 'Open tender', + }, + NEGOTIATED_CONTRACT: { + DB_ID: 'mzwp337piamg1mei7fqh1o73s', + VALUE: 'Negotiated contract', + }, + DIRECT_AWARD: { + DB_ID: 'qnqrle4xwsj5go8pchj31sat4', + VALUE: 'Direct award', + }, + COMPETITIVE_BIDDING: { + DB_ID: 'qw2hp8khykctdic2z58z70ru8', + VALUE: 'Competitive bidding', + }, + OTHER: { + DB_ID: 'tn8k8lot1bvirmztmmgq2u8hn', + VALUE: 'Other', + }, +}; diff --git a/src/api/constants/index.ts b/src/api/constants/index.ts index 24dba35117..893331028b 100644 --- a/src/api/constants/index.ts +++ b/src/api/constants/index.ts @@ -10,6 +10,7 @@ export * from './cron'; export * from './date-format'; export * from './declarations'; export * from './eligibility'; +export * from './export-contract-award-method'; export * from './external-apis'; export * from './field-values'; export * from './supported-currencies'; diff --git a/src/api/helpers/create-an-application/index.ts b/src/api/helpers/create-an-application/index.ts index 4feb3c83e5..227031785f 100644 --- a/src/api/helpers/create-an-application/index.ts +++ b/src/api/helpers/create-an-application/index.ts @@ -79,7 +79,7 @@ const createAnApplication = async (root: any, variables: CreateAnApplicationVari * 1) Create a new buyer with country and application relationship. * 2) Create a new declaration with application relationship. * 3) Get a totalContractValue DB entry, for linking a relationship to eligibility. - * 4) Create a cover period value from the DB. + * 4) Get a cover period value from the DB. * 5) Create a new eligibility with country and application relationship. * 6) Create a new export contract with application relationship. * 7) Create a new policy with application relationship. diff --git a/src/api/schema.graphql b/src/api/schema.graphql index 829e56a03c..e71955ffd9 100644 --- a/src/api/schema.graphql +++ b/src/api/schema.graphql @@ -993,6 +993,8 @@ type ExportContract { application: Application agent: ExportContractAgent privateMarket: PrivateMarket + awardMethod: ExportContractAwardMethod + otherAwardMethod: String finalDestinationKnown: Boolean finalDestinationCountryCode: String goodsOrServicesDescription: String @@ -1011,6 +1013,8 @@ input ExportContractWhereInput { application: ApplicationWhereInput agent: ExportContractAgentWhereInput privateMarket: PrivateMarketWhereInput + awardMethod: ExportContractAwardMethodWhereInput + otherAwardMethod: StringFilter finalDestinationCountryCode: StringFilter goodsOrServicesDescription: StringFilter paymentTermsDescription: StringFilter @@ -1018,6 +1022,7 @@ input ExportContractWhereInput { input ExportContractOrderByInput { id: OrderDirection + otherAwardMethod: OrderDirection finalDestinationCountryCode: OrderDirection goodsOrServicesDescription: OrderDirection paymentTermsDescription: OrderDirection @@ -1027,6 +1032,8 @@ input ExportContractUpdateInput { application: ApplicationRelateToOneForUpdateInput agent: ExportContractAgentRelateToOneForUpdateInput privateMarket: PrivateMarketRelateToOneForUpdateInput + awardMethod: ExportContractAwardMethodRelateToOneForUpdateInput + otherAwardMethod: String finalDestinationKnown: Boolean finalDestinationCountryCode: String goodsOrServicesDescription: String @@ -1045,6 +1052,12 @@ input PrivateMarketRelateToOneForUpdateInput { disconnect: Boolean } +input ExportContractAwardMethodRelateToOneForUpdateInput { + create: ExportContractAwardMethodCreateInput + connect: ExportContractAwardMethodWhereUniqueInput + disconnect: Boolean +} + input ExportContractUpdateArgs { where: ExportContractWhereUniqueInput! data: ExportContractUpdateInput! @@ -1054,6 +1067,8 @@ input ExportContractCreateInput { application: ApplicationRelateToOneForCreateInput agent: ExportContractAgentRelateToOneForCreateInput privateMarket: PrivateMarketRelateToOneForCreateInput + awardMethod: ExportContractAwardMethodRelateToOneForCreateInput + otherAwardMethod: String finalDestinationKnown: Boolean finalDestinationCountryCode: String goodsOrServicesDescription: String @@ -1070,6 +1085,11 @@ input PrivateMarketRelateToOneForCreateInput { connect: PrivateMarketWhereUniqueInput } +input ExportContractAwardMethodRelateToOneForCreateInput { + create: ExportContractAwardMethodCreateInput + connect: ExportContractAwardMethodWhereUniqueInput +} + type ExportContractAgent { id: ID! exportContract: ExportContract @@ -1266,6 +1286,41 @@ input ExportContractAgentServiceChargeCreateInput { payableCountryCode: String } +type ExportContractAwardMethod { + id: ID! + value: String +} + +input ExportContractAwardMethodWhereUniqueInput { + id: ID +} + +input ExportContractAwardMethodWhereInput { + AND: [ExportContractAwardMethodWhereInput!] + OR: [ExportContractAwardMethodWhereInput!] + NOT: [ExportContractAwardMethodWhereInput!] + id: IDFilter + value: StringFilter +} + +input ExportContractAwardMethodOrderByInput { + id: OrderDirection + value: OrderDirection +} + +input ExportContractAwardMethodUpdateInput { + value: String +} + +input ExportContractAwardMethodUpdateArgs { + where: ExportContractAwardMethodWhereUniqueInput! + data: ExportContractAwardMethodUpdateInput! +} + +input ExportContractAwardMethodCreateInput { + value: String +} + type PrivateMarket { id: ID! exportContract: ExportContract @@ -2982,6 +3037,12 @@ type Mutation { updateExportContractAgentServiceCharges(data: [ExportContractAgentServiceChargeUpdateArgs!]!): [ExportContractAgentServiceCharge] deleteExportContractAgentServiceCharge(where: ExportContractAgentServiceChargeWhereUniqueInput!): ExportContractAgentServiceCharge deleteExportContractAgentServiceCharges(where: [ExportContractAgentServiceChargeWhereUniqueInput!]!): [ExportContractAgentServiceCharge] + createExportContractAwardMethod(data: ExportContractAwardMethodCreateInput!): ExportContractAwardMethod + createExportContractAwardMethods(data: [ExportContractAwardMethodCreateInput!]!): [ExportContractAwardMethod] + updateExportContractAwardMethod(where: ExportContractAwardMethodWhereUniqueInput!, data: ExportContractAwardMethodUpdateInput!): ExportContractAwardMethod + updateExportContractAwardMethods(data: [ExportContractAwardMethodUpdateArgs!]!): [ExportContractAwardMethod] + deleteExportContractAwardMethod(where: ExportContractAwardMethodWhereUniqueInput!): ExportContractAwardMethod + deleteExportContractAwardMethods(where: [ExportContractAwardMethodWhereUniqueInput!]!): [ExportContractAwardMethod] createPrivateMarket(data: PrivateMarketCreateInput!): PrivateMarket createPrivateMarkets(data: [PrivateMarketCreateInput!]!): [PrivateMarket] updatePrivateMarket(where: PrivateMarketWhereUniqueInput!, data: PrivateMarketUpdateInput!): PrivateMarket @@ -3251,6 +3312,9 @@ type Query { exportContractAgentServiceCharges(where: ExportContractAgentServiceChargeWhereInput! = {}, orderBy: [ExportContractAgentServiceChargeOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: ExportContractAgentServiceChargeWhereUniqueInput): [ExportContractAgentServiceCharge!] exportContractAgentServiceCharge(where: ExportContractAgentServiceChargeWhereUniqueInput!): ExportContractAgentServiceCharge exportContractAgentServiceChargesCount(where: ExportContractAgentServiceChargeWhereInput! = {}): Int + exportContractAwardMethods(where: ExportContractAwardMethodWhereInput! = {}, orderBy: [ExportContractAwardMethodOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: ExportContractAwardMethodWhereUniqueInput): [ExportContractAwardMethod!] + exportContractAwardMethod(where: ExportContractAwardMethodWhereUniqueInput!): ExportContractAwardMethod + exportContractAwardMethodsCount(where: ExportContractAwardMethodWhereInput! = {}): Int privateMarkets(where: PrivateMarketWhereInput! = {}, orderBy: [PrivateMarketOrderByInput!]! = [], take: Int, skip: Int! = 0, cursor: PrivateMarketWhereUniqueInput): [PrivateMarket!] privateMarket(where: PrivateMarketWhereUniqueInput!): PrivateMarket privateMarketsCount(where: PrivateMarketWhereInput! = {}): Int diff --git a/src/api/schema.prisma b/src/api/schema.prisma index a5eea94d72..e7962ac80f 100644 --- a/src/api/schema.prisma +++ b/src/api/schema.prisma @@ -199,20 +199,24 @@ model JointlyInsuredParty { } model ExportContract { - id String @id @default(cuid()) - application Application? @relation("ExportContract_application", fields: [applicationId], references: [id]) - applicationId String? @map("application") - agent ExportContractAgent? @relation("ExportContract_agent", fields: [agentId], references: [id]) - agentId String? @unique @map("agent") - privateMarket PrivateMarket? @relation("ExportContract_privateMarket", fields: [privateMarketId], references: [id]) - privateMarketId String? @unique @map("privateMarket") + id String @id @default(cuid()) + application Application? @relation("ExportContract_application", fields: [applicationId], references: [id]) + applicationId String? @map("application") + agent ExportContractAgent? @relation("ExportContract_agent", fields: [agentId], references: [id]) + agentId String? @unique @map("agent") + privateMarket PrivateMarket? @relation("ExportContract_privateMarket", fields: [privateMarketId], references: [id]) + privateMarketId String? @unique @map("privateMarket") + awardMethod ExportContractAwardMethod? @relation("ExportContract_awardMethod", fields: [awardMethodId], references: [id]) + awardMethodId String? @map("awardMethod") + otherAwardMethod String @default("") @mysql.VarChar(200) finalDestinationKnown Boolean? - finalDestinationCountryCode String @default("") @mysql.VarChar(3) - goodsOrServicesDescription String @default("") @mysql.VarChar(1000) - paymentTermsDescription String @default("") @mysql.VarChar(1000) - from_Application_exportContract Application[] @relation("Application_exportContract") + finalDestinationCountryCode String @default("") @mysql.VarChar(3) + goodsOrServicesDescription String @default("") @mysql.VarChar(1000) + paymentTermsDescription String @default("") @mysql.VarChar(1000) + from_Application_exportContract Application[] @relation("Application_exportContract") @@index([applicationId]) + @@index([awardMethodId]) } model ExportContractAgent { @@ -245,6 +249,12 @@ model ExportContractAgentServiceCharge { payableCountryCode String @default("") @mysql.VarChar(3) } +model ExportContractAwardMethod { + id String @id @default(cuid()) + value String @default("") @mysql.VarChar(50) + from_ExportContract_awardMethod ExportContract[] @relation("ExportContract_awardMethod") +} + model PrivateMarket { id String @id @default(cuid()) exportContract ExportContract? @relation("ExportContract_privateMarket") diff --git a/src/api/schema.ts b/src/api/schema.ts index 73364b1074..a084c14965 100644 --- a/src/api/schema.ts +++ b/src/api/schema.ts @@ -367,6 +367,10 @@ export const lists = { application: relationship({ ref: 'Application' }), agent: relationship({ ref: 'ExportContractAgent.exportContract' }), privateMarket: relationship({ ref: 'PrivateMarket.exportContract' }), + awardMethod: relationship({ ref: 'ExportContractAwardMethod' }), + otherAwardMethod: text({ + db: { nativeType: 'VarChar(200)' }, + }), finalDestinationKnown: nullableCheckbox(), finalDestinationCountryCode: text({ db: { nativeType: 'VarChar(3)' }, @@ -436,6 +440,14 @@ export const lists = { }, access: allowAll, }, + ExportContractAwardMethod: list({ + fields: { + value: text({ + db: { nativeType: 'VarChar(50)' }, + }), + }, + access: allowAll, + }), PrivateMarket: list({ fields: { exportContract: relationship({ ref: 'ExportContract.privateMarket' }), diff --git a/src/ui/server/constants/export-contract-award-method.ts b/src/ui/server/constants/export-contract-award-method.ts new file mode 100644 index 0000000000..06bca48354 --- /dev/null +++ b/src/ui/server/constants/export-contract-award-method.ts @@ -0,0 +1,25 @@ +/** + * List of custom "export contract award method" database IDs and values. + */ +export const EXPORT_CONTRACT_AWARD_METHOD = { + OPEN_TENDER: { + DB_ID: 'eg9qxlqw4edxa8b5mwbybsrfp', + VALUE: 'Open tender', + }, + NEGOTIATED_CONTRACT: { + DB_ID: 'mzwp337piamg1mei7fqh1o73s', + VALUE: 'Negotiated contract', + }, + DIRECT_AWARD: { + DB_ID: 'qnqrle4xwsj5go8pchj31sat4', + VALUE: 'Direct award', + }, + COMPETITIVE_BIDDING: { + DB_ID: 'qw2hp8khykctdic2z58z70ru8', + VALUE: 'Competitive bidding', + }, + OTHER: { + DB_ID: 'tn8k8lot1bvirmztmmgq2u8hn', + VALUE: 'Other', + }, +}; diff --git a/src/ui/server/constants/index.ts b/src/ui/server/constants/index.ts index 372127f3e0..a754135853 100644 --- a/src/ui/server/constants/index.ts +++ b/src/ui/server/constants/index.ts @@ -10,6 +10,7 @@ export * from './dates'; export * from './declarations'; export * from './eligibility'; export * from './environments'; +export * from './export-contract-award-method'; export * from './external-apis'; export * from './field-ids'; export * from './field-values';