const threeDecimalPositiveString = string(/^(?:0\.(?!000)[0-9]{3}|[1-9][0-9]{0,7}\.[0-9]{3})$/); const threeDecimalPositiveZeroString = string(/^(?:0\.[0-9]{3}|[1-9][0-9]{0,7}\.[0-9]{3})$/); const threeDecimalNegativePositiveString = string(/^[-]?(?:[1-9][0-9]{0,7}\.[0-9]{3}|0\.[0-9]{3})$/); const oneDecimalPositiveString = string(/^(100(.0)?|[1-9]\d?(\.\d)?|0\.[1-9])$/); const certificateNumberType = string(/[0-9]{30}/); const productionDeviceIdType = string(/[0-9]{18}/); // v81 XSD: SupportFlagType = pattern [0-9]{1,2} (1-2 digits). Used by SupportFlag element and PreConversionProductionDevice.supportFlag. const supportFlagType = string(/^[0-9]{1,2}$/); const shortCode = string(100); const codingScheme = string(100); const longCode = string(255); const text = string(16000); const sendCertificatesTypes = shape({ messageSchema: shortCode().isRequired(), header: shape({ messageID: shortCode().isRequired(), fromRegistry: shortCode().isRequired(), toRegistry: shortCode().isRequired(), context: constant("transfer").isRequired(), messageTransmissionTime: datetime().isRequired() }).isRequired(), body: shape({ sendingAccountId: shortCode().isRequired(), sendingAccountIdCs: codingScheme(), receivingAccountId: shortCode().isRequired(), receivingAccountIdCs: codingScheme(), numberOfCertificates: number(0, null).isRequired(), // Message: 0 or 1 per body. XSD LongString max 1024 message: string(1, 1024), certificates: array(shape({ // v81: faceValue is now optional (use="optional" added), but kept for compatibility faceValue: constant("MWh"), // StartCertificateNumber startCertificateNumber: certificateNumberType().isRequired(), startCertificateNumberCs: codingScheme(), // EndCertificateNumber endCertificateNumber: certificateNumberType().isRequired(), endCertificateNumberCs: codingScheme(), issuingBody: string(1, 20).isRequired(), countryOfIssue: string(1, 20).isRequired(), dateOfIssue: date().isRequired(), // Production period productionPeriodStart: offsetDateTime().isRequired(), productionPeriodEnd: offsetDateTime().isRequired(), // v81: New attribute added productionPeriodLength: string(1, 20), energyCarrier: oneOf(["Electricity", "EnergyGas", "Hydrogen"]).isRequired(), // Conversion conversionType: string(1, 20).isRequired(), // v81: New attribute added preConversionCancellationStatement: string(1, 150), // v81: New Pre-Conversion elements // PreConversionProductionPeriod preConversionProductionPeriodStart: offsetDateTime(), preConversionProductionPeriodEnd: offsetDateTime(), preConversionProductionPeriodLength: string(1, 20), // PreConversionProductionDevice preConversionProductionDeviceId: productionDeviceIdType(), preConversionProductionDeviceName: string(1, 255), preConversionProductionDeviceTechnology: string(1, 20), preConversionProductionDeviceDateOperational: date(), preConversionProductionDeviceCapacity: threeDecimalPositiveString, preConversionProductionDeviceLabel: string(1, 20), // v81 XSD: PreConversionProductionDevice.supportFlag uses SupportFlagType [0-9]{1,2}. New in v81, no v80 compatibility needed. preConversionProductionDeviceSupportFlag: supportFlagType(), // PreConversionPDCoordinates preConversionPDLongitude: string(1, 20), preConversionPDLatitude: string(1, 20), preConversionPDCoordinateCode: string(1, 20), // PreConversionPDAddress preConversionPDCountry: string(1, 20), preConversionPDCity: string(1, 150), preConversionPDPostCode: string(1, 10), preConversionPDStreetName: string(1, 150), preConversionPDStreetNumber: string(1, 10), // PreConversionEmissions preConversionEmissions: threeDecimalPositiveZeroString, preConversionEmissionsCalculationMethod: string(1, 20), // PreConversionRadioactiveWaste preConversionRadioactiveWaste: threeDecimalPositiveString, preConversionRadioactiveWasteCalculationMethod: string(1, 20), // Storage (mandatory in v81; tag required, 1-20 characters) storageTag: string(1, 20).isRequired(), // v81: New Storage attributes storageEfficiencyFactor: oneDecimalPositiveString, storageCancellationStatement: string(1, 150), storageCancellationIssuingBody: string(1, 2), // v81: New Storage child elements // StorageSystemCoordinates storageSystemLongitude: string(1, 20), storageSystemLatitude: string(1, 20), storageSystemCoordinateCode: string(1, 20), // StorageSystemAddress storageSystemCountry: string(1, 20), storageSystemCity: string(1, 150), storageSystemPostCode: string(1, 10), storageSystemStreetName: string(1, 150), storageSystemStreetNumber: string(1, 10), // PreStorageProductionPeriod preStorageProductionPeriodStart: offsetDateTime(), preStorageProductionPeriodEnd: offsetDateTime(), preStorageProductionPeriodLength: string(1, 20), // Product (at least one required) product: array(shape({ name: string(1, 20).isRequired(), legalStatus: oneOf(["LC", "NGC"]).isRequired(), // Purpose: 1 or more per product purpose: array(oneOf(["Disclosure", "Support", "Target"]), 1, 3).isRequired(), competentAuthority: array(shape({ code: string(4), }), 10), productType: array(shape({ value: string(1, 20).isRequired(), type: oneOf(["driver", "targetType", "targetScheme"]).isRequired(), }), 10) }), 1, 10).isRequired(), // Production device productionDeviceId: productionDeviceIdType().isRequired(), productionDeviceIdCs: codingScheme(), productionDeviceName: string(1, 255), dateOperational: date().isRequired(), // Capacity electricalCapacity: threeDecimalPositiveString, mechanicalCapacity: threeDecimalPositiveString, thermalCapacity: threeDecimalPositiveString, gasProductionCapacity: threeDecimalPositiveString, // Module (ModuleCapacity mandatory, one per Module) moduleCapacity: threeDecimalPositiveString, moduleDateOperational: date(), moduleDescription: string(1, 255), // Production technology productionTechnology: string(1, 20).isRequired(), productionTechnologyCs: codingScheme(), // Energy source energySource: string(1, 20).isRequired(), energySourceCs: codingScheme(), advancedBiomassFeedstock: boolean(), sourceShares: string(1, 255), // Support flag // v81 XSD: SupportFlagType [0-9]{1,2}. v80 used xs:byte. Kept string(1, 20) for v80 compatibility - validate [0-9]{1,2} at v81 export. supportFlag: string(1, 20).isRequired(), supportFlagCs: codingScheme(), productionSupportDescription: string(1, 1024), investmentSupportDescription: string(1, 1024), // Production device location // The requested combination of coordinates parameters is checked in Val79RuleService // Coordinates productionDeviceLongitude: string(1, 20), productionDeviceLatitude: string(1, 20), productionDeviceCoordinateCode: string(1, 20), // The requested combination of address parameters is checked in Val79RuleService // Address productionDeviceCity: string(1, 150), productionDevicePostCode: string(1, 10), productionDeviceCountry: string(1, 20), // v81: New Address attributes productionDeviceStreetName: string(1, 150), productionDeviceStreetNumber: string(1, 10), // v81: Changed from TinyToken (1-20) to DisseminationLevelType (1-2) disseminationLevel: string(1, 20).isRequired(), // Cogeneration useOfHeat: string(1, 20), percentagePrimaryEnergySaved: oneDecimalPositiveString, amountPrimaryEnergySaved: threeDecimalPositiveString, overallPrimaryEnergySavings: oneDecimalPositiveString, usefulHeat: threeDecimalPositiveString, hecCriteriaMet: boolean(), electricalEfficiency: oneDecimalPositiveString, thermalEfficiency: oneDecimalPositiveString, // Gas compositionPurity: string(1, 20), gasCompositionCriteria: string(1, 20), gasUsage: string(1, 20), gasType: string(1, 20), // v81: New Gas child elements gasCriterion: string(1, 1024), etsEsrEligibility: string(2, 5), // v81: New required attribute fossilAuxiliaryDeducted: string(1, 20), // CalorificValue calorificValue: threeDecimalPositiveString, // If calorific value exists the type is required (validated in Val105RuleService) calorificValueType: oneOf(["lower", "higher"]), calorificValueUnit: string(1, 20), // GHGEmissions // GHGEmissionsProduced // GHGEmissionsProduced: 3 decimals, min -99999999.999, max 99999999.999 ghgEmissionsProduced: threeDecimalNegativePositiveString, // If ghgEmissionsProduced exists the ghgEmissionsProducedCalculationMethod is required (validated in Val109RuleService) ghgEmissionsProducedCalculationMethod: string(1, 20), ghgEmissionsProducedUnit: string(1, 20), ghgSavingsCriteriaMet: boolean(), // AbsoluteGHGEmissionsSaved absoluteGHGEmissionsSaved: threeDecimalPositiveZeroString, // If absoluteGHGEmissionsSaved exists the absoluteGHGEmissionsSavedCalculationMethod is required (validated in Val110RuleService) absoluteGHGEmissionsSavedCalculationMethod: string(1, 20), absoluteGHGEmissionsSavedUnit: string(1, 20), // RadioactiveWasteProduced radioactiveWasteProduced: threeDecimalPositiveString, radioactiveWasteCalculationMethod: string(1, 20), // Sustainability requirementReference: string(1, 20), sustainabilityScheme: string(1, 20), auditReport: string(1, 255), sustainabilityAdditionalInfo: string(1, 255), sustainabilityCriteriaMet: boolean(), certificationBody: string(1, 20), label: array(longCode(), 50), additionalInfo: string(1, 255), // v81: New elements added to Certificates sequence // BiddingZone biddingZone: string(1, 20), biddingZone90PercentageRES: boolean(), biddingZoneLowEmission: boolean(), // RedispatchingCriteriaMet redispatchingCriteriaMet: boolean(), // PowerPurchaseAgreement powerPurchaseAgreementStartDate: date(), powerPurchaseAgreementEndDate: date(), powerPurchaseAgreementBuyerId: string(1, 150), // CustomAttributes: optional; inner keys are validated by the certificate-type custom scheme customAttributes: shape({}, true), }), 50000).isRequired(), }).isRequired() });