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 shortCode = string(100); const codingScheme = string(100); const longCode = string(255); const text = string(16000); const sendCertificatesTypesV80 = 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({ faceValue: constant("MWh").isRequired(), // StartCertificateNumber startCertificateNumber: string(/[0-9]{30}/).isRequired(), startCertificateNumberCs: codingScheme(), // EndCertificateNumber endCertificateNumber: string(/[0-9]{30}/).isRequired(), endCertificateNumberCs: codingScheme(), issuingBody: string(1, 20).isRequired(), countryOfIssue: string(1, 20).isRequired(), dateOfIssue: date().isRequired(), // Production period productionPeriodStart: offsetDateTime().isRequired(), productionPeriodEnd: offsetDateTime().isRequired(), energyCarrier: oneOf(["Electricity", "EnergyGas", "Hydrogen"]).isRequired(), // Conversion conversionType: string(1, 20).isRequired(), preConversionSupportFlag: string(1, 20), // Storage: 1 per certificate, tag exactly 5 characters storageTag: string(5, 5), // 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: string(/[0-9]{18}/).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 supportFlag: string(1, 2).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), 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), // CalorificValue calorificValue: threeDecimalPositiveString, // If calorific value exists the type is required (validated in Val105RuleService) calorificValueType: oneOf(["lower", "higher"]), calorificValueUnit: string(1, 20), // GHGEmissions // 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), // CustomAttributes: optional; inner keys are validated by the certificate-type custom scheme customAttributes: shape({}, true), }), 50000).isRequired(), }).isRequired() });