@gruncellka/porto-data 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +215 -0
- package/LICENSE +199 -5
- package/README.md +53 -34
- package/index.d.ts +35 -18
- package/index.js +2 -1
- package/package.json +28 -8
- package/porto_data/formats/envelopes.json +120 -0
- package/porto_data/formats/layouts.json +288 -0
- package/porto_data/mappings.json +65 -10
- package/porto_data/metadata.json +662 -125
- package/porto_data/policy/jurisdictions.json +839 -0
- package/porto_data/policy/markets.json +75 -0
- package/porto_data/policy/restrictions.json +668 -0
- package/porto_data/providers/deutschepost/features.json +42 -0
- package/porto_data/providers/deutschepost/graph.json +203 -0
- package/porto_data/providers/deutschepost/limits.json +17 -0
- package/porto_data/providers/deutschepost/marks.json +71 -0
- package/porto_data/providers/deutschepost/prices/products.json +239 -0
- package/porto_data/providers/deutschepost/prices/services.json +51 -0
- package/porto_data/providers/deutschepost/products.json +197 -0
- package/porto_data/providers/deutschepost/services.json +88 -0
- package/porto_data/providers/deutschepost/weights.json +46 -0
- package/porto_data/providers/deutschepost/zones.json +231 -0
- package/porto_data/providers/laposte/features.json +42 -0
- package/porto_data/providers/laposte/graph.json +234 -0
- package/porto_data/providers/laposte/limits.json +17 -0
- package/porto_data/providers/laposte/marks.json +39 -0
- package/porto_data/providers/laposte/prices/products.json +947 -0
- package/porto_data/providers/laposte/prices/services.json +41 -0
- package/porto_data/providers/laposte/products.json +276 -0
- package/porto_data/providers/laposte/services.json +63 -0
- package/porto_data/providers/laposte/weights.json +38 -0
- package/porto_data/providers/laposte/zones.json +230 -0
- package/porto_data/providers/swisspost/features.json +21 -0
- package/porto_data/providers/swisspost/graph.json +212 -0
- package/porto_data/providers/swisspost/limits.json +17 -0
- package/porto_data/providers/swisspost/marks.json +41 -0
- package/porto_data/providers/swisspost/prices/products.json +347 -0
- package/porto_data/providers/swisspost/prices/services.json +31 -0
- package/porto_data/providers/swisspost/products.json +193 -0
- package/porto_data/providers/swisspost/rules.json +25 -0
- package/porto_data/providers/swisspost/services.json +40 -0
- package/porto_data/providers/swisspost/weights.json +38 -0
- package/porto_data/providers/swisspost/zones.json +223 -0
- package/porto_data/providers/ukrposhta/features.json +28 -0
- package/porto_data/providers/ukrposhta/graph.json +148 -0
- package/porto_data/providers/ukrposhta/limits.json +17 -0
- package/porto_data/providers/ukrposhta/marks.json +25 -0
- package/porto_data/providers/ukrposhta/prices/products.json +123 -0
- package/porto_data/providers/ukrposhta/prices/services.json +42 -0
- package/porto_data/providers/ukrposhta/products.json +74 -0
- package/porto_data/providers/ukrposhta/services.json +40 -0
- package/porto_data/providers/ukrposhta/weights.json +26 -0
- package/porto_data/providers/ukrposhta/zones.json +226 -0
- package/porto_data/providers.json +37 -0
- package/porto_data/schemas/envelopes.schema.json +120 -0
- package/porto_data/schemas/features.schema.json +66 -55
- package/porto_data/schemas/graph.schema.json +189 -0
- package/porto_data/schemas/jurisdictions.schema.json +116 -0
- package/porto_data/schemas/layouts.schema.json +156 -0
- package/porto_data/schemas/limits.schema.json +253 -0
- package/porto_data/schemas/mappings.schema.json +73 -0
- package/porto_data/schemas/markets.schema.json +186 -0
- package/porto_data/schemas/marks.schema.json +127 -0
- package/porto_data/schemas/metadata.schema.json +183 -0
- package/porto_data/schemas/porto_ids.schema.json +45 -0
- package/porto_data/schemas/product_prices.schema.json +126 -0
- package/porto_data/schemas/products.schema.json +338 -110
- package/porto_data/schemas/providers.schema.json +71 -0
- package/porto_data/schemas/restrictions.schema.json +175 -355
- package/porto_data/schemas/rules.schema.json +104 -0
- package/porto_data/schemas/service_prices.schema.json +116 -0
- package/porto_data/schemas/services.schema.json +113 -70
- package/porto_data/schemas/weights.schema.json +70 -0
- package/porto_data/schemas/zones.schema.json +78 -72
- package/porto_data/data/data_links.json +0 -148
- package/porto_data/data/dimensions.json +0 -158
- package/porto_data/data/features.json +0 -66
- package/porto_data/data/prices.json +0 -242
- package/porto_data/data/products.json +0 -84
- package/porto_data/data/restrictions.json +0 -795
- package/porto_data/data/services.json +0 -61
- package/porto_data/data/weight_tiers.json +0 -54
- package/porto_data/data/zones.json +0 -230
- package/porto_data/schemas/data_links.schema.json +0 -223
- package/porto_data/schemas/dimensions.schema.json +0 -215
- package/porto_data/schemas/prices.schema.json +0 -180
- package/porto_data/schemas/weight_tiers.schema.json +0 -70
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/gruncellka/porto-data/refs/heads/main/porto_data/schemas/layouts.schema.json",
|
|
4
|
+
"title": "Envelope layouts by jurisdiction",
|
|
5
|
+
"description": "Print geometry on the envelope front per ISO 3166-1 alpha-2 jurisdiction. Physical sizes: formats/envelopes.json. Coordinates: origin top-left, mm, landscape front. Optional standard cites the norm (e.g. DIN678, SN010130, NFEN13850).",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"file_type",
|
|
9
|
+
"unit",
|
|
10
|
+
"jurisdictions"
|
|
11
|
+
],
|
|
12
|
+
"definitions": {
|
|
13
|
+
"rectangleMm": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"required": [
|
|
16
|
+
"x",
|
|
17
|
+
"y",
|
|
18
|
+
"width",
|
|
19
|
+
"height"
|
|
20
|
+
],
|
|
21
|
+
"properties": {
|
|
22
|
+
"x": {
|
|
23
|
+
"type": "integer",
|
|
24
|
+
"minimum": 0
|
|
25
|
+
},
|
|
26
|
+
"y": {
|
|
27
|
+
"type": "integer",
|
|
28
|
+
"minimum": 0
|
|
29
|
+
},
|
|
30
|
+
"width": {
|
|
31
|
+
"type": "integer",
|
|
32
|
+
"minimum": 1
|
|
33
|
+
},
|
|
34
|
+
"height": {
|
|
35
|
+
"type": "integer",
|
|
36
|
+
"minimum": 1
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"additionalProperties": false
|
|
40
|
+
},
|
|
41
|
+
"postMarkAnchorMm": {
|
|
42
|
+
"type": "object",
|
|
43
|
+
"required": [
|
|
44
|
+
"x",
|
|
45
|
+
"y"
|
|
46
|
+
],
|
|
47
|
+
"properties": {
|
|
48
|
+
"x": {
|
|
49
|
+
"type": "integer",
|
|
50
|
+
"minimum": 0
|
|
51
|
+
},
|
|
52
|
+
"y": {
|
|
53
|
+
"type": "integer",
|
|
54
|
+
"minimum": 0
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"additionalProperties": false
|
|
58
|
+
},
|
|
59
|
+
"layoutBody": {
|
|
60
|
+
"type": "object",
|
|
61
|
+
"required": [
|
|
62
|
+
"post_mark",
|
|
63
|
+
"window"
|
|
64
|
+
],
|
|
65
|
+
"properties": {
|
|
66
|
+
"post_mark": {
|
|
67
|
+
"$ref": "#/definitions/postMarkAnchorMm"
|
|
68
|
+
},
|
|
69
|
+
"window": {
|
|
70
|
+
"type": "object",
|
|
71
|
+
"required": [
|
|
72
|
+
"supported"
|
|
73
|
+
],
|
|
74
|
+
"properties": {
|
|
75
|
+
"supported": {
|
|
76
|
+
"type": "boolean"
|
|
77
|
+
},
|
|
78
|
+
"area": {
|
|
79
|
+
"$ref": "#/definitions/rectangleMm"
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
"additionalProperties": false
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"additionalProperties": false
|
|
86
|
+
},
|
|
87
|
+
"envelopeLayoutRow": {
|
|
88
|
+
"type": "object",
|
|
89
|
+
"required": [
|
|
90
|
+
"orientation",
|
|
91
|
+
"layout"
|
|
92
|
+
],
|
|
93
|
+
"properties": {
|
|
94
|
+
"standard": {
|
|
95
|
+
"type": "string",
|
|
96
|
+
"minLength": 1
|
|
97
|
+
},
|
|
98
|
+
"orientation": {
|
|
99
|
+
"type": "string",
|
|
100
|
+
"enum": [
|
|
101
|
+
"landscape",
|
|
102
|
+
"portrait"
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
"layout": {
|
|
106
|
+
"$ref": "#/definitions/layoutBody"
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
"additionalProperties": false
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"properties": {
|
|
113
|
+
"$schema": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"format": "uri"
|
|
116
|
+
},
|
|
117
|
+
"file_type": {
|
|
118
|
+
"type": "string",
|
|
119
|
+
"const": "layouts"
|
|
120
|
+
},
|
|
121
|
+
"unit": {
|
|
122
|
+
"type": "object",
|
|
123
|
+
"required": [
|
|
124
|
+
"dimension"
|
|
125
|
+
],
|
|
126
|
+
"properties": {
|
|
127
|
+
"dimension": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"const": "mm"
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
"additionalProperties": false
|
|
133
|
+
},
|
|
134
|
+
"jurisdictions": {
|
|
135
|
+
"type": "object",
|
|
136
|
+
"minProperties": 1,
|
|
137
|
+
"additionalProperties": {
|
|
138
|
+
"type": "object",
|
|
139
|
+
"required": [
|
|
140
|
+
"envelopes"
|
|
141
|
+
],
|
|
142
|
+
"properties": {
|
|
143
|
+
"envelopes": {
|
|
144
|
+
"type": "object",
|
|
145
|
+
"minProperties": 1,
|
|
146
|
+
"additionalProperties": {
|
|
147
|
+
"$ref": "#/definitions/envelopeLayoutRow"
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
"additionalProperties": false
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
"additionalProperties": false
|
|
156
|
+
}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/gruncellka/porto-data/refs/heads/main/porto_data/schemas/limits.schema.json",
|
|
4
|
+
"title": "Provider limits schema",
|
|
5
|
+
"description": "Provider-scoped operational limits: how this operator applies service (conflicts, infrastructure, internal policy). Not shared legal sanctions—those live in policy/restrictions.json (country / EU / UN regimes, independent of any single carrier). Each limits file is keyed by provider; regime periods and calendar use the provider operational timezone (see frameworks.timezone, aligned with providers.json for the same provider id).",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"file_type",
|
|
9
|
+
"provider",
|
|
10
|
+
"unit",
|
|
11
|
+
"limits",
|
|
12
|
+
"frameworks"
|
|
13
|
+
],
|
|
14
|
+
"properties": {
|
|
15
|
+
"$schema": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"format": "uri",
|
|
18
|
+
"description": "JSON Schema URI reference"
|
|
19
|
+
},
|
|
20
|
+
"file_type": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"const": "limits",
|
|
23
|
+
"description": "File type identifier"
|
|
24
|
+
},
|
|
25
|
+
"provider": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"pattern": "^[a-z_]+$",
|
|
28
|
+
"description": "Provider id (must match path providers/<id>/)"
|
|
29
|
+
},
|
|
30
|
+
"unit": {
|
|
31
|
+
"type": "object",
|
|
32
|
+
"required": [
|
|
33
|
+
"country_code",
|
|
34
|
+
"date"
|
|
35
|
+
],
|
|
36
|
+
"properties": {
|
|
37
|
+
"country_code": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"const": "ISO 3166-1 alpha-2"
|
|
40
|
+
},
|
|
41
|
+
"date": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"const": "ISO 8601"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"additionalProperties": false
|
|
47
|
+
},
|
|
48
|
+
"limits": {
|
|
49
|
+
"type": "array",
|
|
50
|
+
"items": {
|
|
51
|
+
"type": "object",
|
|
52
|
+
"required": [
|
|
53
|
+
"id",
|
|
54
|
+
"country_code",
|
|
55
|
+
"status",
|
|
56
|
+
"reason",
|
|
57
|
+
"notes",
|
|
58
|
+
"effective_from"
|
|
59
|
+
],
|
|
60
|
+
"properties": {
|
|
61
|
+
"id": {
|
|
62
|
+
"type": "string"
|
|
63
|
+
},
|
|
64
|
+
"country_code": {
|
|
65
|
+
"type": "string",
|
|
66
|
+
"pattern": "^[A-Z]{2}$"
|
|
67
|
+
},
|
|
68
|
+
"region_code": {
|
|
69
|
+
"type": "string"
|
|
70
|
+
},
|
|
71
|
+
"status": {
|
|
72
|
+
"type": "string",
|
|
73
|
+
"enum": [
|
|
74
|
+
"restricted",
|
|
75
|
+
"limited",
|
|
76
|
+
"prohibited",
|
|
77
|
+
"severe",
|
|
78
|
+
"operational"
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
"reason": {
|
|
82
|
+
"type": "string"
|
|
83
|
+
},
|
|
84
|
+
"description": {
|
|
85
|
+
"type": "string"
|
|
86
|
+
},
|
|
87
|
+
"notes": {
|
|
88
|
+
"type": "string"
|
|
89
|
+
},
|
|
90
|
+
"areas": {
|
|
91
|
+
"type": "object",
|
|
92
|
+
"additionalProperties": {
|
|
93
|
+
"type": "string"
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"entity_type": {
|
|
97
|
+
"type": "string",
|
|
98
|
+
"enum": [
|
|
99
|
+
"country",
|
|
100
|
+
"territory",
|
|
101
|
+
"disputed"
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
"effective_from": {
|
|
105
|
+
"type": [
|
|
106
|
+
"string",
|
|
107
|
+
"null"
|
|
108
|
+
],
|
|
109
|
+
"format": "date"
|
|
110
|
+
},
|
|
111
|
+
"effective_to": {
|
|
112
|
+
"type": [
|
|
113
|
+
"string",
|
|
114
|
+
"null"
|
|
115
|
+
],
|
|
116
|
+
"format": "date"
|
|
117
|
+
},
|
|
118
|
+
"partial": {
|
|
119
|
+
"type": "boolean"
|
|
120
|
+
},
|
|
121
|
+
"reference": {
|
|
122
|
+
"type": [
|
|
123
|
+
"string",
|
|
124
|
+
"null"
|
|
125
|
+
],
|
|
126
|
+
"format": "uri"
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
"additionalProperties": false
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
"context": {
|
|
133
|
+
"type": "object",
|
|
134
|
+
"description": "Provider-facing narrative only (this limits file’s carrier). Do not use this object to stand in for legal regimes; policy/restrictions.json holds verifiable destination rows and EU/UN-style frameworks.",
|
|
135
|
+
"properties": {
|
|
136
|
+
"national": {
|
|
137
|
+
"type": "object",
|
|
138
|
+
"required": [
|
|
139
|
+
"description",
|
|
140
|
+
"notes"
|
|
141
|
+
],
|
|
142
|
+
"properties": {
|
|
143
|
+
"description": {
|
|
144
|
+
"type": "string"
|
|
145
|
+
},
|
|
146
|
+
"notes": {
|
|
147
|
+
"type": "string"
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
"additionalProperties": false
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
"additionalProperties": false
|
|
154
|
+
},
|
|
155
|
+
"frameworks": {
|
|
156
|
+
"type": "object",
|
|
157
|
+
"description": "Operational regime metadata for this provider. Each framework documents the regime time window (effective_from / effective_to, nullable) interpreted in timezone (provider operational calendar—must match providers.<id>.timezone). limits[] row effective_from/effective_to remain authoritative for SDK activation; framework dates are the documented span, usually aligned with the primary limit row.",
|
|
158
|
+
"patternProperties": {
|
|
159
|
+
"^[A-Z0-9_]+$": {
|
|
160
|
+
"type": "object",
|
|
161
|
+
"required": [
|
|
162
|
+
"id",
|
|
163
|
+
"label",
|
|
164
|
+
"description",
|
|
165
|
+
"type",
|
|
166
|
+
"applies_to",
|
|
167
|
+
"effective_from",
|
|
168
|
+
"effective_to",
|
|
169
|
+
"timezone"
|
|
170
|
+
],
|
|
171
|
+
"properties": {
|
|
172
|
+
"id": {
|
|
173
|
+
"type": "string"
|
|
174
|
+
},
|
|
175
|
+
"label": {
|
|
176
|
+
"type": "string"
|
|
177
|
+
},
|
|
178
|
+
"description": {
|
|
179
|
+
"type": "string"
|
|
180
|
+
},
|
|
181
|
+
"type": {
|
|
182
|
+
"type": "string",
|
|
183
|
+
"enum": [
|
|
184
|
+
"conflict",
|
|
185
|
+
"infrastructure",
|
|
186
|
+
"political"
|
|
187
|
+
]
|
|
188
|
+
},
|
|
189
|
+
"applies_to": {
|
|
190
|
+
"type": "array",
|
|
191
|
+
"items": {
|
|
192
|
+
"type": "string",
|
|
193
|
+
"pattern": "^[A-Z]{2}$|^ALL$"
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
"regions": {
|
|
197
|
+
"type": "array",
|
|
198
|
+
"items": {
|
|
199
|
+
"type": "object",
|
|
200
|
+
"required": [
|
|
201
|
+
"code",
|
|
202
|
+
"name"
|
|
203
|
+
],
|
|
204
|
+
"properties": {
|
|
205
|
+
"code": {
|
|
206
|
+
"type": "string"
|
|
207
|
+
},
|
|
208
|
+
"name": {
|
|
209
|
+
"type": "string"
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
"additionalProperties": false
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
"note": {
|
|
216
|
+
"type": "string"
|
|
217
|
+
},
|
|
218
|
+
"reference": {
|
|
219
|
+
"type": [
|
|
220
|
+
"string",
|
|
221
|
+
"null"
|
|
222
|
+
],
|
|
223
|
+
"format": "uri"
|
|
224
|
+
},
|
|
225
|
+
"effective_from": {
|
|
226
|
+
"type": [
|
|
227
|
+
"string",
|
|
228
|
+
"null"
|
|
229
|
+
],
|
|
230
|
+
"format": "date"
|
|
231
|
+
},
|
|
232
|
+
"effective_to": {
|
|
233
|
+
"type": [
|
|
234
|
+
"string",
|
|
235
|
+
"null"
|
|
236
|
+
],
|
|
237
|
+
"format": "date"
|
|
238
|
+
},
|
|
239
|
+
"timezone": {
|
|
240
|
+
"type": "string",
|
|
241
|
+
"minLength": 3,
|
|
242
|
+
"pattern": "^[A-Za-z0-9_+-]+(/[A-Za-z0-9_+-]+)+$",
|
|
243
|
+
"description": "IANA zone for this provider’s operational calendar (must match providers.json → providers.<id>.timezone for the limits file’s provider). Used when interpreting framework and limits row effective_* dates."
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
"additionalProperties": false
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
"additionalProperties": false
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
"additionalProperties": false
|
|
253
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/gruncellka/porto-data/refs/heads/main/porto_data/schemas/mappings.schema.json",
|
|
4
|
+
"title": "Porto-data schema ↔ data mappings",
|
|
5
|
+
"description": "Maps each JSON Schema path under schemas/ to its canonical data file (policy/, formats/, providers/<id>/, or bundle root). Blocks mirror bundle layout: policy, formats, registry (e.g. providers.json), providers. Provider keys must match providers.json.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"mappings"
|
|
9
|
+
],
|
|
10
|
+
"additionalProperties": false,
|
|
11
|
+
"properties": {
|
|
12
|
+
"$schema": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"format": "uri"
|
|
15
|
+
},
|
|
16
|
+
"mappings": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"required": [
|
|
19
|
+
"policy",
|
|
20
|
+
"formats",
|
|
21
|
+
"registry",
|
|
22
|
+
"providers"
|
|
23
|
+
],
|
|
24
|
+
"additionalProperties": false,
|
|
25
|
+
"properties": {
|
|
26
|
+
"policy": {
|
|
27
|
+
"type": "object",
|
|
28
|
+
"minProperties": 0,
|
|
29
|
+
"additionalProperties": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"minLength": 1,
|
|
32
|
+
"pattern": "^(?!\\.\\./)([A-Za-z0-9_.-]+/)*[A-Za-z0-9_.-]+\\.json$"
|
|
33
|
+
},
|
|
34
|
+
"description": "Schema paths → data under policy/."
|
|
35
|
+
},
|
|
36
|
+
"formats": {
|
|
37
|
+
"type": "object",
|
|
38
|
+
"minProperties": 0,
|
|
39
|
+
"additionalProperties": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"minLength": 1,
|
|
42
|
+
"pattern": "^(?!\\.\\./)([A-Za-z0-9_.-]+/)*[A-Za-z0-9_.-]+\\.json$"
|
|
43
|
+
},
|
|
44
|
+
"description": "Schema paths → data under formats/."
|
|
45
|
+
},
|
|
46
|
+
"registry": {
|
|
47
|
+
"type": "object",
|
|
48
|
+
"minProperties": 0,
|
|
49
|
+
"additionalProperties": {
|
|
50
|
+
"type": "string",
|
|
51
|
+
"minLength": 1,
|
|
52
|
+
"pattern": "^(?!\\.\\./)([A-Za-z0-9_.-]+/)*[A-Za-z0-9_.-]+\\.json$"
|
|
53
|
+
},
|
|
54
|
+
"description": "Schema paths → bundle-root manifest files (e.g. providers.json)."
|
|
55
|
+
},
|
|
56
|
+
"providers": {
|
|
57
|
+
"type": "object",
|
|
58
|
+
"minProperties": 0,
|
|
59
|
+
"additionalProperties": {
|
|
60
|
+
"type": "object",
|
|
61
|
+
"minProperties": 1,
|
|
62
|
+
"additionalProperties": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"minLength": 1,
|
|
65
|
+
"pattern": "^(?!\\.\\./)([A-Za-z0-9_.-]+/)*[A-Za-z0-9_.-]+\\.json$"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"description": "Provider id → map of schema path → data path under providers/<id>/."
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/gruncellka/porto-data/refs/heads/main/porto_data/schemas/markets.schema.json",
|
|
4
|
+
"title": "Markets (country fiscal and calendar policy)",
|
|
5
|
+
"description": "Per-country currency, VAT, international quote currencies, and postal working-day calendar. providers.json country resolves fiscal and working_days defaults via markets[COUNTRY]. All operators in the same country share one market row.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"file_type",
|
|
9
|
+
"unit",
|
|
10
|
+
"markets"
|
|
11
|
+
],
|
|
12
|
+
"properties": {
|
|
13
|
+
"$schema": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"format": "uri"
|
|
16
|
+
},
|
|
17
|
+
"file_type": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"const": "markets"
|
|
20
|
+
},
|
|
21
|
+
"description": {
|
|
22
|
+
"type": "string"
|
|
23
|
+
},
|
|
24
|
+
"unit": {
|
|
25
|
+
"type": "object",
|
|
26
|
+
"description": "Encoding hints for country_code and currency fields in this file.",
|
|
27
|
+
"required": [
|
|
28
|
+
"country_code",
|
|
29
|
+
"currency"
|
|
30
|
+
],
|
|
31
|
+
"properties": {
|
|
32
|
+
"country_code": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"const": "ISO 3166-1 alpha-2"
|
|
35
|
+
},
|
|
36
|
+
"currency": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"const": "ISO 4217"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"additionalProperties": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"minLength": 1
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"markets": {
|
|
47
|
+
"type": "object",
|
|
48
|
+
"minProperties": 1,
|
|
49
|
+
"patternProperties": {
|
|
50
|
+
"^[A-Z]{2}$": {
|
|
51
|
+
"$ref": "#/definitions/market"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"additionalProperties": false
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"definitions": {
|
|
58
|
+
"currency_code": {
|
|
59
|
+
"type": "string",
|
|
60
|
+
"enum": [
|
|
61
|
+
"EUR",
|
|
62
|
+
"CHF",
|
|
63
|
+
"UAH",
|
|
64
|
+
"USD"
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
"vat_lane": {
|
|
68
|
+
"type": "object",
|
|
69
|
+
"required": [
|
|
70
|
+
"inclusive"
|
|
71
|
+
],
|
|
72
|
+
"properties": {
|
|
73
|
+
"inclusive": {
|
|
74
|
+
"type": "boolean",
|
|
75
|
+
"description": "When true, published tariff amounts for this lane include VAT."
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"additionalProperties": false
|
|
79
|
+
},
|
|
80
|
+
"vat": {
|
|
81
|
+
"type": "object",
|
|
82
|
+
"properties": {
|
|
83
|
+
"rate": {
|
|
84
|
+
"type": "number",
|
|
85
|
+
"minimum": 0,
|
|
86
|
+
"maximum": 1,
|
|
87
|
+
"description": "Standard VAT rate as a fraction (e.g. 0.2 for 20%)."
|
|
88
|
+
},
|
|
89
|
+
"exempt": {
|
|
90
|
+
"type": "boolean",
|
|
91
|
+
"description": "When true, universal letter service is VAT-exempt in this market (all lanes)."
|
|
92
|
+
},
|
|
93
|
+
"domestic": {
|
|
94
|
+
"$ref": "#/definitions/vat_lane",
|
|
95
|
+
"description": "VAT presentation for domestic-zone tariff rows."
|
|
96
|
+
},
|
|
97
|
+
"international": {
|
|
98
|
+
"$ref": "#/definitions/vat_lane",
|
|
99
|
+
"description": "VAT presentation for international-zone tariff rows."
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
"additionalProperties": false
|
|
103
|
+
},
|
|
104
|
+
"settlement": {
|
|
105
|
+
"type": "object",
|
|
106
|
+
"required": [
|
|
107
|
+
"currency",
|
|
108
|
+
"fx",
|
|
109
|
+
"fx_date"
|
|
110
|
+
],
|
|
111
|
+
"properties": {
|
|
112
|
+
"currency": {
|
|
113
|
+
"$ref": "#/definitions/currency_code",
|
|
114
|
+
"description": "Currency charged at checkout or service date."
|
|
115
|
+
},
|
|
116
|
+
"fx": {
|
|
117
|
+
"type": "string",
|
|
118
|
+
"minLength": 1,
|
|
119
|
+
"description": "FX rate source when quoted amount differs from settlement currency (e.g. NBU)."
|
|
120
|
+
},
|
|
121
|
+
"fx_date": {
|
|
122
|
+
"type": "string",
|
|
123
|
+
"minLength": 1,
|
|
124
|
+
"description": "When FX applies (e.g. service for service-date rate)."
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
"additionalProperties": false
|
|
128
|
+
},
|
|
129
|
+
"working_days": {
|
|
130
|
+
"type": "object",
|
|
131
|
+
"required": [
|
|
132
|
+
"weekdays",
|
|
133
|
+
"exclude_public_holidays"
|
|
134
|
+
],
|
|
135
|
+
"properties": {
|
|
136
|
+
"weekdays": {
|
|
137
|
+
"type": "string",
|
|
138
|
+
"enum": [
|
|
139
|
+
"mon_fri",
|
|
140
|
+
"mon_sat"
|
|
141
|
+
],
|
|
142
|
+
"description": "Which weekdays count toward operator-stated delivery SLAs in this market."
|
|
143
|
+
},
|
|
144
|
+
"exclude_public_holidays": {
|
|
145
|
+
"type": "boolean",
|
|
146
|
+
"description": "When true, public holidays of this market do not count as delivery days."
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
"additionalProperties": false
|
|
150
|
+
},
|
|
151
|
+
"market": {
|
|
152
|
+
"type": "object",
|
|
153
|
+
"required": [
|
|
154
|
+
"currency",
|
|
155
|
+
"working_days"
|
|
156
|
+
],
|
|
157
|
+
"properties": {
|
|
158
|
+
"currency": {
|
|
159
|
+
"$ref": "#/definitions/currency_code",
|
|
160
|
+
"description": "Default domestic postal quote currency for this market."
|
|
161
|
+
},
|
|
162
|
+
"working_days": {
|
|
163
|
+
"$ref": "#/definitions/working_days",
|
|
164
|
+
"description": "Default postal working-day calendar for operator delivery SLAs in this market."
|
|
165
|
+
},
|
|
166
|
+
"international_currency": {
|
|
167
|
+
"type": "array",
|
|
168
|
+
"minItems": 1,
|
|
169
|
+
"uniqueItems": true,
|
|
170
|
+
"items": {
|
|
171
|
+
"$ref": "#/definitions/currency_code"
|
|
172
|
+
},
|
|
173
|
+
"description": "Allowed row-level quote currencies when a tariff row differs from currency."
|
|
174
|
+
},
|
|
175
|
+
"vat": {
|
|
176
|
+
"$ref": "#/definitions/vat"
|
|
177
|
+
},
|
|
178
|
+
"settlement": {
|
|
179
|
+
"$ref": "#/definitions/settlement"
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
"additionalProperties": false
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
"additionalProperties": false
|
|
186
|
+
}
|