From 31f6acf002c8facd9aeae6ac14fcd2b0d701a468 Mon Sep 17 00:00:00 2001 From: odscjen Date: Wed, 15 May 2024 12:28:39 +0100 Subject: [PATCH 01/15] add ImmediateContainer, Quantity and SimplyUnit, clarify Unit use --- .../release_package.json | 20 + docs/schema/reference.md | 25 +- schema/dereferenced-release-schema.json | 636 +++++++++++++++++- schema/release-schema.json | 87 ++- .../versioned-release-validation-schema.json | 143 ++++ 5 files changed, 880 insertions(+), 31 deletions(-) diff --git a/docs/examples/release_schema_reference/release_package.json b/docs/examples/release_schema_reference/release_package.json index a428e8272..31d3154f4 100644 --- a/docs/examples/release_schema_reference/release_package.json +++ b/docs/examples/release_schema_reference/release_package.json @@ -155,6 +155,26 @@ "currency": "GBP" } } + }, + { + "id": "0002", + "description": "Paint for road markings", + "classification": { + "scheme": "CPV", + "id": "44811000", + "description": "Road paint", + "uri": "http://cpv.data.ac.uk/code-44811000" + }, + "immediateContainer": { + "name": "Can/Tin", + "capacity": { + "unit": { + "scheme": "UNCEFACT", + "id": "GLI" + }, + "value": "[100,100]" + } + } } ], "value": { diff --git a/docs/schema/reference.md b/docs/schema/reference.md index 22cfafe62..cc9b07dcd 100644 --- a/docs/schema/reference.md +++ b/docs/schema/reference.md @@ -537,11 +537,11 @@ The items block is used to list the line-items associated with a tender, award o #### Unit -The `unit` block allows detailed specification of the parameters and price of units that make up a line-item. +The `unit` block allows detailed specification of the parameters and price of units that make up a line-item. It should be used for units of measurement only. For units of presentation it is recommended to use the `ImmediateContainer` subschema. -If the [Quantities, Units, Dimensions and Data Types Ontologies](https://www.qudt.org) unit classification scheme is used, then publishers can use its CamelCase unit names, such as "SquareMile", in the `unit.name` field. +If the [Quantities, Units, Dimensions and Data Types Ontologies](https://www.qudt.org) unit classification scheme is used, then publishers may use its CamelCase unit names, such as "SquareMile", in the `unit.name` field. -Other unit classification schemes can be used, including those in the [unitClassificationScheme codelist](codelists.md#unit-classification-scheme). +Other unit classification schemes may be used, including those in the [unitClassificationScheme codelist](codelists.md#unit-classification-scheme). ````{admonition} Example :class: hint @@ -558,6 +558,25 @@ Other unit classification schemes can be used, including those in the [unitClass :collapse: value ``` +#### ImmediateContainer + +The `ImmediateContainer` subschema allows detailed specification of the immediate container of an item. This is also known as the presentation, the presentation form, the package. For units of measurement it is recommended to use the `Unit` subschema. + +````{admonition} Example +:class: hint + +```{jsoninclude} ../examples/release_schema_reference/release_package.json +:jsonpointer: /releases/0/tender/items/1 +:expand: immediateContainer +:title: immediateContainer +``` +```` + +```{jsonschema} ../../build/current_lang/release-schema.json +:pointer: /definitions/Item/properties/immediateContainer +:collapse: capacity +``` + ### Classification ````{admonition} Example diff --git a/schema/dereferenced-release-schema.json b/schema/dereferenced-release-schema.json index 8ea5d2834..3afe0cb86 100644 --- a/schema/dereferenced-release-schema.json +++ b/schema/dereferenced-release-schema.json @@ -3078,7 +3078,7 @@ }, "unit": { "title": "Unit", - "description": "A description of the unit in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price.", + "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", "type": "object", "properties": { "scheme": { @@ -3101,7 +3101,7 @@ }, "name": { "title": "Name", - "description": "Name of the unit.", + "description": "The name of the unit.", "type": [ "string", "null" @@ -3455,7 +3455,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the scheme.", + "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", "format": "uri", "type": [ "string", @@ -3463,6 +3463,70 @@ ] } } + }, + "immediateContainer": { + "title": "Immediate container", + "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "type": "object", + "properties": { + "name": { + "title": "Name", + "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "type": [ + "string", + "null" + ], + "minLength": 1 + }, + "capacity": { + "title": "Capacity", + "description": "The storage capacity of the container.", + "type": "object", + "properties": { + "unit": { + "title": "Unit", + "description": "The unit of measurement for the quantity.", + "type": "object", + "properties": { + "scheme": { + "title": "Scheme", + "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "type": [ + "string", + "null" + ], + "codelist": "unitClassificationScheme.csv", + "openCodelist": true, + "minLength": 1 + }, + "id": { + "title": "ID", + "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "type": [ + "string", + "null" + ], + "versionId": true, + "minLength": 1 + } + }, + "minProperties": 1 + }, + "value": { + "title": "Value", + "description": "The quantity, as a multiple of the unit of measurement. The quantity is expressed in interval notation, for example: \"[10,10]\" for 10 units, \"[1,10]\" for 1 to 10 units, or \"[10,INF[\" for 10 or more units.", + "type": [ + "string", + "number", + "null" + ], + "pattern": "^[([\\]][0-9]+,([0-9]+|INF)[)[\\]]$" + } + }, + "minProperties": 1 + } + }, + "minProperties": 1 } } }, @@ -8099,7 +8163,7 @@ }, "unit": { "title": "Unit", - "description": "A description of the unit in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price.", + "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", "type": "object", "properties": { "scheme": { @@ -8122,7 +8186,7 @@ }, "name": { "title": "Name", - "description": "Name of the unit.", + "description": "The name of the unit.", "type": [ "string", "null" @@ -8476,7 +8540,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the scheme.", + "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", "format": "uri", "type": [ "string", @@ -8484,6 +8548,70 @@ ] } } + }, + "immediateContainer": { + "title": "Immediate container", + "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "type": "object", + "properties": { + "name": { + "title": "Name", + "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "type": [ + "string", + "null" + ], + "minLength": 1 + }, + "capacity": { + "title": "Capacity", + "description": "The storage capacity of the container.", + "type": "object", + "properties": { + "unit": { + "title": "Unit", + "description": "The unit of measurement for the quantity.", + "type": "object", + "properties": { + "scheme": { + "title": "Scheme", + "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "type": [ + "string", + "null" + ], + "codelist": "unitClassificationScheme.csv", + "openCodelist": true, + "minLength": 1 + }, + "id": { + "title": "ID", + "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "type": [ + "string", + "null" + ], + "versionId": true, + "minLength": 1 + } + }, + "minProperties": 1 + }, + "value": { + "title": "Value", + "description": "The quantity, as a multiple of the unit of measurement. The quantity is expressed in interval notation, for example: \"[10,10]\" for 10 units, \"[1,10]\" for 1 to 10 units, or \"[10,INF[\" for 10 or more units.", + "type": [ + "string", + "number", + "null" + ], + "pattern": "^[([\\]][0-9]+,([0-9]+|INF)[)[\\]]$" + } + }, + "minProperties": 1 + } + }, + "minProperties": 1 } } }, @@ -10159,7 +10287,7 @@ }, "unit": { "title": "Unit", - "description": "A description of the unit in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price.", + "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", "type": "object", "properties": { "scheme": { @@ -10182,7 +10310,7 @@ }, "name": { "title": "Name", - "description": "Name of the unit.", + "description": "The name of the unit.", "type": [ "string", "null" @@ -10536,7 +10664,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the scheme.", + "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", "format": "uri", "type": [ "string", @@ -10544,6 +10672,70 @@ ] } } + }, + "immediateContainer": { + "title": "Immediate container", + "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "type": "object", + "properties": { + "name": { + "title": "Name", + "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "type": [ + "string", + "null" + ], + "minLength": 1 + }, + "capacity": { + "title": "Capacity", + "description": "The storage capacity of the container.", + "type": "object", + "properties": { + "unit": { + "title": "Unit", + "description": "The unit of measurement for the quantity.", + "type": "object", + "properties": { + "scheme": { + "title": "Scheme", + "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "type": [ + "string", + "null" + ], + "codelist": "unitClassificationScheme.csv", + "openCodelist": true, + "minLength": 1 + }, + "id": { + "title": "ID", + "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "type": [ + "string", + "null" + ], + "versionId": true, + "minLength": 1 + } + }, + "minProperties": 1 + }, + "value": { + "title": "Value", + "description": "The quantity, as a multiple of the unit of measurement. The quantity is expressed in interval notation, for example: \"[10,10]\" for 10 units, \"[1,10]\" for 1 to 10 units, or \"[10,INF[\" for 10 or more units.", + "type": [ + "string", + "number", + "null" + ], + "pattern": "^[([\\]][0-9]+,([0-9]+|INF)[)[\\]]$" + } + }, + "minProperties": 1 + } + }, + "minProperties": 1 } } }, @@ -16150,7 +16342,7 @@ }, "unit": { "title": "Unit", - "description": "A description of the unit in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price.", + "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", "type": "object", "properties": { "scheme": { @@ -16173,7 +16365,7 @@ }, "name": { "title": "Name", - "description": "Name of the unit.", + "description": "The name of the unit.", "type": [ "string", "null" @@ -16527,7 +16719,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the scheme.", + "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", "format": "uri", "type": [ "string", @@ -16535,6 +16727,70 @@ ] } } + }, + "immediateContainer": { + "title": "Immediate container", + "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "type": "object", + "properties": { + "name": { + "title": "Name", + "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "type": [ + "string", + "null" + ], + "minLength": 1 + }, + "capacity": { + "title": "Capacity", + "description": "The storage capacity of the container.", + "type": "object", + "properties": { + "unit": { + "title": "Unit", + "description": "The unit of measurement for the quantity.", + "type": "object", + "properties": { + "scheme": { + "title": "Scheme", + "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "type": [ + "string", + "null" + ], + "codelist": "unitClassificationScheme.csv", + "openCodelist": true, + "minLength": 1 + }, + "id": { + "title": "ID", + "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "type": [ + "string", + "null" + ], + "versionId": true, + "minLength": 1 + } + }, + "minProperties": 1 + }, + "value": { + "title": "Value", + "description": "The quantity, as a multiple of the unit of measurement. The quantity is expressed in interval notation, for example: \"[10,10]\" for 10 units, \"[1,10]\" for 1 to 10 units, or \"[10,INF[\" for 10 or more units.", + "type": [ + "string", + "number", + "null" + ], + "pattern": "^[([\\]][0-9]+,([0-9]+|INF)[)[\\]]$" + } + }, + "minProperties": 1 + } + }, + "minProperties": 1 } } }, @@ -21167,7 +21423,7 @@ }, "unit": { "title": "Unit", - "description": "A description of the unit in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price.", + "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", "type": "object", "properties": { "scheme": { @@ -21190,7 +21446,7 @@ }, "name": { "title": "Name", - "description": "Name of the unit.", + "description": "The name of the unit.", "type": [ "string", "null" @@ -21544,7 +21800,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the scheme.", + "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", "format": "uri", "type": [ "string", @@ -21552,6 +21808,70 @@ ] } } + }, + "immediateContainer": { + "title": "Immediate container", + "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "type": "object", + "properties": { + "name": { + "title": "Name", + "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "type": [ + "string", + "null" + ], + "minLength": 1 + }, + "capacity": { + "title": "Capacity", + "description": "The storage capacity of the container.", + "type": "object", + "properties": { + "unit": { + "title": "Unit", + "description": "The unit of measurement for the quantity.", + "type": "object", + "properties": { + "scheme": { + "title": "Scheme", + "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "type": [ + "string", + "null" + ], + "codelist": "unitClassificationScheme.csv", + "openCodelist": true, + "minLength": 1 + }, + "id": { + "title": "ID", + "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "type": [ + "string", + "null" + ], + "versionId": true, + "minLength": 1 + } + }, + "minProperties": 1 + }, + "value": { + "title": "Value", + "description": "The quantity, as a multiple of the unit of measurement. The quantity is expressed in interval notation, for example: \"[10,10]\" for 10 units, \"[1,10]\" for 1 to 10 units, or \"[10,INF[\" for 10 or more units.", + "type": [ + "string", + "number", + "null" + ], + "pattern": "^[([\\]][0-9]+,([0-9]+|INF)[)[\\]]$" + } + }, + "minProperties": 1 + } + }, + "minProperties": 1 } } }, @@ -23221,7 +23541,7 @@ }, "unit": { "title": "Unit", - "description": "A description of the unit in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price.", + "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", "type": "object", "properties": { "scheme": { @@ -23244,7 +23564,7 @@ }, "name": { "title": "Name", - "description": "Name of the unit.", + "description": "The name of the unit.", "type": [ "string", "null" @@ -23598,7 +23918,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the scheme.", + "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", "format": "uri", "type": [ "string", @@ -23606,6 +23926,70 @@ ] } } + }, + "immediateContainer": { + "title": "Immediate container", + "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "type": "object", + "properties": { + "name": { + "title": "Name", + "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "type": [ + "string", + "null" + ], + "minLength": 1 + }, + "capacity": { + "title": "Capacity", + "description": "The storage capacity of the container.", + "type": "object", + "properties": { + "unit": { + "title": "Unit", + "description": "The unit of measurement for the quantity.", + "type": "object", + "properties": { + "scheme": { + "title": "Scheme", + "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "type": [ + "string", + "null" + ], + "codelist": "unitClassificationScheme.csv", + "openCodelist": true, + "minLength": 1 + }, + "id": { + "title": "ID", + "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "type": [ + "string", + "null" + ], + "versionId": true, + "minLength": 1 + } + }, + "minProperties": 1 + }, + "value": { + "title": "Value", + "description": "The quantity, as a multiple of the unit of measurement. The quantity is expressed in interval notation, for example: \"[10,10]\" for 10 units, \"[1,10]\" for 1 to 10 units, or \"[10,INF[\" for 10 or more units.", + "type": [ + "string", + "number", + "null" + ], + "pattern": "^[([\\]][0-9]+,([0-9]+|INF)[)[\\]]$" + } + }, + "minProperties": 1 + } + }, + "minProperties": 1 } } }, @@ -33839,7 +34223,7 @@ }, "unit": { "title": "Unit", - "description": "A description of the unit in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price.", + "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", "type": "object", "properties": { "scheme": { @@ -33862,7 +34246,7 @@ }, "name": { "title": "Name", - "description": "Name of the unit.", + "description": "The name of the unit.", "type": [ "string", "null" @@ -34216,7 +34600,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the scheme.", + "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", "format": "uri", "type": [ "string", @@ -34224,6 +34608,70 @@ ] } } + }, + "immediateContainer": { + "title": "Immediate container", + "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "type": "object", + "properties": { + "name": { + "title": "Name", + "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "type": [ + "string", + "null" + ], + "minLength": 1 + }, + "capacity": { + "title": "Capacity", + "description": "The storage capacity of the container.", + "type": "object", + "properties": { + "unit": { + "title": "Unit", + "description": "The unit of measurement for the quantity.", + "type": "object", + "properties": { + "scheme": { + "title": "Scheme", + "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "type": [ + "string", + "null" + ], + "codelist": "unitClassificationScheme.csv", + "openCodelist": true, + "minLength": 1 + }, + "id": { + "title": "ID", + "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "type": [ + "string", + "null" + ], + "versionId": true, + "minLength": 1 + } + }, + "minProperties": 1 + }, + "value": { + "title": "Value", + "description": "The quantity, as a multiple of the unit of measurement. The quantity is expressed in interval notation, for example: \"[10,10]\" for 10 units, \"[1,10]\" for 1 to 10 units, or \"[10,INF[\" for 10 or more units.", + "type": [ + "string", + "number", + "null" + ], + "pattern": "^[([\\]][0-9]+,([0-9]+|INF)[)[\\]]$" + } + }, + "minProperties": 1 + } + }, + "minProperties": 1 } } }, @@ -35210,7 +35658,7 @@ }, "Unit": { "title": "Unit", - "description": "A description of the unit in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price.", + "description": "A description of the unit in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This object should be used for units of measurement only. For units of presentation it is recommended to use the `ImmediateContainer` object.", "type": "object", "properties": { "scheme": { @@ -35233,7 +35681,7 @@ }, "name": { "title": "Name", - "description": "Name of the unit.", + "description": "The name of the unit.", "type": [ "string", "null" @@ -35587,7 +36035,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the scheme.", + "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", "format": "uri", "type": [ "string", @@ -35596,6 +36044,146 @@ } } }, + "ImmediateContainer": { + "title": "Immediate container", + "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "type": "object", + "properties": { + "name": { + "title": "Name", + "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "type": [ + "string", + "null" + ], + "minLength": 1 + }, + "capacity": { + "title": "Capacity", + "description": "The storage capacity of the container.", + "type": "object", + "properties": { + "unit": { + "title": "Unit", + "description": "The unit of measurement for the quantity.", + "type": "object", + "properties": { + "scheme": { + "title": "Scheme", + "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "type": [ + "string", + "null" + ], + "codelist": "unitClassificationScheme.csv", + "openCodelist": true, + "minLength": 1 + }, + "id": { + "title": "ID", + "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "type": [ + "string", + "null" + ], + "versionId": true, + "minLength": 1 + } + }, + "minProperties": 1 + }, + "value": { + "title": "Value", + "description": "The quantity, as a multiple of the unit of measurement. The quantity is expressed in interval notation, for example: \"[10,10]\" for 10 units, \"[1,10]\" for 1 to 10 units, or \"[10,INF[\" for 10 or more units.", + "type": [ + "string", + "number", + "null" + ], + "pattern": "^[([\\]][0-9]+,([0-9]+|INF)[)[\\]]$" + } + }, + "minProperties": 1 + } + }, + "minProperties": 1 + }, + "Quantity": { + "title": "Quantity", + "description": "The quantity of a thing.", + "type": "object", + "properties": { + "unit": { + "title": "Unit", + "description": "The unit of measurement for the quantity.", + "type": "object", + "properties": { + "scheme": { + "title": "Scheme", + "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "type": [ + "string", + "null" + ], + "codelist": "unitClassificationScheme.csv", + "openCodelist": true, + "minLength": 1 + }, + "id": { + "title": "ID", + "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "type": [ + "string", + "null" + ], + "versionId": true, + "minLength": 1 + } + }, + "minProperties": 1 + }, + "value": { + "title": "Value", + "description": "The quantity, as a multiple of the unit of measurement. The quantity is expressed in interval notation, for example: \"[10,10]\" for 10 units, \"[1,10]\" for 1 to 10 units, or \"[10,INF[\" for 10 or more units.", + "type": [ + "string", + "number", + "null" + ], + "pattern": "^[([\\]][0-9]+,([0-9]+|INF)[)[\\]]$" + } + }, + "minProperties": 1 + }, + "SimpleUnit": { + "title": "Simple unit", + "description": "A unit of measurement.", + "type": "object", + "properties": { + "scheme": { + "title": "Scheme", + "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "type": [ + "string", + "null" + ], + "codelist": "unitClassificationScheme.csv", + "openCodelist": true, + "minLength": 1 + }, + "id": { + "title": "ID", + "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "type": [ + "string", + "null" + ], + "versionId": true, + "minLength": 1 + } + }, + "minProperties": 1 + }, "Link": { "title": "Link", "description": "A reference to a related resource.", diff --git a/schema/release-schema.json b/schema/release-schema.json index 9a87855bc..bf059b2e2 100644 --- a/schema/release-schema.json +++ b/schema/release-schema.json @@ -1603,8 +1603,13 @@ }, "unit": { "title": "Unit", - "description": "A description of the unit in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price.", + "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", "$ref": "#/definitions/Unit" + }, + "immediateContainer": { + "title": "Immediate container", + "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "$ref": "#/definitions/ImmediateContainer" } } }, @@ -2591,7 +2596,7 @@ }, "Unit": { "title": "Unit", - "description": "A description of the unit in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price.", + "description": "A description of the unit in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This object should be used for units of measurement only. For units of presentation it is recommended to use the `ImmediateContainer` object.", "type": "object", "properties": { "scheme": { @@ -2614,7 +2619,7 @@ }, "name": { "title": "Name", - "description": "Name of the unit.", + "description": "The name of the unit.", "type": [ "string", "null" @@ -2627,7 +2632,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the scheme.", + "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", "format": "uri", "type": [ "string", @@ -2636,6 +2641,80 @@ } } }, + "ImmediateContainer": { + "title": "Immediate container", + "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "type": "object", + "properties": { + "name": { + "title": "Name", + "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "type": [ + "string", + "null" + ], + "minLength": 1 + }, + "capacity": { + "title": "Capacity", + "description": "The storage capacity of the container.", + "$ref": "#/definitions/Quantity" + } + }, + "minProperties": 1 + }, + "Quantity": { + "title": "Quantity", + "description": "The quantity of a thing.", + "type": "object", + "properties": { + "unit": { + "title": "Unit", + "description": "The unit of measurement for the quantity.", + "$ref": "#/definitions/SimpleUnit" + }, + "value": { + "title": "Value", + "description": "The quantity, as a multiple of the unit of measurement. The quantity is expressed in interval notation, for example: \"[10,10]\" for 10 units, \"[1,10]\" for 1 to 10 units, or \"[10,INF[\" for 10 or more units.", + "type": [ + "string", + "number", + "null" + ], + "pattern": "^[([\\]][0-9]+,([0-9]+|INF)[)[\\]]$" + } + }, + "minProperties": 1 + }, + "SimpleUnit": { + "title": "Simple unit", + "description": "A unit of measurement.", + "type": "object", + "properties": { + "scheme": { + "title": "Scheme", + "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "type": [ + "string", + "null" + ], + "codelist": "unitClassificationScheme.csv", + "openCodelist": true, + "minLength": 1 + }, + "id": { + "title": "ID", + "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "type": [ + "string", + "null" + ], + "versionId": true, + "minLength": 1 + } + }, + "minProperties": 1 + }, "Link": { "title": "Link", "description": "A reference to a related resource.", diff --git a/schema/versioned-release-validation-schema.json b/schema/versioned-release-validation-schema.json index 3f0c16627..260a92b29 100644 --- a/schema/versioned-release-validation-schema.json +++ b/schema/versioned-release-validation-schema.json @@ -1874,6 +1874,9 @@ }, "unit": { "$ref": "#/definitions/Unit" + }, + "immediateContainer": { + "$ref": "#/definitions/ImmediateContainer" } } }, @@ -2973,6 +2976,146 @@ } } }, + "ImmediateContainer": { + "type": "object", + "properties": { + "name": { + "type": "array", + "items": { + "type": "object", + "properties": { + "releaseDate": { + "format": "date-time", + "type": "string" + }, + "releaseID": { + "type": "string" + }, + "value": { + "type": [ + "string", + "null" + ], + "minLength": 1 + }, + "releaseTag": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "capacity": { + "$ref": "#/definitions/Quantity" + } + }, + "minProperties": 1 + }, + "Quantity": { + "type": "object", + "properties": { + "unit": { + "$ref": "#/definitions/SimpleUnit" + }, + "value": { + "type": "array", + "items": { + "type": "object", + "properties": { + "releaseDate": { + "format": "date-time", + "type": "string" + }, + "releaseID": { + "type": "string" + }, + "value": { + "type": [ + "string", + "number", + "null" + ], + "pattern": "^[([\\]][0-9]+,([0-9]+|INF)[)[\\]]$" + }, + "releaseTag": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "minProperties": 1 + }, + "SimpleUnit": { + "type": "object", + "properties": { + "scheme": { + "type": "array", + "items": { + "type": "object", + "properties": { + "releaseDate": { + "format": "date-time", + "type": "string" + }, + "releaseID": { + "type": "string" + }, + "value": { + "type": [ + "string", + "null" + ], + "codelist": "unitClassificationScheme.csv", + "openCodelist": true, + "minLength": 1 + }, + "releaseTag": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "id": { + "type": "array", + "items": { + "type": "object", + "properties": { + "releaseDate": { + "format": "date-time", + "type": "string" + }, + "releaseID": { + "type": "string" + }, + "value": { + "type": [ + "string", + "null" + ], + "versionId": true, + "minLength": 1 + }, + "releaseTag": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "minProperties": 1 + }, "Link": { "type": "object", "properties": { From 71c1b3fdcfea46de1bb93bac133e104d0584c9f1 Mon Sep 17 00:00:00 2001 From: Jen Harris <95221058+odscjen@users.noreply.github.com> Date: Wed, 15 May 2024 15:07:07 +0100 Subject: [PATCH 02/15] Apply suggestions from code review Co-authored-by: James McKinney <26463+jpmckinney@users.noreply.github.com> --- docs/schema/reference.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/schema/reference.md b/docs/schema/reference.md index cc9b07dcd..808fc99f4 100644 --- a/docs/schema/reference.md +++ b/docs/schema/reference.md @@ -537,7 +537,7 @@ The items block is used to list the line-items associated with a tender, award o #### Unit -The `unit` block allows detailed specification of the parameters and price of units that make up a line-item. It should be used for units of measurement only. For units of presentation it is recommended to use the `ImmediateContainer` subschema. +The `unit` subschema allows detailed specification of the parameters and price of units that make up a line-item. It should be used for units of measurement only. For units of presentation, use the [`ImmediateContainer` subschema](#immediatecontainer), which is used by the [`Item.immediateContainer` field](#item). If the [Quantities, Units, Dimensions and Data Types Ontologies](https://www.qudt.org) unit classification scheme is used, then publishers may use its CamelCase unit names, such as "SquareMile", in the `unit.name` field. @@ -560,7 +560,7 @@ Other unit classification schemes may be used, including those in the [unitClass #### ImmediateContainer -The `ImmediateContainer` subschema allows detailed specification of the immediate container of an item. This is also known as the presentation, the presentation form, the package. For units of measurement it is recommended to use the `Unit` subschema. +The `ImmediateContainer` subschema allows detailed specification of the immediate container of an item. This is also called the presentation, presentation form, or package. For units of measurement, use the [`Unit` subschema](#unit). ````{admonition} Example :class: hint From d093624cbcacd7b3ad9427bc8a5b4e7a5f5d9fb4 Mon Sep 17 00:00:00 2001 From: odscjen Date: Wed, 15 May 2024 15:21:53 +0100 Subject: [PATCH 03/15] add definition of unit of measurement to reference.md --- docs/schema/reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/schema/reference.md b/docs/schema/reference.md index 808fc99f4..370b1d754 100644 --- a/docs/schema/reference.md +++ b/docs/schema/reference.md @@ -537,7 +537,7 @@ The items block is used to list the line-items associated with a tender, award o #### Unit -The `unit` subschema allows detailed specification of the parameters and price of units that make up a line-item. It should be used for units of measurement only. For units of presentation, use the [`ImmediateContainer` subschema](#immediatecontainer), which is used by the [`Item.immediateContainer` field](#item). +The `unit` subschema allows detailed specification of the parameters and price of units that make up a line-item. It should be used for units of measurement only. A unit of measurement is a definite magnitude of a quantity, defined and adopted by convention, that is used as a standard of measurement for the same kind of quantity. For example weight is a physical quantity, and the kilogram can be used as a unit of measurement for weight. For units of presentation, use the [`ImmediateContainer` subschema](#immediatecontainer), which is used by the [`Item.immediateContainer` field](#item). If the [Quantities, Units, Dimensions and Data Types Ontologies](https://www.qudt.org) unit classification scheme is used, then publishers may use its CamelCase unit names, such as "SquareMile", in the `unit.name` field. From c0f177d8ce19bf5b9fa70e27dcbafec20965e4ef Mon Sep 17 00:00:00 2001 From: James McKinney <26463+jpmckinney@users.noreply.github.com> Date: Wed, 12 Jun 2024 17:48:53 -0400 Subject: [PATCH 04/15] release-schema: Unit of presentation is allowed, but discouraged. Link to immediateContainer codelist. Align SimpleUnit, Unit, Classification. --- manage.py | 6 +- schema/dereferenced-release-schema.json | 136 ++++++++++++------------ schema/release-schema.json | 20 ++-- 3 files changed, 83 insertions(+), 79 deletions(-) diff --git a/manage.py b/manage.py index 6b018148f..3bce47b69 100755 --- a/manage.py +++ b/manage.py @@ -228,7 +228,11 @@ def _add_versioned(schema, unversioned_pointers, pointer, key, value): types = coerce_to_list(value, 'type') # If a type is unrecognized, we might need to update this script. - if '$ref' not in value and types not in recognized_types: + if ( + '$ref' not in value + and types not in recognized_types + and not (pointer == '/definitions/Quantity/properties/value' and types == ['string', 'number', 'null']) + ): warnings.warn(f'{pointer} has unrecognized type {types}') # For example, if $ref is used. diff --git a/schema/dereferenced-release-schema.json b/schema/dereferenced-release-schema.json index 3afe0cb86..cf02311f6 100644 --- a/schema/dereferenced-release-schema.json +++ b/schema/dereferenced-release-schema.json @@ -3077,13 +3077,13 @@ ] }, "unit": { - "title": "Unit", - "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", + "title": "Pricing unit", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", "type": "object", "properties": { "scheme": { "title": "Scheme", - "description": "The list from which identifiers for units of measure are taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended for a unit of measurement.", "type": [ "string", "null" @@ -3093,7 +3093,7 @@ }, "id": { "title": "ID", - "description": "The identifier from the codelist referenced in the `scheme` field. Check the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find and use identifiers from the scheme in use.", + "description": "The identifier for the unit, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -3455,7 +3455,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", + "description": "A URI to uniquely identify the unit.", "format": "uri", "type": [ "string", @@ -3471,7 +3471,7 @@ "properties": { "name": { "title": "Name", - "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "description": "The common name of the container. For medicine items, it is recommended to use a title from the [immediateContainer](https://extensions.open-contracting.org/en/extensions/medicine/master/codelists/#immediateContainer.csv) codelist in the OCDS [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension. For other items, it is recommended to use a title from PackageTypeCodelist in the GS1 [Global Data Synchronisation Network (GDSN)](https://www.gs1.org/standards/gdsn) standard.", "type": [ "string", "null" @@ -3490,7 +3490,7 @@ "properties": { "scheme": { "title": "Scheme", - "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", "type": [ "string", "null" @@ -3501,7 +3501,7 @@ }, "id": { "title": "ID", - "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "description": "The identifier for the unit of measurement, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -8162,13 +8162,13 @@ ] }, "unit": { - "title": "Unit", - "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", + "title": "Pricing unit", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", "type": "object", "properties": { "scheme": { "title": "Scheme", - "description": "The list from which identifiers for units of measure are taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended for a unit of measurement.", "type": [ "string", "null" @@ -8178,7 +8178,7 @@ }, "id": { "title": "ID", - "description": "The identifier from the codelist referenced in the `scheme` field. Check the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find and use identifiers from the scheme in use.", + "description": "The identifier for the unit, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -8540,7 +8540,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", + "description": "A URI to uniquely identify the unit.", "format": "uri", "type": [ "string", @@ -8556,7 +8556,7 @@ "properties": { "name": { "title": "Name", - "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "description": "The common name of the container. For medicine items, it is recommended to use a title from the [immediateContainer](https://extensions.open-contracting.org/en/extensions/medicine/master/codelists/#immediateContainer.csv) codelist in the OCDS [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension. For other items, it is recommended to use a title from PackageTypeCodelist in the GS1 [Global Data Synchronisation Network (GDSN)](https://www.gs1.org/standards/gdsn) standard.", "type": [ "string", "null" @@ -8575,7 +8575,7 @@ "properties": { "scheme": { "title": "Scheme", - "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", "type": [ "string", "null" @@ -8586,7 +8586,7 @@ }, "id": { "title": "ID", - "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "description": "The identifier for the unit of measurement, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -10286,13 +10286,13 @@ ] }, "unit": { - "title": "Unit", - "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", + "title": "Pricing unit", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", "type": "object", "properties": { "scheme": { "title": "Scheme", - "description": "The list from which identifiers for units of measure are taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended for a unit of measurement.", "type": [ "string", "null" @@ -10302,7 +10302,7 @@ }, "id": { "title": "ID", - "description": "The identifier from the codelist referenced in the `scheme` field. Check the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find and use identifiers from the scheme in use.", + "description": "The identifier for the unit, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -10664,7 +10664,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", + "description": "A URI to uniquely identify the unit.", "format": "uri", "type": [ "string", @@ -10680,7 +10680,7 @@ "properties": { "name": { "title": "Name", - "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "description": "The common name of the container. For medicine items, it is recommended to use a title from the [immediateContainer](https://extensions.open-contracting.org/en/extensions/medicine/master/codelists/#immediateContainer.csv) codelist in the OCDS [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension. For other items, it is recommended to use a title from PackageTypeCodelist in the GS1 [Global Data Synchronisation Network (GDSN)](https://www.gs1.org/standards/gdsn) standard.", "type": [ "string", "null" @@ -10699,7 +10699,7 @@ "properties": { "scheme": { "title": "Scheme", - "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", "type": [ "string", "null" @@ -10710,7 +10710,7 @@ }, "id": { "title": "ID", - "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "description": "The identifier for the unit of measurement, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -16341,13 +16341,13 @@ ] }, "unit": { - "title": "Unit", - "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", + "title": "Pricing unit", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", "type": "object", "properties": { "scheme": { "title": "Scheme", - "description": "The list from which identifiers for units of measure are taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended for a unit of measurement.", "type": [ "string", "null" @@ -16357,7 +16357,7 @@ }, "id": { "title": "ID", - "description": "The identifier from the codelist referenced in the `scheme` field. Check the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find and use identifiers from the scheme in use.", + "description": "The identifier for the unit, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -16719,7 +16719,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", + "description": "A URI to uniquely identify the unit.", "format": "uri", "type": [ "string", @@ -16735,7 +16735,7 @@ "properties": { "name": { "title": "Name", - "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "description": "The common name of the container. For medicine items, it is recommended to use a title from the [immediateContainer](https://extensions.open-contracting.org/en/extensions/medicine/master/codelists/#immediateContainer.csv) codelist in the OCDS [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension. For other items, it is recommended to use a title from PackageTypeCodelist in the GS1 [Global Data Synchronisation Network (GDSN)](https://www.gs1.org/standards/gdsn) standard.", "type": [ "string", "null" @@ -16754,7 +16754,7 @@ "properties": { "scheme": { "title": "Scheme", - "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", "type": [ "string", "null" @@ -16765,7 +16765,7 @@ }, "id": { "title": "ID", - "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "description": "The identifier for the unit of measurement, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -21422,13 +21422,13 @@ ] }, "unit": { - "title": "Unit", - "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", + "title": "Pricing unit", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", "type": "object", "properties": { "scheme": { "title": "Scheme", - "description": "The list from which identifiers for units of measure are taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended for a unit of measurement.", "type": [ "string", "null" @@ -21438,7 +21438,7 @@ }, "id": { "title": "ID", - "description": "The identifier from the codelist referenced in the `scheme` field. Check the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find and use identifiers from the scheme in use.", + "description": "The identifier for the unit, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -21800,7 +21800,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", + "description": "A URI to uniquely identify the unit.", "format": "uri", "type": [ "string", @@ -21816,7 +21816,7 @@ "properties": { "name": { "title": "Name", - "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "description": "The common name of the container. For medicine items, it is recommended to use a title from the [immediateContainer](https://extensions.open-contracting.org/en/extensions/medicine/master/codelists/#immediateContainer.csv) codelist in the OCDS [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension. For other items, it is recommended to use a title from PackageTypeCodelist in the GS1 [Global Data Synchronisation Network (GDSN)](https://www.gs1.org/standards/gdsn) standard.", "type": [ "string", "null" @@ -21835,7 +21835,7 @@ "properties": { "scheme": { "title": "Scheme", - "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", "type": [ "string", "null" @@ -21846,7 +21846,7 @@ }, "id": { "title": "ID", - "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "description": "The identifier for the unit of measurement, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -23540,13 +23540,13 @@ ] }, "unit": { - "title": "Unit", - "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", + "title": "Pricing unit", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", "type": "object", "properties": { "scheme": { "title": "Scheme", - "description": "The list from which identifiers for units of measure are taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended for a unit of measurement.", "type": [ "string", "null" @@ -23556,7 +23556,7 @@ }, "id": { "title": "ID", - "description": "The identifier from the codelist referenced in the `scheme` field. Check the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find and use identifiers from the scheme in use.", + "description": "The identifier for the unit, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -23918,7 +23918,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", + "description": "A URI to uniquely identify the unit.", "format": "uri", "type": [ "string", @@ -23934,7 +23934,7 @@ "properties": { "name": { "title": "Name", - "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "description": "The common name of the container. For medicine items, it is recommended to use a title from the [immediateContainer](https://extensions.open-contracting.org/en/extensions/medicine/master/codelists/#immediateContainer.csv) codelist in the OCDS [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension. For other items, it is recommended to use a title from PackageTypeCodelist in the GS1 [Global Data Synchronisation Network (GDSN)](https://www.gs1.org/standards/gdsn) standard.", "type": [ "string", "null" @@ -23953,7 +23953,7 @@ "properties": { "scheme": { "title": "Scheme", - "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", "type": [ "string", "null" @@ -23964,7 +23964,7 @@ }, "id": { "title": "ID", - "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "description": "The identifier for the unit of measurement, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -34222,13 +34222,13 @@ ] }, "unit": { - "title": "Unit", - "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", + "title": "Pricing unit", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", "type": "object", "properties": { "scheme": { "title": "Scheme", - "description": "The list from which identifiers for units of measure are taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended for a unit of measurement.", "type": [ "string", "null" @@ -34238,7 +34238,7 @@ }, "id": { "title": "ID", - "description": "The identifier from the codelist referenced in the `scheme` field. Check the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find and use identifiers from the scheme in use.", + "description": "The identifier for the unit, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -34600,7 +34600,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", + "description": "A URI to uniquely identify the unit.", "format": "uri", "type": [ "string", @@ -34616,7 +34616,7 @@ "properties": { "name": { "title": "Name", - "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "description": "The common name of the container. For medicine items, it is recommended to use a title from the [immediateContainer](https://extensions.open-contracting.org/en/extensions/medicine/master/codelists/#immediateContainer.csv) codelist in the OCDS [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension. For other items, it is recommended to use a title from PackageTypeCodelist in the GS1 [Global Data Synchronisation Network (GDSN)](https://www.gs1.org/standards/gdsn) standard.", "type": [ "string", "null" @@ -34635,7 +34635,7 @@ "properties": { "scheme": { "title": "Scheme", - "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", "type": [ "string", "null" @@ -34646,7 +34646,7 @@ }, "id": { "title": "ID", - "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "description": "The identifier for the unit of measurement, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -35657,13 +35657,13 @@ } }, "Unit": { - "title": "Unit", - "description": "A description of the unit in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This object should be used for units of measurement only. For units of presentation it is recommended to use the `ImmediateContainer` object.", + "title": "Pricing unit", + "description": "A pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", "type": "object", "properties": { "scheme": { "title": "Scheme", - "description": "The list from which identifiers for units of measure are taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended for a unit of measurement.", "type": [ "string", "null" @@ -35673,7 +35673,7 @@ }, "id": { "title": "ID", - "description": "The identifier from the codelist referenced in the `scheme` field. Check the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find and use identifiers from the scheme in use.", + "description": "The identifier for the unit, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -36035,7 +36035,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", + "description": "A URI to uniquely identify the unit.", "format": "uri", "type": [ "string", @@ -36051,7 +36051,7 @@ "properties": { "name": { "title": "Name", - "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "description": "The common name of the container. For medicine items, it is recommended to use a title from the [immediateContainer](https://extensions.open-contracting.org/en/extensions/medicine/master/codelists/#immediateContainer.csv) codelist in the OCDS [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension. For other items, it is recommended to use a title from PackageTypeCodelist in the GS1 [Global Data Synchronisation Network (GDSN)](https://www.gs1.org/standards/gdsn) standard.", "type": [ "string", "null" @@ -36070,7 +36070,7 @@ "properties": { "scheme": { "title": "Scheme", - "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", "type": [ "string", "null" @@ -36081,7 +36081,7 @@ }, "id": { "title": "ID", - "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "description": "The identifier for the unit of measurement, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -36120,7 +36120,7 @@ "properties": { "scheme": { "title": "Scheme", - "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", "type": [ "string", "null" @@ -36131,7 +36131,7 @@ }, "id": { "title": "ID", - "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "description": "The identifier for the unit of measurement, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -36162,7 +36162,7 @@ "properties": { "scheme": { "title": "Scheme", - "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", "type": [ "string", "null" @@ -36173,7 +36173,7 @@ }, "id": { "title": "ID", - "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "description": "The identifier for the unit of measurement, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" diff --git a/schema/release-schema.json b/schema/release-schema.json index bf059b2e2..1d418bf21 100644 --- a/schema/release-schema.json +++ b/schema/release-schema.json @@ -1602,8 +1602,8 @@ ] }, "unit": { - "title": "Unit", - "description": "A description of the unit of in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This field should be used for units of measurement only. For units of presentation it is recommended to use the `immediateContainer` field.", + "title": "Pricing unit", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", "$ref": "#/definitions/Unit" }, "immediateContainer": { @@ -2595,13 +2595,13 @@ } }, "Unit": { - "title": "Unit", - "description": "A description of the unit in which the goods, services or works are provided (e.g. hours, kilograms) and the unit-price. This object should be used for units of measurement only. For units of presentation it is recommended to use the `ImmediateContainer` object.", + "title": "Pricing unit", + "description": "A pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", "type": "object", "properties": { "scheme": { "title": "Scheme", - "description": "The list from which identifiers for units of measure are taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended for a unit of measurement.", "type": [ "string", "null" @@ -2611,7 +2611,7 @@ }, "id": { "title": "ID", - "description": "The identifier from the codelist referenced in the `scheme` field. Check the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find and use identifiers from the scheme in use.", + "description": "The identifier for the unit, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" @@ -2632,7 +2632,7 @@ }, "uri": { "title": "URI", - "description": "The machine-readable URI for the unit of measure, provided by the `scheme`.", + "description": "A URI to uniquely identify the unit.", "format": "uri", "type": [ "string", @@ -2648,7 +2648,7 @@ "properties": { "name": { "title": "Name", - "description": "The common name of the container. It is recommended to use titles from the immediateContainer codelist in the [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension for medicine items, or titles from the [GS1 GDSN PackageTypeCodelist](https://www.gs1.org/standards/gdsn) for other items.", + "description": "The common name of the container. For medicine items, it is recommended to use a title from the [immediateContainer](https://extensions.open-contracting.org/en/extensions/medicine/master/codelists/#immediateContainer.csv) codelist in the OCDS [Medicine](https://extensions.open-contracting.org/en/extensions/medicine/master/) extension. For other items, it is recommended to use a title from PackageTypeCodelist in the GS1 [Global Data Synchronisation Network (GDSN)](https://www.gs1.org/standards/gdsn) standard.", "type": [ "string", "null" @@ -2693,7 +2693,7 @@ "properties": { "scheme": { "title": "Scheme", - "description": "The codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", + "description": "The scheme or codelist from which the identifier for the unit of measurement is taken, using the open [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist. 'UNCEFACT' is recommended.", "type": [ "string", "null" @@ -2704,7 +2704,7 @@ }, "id": { "title": "ID", - "description": "The identifier for the unit of measurement, taken from the codelist referenced by the `scheme` field. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", + "description": "The identifier for the unit of measurement, taken from the scheme. Refer to the [unitClassificationScheme](https://standard.open-contracting.org/{{version}}/{{lang}}/schema/codelists/#unit-classification-scheme) codelist for details of how to find identifiers within schemes.", "type": [ "string", "null" From f049f111d13611bbf6cc32b269cb5202755b1c70 Mon Sep 17 00:00:00 2001 From: James McKinney <26463+jpmckinney@users.noreply.github.com> Date: Wed, 12 Jun 2024 18:15:10 -0400 Subject: [PATCH 05/15] chore: Update JS style to latest profile template --- .github/workflows/js.yml | 7 +- docs/_static/script.js | 138 ++++++++++++++++++++------------------- 2 files changed, 74 insertions(+), 71 deletions(-) diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml index b23aea2d5..4c8147e26 100644 --- a/.github/workflows/js.yml +++ b/.github/workflows/js.yml @@ -6,8 +6,5 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 18 - - run: npm install standard eslint-plugin-import@2.26.0 - - run: npx standard docs/_static/script.js + - uses: biomejs/setup-biome@v2 + - run: biome ci --indent-style=space --line-width=119 docs/_static/script.js diff --git a/docs/_static/script.js b/docs/_static/script.js index e46cd638a..ffd653486 100644 --- a/docs/_static/script.js +++ b/docs/_static/script.js @@ -1,35 +1,40 @@ /* global XMLHttpRequest, location, renderjson */ -const pathComponents = window.location.pathname.split('/') -if (pathComponents[pathComponents.length - 2] === 'codelists') { - document.querySelector('.wy-nav-content').style.maxWidth = 'none' +const pathComponents = window.location.pathname.split("/"); +if (pathComponents[pathComponents.length - 2] === "codelists") { + document.querySelector(".wy-nav-content").style.maxWidth = "none"; } // FYI: extensionlist appears many times on /schema/reference/ -if (document.querySelector('.extension_list')) { - const language = location.pathname.split('/')[2] +if (document.querySelector(".extension_list")) { + const language = location.pathname.split("/")[2]; // Append an empty list for community extensions. - document.querySelectorAll('.extension_list .hide').forEach(element => { - const dl = document.createElement('dl') - dl.className = 'simple community-list hide' - element.insertAdjacentElement('afterend', dl) - element.innerHTML = `${element.innerHTML}` - }) + for (const element of document.querySelectorAll(".extension_list .hide")) { + const dl = document.createElement("dl"); + dl.className = "simple community-list hide"; + element.insertAdjacentElement("afterend", dl); + element.innerHTML = `${element.innerHTML}`; + } // Get the community extensions to add to the documentation. - const request = new XMLHttpRequest() - request.open('GET', 'https://raw.githubusercontent.com/open-contracting/extension_registry/main/build/extensions.json') - request.responseType = 'json' + const request = new XMLHttpRequest(); + request.open( + "GET", + "https://raw.githubusercontent.com/open-contracting/extension_registry/main/build/extensions.json", + ); + request.responseType = "json"; request.onload = () => { if (request.status >= 200 && request.status < 400) { // Add community extensions. - request.response.extensions.forEach(extension => { + for (const extension of request.response.extensions) { if (!extension.core) { - const div = document.getElementById(`extensionlist-${extension.category}`) + const div = document.getElementById(`extensionlist-${extension.category}`); if (div) { - div.querySelector('.community-list').insertAdjacentHTML('beforeend', ` + div.querySelector(".community-list").insertAdjacentHTML( + "beforeend", + `
${extension.name[language] || extension.name.en} @@ -38,79 +43,80 @@ if (document.querySelector('.extension_list')) {
${extension.description[language] || extension.description.en}
- `) - div.querySelectorAll('.hide').forEach(element => { - element.classList.remove('hide') - }) + `, + ); + for (const element of div.querySelectorAll(".hide")) { + element.classList.remove("hide"); + } } } - }) + } // Remove empty extension lists. - document.querySelectorAll('.extension_list').forEach(element => { - if (!element.querySelector('a')) { - element.remove() + for (const element of document.querySelectorAll(".extension_list")) { + if (!element.querySelector("a")) { + element.remove(); } - }) + } } - } + }; - request.send() + request.send(); } -document.querySelectorAll('.expandjson').forEach(element => { - const defaultOpen = [] - let fileClassName - element.classList.forEach(className => { - if (className.substring(0, 7) === 'expand-' && className.length > 7) { - defaultOpen.push(className.substring(7)) +for (const element of document.querySelectorAll(".expandjson")) { + const defaultOpen = []; + let fileClassName; + for (const className of element.classList) { + if (className.substring(0, 7) === "expand-" && className.length > 7) { + defaultOpen.push(className.substring(7)); } - if (className.substring(0, 5) === 'file-') { - fileClassName = className + if (className.substring(0, 5) === "file-") { + fileClassName = className; } - }) + } - let data = JSON.parse(element.textContent) + let data = JSON.parse(element.textContent); // If the jsoninclude directive indexed to a JSON array (a common mistake), only display the first entry. if (data.length) { - data = data[0] + data = data[0]; } - const replacement = renderjson.set_show_to_level(1).set_max_string_length(100).set_default_open(defaultOpen)(data) + const replacement = renderjson.set_show_to_level(1).set_max_string_length(100).set_default_open(defaultOpen)(data); // element.firstElementChild.replaceWith(replacement) // https://caniuse.com/mdn-api_parentnode_firstelementchild - element.replaceChild(replacement, element.querySelector('.highlight-json')) + element.replaceChild(replacement, element.querySelector(".highlight-json")); - const container = element.previousElementSibling - let select - if (container && container.classList.contains('selection-container')) { + const container = element.previousElementSibling; + let select; + if (container?.classList.contains("selection-container")) { // Hide additional examples. - element.style.display = 'none' - container.appendChild(element) + element.style.display = "none"; + container.appendChild(element); // Display the select element if there are multiple options. - select = container.querySelector('select') - select.style.display = '' + select = container.querySelector("select"); + select.style.display = ""; } else { - const div = document.createElement('div') - element.insertAdjacentElement('beforebegin', div) - div.className = 'selection-container' - div.appendChild(element) + const div = document.createElement("div"); + element.insertAdjacentElement("beforebegin", div); + div.className = "selection-container"; + div.appendChild(element); - select = document.createElement('select') - div.insertAdjacentElement('afterbegin', select) + select = document.createElement("select"); + div.insertAdjacentElement("afterbegin", select); // Hide the select element if there is one option. - select.style.display = 'none' - select.addEventListener('change', () => { - div.querySelectorAll('.expandjson').forEach(child => { - child.style.display = 'none' - }) - div.querySelector(`.${select.value}`).style.display = '' - }) + select.style.display = "none"; + select.addEventListener("change", () => { + for (const child of div.querySelectorAll(".expandjson")) { + child.style.display = "none"; + } + div.querySelector(`.${select.value}`).style.display = ""; + }); } - const option = document.createElement('option') - option.value = fileClassName - option.textContent = fileClassName.replace('file-', '') - select.appendChild(option) -}) + const option = document.createElement("option"); + option.value = fileClassName; + option.textContent = fileClassName.replace("file-", ""); + select.appendChild(option); +} From 796405a8fa335ba37f018e9e9703962b15b19be7 Mon Sep 17 00:00:00 2001 From: James McKinney <26463+jpmckinney@users.noreply.github.com> Date: Wed, 12 Jun 2024 18:15:51 -0400 Subject: [PATCH 06/15] chore: Update to latest profile template --- .github/workflows/shell.yml | 3 ++- common-requirements.txt | 10 +++++----- script/diff | 7 ++++--- script/update | 7 ++++--- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/.github/workflows/shell.yml b/.github/workflows/shell.yml index e87989085..fe96765b8 100644 --- a/.github/workflows/shell.yml +++ b/.github/workflows/shell.yml @@ -8,6 +8,7 @@ jobs: - uses: actions/checkout@v4 - run: | sudo apt update - sudo apt install shellcheck shfmt + sudo apt install devscripts shellcheck shfmt + - run: checkbashisms $(shfmt -f .) - run: shellcheck $(shfmt -f .) - run: shfmt -d -i 4 -sr $(shfmt -f .) diff --git a/common-requirements.txt b/common-requirements.txt index 089b9bfb1..ff4de52f3 100644 --- a/common-requirements.txt +++ b/common-requirements.txt @@ -56,7 +56,7 @@ exceptiongroup==1.0.0 # pytest h11==0.13.0 # via wsproto -idna==2.10 +idna==3.7 # via # requests # trio @@ -64,7 +64,7 @@ imagesize==1.4.1 # via sphinx iniconfig==1.1.1 # via pytest -jinja2==3.1.3 +jinja2==3.1.4 # via # myst-parser # sphinx @@ -123,7 +123,7 @@ pytz==2021.1 # via babel pyyaml==6.0.1 # via myst-parser -requests==2.31.0 +requests==2.32.2 # via # elasticsearch # ocdsextensionregistry @@ -151,7 +151,7 @@ sphinx==5.3.0 # sphinx-intl sphinx-autobuild==2021.3.14 # via -r common-requirements.in -sphinx-intl==2.1.0 +sphinx-intl==2.2.0 # via -r common-requirements.in sphinxcontrib-applehelp==1.0.2 # via sphinx @@ -171,7 +171,7 @@ tomli==2.0.1 # pip-tools # pyproject-hooks # pytest -tornado==6.3.3 +tornado==6.4.1 # via livereload trio==0.20.0 # via diff --git a/script/diff b/script/diff index 988c0fff9..cf7e85060 100755 --- a/script/diff +++ b/script/diff @@ -1,6 +1,7 @@ -#!/usr/bin/env bash -# No -e, because diff fails. -set -uo pipefail +#!/bin/sh + +# No -e, because diff uses exit status 1 when differences are found. +set -u curl -sS https://raw.githubusercontent.com/open-contracting/standard_profile_template/latest/docs/conf.py | diff -u - docs/conf.py diff --git a/script/update b/script/update index ada17caa4..cba8c6fc2 100755 --- a/script/update +++ b/script/update @@ -1,7 +1,8 @@ -#!/usr/bin/env bash -set -euo pipefail +#!/bin/sh -function main { +set -eu + +main() { mkdir -p script include tests for f in Makefile common-requirements.in common-requirements.txt .github/dependabot.yml .github/workflows/lint.yml .github/workflows/shell.yml docs/_static/favicon-16x16.ico include/common.mk include/prologue.mk include/header.html script/diff script/update tests/conftest.py tests/test_common.py; do From d518130b9fd8f465333f29a81dcd94a72b1564d3 Mon Sep 17 00:00:00 2001 From: James McKinney <26463+jpmckinney@users.noreply.github.com> Date: Wed, 12 Jun 2024 18:19:21 -0400 Subject: [PATCH 07/15] chore: Fix typo in changelog --- docs/history/changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/history/changelog.md b/docs/history/changelog.md index d5bb96265..f52ced19b 100644 --- a/docs/history/changelog.md +++ b/docs/history/changelog.md @@ -205,7 +205,7 @@ Per the [normative and non-normative content and changes policy](../governance/n * [#1421](https://github.com/open-contracting/standard/pull/1421) `tender.standstillPeriod` * [#1492](https://github.com/open-contracting/standard/pull/1492) `awards.datePublished` * [#1648](https://github.com/open-contracting/standard/pull/1648) [#1683](https://github.com/open-contracting/standard/pull/1683) `finalStatus`, `finalStatusDetails` and `finalStatusDate` to `Tender`, `Award` and `Contract` - * [#1208](https://github.com/open-contracting/standard/pull/1326) The estimated and maximum values of framework agreeemnts: + * [#1208](https://github.com/open-contracting/standard/pull/1326) The estimated and maximum values of framework agreements: * `tender.maximumValue`. Previously, `tender.value` was used for the maximum value. However, this led to double-counting. * `awards.maximumValue`. Previously, `awards.value` was used for the maximum value. However, this led to double-counting. * `awards.estimatedValue` From b95e9ccbc5ec552ff182f9e7349a9a9fd94a9b1a Mon Sep 17 00:00:00 2001 From: James McKinney <26463+jpmckinney@users.noreply.github.com> Date: Wed, 12 Jun 2024 18:22:45 -0400 Subject: [PATCH 08/15] ci: Add sme exception --- .github/workflows/spellcheck.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/spellcheck.yml b/.github/workflows/spellcheck.yml index 300eefc34..b60b28a2b 100644 --- a/.github/workflows/spellcheck.yml +++ b/.github/workflows/spellcheck.yml @@ -10,4 +10,4 @@ jobs: with: python-version: '3.10' - run: pip install codespell - - run: codespell -S .git,docson,locale,examples,country.csv,currency.csv,language.csv,mediaType.csv -L fo,zar . + - run: codespell -S .git,docson,locale,examples,country.csv,currency.csv,language.csv,mediaType.csv -L fo,sme,zar,SME . From 0538f7f010bf90c839c7fcf53e0032544765e17e Mon Sep 17 00:00:00 2001 From: James McKinney <26463+jpmckinney@users.noreply.github.com> Date: Wed, 12 Jun 2024 18:45:52 -0400 Subject: [PATCH 09/15] changelog: Re-order according to: ocid, id, date, parties, buyer, planning, tender, award, contracts, then alphabetical. Use field paths instead of subschema names if possible. --- docs/history/changelog.md | 77 +++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 39 deletions(-) diff --git a/docs/history/changelog.md b/docs/history/changelog.md index f52ced19b..ef15aacf4 100644 --- a/docs/history/changelog.md +++ b/docs/history/changelog.md @@ -160,6 +160,11 @@ Per the [normative and non-normative content and changes policy](../governance/n * [#1352](https://github.com/open-contracting/standard/pull/1352) Replace "party", "entity", etc. with "organization". * [#1353](https://github.com/open-contracting/standard/pull/1353) Replace "submit a tender" with "submit a bid". +* `relatedProcess.csv`: + * [#1645](https://github.com/open-contracting/standard/pull/1645) Deprecate "parent-to-child" codes: 'subContract', 'replacementProcess' and 'renewalProcess' + * [#1670](https://github.com/open-contracting/standard/pull/1670) Deprecate 'parent' code, because a subcontract needs to be described within its main contract, not within a separate contracting process + * [#1645](https://github.com/open-contracting/standard/pull/1645) Update descriptions: 'prior', 'framework', 'unsuccessfulProcess' + * `releaseTag.csv`: * [#1238](https://github.com/open-contracting/standard/pull/1238) Open the `releaseTag` codelist. * [#1415](https://github.com/open-contracting/standard/pull/1415) [#1509](https://github.com/open-contracting/standard/pull/1509) Align descriptions of 'planning', 'tender', 'award' and 'contract' with the corresponding schema fields. @@ -172,16 +177,12 @@ Per the [normative and non-normative content and changes policy](../governance/n * [#1209](https://github.com/open-contracting/standard/pull/1209) Replace "electronic goods" with "digital goods" in the description of 'goods' from the `procurementCategory` codelist, to align with the description in the World Trade Organization's Agreement on Government Procurement, and to avoid confusion between electronic goods like computers and digital goods like software. * [#1530](https://github.com/open-contracting/standard/pull/1530) Use consistent wording for "goods, services and/or works" in the `classificationScheme`, `extendedProcurementCategory`, `partyRole` and `procurementCategory` codelists. * [#1550](https://github.com/open-contracting/standard/pull/1550) Align and improve code descriptions in `extendedProcurementCategory` and `procurementCategory`. -* `relatedProcess.csv`: - * [#1645](https://github.com/open-contracting/standard/pull/1645) Deprecate "parent-to-child" codes: 'subContract', 'replacementProcess' and 'renewalProcess' - * [#1670](https://github.com/open-contracting/standard/pull/1670) Deprecate 'parent' code, because a subcontract needs to be described within its main contract, not within a separate contracting process - * [#1645](https://github.com/open-contracting/standard/pull/1645) Update descriptions: 'prior', 'framework', 'unsuccessfulProcess' ### Schema * Clarify core concepts: * [#1216](https://github.com/open-contracting/standard/pull/1216) Define contracting process and planning process in the schema description. Update definition of release, record and ocid. Update references to contracting process so that it takes take the planning process into account. - * [#1513](https://github.com/open-contracting/standard/pull/1513) Update fields' use of "contracting process" and "contracting (or planning) process" to reflect the new definition. Align `budget.project` and `budget.projectID`. + * [#1513](https://github.com/open-contracting/standard/pull/1513) Update fields' use of "contracting process" and "contracting (or planning) process" to reflect the new definition. Align `planning.budget.project` and `planning.budget.projectID`. * [#1443](https://github.com/open-contracting/standard/pull/1443) `date` * [#1182](https://github.com/open-contracting/standard/pull/1182) `buyer` * [#1163](https://github.com/open-contracting/standard/pull/1163) `tender.procuringEntity` @@ -192,8 +193,9 @@ Per the [normative and non-normative content and changes policy](../governance/n * [#1208](https://github.com/open-contracting/standard/pull/1208) `contracts` and its fields * [#1415](https://github.com/open-contracting/standard/pull/1415) `planning`, `Planning`, `tender`, `Tender`, `awards`, `contracts` and minor alignment of "planning process" (part of the description of the schema) with `planning`. - * Add new fields: + * [#1679](https://github.com/open-contracting/standard/pull/1679) `parties.details.classifications` + * [#1459](https://github.com/open-contracting/standard/pull/1459) `parties.details.scale` * [#1335](https://github.com/open-contracting/standard/pull/1335) `planning.id` * [#1642](https://github.com/open-contracting/standard/pull/1642) `planning.finalStatus`, `planning.finalStatusDetails` and `planning.finalStatusDate` * [#1324](https://github.com/open-contracting/standard/pull/1324) `tender.datePublished` @@ -204,6 +206,7 @@ Per the [normative and non-normative content and changes policy](../governance/n * [#1654](https://github.com/open-contracting/standard/pull/1654) `tender.submissionTerms.electronicSubmissionPolicy` * [#1421](https://github.com/open-contracting/standard/pull/1421) `tender.standstillPeriod` * [#1492](https://github.com/open-contracting/standard/pull/1492) `awards.datePublished` + * [#1490](https://github.com/open-contracting/standard/pull/1490) `contracts.identifiers` * [#1648](https://github.com/open-contracting/standard/pull/1648) [#1683](https://github.com/open-contracting/standard/pull/1683) `finalStatus`, `finalStatusDetails` and `finalStatusDate` to `Tender`, `Award` and `Contract` * [#1208](https://github.com/open-contracting/standard/pull/1326) The estimated and maximum values of framework agreements: * `tender.maximumValue`. Previously, `tender.value` was used for the maximum value. However, this led to double-counting. @@ -211,7 +214,6 @@ Per the [normative and non-normative content and changes policy](../governance/n * `awards.estimatedValue` * `contracts.maximumValue` * `contracts.estimatedValue` - * [#1459](https://github.com/open-contracting/standard/pull/1459) `Organization.details.scale` * [#1326](https://github.com/open-contracting/standard/pull/1326) [#1431](https://github.com/open-contracting/standard/pull/1431) `links` * [#1376](https://github.com/open-contracting/standard/pull/1376) [#1489](https://github.com/open-contracting/standard/pull/1489) `publisher` * [#1372](https://github.com/open-contracting/standard/pull/1372) `Address.country` @@ -221,38 +223,36 @@ Per the [normative and non-normative content and changes policy](../governance/n * [#1434](https://github.com/open-contracting/standard/pull/1434) `Milestone.value` * [#1490](https://github.com/open-contracting/standard/pull/1490) `SimpleIdentifier` * [#1519](https://github.com/open-contracting/standard/pull/1519) `Value.amountNet` and `Value.amountGross` - * [#1490](https://github.com/open-contracting/standard/pull/1490) `contracts.identifiers` - * [#1679](https://github.com/open-contracting/standard/pull/1679) `Organization.details.classifications` * Deprecate some fields: - * [#1200](https://github.com/open-contracting/standard/pull/1200) `tender.submissionMethod`, because all codes from the `submissionMethod` codelist are deprecated. * [#1296](https://github.com/open-contracting/standard/pull/1296) `tender.eligibilityCriteria` in favor of the new `tender.exclusionGrounds` field, in order to use more common terminology and improve semantics. - * [#1372](https://github.com/open-contracting/standard/pull/1372) `Address.countryName` in favor of the new `Address.country` field, to promote standardized country codes instead of non-standardized country names. + * [#1200](https://github.com/open-contracting/standard/pull/1200) `tender.submissionMethod`, because all codes from the `submissionMethod` codelist are deprecated. + * [#1670](https://github.com/open-contracting/standard/pull/1670) `contracts.relatedProcesses`, because all relevant codes from the `relatedProcess` codelist are deprecated. + * [#1509](https://github.com/open-contracting/standard/pull/1509) `tender.status`, `awards.status`, `contracts.status`, because the same information can be provided by filling in the relevant date fields. * [#1389](https://github.com/open-contracting/standard/pull/1389) `initiationType`, because the approach to data modelling that it supports was not pursued. + * [#1372](https://github.com/open-contracting/standard/pull/1372) `Address.countryName` in favor of the new `Address.country` field, to promote standardized country codes instead of non-standardized country names. * [#1380](https://github.com/open-contracting/standard/pull/1380) `Document.language` in favor of the new `Document.languages` field, to support documents in which multiple languages are used. - * [#1509](https://github.com/open-contracting/standard/pull/1509) `tender.status`, `Award.status`, `Contract.status`, because the same information can be provided by filling in the relevant date fields. * [#1662](https://github.com/open-contracting/standard/pull/1662) `Transaction.source`, because its value would be potentially identical across every transaction. - * [#1670](https://github.com/open-contracting/standard/pull/1670) `Contract.relatedProcesses`, because all relevant codes from the relatedProcess codelist are deprecated. * Update and clarify field descriptions: * [#1113](https://github.com/open-contracting/standard/pull/1113) `ocid`, to recommend a hyphen after the ocid prefix. * [#1527](https://github.com/open-contracting/standard/pull/1527) `id`, to clarify use in releases and compiled releases. - * [#1094](https://github.com/open-contracting/standard/pull/1094) `Organization.id`, to clarify its uniqueness. - * [#1510](https://github.com/open-contracting/standard/pull/1510) `Organization.additionalIdentifiers`, to clarify its potential use for organizational units. - * [#1167](https://github.com/open-contracting/standard/pull/1167) `Budget`, `Budget.id`, `Budget.description`, `Budget.amount`, to reduce ambiguity and use consistent wording. - * [#1529](https://github.com/open-contracting/standard/pull/1529) `Budget`, `Budget.id`, `Budget.description`, `Budget.amount`, `Budget.project`, `Budget.uri`, `Budget.source`, `tender.value`, `tender.minValue`, `awards.value`, `Transaction`, to replace "contracting process" with "contract(s)". - * [#1189](https://github.com/open-contracting/standard/pull/1189) `Document.url`, to use precise wording and to describe how to indicate a part of a document. - * [#1229](https://github.com/open-contracting/standard/pull/1229) Standardize the descriptions of `planning.documents`, `tender.documents`, `awards.documents`, `contracts.documents`, and `contracts.implementation.documents`. + * [#1094](https://github.com/open-contracting/standard/pull/1094) `parties.id`, to clarify its uniqueness. + * [#1510](https://github.com/open-contracting/standard/pull/1510) `parties.additionalIdentifiers`, to clarify its potential use for organizational units. + * [#1167](https://github.com/open-contracting/standard/pull/1167) `Budget`, `planning.budget.id`, `planning.budget.description`, `planning.budget.amount`, to reduce ambiguity and use consistent wording. + * [#1529](https://github.com/open-contracting/standard/pull/1529) `Budget`, `planning.budget.id`, `planning.budget.description`, `planning.budget.amount`, `planning.budget.project`, `planning.budget.uri`, `planning.budget.source`, `tender.value`, `tender.minValue`, `awards.value`, `Transaction`, to replace "contracting process" with "contract(s)". + * [#1509](https://github.com/open-contracting/standard/pull/1509) `planning`, `Planning`, `tender` and `Tender` to clarify relationships with the availability of documents. * [#1335](https://github.com/open-contracting/standard/pull/1335) Standardize the descriptions of `planning`, `planning.rationale`, `planning.budget`, `planning.documents`, and `planning.milestones`. - * [#1530](https://github.com/open-contracting/standard/pull/1530) `Buyer`, `tender.items`, `awards.items`, `contracts.items`, `Item`, `Item.description`, `Item.unit`, `Unit`, `transaction.providerOrganization`, `transaction.receiverOrganization` to use consistent wording for "goods, services and/or works". + * [#1229](https://github.com/open-contracting/standard/pull/1229) Standardize the descriptions of `planning.documents`, `tender.documents`, `awards.documents`, `contracts.documents`, and `contracts.implementation.documents`. + * [#1530](https://github.com/open-contracting/standard/pull/1530) `buyer`, `tender.items`, `awards.items`, `contracts.items`, `Item`, `Item.description`, `Item.unit`, `Unit`, `Transaction.providerOrganization`, `Transaction.receiverOrganization` to use consistent wording for "goods, services and/or works". + * [#1663](https://github.com/open-contracting/standard/pull/1663) `tender.amendments`, `awards.amendments`, `contracts.amendments` to avoid restating field titles. * [#1528](https://github.com/open-contracting/standard/pull/1528) `tender.id`, `tender.hasEnquiries`, to reduce ambiguity and use consistent wording in the description of procurement stages. - * [#1519](https://github.com/open-contracting/standard/pull/1519) `value.amount`, to clarify amount taken from system or document. * [#1618](https://github.com/open-contracting/standard/pull/1618) `tender.enquiryPeriod`, to remove the suggestion to use `tender.submissionMethodDetails` for information about how to submit enquiries. + * [#1656](https://github.com/open-contracting/standard/pull/1656) `awards.value` and `contracts.value`, to clarify with respect to changes in contract values. * [#1645](https://github.com/open-contracting/standard/pull/1645) `relatedProcesses`, to use consistent wording in the description of multi-stage procedures. + * [#1189](https://github.com/open-contracting/standard/pull/1189) `Document.url`, to use precise wording and to describe how to indicate a part of a document. + * [#1519](https://github.com/open-contracting/standard/pull/1519) `Value.amount`, to clarify amount taken from system or document. * [#1618](https://github.com/open-contracting/standard/pull/1618) Normalize field descriptions according to a style guide. - * [#1656](https://github.com/open-contracting/standard/pull/1656) `Award.value` and `Contract.value`, to clarify with respect to changes in contract values. - * [#1509](https://github.com/open-contracting/standard/pull/1509) `planning`, `Planning`, `tender` and `Tender` to clarify relationships with the availability of documents. - * [#1663](https://github.com/open-contracting/standard/pull/1663) `tender.amendments`, `awards.amendments`, `contracts.amendments` to avoid restating field titles. * Remove confusing terminology: * [#1487](https://github.com/open-contracting/standard/pull/1487) `planning.budget.project`, to remove sentence about translation options. @@ -264,9 +264,9 @@ Per the [normative and non-normative content and changes policy](../governance/n * Add or strengthen normative statements in field descriptions: * [#1086](https://github.com/open-contracting/standard/pull/1086) Recommend the use of strings rather than integers for identifiers. - * [#1112](https://github.com/open-contracting/standard/pull/1112) `Organization.id`: "This field need only be unique within the scope of the contracting process, but **should** be built with the following structure {identifier.scheme}-{identifier.id}(-{department-identifier}) if the primary identifier for this organization is available" ("may" replaced with "should") - * [#1112](https://github.com/open-contracting/standard/pull/1112) `Period.durationInDays`: "If a startDate and endDate are set, this field, if used, **must** be equal to the difference between startDate and endDate. Otherwise, if a startDate and maxExtentDate are set, this field, if used, **must** be equal to the difference between startDate and maxExtentDate." ("should" replaced with "must") + * [#1112](https://github.com/open-contracting/standard/pull/1112) `parties.id`: "This field need only be unique within the scope of the contracting process, but **should** be built with the following structure {identifier.scheme}-{identifier.id}(-{department-identifier}) if the primary identifier for this organization is available" ("may" replaced with "should") * [#1112](https://github.com/open-contracting/standard/pull/1112) [#1540](https://github.com/open-contracting/standard/pull/1540) `contracts.items`: "If the items contracted are identical to the items awarded and/or the items tendered, this field **should** be omitted." (rephrased) + * [#1112](https://github.com/open-contracting/standard/pull/1112) `Period.durationInDays`: "If a startDate and endDate are set, this field, if used, **must** be equal to the difference between startDate and endDate. Otherwise, if a startDate and maxExtentDate are set, this field, if used, **must** be equal to the difference between startDate and maxExtentDate." ("should" replaced with "must") * Clarify merging behavior: * [#1242](https://github.com/open-contracting/standard/pull/1242) Clarify that the releases to merge must use the same version of OCDS. @@ -274,8 +274,8 @@ Per the [normative and non-normative content and changes policy](../governance/n * [#1315](https://github.com/open-contracting/standard/pull/1315) Update the descriptions of `id` and `date`, to add rules for compiled releases. * Make minor changes to the schema's organization: - * [#1240](https://github.com/open-contracting/standard/pull/1240) Move `Unit` from `Item.unit` to the schema definitions. * [#1354](https://github.com/open-contracting/standard/pull/1354) Switch the positions of `contracts.dateSigned` and `contracts.period` to correspond with the order in `Award`. + * [#1240](https://github.com/open-contracting/standard/pull/1240) Move `Unit` from `Item.unit` to the schema definitions. * Make minor changes to the JSON Schema properties: * [#1257](https://github.com/open-contracting/standard/pull/1257) Remove the default value (was `"en"`) for the `language` field. @@ -315,7 +315,6 @@ Per the [normative and non-normative content and changes policy](../governance/n * [#1067](https://github.com/open-contracting/standard/pull/1067) `Publisher.name`, to indicate that it is the organization or department responsible for publishing the OCDS version of the data. * [#1450](https://github.com/open-contracting/standard/pull/1450) Replace a repeated example in schema/merging/ with a link to guidance/build/merging/. - * [#1665](https://github.com/open-contracting/standard/pull/1665) Abandon in-file translations. ### Documentation @@ -332,7 +331,7 @@ Per the [normative and non-normative content and changes policy](../governance/n * [#1315](https://github.com/open-contracting/standard/pull/1315) Add rules on setting `id` and `date` for compiled releases to the merging specification. * [#1375](https://github.com/open-contracting/standard/pull/1375) Update guidance for empty fields in the merging documentation. * Identifiers - * [#1094](https://github.com/open-contracting/standard/pull/1094) Add guidance on populating `Organization.id` for parties without an organization identifier. + * [#1094](https://github.com/open-contracting/standard/pull/1094) Add guidance on populating `parties.id` for parties without an organization identifier. * [#1643](https://github.com/open-contracting/standard/pull/1643) Update identifier section in release reference. * [#1655](https://github.com/open-contracting/standard/pull/1655) Rewrite identifiers reference and examples for clarity. * Documents @@ -396,13 +395,13 @@ See the changelogs for: ### Advisories -* OCDS 1.0 uses the [whole-list merge](../schema/merging.md#whole-list-merge) strategy for `Award.suppliers`, whereas OCDS 1.1 uses the [identifier merge](../schema/merging.md#identifier-merge) strategy. As a consequence, the OCDS 1.1 versioned release schema is not backward compatible with OCDS 1.0. - * **Action:** Versioned releases respecting the OCDS 1.0 schema that set `Award.suppliers` will need to be re-created to validate against the OCDS 1.1 schema. +* OCDS 1.0 uses the [whole-list merge](../schema/merging.md#whole-list-merge) strategy for `awards.suppliers`, whereas OCDS 1.1 uses the [identifier merge](../schema/merging.md#identifier-merge) strategy. As a consequence, the OCDS 1.1 versioned release schema is not backward compatible with OCDS 1.0. + * **Action:** Versioned releases respecting the OCDS 1.0 schema that set `awards.suppliers` will need to be re-created to validate against the OCDS 1.1 schema. * [#780](https://github.com/open-contracting/standard/pull/780) All extensions authored by the Open Contracting Partnership have been moved to the [open-contracting-extensions](https://github.com/open-contracting-extensions) organization. * **Action:** No change is required, but we recommend that publishers update the URLs of these extensions in their release packages and record packages. * [#738](https://github.com/open-contracting/standard/pull/738) 1.1.3 changed the merging and versioning behaviors of `Item.unit`, such that it could be removed by setting it to `null`, and such that it was versioned as a whole. 1.1.4 restores the behaviors from 1.1.2, such that only its sub-fields can be removed by setting them to `null`, and such that its sub-fields are versioned individually. * **Action:** If you had upgraded to OCDS 1.1.3, then compiled releases and versioned releases that set `Item.unit` will likely need to be re-created to validate against the OCDS 1.1.4 schema. -* [#810](https://github.com/open-contracting/standard/pull/810) `buyer.id`, `Tender.procuringEntity.id`, `Contract.implementation.payer.id` `Contract.implementation.payee.id`, `Budget.id`, `Identifier.id`, and `Classification.id` are now versioned, consistent with the documentation. +* [#810](https://github.com/open-contracting/standard/pull/810) `buyer.id`, `planning.budget.id`, `tender.procuringEntity.id`, `contracts.implementation.payer.id` `contracts.implementation.payee.id`, `Identifier.id`, and `Classification.id` are now versioned, consistent with the documentation. * **Action:** Versioned releases that set these fields will likely need to be re-created to validate against the OCDS 1.1.4 schema. * [#831](https://github.com/open-contracting/standard/pull/831) OCDS now has a [Normative and non-normative content and changes policy](../governance/normative). * [#744](https://github.com/open-contracting/standard/pull/744) OCDS now has a [Translation and localization policy](../governance/translation). @@ -423,7 +422,7 @@ See the changelogs for: ### Schema * [#712](https://github.com/open-contracting/standard/pull/712) [#715](https://github.com/open-contracting/standard/pull/715) Add missing titles for `publisher` and `url` and description for `record` in the record package schema, and missing description for `releases` in release package schema. -* [#769](https://github.com/open-contracting/standard/pull/769) The versioned release schema now matches the release schema in: having a `minLength` validation property for `OrganizationReference.name`; having `codelist` and `openCodelist` properties for `Tender.awardCriteria`, `Tender.awardCriteriaDetails`, `Document.documentType`, `Item.unit.scheme`, `Classification.scheme`, and `RelatedProcess.scheme`; and having a `deprecated` property for `Budget.source`. All `title` and `description` metadata properties are removed from the versioned release schema. +* [#769](https://github.com/open-contracting/standard/pull/769) The versioned release schema now matches the release schema in: having a `minLength` validation property for `OrganizationReference.name`; having `codelist` and `openCodelist` properties for `tender.awardCriteria`, `tender.awardCriteriaDetails`, `Document.documentType`, `Item.unit.scheme`, `Classification.scheme`, and `RelatedProcess.scheme`; and having a `deprecated` property for `planning.budget.source`. All `title` and `description` metadata properties are removed from the versioned release schema. * [#838](https://github.com/open-contracting/standard/pull/838) Eliminate the conflicting rule that release identifiers must be unique within release packages. Uniqueness within the scope of a release package either implies that release identifiers must be globally unique, or imposes an arbitrary restriction on the contents of release packages, as there is no rule preventing release packages from containing releases from different contracting processes. Release identifiers are only required to be locally unique within the scope of a contracting process. The `ocid` and `id` values of a release can be used together to disambiguate releases within a release package. * Clarify the uniqueness of release identifiers in the release schema [#838](https://github.com/open-contracting/standard/pull/838) and release package schema [#831](https://github.com/open-contracting/standard/pull/831). * [#810](https://github.com/open-contracting/standard/pull/810) `tag` is now `omitWhenMerged`, consistent with the reference implementation in OCDS Merge. @@ -474,7 +473,7 @@ See the changelogs for: ### Schema -* [#646](https://github.com/open-contracting/standard/pull/646) Disallow use of `null` as an entry in the array for `Tender.additionalProcurementCategories`. +* [#646](https://github.com/open-contracting/standard/pull/646) Disallow use of `null` as an entry in the array for `tender.additionalProcurementCategories`. * [#639](https://github.com/open-contracting/standard/issues/639) Make `name` field optional for `OrganizationReference`. * [#630](https://github.com/open-contracting/standard/issues/630) Allow optional field `Item.unit` to be `null`. **(Reverted in 1.1.4)** * [#663](https://github.com/open-contracting/standard/pull/663) Add `"type": "object"` to objects in the versioned release schema. @@ -486,12 +485,12 @@ See the changelogs for: ### Schema -* [#603](https://github.com/open-contracting/standard/issues/603) [#645](https://github.com/open-contracting/standard/issues/645) Add definitions to `Release`, `planning.budget`, `Milestone`, `Organization.address`, `Organization.contactPoint`, `Classification`, `Identifier`, `Value` and `Period`. +* [#603](https://github.com/open-contracting/standard/issues/603) [#645](https://github.com/open-contracting/standard/issues/645) Add definitions to `Release`, `parties.address`, `parties.contactPoint`, `planning.budget`, `Classification`, `Identifier`, `Milestone`, `Period` and `Value`. * [#578](https://github.com/open-contracting/standard/issues/578) Update the definition of the `buyer` field to cover goods, works and services, and multiple buyers. ### Documentation -* [#633](https://github.com/open-contracting/standard/issues/633) Update schema reference page to display `Release.relatedProcesses`, `Planning.documents` and `Contract.relatedProcesses`. +* [#633](https://github.com/open-contracting/standard/issues/633) Update schema reference page to display `Release.relatedProcesses`, `planning.documents` and `contracts.relatedProcesses`. * [#634](https://github.com/open-contracting/standard/issues/634) Clarify definitions of core, community and local extensions. * Old and unused scripts have been removed from the documentation repository, and a number of script dependencies have been updated. @@ -642,7 +641,7 @@ See the changelogs for: ### Schema * [#283](https://github.com/open-contracting/standard/issues/283) Remove `"mergeStrategy": "ocdsVersion"` from the `planning.budget` field. -* [#295](https://github.com/open-contracting/standard/issues/295) Allow the optional fields `Award.status` and `Contract.status` to be `null`. +* [#295](https://github.com/open-contracting/standard/issues/295) Allow the optional fields `awards.status` and `contracts.status` to be `null`. * [#300](https://github.com/open-contracting/standard/issues/300) Remove `"format": "uri"` from the `publisher.scheme` field. * [#304](https://github.com/open-contracting/standard/pull/304) Fix the versioning of arrays in the versioned release schema. * [#305](https://github.com/open-contracting/standard/pull/305) Add `title` and `description` properties and fix typos. @@ -660,8 +659,8 @@ See the changelogs for: ### Schema * [#188](https://github.com/open-contracting/standard/pull/188) Add the `tender.numberOfTenderers` and `tender.tenderers` fields. -* [#199](https://github.com/open-contracting/standard/issues/199) Add the `Award.contractPeriod` field, to disclose the anticipated contract period without creating a `Contract` object. -* Update the `description` property of the `Award.date` field. +* [#199](https://github.com/open-contracting/standard/issues/199) Add the `awards.contractPeriod` field, to disclose the anticipated contract period without creating a `Contract` object. +* Update the `description` property of the `awards.date` field. ### Documentation From 84de56f3c389b06aee40149e8eac940751305632 Mon Sep 17 00:00:00 2001 From: James McKinney <26463+jpmckinney@users.noreply.github.com> Date: Wed, 12 Jun 2024 18:48:46 -0400 Subject: [PATCH 10/15] changelog: Add changelog entries for Item.immediateContainer new field, and Item.unit normative change --- docs/history/changelog.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/history/changelog.md b/docs/history/changelog.md index ef15aacf4..e6ebe3f8b 100644 --- a/docs/history/changelog.md +++ b/docs/history/changelog.md @@ -219,6 +219,7 @@ Per the [normative and non-normative content and changes policy](../governance/n * [#1372](https://github.com/open-contracting/standard/pull/1372) `Address.country` * [#1380](https://github.com/open-contracting/standard/pull/1380) [#1440](https://github.com/open-contracting/standard/pull/1440) `Document.languages` * [#1439](https://github.com/open-contracting/standard/pull/1439) `Document.relatedItems` + * [#1689](https://github.com/open-contracting/standard/pull/1689) `Item.immediateContainer` * [#1455](https://github.com/open-contracting/standard/pull/1455) `Milestone.dueAfterDate` * [#1434](https://github.com/open-contracting/standard/pull/1434) `Milestone.value` * [#1490](https://github.com/open-contracting/standard/pull/1490) `SimpleIdentifier` @@ -264,9 +265,10 @@ Per the [normative and non-normative content and changes policy](../governance/n * Add or strengthen normative statements in field descriptions: * [#1086](https://github.com/open-contracting/standard/pull/1086) Recommend the use of strings rather than integers for identifiers. - * [#1112](https://github.com/open-contracting/standard/pull/1112) `parties.id`: "This field need only be unique within the scope of the contracting process, but **should** be built with the following structure {identifier.scheme}-{identifier.id}(-{department-identifier}) if the primary identifier for this organization is available" ("may" replaced with "should") + * [#1112](https://github.com/open-contracting/standard/pull/1112) `parties.id`: "This field need only be unique within the scope of the contracting process, but **should** be built with the following structure {identifier.scheme}-{identifier.id}(-{department-identifier}) if the primary identifier for this organization is available." ("may" replaced with "should") * [#1112](https://github.com/open-contracting/standard/pull/1112) [#1540](https://github.com/open-contracting/standard/pull/1540) `contracts.items`: "If the items contracted are identical to the items awarded and/or the items tendered, this field **should** be omitted." (rephrased) * [#1112](https://github.com/open-contracting/standard/pull/1112) `Period.durationInDays`: "If a startDate and endDate are set, this field, if used, **must** be equal to the difference between startDate and endDate. Otherwise, if a startDate and maxExtentDate are set, this field, if used, **must** be equal to the difference between startDate and maxExtentDate." ("should" replaced with "must") + * [#1689](https://github.com/open-contracting/standard/pull/1689) `Item.unit` and `Unit`: "It is **recommended** to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation." * Clarify merging behavior: * [#1242](https://github.com/open-contracting/standard/pull/1242) Clarify that the releases to merge must use the same version of OCDS. From ffeb52ac64c24705bea9b1385f22c3fcac2e3b00 Mon Sep 17 00:00:00 2001 From: James McKinney <26463+jpmckinney@users.noreply.github.com> Date: Wed, 12 Jun 2024 18:54:09 -0400 Subject: [PATCH 11/15] schema/reference: Add SimpleUnit, Quantity. Remove sentences that duplicates schema and that define unit of measurement. Remove instruction about QUDT that is difficult to follow due to QUDT's documentation structure. Don't collapse field that is defined by subschema. --- docs/schema/reference.md | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/docs/schema/reference.md b/docs/schema/reference.md index 370b1d754..670bc74fe 100644 --- a/docs/schema/reference.md +++ b/docs/schema/reference.md @@ -537,12 +537,6 @@ The items block is used to list the line-items associated with a tender, award o #### Unit -The `unit` subschema allows detailed specification of the parameters and price of units that make up a line-item. It should be used for units of measurement only. A unit of measurement is a definite magnitude of a quantity, defined and adopted by convention, that is used as a standard of measurement for the same kind of quantity. For example weight is a physical quantity, and the kilogram can be used as a unit of measurement for weight. For units of presentation, use the [`ImmediateContainer` subschema](#immediatecontainer), which is used by the [`Item.immediateContainer` field](#item). - -If the [Quantities, Units, Dimensions and Data Types Ontologies](https://www.qudt.org) unit classification scheme is used, then publishers may use its CamelCase unit names, such as "SquareMile", in the `unit.name` field. - -Other unit classification schemes may be used, including those in the [unitClassificationScheme codelist](codelists.md#unit-classification-scheme). - ````{admonition} Example :class: hint @@ -560,8 +554,6 @@ Other unit classification schemes may be used, including those in the [unitClass #### ImmediateContainer -The `ImmediateContainer` subschema allows detailed specification of the immediate container of an item. This is also called the presentation, presentation form, or package. For units of measurement, use the [`Unit` subschema](#unit). - ````{admonition} Example :class: hint @@ -574,7 +566,6 @@ The `ImmediateContainer` subschema allows detailed specification of the immediat ```{jsonschema} ../../build/current_lang/release-schema.json :pointer: /definitions/Item/properties/immediateContainer -:collapse: capacity ``` ### Classification @@ -703,6 +694,15 @@ The entries of the top-level `links` array are `Link` objects: :pointer: /definitions/Link ``` +### Quantity + +```{field-description} ../../build/current_lang/release-schema.json /definitions/Quantity +``` + +```{jsonschema} ../../build/current_lang/release-schema.json +:pointer: /definitions/Quantity +``` + ### SimpleIdentifier ```{field-description} ../../build/current_lang/release-schema.json /definitions/SimpleIdentifier @@ -711,3 +711,12 @@ The entries of the top-level `links` array are `Link` objects: ```{jsonschema} ../../build/current_lang/release-schema.json :pointer: /definitions/SimpleIdentifier ``` + +### SimpleUnit + +```{field-description} ../../build/current_lang/release-schema.json /definitions/SimpleUnit +``` + +```{jsonschema} ../../build/current_lang/release-schema.json +:pointer: /definitions/SimpleUnit +``` From 2c46cec6ae4167f5737a09bd01b449c16f81085e Mon Sep 17 00:00:00 2001 From: James McKinney <26463+jpmckinney@users.noreply.github.com> Date: Thu, 13 Jun 2024 00:51:37 -0400 Subject: [PATCH 12/15] unitClassificationScheme: Update the instructions on how to find identifiers within the QUDT scheme --- docs/history/changelog.md | 3 +++ schema/codelists/unitClassificationScheme.csv | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/history/changelog.md b/docs/history/changelog.md index e6ebe3f8b..167035f81 100644 --- a/docs/history/changelog.md +++ b/docs/history/changelog.md @@ -169,6 +169,9 @@ Per the [normative and non-normative content and changes policy](../governance/n * [#1238](https://github.com/open-contracting/standard/pull/1238) Open the `releaseTag` codelist. * [#1415](https://github.com/open-contracting/standard/pull/1415) [#1509](https://github.com/open-contracting/standard/pull/1509) Align descriptions of 'planning', 'tender', 'award' and 'contract' with the corresponding schema fields. +* `unitClassificationScheme.csv`: + * [#1689](https://github.com/open-contracting/standard/pull/1689) Update the instructions on how to find identifiers within the QUDT scheme. + * `tenderStatus`, `awardStatus` and `contractStatus`: * [#1509](https://github.com/open-contracting/standard/pull/1509) [#1658](https://github.com/open-contracting/standard/pull/1658) Clarify semantics and deprecate codes. diff --git a/schema/codelists/unitClassificationScheme.csv b/schema/codelists/unitClassificationScheme.csv index 73229582b..fcd797df2 100644 --- a/schema/codelists/unitClassificationScheme.csv +++ b/schema/codelists/unitClassificationScheme.csv @@ -1,3 +1,3 @@ Code,Title,Description -UNCEFACT,UN/CEFACT Recommendation 20,Use the common code from the latest version of the UN/CEFACT Recommendation 20 list of 'Codes for Units of Measure Used in International Trade'. -QUDT,"Quantities, Units, Dimensions and Data Types Ontologies",Use the [QUDT Code](https://www.qudt.org) value. +UNCEFACT,UN/CEFACT Recommendation 20,"Use the common code from the latest version of the UN/CEFACT Recommendation 20 list of ""Codes for Units of Measure Used in International Trade.""" +QUDT,"Quantities, Units, Dimensions and Data Types Ontologies","Use the unqualified name from the QUDT Units Vocabulary: for example, 'KiloGM'." From f49015bf95b9d0feacb306d26e27e94749abdf04 Mon Sep 17 00:00:00 2001 From: James McKinney <26463+jpmckinney@users.noreply.github.com> Date: Thu, 13 Jun 2024 01:04:00 -0400 Subject: [PATCH 13/15] release-schema: Restore definition of unit of measurement, originally in Markdown --- schema/release-schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/schema/release-schema.json b/schema/release-schema.json index 1d418bf21..53ed21692 100644 --- a/schema/release-schema.json +++ b/schema/release-schema.json @@ -1603,7 +1603,7 @@ }, "unit": { "title": "Pricing unit", - "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation. A unit of measurement is a definite magnitude of a quantity, defined and adopted by convention or law, that is used as a standard of measurement for the same kind of quantity. For example, mass, a quantity, can be measured in kilograms, a unit of measurement.", "$ref": "#/definitions/Unit" }, "immediateContainer": { @@ -2596,7 +2596,7 @@ }, "Unit": { "title": "Pricing unit", - "description": "A pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", + "description": "A pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation. A unit of measurement is a definite magnitude of a quantity, defined and adopted by convention or law, that is used as a standard of measurement for the same kind of quantity. For example, mass, a quantity, can be measured in kilograms, a unit of measurement.", "type": "object", "properties": { "scheme": { From a03a772c172fe14ef708354e3e737c78abf2cd9e Mon Sep 17 00:00:00 2001 From: Duncan Dewhurst Date: Thu, 13 Jun 2024 12:16:50 +0100 Subject: [PATCH 14/15] Update dereferenced release schema --- schema/dereferenced-release-schema.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/schema/dereferenced-release-schema.json b/schema/dereferenced-release-schema.json index cf02311f6..4be286c08 100644 --- a/schema/dereferenced-release-schema.json +++ b/schema/dereferenced-release-schema.json @@ -3078,7 +3078,7 @@ }, "unit": { "title": "Pricing unit", - "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation. A unit of measurement is a definite magnitude of a quantity, defined and adopted by convention or law, that is used as a standard of measurement for the same kind of quantity. For example, mass, a quantity, can be measured in kilograms, a unit of measurement.", "type": "object", "properties": { "scheme": { @@ -8163,7 +8163,7 @@ }, "unit": { "title": "Pricing unit", - "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation. A unit of measurement is a definite magnitude of a quantity, defined and adopted by convention or law, that is used as a standard of measurement for the same kind of quantity. For example, mass, a quantity, can be measured in kilograms, a unit of measurement.", "type": "object", "properties": { "scheme": { @@ -10287,7 +10287,7 @@ }, "unit": { "title": "Pricing unit", - "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation. A unit of measurement is a definite magnitude of a quantity, defined and adopted by convention or law, that is used as a standard of measurement for the same kind of quantity. For example, mass, a quantity, can be measured in kilograms, a unit of measurement.", "type": "object", "properties": { "scheme": { @@ -16342,7 +16342,7 @@ }, "unit": { "title": "Pricing unit", - "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation. A unit of measurement is a definite magnitude of a quantity, defined and adopted by convention or law, that is used as a standard of measurement for the same kind of quantity. For example, mass, a quantity, can be measured in kilograms, a unit of measurement.", "type": "object", "properties": { "scheme": { @@ -21423,7 +21423,7 @@ }, "unit": { "title": "Pricing unit", - "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation. A unit of measurement is a definite magnitude of a quantity, defined and adopted by convention or law, that is used as a standard of measurement for the same kind of quantity. For example, mass, a quantity, can be measured in kilograms, a unit of measurement.", "type": "object", "properties": { "scheme": { @@ -23541,7 +23541,7 @@ }, "unit": { "title": "Pricing unit", - "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation. A unit of measurement is a definite magnitude of a quantity, defined and adopted by convention or law, that is used as a standard of measurement for the same kind of quantity. For example, mass, a quantity, can be measured in kilograms, a unit of measurement.", "type": "object", "properties": { "scheme": { @@ -34223,7 +34223,7 @@ }, "unit": { "title": "Pricing unit", - "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", + "description": "The pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation. A unit of measurement is a definite magnitude of a quantity, defined and adopted by convention or law, that is used as a standard of measurement for the same kind of quantity. For example, mass, a quantity, can be measured in kilograms, a unit of measurement.", "type": "object", "properties": { "scheme": { @@ -35658,7 +35658,7 @@ }, "Unit": { "title": "Pricing unit", - "description": "A pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation.", + "description": "A pricing unit. It is recommended to use the unit of measurement in which the goods, services or works are provided (e.g. kilogram, hour), rather than the unit of presentation (e.g. box), because units of measurement are easier to compare and convert than units of presentation. A unit of measurement is a definite magnitude of a quantity, defined and adopted by convention or law, that is used as a standard of measurement for the same kind of quantity. For example, mass, a quantity, can be measured in kilograms, a unit of measurement.", "type": "object", "properties": { "scheme": { From e7bd89d54715dd61f2463e5226196b360aea92e8 Mon Sep 17 00:00:00 2001 From: James McKinney <26463+jpmckinney@users.noreply.github.com> Date: Fri, 28 Jun 2024 16:00:14 -0400 Subject: [PATCH 15/15] release-schema: Avoid repeating the title in the description for immediateContainer and unit --- schema/dereferenced-release-schema.json | 22 +++++++++++----------- schema/release-schema.json | 6 +++--- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/schema/dereferenced-release-schema.json b/schema/dereferenced-release-schema.json index fb181d345..f71c5592f 100644 --- a/schema/dereferenced-release-schema.json +++ b/schema/dereferenced-release-schema.json @@ -1616,7 +1616,7 @@ }, "title": { "title": "Title", - "description": "The name of the project. If a project's register is available, this should be the same as the project's name in that register.", + "description": "The name of the project. If a projects register is available, this should be the same as the project's name in that register.", "type": [ "string", "null" @@ -4074,7 +4074,7 @@ }, "immediateContainer": { "title": "Immediate container", - "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "description": "The innermost packaging with which the item is in direct contact. Also known as: presentation, presentation form, package.", "type": "object", "properties": { "name": { @@ -10033,7 +10033,7 @@ }, "immediateContainer": { "title": "Immediate container", - "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "description": "The innermost packaging with which the item is in direct contact. Also known as: presentation, presentation form, package.", "type": "object", "properties": { "name": { @@ -12587,7 +12587,7 @@ }, "immediateContainer": { "title": "Immediate container", - "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "description": "The innermost packaging with which the item is in direct contact. Also known as: presentation, presentation form, package.", "type": "object", "properties": { "name": { @@ -17222,7 +17222,7 @@ }, "title": { "title": "Title", - "description": "The name of the project. If a project's register is available, this should be the same as the project's name in that register.", + "description": "The name of the project. If a projects register is available, this should be the same as the project's name in that register.", "type": [ "string", "null" @@ -19680,7 +19680,7 @@ }, "immediateContainer": { "title": "Immediate container", - "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "description": "The innermost packaging with which the item is in direct contact. Also known as: presentation, presentation form, package.", "type": "object", "properties": { "name": { @@ -25635,7 +25635,7 @@ }, "immediateContainer": { "title": "Immediate container", - "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "description": "The innermost packaging with which the item is in direct contact. Also known as: presentation, presentation form, package.", "type": "object", "properties": { "name": { @@ -28183,7 +28183,7 @@ }, "immediateContainer": { "title": "Immediate container", - "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "description": "The innermost packaging with which the item is in direct contact. Also known as: presentation, presentation form, package.", "type": "object", "properties": { "name": { @@ -39359,7 +39359,7 @@ }, "immediateContainer": { "title": "Immediate container", - "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "description": "The innermost packaging with which the item is in direct contact. Also known as: presentation, presentation form, package.", "type": "object", "properties": { "name": { @@ -41324,7 +41324,7 @@ }, "ImmediateContainer": { "title": "Immediate container", - "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "description": "The innermost packaging with which an item is in direct contact. Also known as: presentation, presentation form, package.", "type": "object", "properties": { "name": { @@ -41579,7 +41579,7 @@ }, "title": { "title": "Title", - "description": "The name of the project. If a project's register is available, this should be the same as the project's name in that register.", + "description": "The name of the project. If a projects register is available, this should be the same as the project's name in that register.", "type": [ "string", "null" diff --git a/schema/release-schema.json b/schema/release-schema.json index 4f7bdaf8d..46f3ea6d8 100644 --- a/schema/release-schema.json +++ b/schema/release-schema.json @@ -1633,7 +1633,7 @@ }, "immediateContainer": { "title": "Immediate container", - "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "description": "The innermost packaging with which the item is in direct contact. Also known as: presentation, presentation form, package.", "$ref": "#/definitions/ImmediateContainer" }, "deliveryLocations": { @@ -2790,7 +2790,7 @@ }, "ImmediateContainer": { "title": "Immediate container", - "description": "The immediate container for the item. Also known as: presentation, presentation form, package.", + "description": "The innermost packaging with which an item is in direct contact. Also known as: presentation, presentation form, package.", "type": "object", "properties": { "name": { @@ -2979,7 +2979,7 @@ }, "title": { "title": "Title", - "description": "The name of the project. If a project's register is available, this should be the same as the project's name in that register.", + "description": "The name of the project. If a projects register is available, this should be the same as the project's name in that register.", "type": [ "string", "null"