ippc-model 1.0.0__py3-none-any.whl

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.
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ File name:
6
+ Author: "SYSNET s.r.o."<rjaeger@sysnet.cz>
7
+ Created:
8
+ Version: 1.0.0
9
+ Description:
10
+ """
@@ -0,0 +1,45 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Optional, List
4
+
5
+ from pydantic import BaseModel, Field
6
+ from sysnet_pyutils.models.general import MetadataTypeBase, MetadataType, LogItemType, ListTypeBase
7
+
8
+ from ippc_model.ippc_common import ActivityStatusEnum
9
+
10
+
11
+ # Činnost (kategorie) IPPC [Kategorie zařízení. Příloha č. 1 zákona č. 76/2002 Sb.]
12
+
13
+
14
+ class ActivityTypeBase(BaseModel):
15
+ category: Optional[str] = Field(default=None, description='Kategorie zařízení (Equipment_Class)')
16
+ code: Optional[str] = Field(default=None, description='Číslo (Equipment_Categories)')
17
+ value_cz: Optional[str] = Field(default=None, description='Popis (Equipment_Categories_Text)')
18
+ value_en: Optional[str] = Field(default=None, description='Popis - Reporting EK (Equipment_Categories_Text_EK)')
19
+ hidden: Optional[bool] = Field(default=False, description='Skrýt kategorii v pohledech (Equipment_Class_Hide)')
20
+ comment: Optional[str] = Field(default=None, description='Poznámka (Comment)')
21
+ metadata: Optional[MetadataTypeBase] = Field(default=None, description='Metadata dokumentu')
22
+
23
+
24
+ class ActivityType(ActivityTypeBase):
25
+ status: Optional[ActivityStatusEnum] = Field(default=ActivityStatusEnum.AC_NEW, description='Stav položky činnosti')
26
+ metadata: Optional[MetadataType] = Field(default=None, description='')
27
+ history: Optional[list[LogItemType]] = Field(default=None, description='Historie dokumentu')
28
+
29
+
30
+ class ActivityListType(ListTypeBase):
31
+ hits: Optional[int] = Field(default=0, description='Hits')
32
+ entries: Optional[List[ActivityType]] = Field(default=None, description='')
33
+
34
+
35
+ class ActivityViewItemType(BaseModel):
36
+ hidden: Optional[bool] = Field(default=False, description='Skrýt kategorii v pohledech (Equipment_Class_Hide)')
37
+ category: Optional[str] = Field(default=None, description='Kategorie zařízení (Equipment_Class)')
38
+ code: Optional[str] = Field(default=None, description='Číslo (Equipment_Categories)')
39
+ value_cz: Optional[str] = Field(default=None, description='Popis (Equipment_Categories_Text)')
40
+ value_en: Optional[str] = Field(default=None, description='Popis - Reporting EK (Equipment_Categories_Text_EK)')
41
+ count_container: Optional[int] = Field(default=0, description='Počet IP')
42
+ count_equipment: Optional[int] = Field(default=0, description='Počet zařízení')
43
+ count_expert: Optional[int] = Field(default=0, description='Počet OZO')
44
+
45
+
@@ -0,0 +1,362 @@
1
+ import json
2
+ from datetime import datetime
3
+ from enum import Enum
4
+ from typing import Optional, List, Union
5
+ from uuid import UUID
6
+
7
+ from pydantic import BaseModel, Field
8
+ from sysnet_pyutils.data_utils import get_dict_value_list, get_dict_value
9
+ from sysnet_pyutils.models.general import LinkedType, WorkflowType, RegionalValueType
10
+ from sysnet_pyutils.utils import is_valid_uuid
11
+
12
+
13
+ class IppcDocCodeEnum(Enum):
14
+ REQUEST = 'request'
15
+ SUMMARIZE = 'summarize'
16
+ STATEMENT = 'statement'
17
+ STATEMENT_CENIA = 'statement-cenia'
18
+ DECISION = 'decision'
19
+ APPEAL = 'appeal'
20
+ APPDEC = 'appdec'
21
+ RE_DECISION = 're-decision'
22
+ MINORCHANGE = 'minorchange'
23
+ CANCELED = 'canceled'
24
+ CHANGE = 'change'
25
+ ADDITIONAL = 'additional'
26
+ TERMINATED = 'terminated'
27
+ EXCEPTIONS = 'exceptions'
28
+ APPEAL_RESULT = 'appeal-result'
29
+ INTERRUPTED = 'interrupted'
30
+ RESUMED = 'resumed'
31
+ VALIDATE = 'validate'
32
+ EXEMPTION = 'exemption'
33
+ CLOSED = 'closed'
34
+
35
+ REPORT_CONDITIONS = 'report-conditions'
36
+ REPORT_REVIEW = 'report-review'
37
+ REPORT_CHECK = 'report-check'
38
+ REPORT_CHECK_SUPPLEMENT = 'report-check-supplement'
39
+ XCHG_COMPANY = 'xchg-company'
40
+ MERGED = 'merged'
41
+
42
+ @classmethod
43
+ def has_value(cls, value):
44
+ return value in cls._value2member_map_
45
+
46
+
47
+ DOC_CREATES_CONTAINER = [IppcDocCodeEnum.REQUEST, IppcDocCodeEnum.CHANGE, IppcDocCodeEnum.EXCEPTIONS]
48
+
49
+ CONTAINER_TITLES = {
50
+ IppcDocCodeEnum.REQUEST: 'Integrované povolení',
51
+ IppcDocCodeEnum.CHANGE: 'Změna integrovaného povolení',
52
+ IppcDocCodeEnum.EXCEPTIONS: 'Výjimky',
53
+
54
+ IppcDocCodeEnum.REPORT_CONDITIONS: 'Dokumentace k zařízení',
55
+ IppcDocCodeEnum.REPORT_REVIEW: 'Dokumentace k zařízení',
56
+ IppcDocCodeEnum.REPORT_CHECK: 'Dokumentace k zařízení',
57
+ IppcDocCodeEnum.REPORT_CHECK_SUPPLEMENT: 'Dokumentace k zařízení',
58
+ IppcDocCodeEnum.XCHG_COMPANY: 'Dokumentace k zařízení'
59
+ }
60
+
61
+ DOC_PROCEEDING = [
62
+ IppcDocCodeEnum.REQUEST, IppcDocCodeEnum.SUMMARIZE, IppcDocCodeEnum.STATEMENT, IppcDocCodeEnum.STATEMENT_CENIA,
63
+ IppcDocCodeEnum.DECISION, IppcDocCodeEnum.APPEAL, IppcDocCodeEnum.APPDEC, IppcDocCodeEnum.RE_DECISION,
64
+ IppcDocCodeEnum.MINORCHANGE, IppcDocCodeEnum.VALIDATE, IppcDocCodeEnum.CANCELED,
65
+ IppcDocCodeEnum.CHANGE,
66
+ IppcDocCodeEnum.INTERRUPTED, IppcDocCodeEnum.RESUMED, IppcDocCodeEnum.ADDITIONAL, IppcDocCodeEnum.TERMINATED,
67
+ IppcDocCodeEnum.EXEMPTION, IppcDocCodeEnum.EXCEPTIONS, IppcDocCodeEnum.APPEAL_RESULT, IppcDocCodeEnum.CLOSED,
68
+ IppcDocCodeEnum.MERGED]
69
+
70
+ DOC_DOCUMENTATION = [
71
+ IppcDocCodeEnum.REPORT_CONDITIONS, IppcDocCodeEnum.REPORT_REVIEW,
72
+ IppcDocCodeEnum.REPORT_CHECK, IppcDocCodeEnum.REPORT_CHECK_SUPPLEMENT,
73
+ IppcDocCodeEnum.XCHG_COMPANY]
74
+
75
+
76
+ class IppcAdditionalTypeEnum(Enum):
77
+ DOKUMENT = 'dokument'
78
+ KORESPONDENCE = 'korespondence'
79
+ ZPRAVA = 'zpráva'
80
+ ZAPIS = 'zápis'
81
+ NAVRH = 'návrh'
82
+ ROZHODNUTI = 'rozhodnutí'
83
+ JINA_INFORMACE = 'jiná informace'
84
+
85
+ @classmethod
86
+ def has_value(cls, value):
87
+ return value in cls._value2member_map_
88
+
89
+
90
+ class ReviewTypeEnum(Enum):
91
+ # 'Typ přezkumu (Plánovaná kontrola|P, Neplánovaná kontrola|U)'
92
+ PLANNED = 'P'
93
+ UNPLANNED = 'U'
94
+
95
+ class DataObjectsEnum(Enum):
96
+ ACTIVITY = 'activity'
97
+ EQUIPMENT = 'equipment'
98
+ EXPERT = 'expert'
99
+
100
+ class DataFormatEnum(Enum):
101
+ CSV = 'csv'
102
+ DDA = 'dda'
103
+
104
+ class IppcStatusEnum(Enum):
105
+ STATUS_0 = '0 - Neautorizováno'
106
+ STATUS_1 = '1 - Publikováno'
107
+ STATUS_2 = '2 - Stručné shrnutí publikováno'
108
+ STATUS_3 = '3 - Stručné shrnutí staženo'
109
+ STATUS_4 = '4 - Vyjádření OZO publikováno'
110
+ STATUS_5 = '5 - Vyjádření OZO staženo'
111
+ STATUS_6 = '6 - Rozhodnuto'
112
+ STATUS_7 = '7 - Uloženo'
113
+ STATUS_8 = '8 - Rozhodnuto (vyjádření nestaženo)'
114
+ STATUS_9 = '9 - Řízení zastaveno'
115
+ STATUS_A = 'A - Dokumentace uložena'
116
+ STATUS_B = 'B - Odvolání'
117
+ STATUS_D = 'D - IP zrušeno'
118
+ STATUS_M = 'M - Řízení sloučeno'
119
+ STATUS_P = 'P - Řízení přerušeno'
120
+ STATUS_Z = 'Z - Provoz ukončen'
121
+ STATUS_Z1 = 'Z1 - Vyňato z režimu'
122
+ STATUS_X = 'X - Bez stavu'
123
+
124
+ @classmethod
125
+ def has_value(cls, value):
126
+ return value in cls._value2member_map_
127
+
128
+
129
+ class PermittingType(BaseModel):
130
+ date_initiated: Optional[datetime] = Field(
131
+ default=None,
132
+ description='Datum zahájení řízení',
133
+ examples=['2024-05-04T00:00:00Z'])
134
+ date_expired: Optional[datetime] = Field(
135
+ default=None,
136
+ description='Datum stažení dokumentu',
137
+ examples=['2024-05-04T00:00:00Z'])
138
+ date_legal: Optional[datetime] = Field(
139
+ default=None,
140
+ description='Datum nabytí právní moci (date_legal, date_legalized)',
141
+ examples=['2024-05-04T00:00:00Z'])
142
+ date_executed: Optional[datetime] = Field(
143
+ default=None,
144
+ description='Datum provedení změny (date_change). Sem patří data typu date_decided, date_merged, ...',
145
+ examples=['2024-05-04T00:00:00Z'])
146
+ date_decided: Optional[datetime] = Field(
147
+ default=None,
148
+ description='Datum zastavení řízení - zapisovat do date_executed',
149
+ examples=['2024-05-04T00:00:00Z'])
150
+ date_exempted: Optional[datetime] = Field(
151
+ default=None,
152
+ description='Datum vynětí z režimu - zapisovat do date_executed',
153
+ examples=['2024-05-04T00:00:00Z'],
154
+ )
155
+ date_exception: Optional[datetime] = Field(
156
+ default=None,
157
+ description='Datum zadání výjimek - zapisovat do date_executed',
158
+ examples=['2024-05-04T00:00:00Z'],
159
+ )
160
+ date_appealed: Optional[datetime] = Field(
161
+ default=None,
162
+ description='Datum odvolání - zapisovat do date_executed',
163
+ examples=['2024-05-04T00:00:00Z'],
164
+ )
165
+ date_interrupted: Optional[datetime] = Field(
166
+ default=None,
167
+ description='Datum přerušení řízení - zapisovat do date_executed',
168
+ examples=['2024-05-04T00:00:00Z'],
169
+ )
170
+ date_resumed: Optional[datetime] = Field(
171
+ default=None,
172
+ description='Datum obnovení řízení - zapisovat do date_executed',
173
+ examples=['2024-05-04T00:00:00Z'],
174
+ )
175
+ date_appeal_result: Optional[datetime] = Field(
176
+ default=None,
177
+ description='Právní moc odvolání - zapisovat do date_legal',
178
+ examples=['2024-05-04T00:00:00Z'],
179
+ )
180
+ date_closed: Optional[datetime] = Field(
181
+ default=None,
182
+ description='Datum ukončení provozu zařízení',
183
+ examples=['2024-05-04T00:00:00Z'],
184
+ )
185
+ published: Optional[bool] = Field(default=False, description='Dokument publikován (publikuje se autorizací, stahuje uplynutím času' )
186
+ source: Optional[str] = Field(default=None, description='Originál žádosti k nahlédnutí')
187
+ bat_id: Optional[str] = Field(default=None, description='Identifikace BAT')
188
+ processor: Optional[str] = Field(default=None, description='Zpracovatel žádosti')
189
+ unabridged: Optional[bool] = Field(default=False, description='Plné znění')
190
+ eia: Optional[bool] = Field(default=False, description='Posouzení podle zákona o posuzování vlivů na životní prostředí')
191
+ eia_id: Optional[str] = Field(default=None, description='Identifikace záměru v informačním systému EIA')
192
+ permitted: Optional[bool] = Field(default=None, description='Integrované povolení uděleno/neuděleno')
193
+ status_resumed: Optional[IppcStatusEnum] = Field(default=None, description='Stav obnovení')
194
+
195
+ class PermittingItemType(PermittingType):
196
+ documents: Optional[List[LinkedType]] = Field(default=None, description='Seznam dokumentů řízení')
197
+
198
+
199
+ class InspectionType(BaseModel):
200
+ date_check_start: Optional[datetime] = Field(
201
+ default=None,
202
+ description='Termín přezkumu nebo kontroly - zahájení',
203
+ examples=['2024-05-04T00:00:00Z'],
204
+ )
205
+ date_check_end: Optional[datetime] = Field(
206
+ default=None,
207
+ description='Termín přezkumu nebo kontroly - ukončení',
208
+ examples=['2024-05-04T00:00:00Z'],
209
+ )
210
+ check_type: Optional[ReviewTypeEnum] = Field(
211
+ default=None,
212
+ description='Typ přezkumu (Plánovaná kontrola, Neplánovaná kontrola)')
213
+ check_office: Optional[str] = Field(
214
+ default=None,
215
+ description='Identifikace kontrolní instituce [identOfficeCheck] (ČIŽP, KHS)',
216
+ )
217
+ finished: Optional[bool] = Field(default=None, description='Zpráva o kontrole (isFinished)')
218
+ check_subject: Optional[str] = Field(default=None, description='Rozsah kontroly a kontrolní období')
219
+
220
+ class InspectionItemType(InspectionType):
221
+ document: Optional[LinkedType] = Field(default=None, description='Propojený dokument')
222
+
223
+
224
+ class ReportType(BaseModel):
225
+ date_published: Optional[datetime] = Field(
226
+ default=None, description='Datum podání zprávy', examples=['2024-05-04T00:00:00Z']
227
+ )
228
+ date_period_start: Optional[datetime] = Field(
229
+ default=None,
230
+ description='Období, za které je zpráva podávána (period_start)- zahájení',
231
+ examples=['2024-05-04T00:00:00Z'],
232
+ )
233
+ date_period_end: Optional[datetime] = Field(
234
+ default=None,
235
+ description='Období, za které je zpráva podávána (period_end) - ukončení',
236
+ examples=['2024-05-04T00:00:00Z'],
237
+ )
238
+ complied: Optional[bool] = Field(default=None, description='Podmínky jsou plněny (isComplied)', examples=[True])
239
+
240
+ class ReportItemType(ReportType):
241
+ document: Optional[LinkedType] = Field(default=None, description='Propojený dokument')
242
+
243
+
244
+ class ValidationType(BaseModel):
245
+ delivered: Optional[bool] = Field(default=None, description='Dokument doručen MŽP', examples=[False])
246
+ date_delivered: Optional[datetime] = Field(default=None, description='Datum doručení na MŽP')
247
+ id_no: Optional[str] = Field(default=None, description='Čj. MŘP')
248
+ archive_file: Optional[str] = Field(default=None, description='Archivační box', examples=['IPPC/EH/21/01/JCK'])
249
+ comment: Optional[str] = Field(default=None, description='Poznámka')
250
+
251
+ class ValidationItemType(ValidationType):
252
+ document: Optional[LinkedType] = Field(default=None, description='Provázaný dokument')
253
+
254
+
255
+ class ChangeOperator(BaseModel):
256
+ date_changed: Optional[datetime] = Field(default=None, description='Datum změny (Date_Changed)')
257
+ date_changed_legal: Optional[datetime] = Field(default=None,
258
+ description='Datum účinnosti změny (Date_Operation_Changed)')
259
+ operator_from: Optional[LinkedType] = Field(default=None, description='Původní provozovatel')
260
+ operator_to: Optional[LinkedType] = Field(default=None, description='Následný provozovatel')
261
+
262
+
263
+ class MergeEquipment(BaseModel):
264
+ date_merged: Optional[datetime] = Field(
265
+ default=None,
266
+ description='Datum sloučení IP - zapisovat do date_executed',
267
+ examples=['2024-05-04T00:00:00Z'])
268
+ date_merged_legal: Optional[datetime] = Field(
269
+ default=None,
270
+ description='Datum právní moci sloučení IP - zapisovat do date_legal',
271
+ examples=['2024-05-04T00:00:00Z'])
272
+ equipment_source: Optional[LinkedType] = Field(default=None, description='Zdrojové zařízení (PID_Appliance)')
273
+ equipment_target: Optional[LinkedType] = Field(default=None, description='Cílové zařízení (PID_Appliance_Merged)')
274
+ equipment_merged: Optional[LinkedType] = Field(default=None, description='Sloučené zařízení (PID_Appliance_Merged)')
275
+
276
+
277
+ class IppcContainerEnum(Enum):
278
+ PROCEEDING = 'proceeding' # Řízení
279
+ DOCUMENTATION = 'documentation' # Dokumentace
280
+ OTHER = 'other' # Jiný
281
+
282
+ @classmethod
283
+ def has_value(cls, value):
284
+ return value in cls._value2member_map_
285
+
286
+ class ActivityStatusEnum(Enum):
287
+ AC_NEW = '0 - nová'
288
+ AC_ACTIVE = '1 - aktivní'
289
+ AC_EXCLUDED = '9 - vyřazená'
290
+
291
+ @classmethod
292
+ def has_value(cls, value):
293
+ return value in cls._value2member_map_
294
+
295
+
296
+ class EquipmentStatusEnum(Enum):
297
+ EQ_NEW = '0 - nové'
298
+ EQ_AUTHORIZED = '1 - autorizováno'
299
+ EQ_ACTIVE = '2 - aktivní'
300
+ EQ_MERGED = 'M - sloučené'
301
+ EQ_CLOSED = 'Z - Provoz ukončen'
302
+ EQ_EXCLUDED = 'Z1 - Vyňato z režimu'
303
+
304
+ @classmethod
305
+ def has_value(cls, value):
306
+ return value in cls._value2member_map_
307
+
308
+
309
+ PROCEEDING_TRANSITION = {
310
+ IppcDocCodeEnum.REQUEST: {'node_name': 'Autorizace žádosti o IP', 'status_to': IppcStatusEnum.STATUS_1.value},
311
+ IppcDocCodeEnum.SUMMARIZE: {'node_name': 'Autorizace stručného shrnutí', 'status_to': IppcStatusEnum.STATUS_2.value},
312
+ IppcDocCodeEnum.STATEMENT: {'node_name': 'Autorizace vyjádření OZO', 'status_to': IppcStatusEnum.STATUS_4.value},
313
+ IppcDocCodeEnum.STATEMENT_CENIA: {'node_name': 'Autorizace vyjádření CENIA', 'status_to': IppcStatusEnum.STATUS_4.value},
314
+ IppcDocCodeEnum.DECISION: {'node_name': None, 'status_to': None},
315
+ IppcDocCodeEnum.APPEAL: {'node_name': None, 'status_to': None},
316
+ IppcDocCodeEnum.APPDEC: {'node_name': None, 'status_to': None},
317
+ IppcDocCodeEnum.RE_DECISION: {'node_name': None, 'status_to': None},
318
+ IppcDocCodeEnum.MINORCHANGE: {'node_name': None, 'status_to': None},
319
+ IppcDocCodeEnum.VALIDATE: {'node_name': None, 'status_to': None},
320
+ IppcDocCodeEnum.CANCELED: {'node_name': None, 'status_to': None},
321
+ IppcDocCodeEnum.CHANGE: {'node_name': 'Autorizace podstatné změny IP', 'status_to': IppcStatusEnum.STATUS_1.value},
322
+ IppcDocCodeEnum.INTERRUPTED: {'node_name': None, 'status_to': None},
323
+ IppcDocCodeEnum.RESUMED: {'node_name': None, 'status_to': None},
324
+ IppcDocCodeEnum.ADDITIONAL: {'node_name': None, 'status_to': None},
325
+ IppcDocCodeEnum.TERMINATED: {'node_name': None, 'status_to': None},
326
+ IppcDocCodeEnum.EXEMPTION: {'node_name': None, 'status_to': None},
327
+ IppcDocCodeEnum.EXCEPTIONS: {'node_name': 'Autorizace výjimek z IP', 'status_to': IppcStatusEnum.STATUS_1.value},
328
+ IppcDocCodeEnum.APPEAL_RESULT: {'node_name': None, 'status_to': None},
329
+ IppcDocCodeEnum.CLOSED: {'node_name': None, 'status_to': None},
330
+
331
+ }
332
+
333
+
334
+ class IppcWorkflowType(WorkflowType):
335
+ status_from: Optional[IppcStatusEnum] = Field(default=None, description='Předchozí stav')
336
+ status_to: Optional[IppcStatusEnum] = Field(default=None, description='Následný stav')
337
+
338
+
339
+ def get_dict_value_regional(data: dict, item_name: str) -> Union[List[RegionalValueType], None]:
340
+ v = get_dict_value_list(data=data, item_name=item_name)
341
+ if not bool(v):
342
+ return None
343
+ out = []
344
+ for item in v:
345
+ x = RegionalValueType(value=item)
346
+ out.append(x)
347
+ return out
348
+
349
+ def get_dict_value_uuid(data: dict, item_name: str) -> Union[str, None]:
350
+ v = get_dict_value(data=data, item_name=item_name)
351
+ if not bool(v):
352
+ return None
353
+ if is_valid_uuid(v):
354
+ return str(UUID(v))
355
+ return None
356
+
357
+ def get_dict_value_rtf(data: dict, item_name: str) -> Union[str, None]:
358
+ v = get_dict_value(data=data, item_name=item_name)
359
+ if not bool(v):
360
+ return None
361
+ out = json.dumps(v)
362
+ return out
@@ -0,0 +1,60 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Optional, List
4
+
5
+ from pydantic import BaseModel, Field
6
+ from sysnet_pyutils.models.general import LinkedType, ListTypeBase, LogItemType
7
+
8
+ from ippc_model.ippc_common import (
9
+ IppcContainerEnum, IppcStatusEnum, PermittingItemType, InspectionItemType,
10
+ ReportItemType, ValidationItemType, ChangeOperator, MergeEquipment, IppcWorkflowType)
11
+
12
+
13
+ class ContainerTypeSuperBase(BaseModel):
14
+ # Kontejner dokumentů IPPC (jedno řízení) [základ]
15
+ name: Optional[str] = Field(
16
+ default=None, description="Název kontejneru", examples=['Výroba obuvnických podešví (PUR-PLASTICS s.r.o.)'])
17
+ content_type: Optional[IppcContainerEnum] = Field(
18
+ default=IppcContainerEnum.PROCEEDING, description='Typ obsahu kontejneru (řízení/dokumentace/jiný)')
19
+ international: Optional[bool] = Field(default=False, description='Mezinárodní mechanismus')
20
+
21
+
22
+ class ContainerTypeBase(ContainerTypeSuperBase):
23
+ # Kontejner dokumentů IPPC (jedno řízení) [zápis dat]
24
+ equipment: Optional[LinkedType] = Field(default=None, description='Zařízení (identifikátor/název)')
25
+ operator: Optional[LinkedType] = Field(default=None, description='Provozovatel (identifikátor/název)')
26
+ has_attachments: Optional[bool] = Field(default=False, description='Kontejner má/nemá přílohy')
27
+
28
+
29
+ class ContainerTypeListItem(ContainerTypeBase):
30
+ # Kontejner dokumentů IPPC lehký (jedno řízení)
31
+ identifier: Optional[str] = Field(default=None, description="UUID kontejneru (model 46)")
32
+ locked: Optional[bool] = Field(default=False, description='Zámek kontejneru')
33
+ status: Optional[IppcStatusEnum] = Field(default=None, description='Stav řízení v kontejneru (model 47)')
34
+ status_saved: Optional[IppcStatusEnum] = Field(default=None, description='Předchozí stav řízení v kontejneru')
35
+ activity_main: Optional[str] = Field(default=None, description='Hlavní činnost')
36
+
37
+
38
+ class ContainerTypeLight(ContainerTypeListItem):
39
+ # Kontejner dokumentů IPPC lehký (jedno řízení)
40
+ activity_other: Optional[list[str]] = Field(default=None, description='Ostatní činnosti')
41
+
42
+
43
+ class ContainerListType(ListTypeBase):
44
+ hits: Optional[int] = Field(default=0, description='Hits')
45
+ entries: Optional[List[ContainerTypeListItem]] = Field(default=None, description='')
46
+
47
+
48
+ class ContainerType(ContainerTypeLight):
49
+ # Kontejner dokumentů IPPC plný (jedno řízení)
50
+ permitting: Optional[PermittingItemType] = Field(default=None, description='Povolovací řízení')
51
+ inspection: Optional[List[InspectionItemType]] = Field(default=None, description='Informace o kontrole')
52
+ report: Optional[List[ReportItemType]] = Field(default=None, description='Zpráva o plnění')
53
+ validation: Optional[List[ValidationItemType]] = Field(default=None, description='Informace o validaci')
54
+ operator_change: Optional[List[ChangeOperator]] = Field(default=None, description='Informace o změně provozovatele')
55
+ equipment_merge: Optional[List[MergeEquipment]] = Field(default=None, description='Informace o sloučení zařízení')
56
+ expert: Optional[LinkedType] = Field(default=None, description='Odborně způsobilá osoba')
57
+ workflow: Optional[list[IppcWorkflowType]] = Field(default=None, description='Záznam životního cyklu')
58
+ history: Optional[list[LogItemType]] = Field(default=None, description='Historie životního cyklu kontejneru')
59
+
60
+
@@ -0,0 +1,55 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Optional, List
4
+
5
+ from pydantic import BaseModel, Field
6
+ from sysnet_pyutils.models.general import LinkedType, MetadataTypeBase, MetadataType, LogItemType, \
7
+ MetadataTypeEntry, ListTypeBase
8
+
9
+ from ippc_model.ippc_common import (
10
+ IppcDocCodeEnum, IppcAdditionalTypeEnum, PermittingType, InspectionType, ReportType, ValidationType, ChangeOperator, MergeEquipment)
11
+
12
+
13
+ class DocumentTypeBase(BaseModel):
14
+ doc_code: Optional[IppcDocCodeEnum] = Field(default=None, description='Kód dokumentu')
15
+ additional_type: Optional[IppcAdditionalTypeEnum] = Field(default=None, description='Typ dodatečné informace, pokud je doc_code==additional')
16
+ title: Optional[str] = Field(default=None, description='Úplný název dokumentu', examples=['Integrované povolení'])
17
+ subject: Optional[str] = Field(default=None, description='Stručný název dokumentu', examples=['Integrované povolení'])
18
+ version_ozo: Optional[str] = Field(default='1', description='Verze OZO???')
19
+ annotation: Optional[str] = Field(default=None, description='Anotace (Většinou annotation RTF!!!)')
20
+ content: Optional[str] = Field(default=None, description='Plný obsah (Většinou Body RTF!!!)')
21
+ permitting: Optional[PermittingType] = Field(default=None, description='Povolovací řízení')
22
+ inspection: Optional[InspectionType] = Field(default=None, description='Informace o kontrole')
23
+ report: Optional[ReportType] = Field(default=None, description='Zpráva o plnění')
24
+ validation: Optional[ValidationType] = Field(default=None, description='Informace o validaci')
25
+ operator_change: Optional[ChangeOperator] = Field(default=None, description='Informace o změně provozovatele')
26
+ equipment_merge: Optional[MergeEquipment] = Field(default=None, description='Informace o sloučení zařízení')
27
+ expert: Optional[LinkedType] = Field(default=None, description='Odborně způsobilá osoba')
28
+ additional: Optional[List[LinkedType]] = Field(default=None, description='Další propojené dokumenty')
29
+ has_attachments: Optional[bool] = Field(default=False, description='Kontejner má/nemá přílohy')
30
+ metadata: Optional[MetadataTypeBase] = Field(default=None, description='Metadata dokumentu')
31
+ linked_list: Optional[List[LinkedType]] = Field(default=None, description='Propojené dokumenty')
32
+
33
+
34
+ class DocumentType(DocumentTypeBase):
35
+ operator: Optional[LinkedType] = Field(default=None, description='Aktuální provozovatel')
36
+ equipment: Optional[LinkedType] = Field(default=None, description='Aktuální zařízení')
37
+ activity_main: Optional[str] = Field(default=None, description='Hlavní činnost')
38
+ activity_other: Optional[list[str]] = Field(default=None, description='Ostatní činnosti')
39
+ metadata: Optional[MetadataType] = Field(default=None, description='Metadata dokumentu')
40
+ history: Optional[list[LogItemType]] = Field(default=None, description='Historie dokumentu')
41
+
42
+
43
+ class DocumentEntryType(BaseModel):
44
+ doc_code: Optional[IppcDocCodeEnum] = Field(default=None, alias='data-code', description='Kód dokumentu')
45
+ additional_type: Optional[IppcAdditionalTypeEnum] = Field(default=None, description='Typ dodatečné informace, pokud je doc_code==additional')
46
+ title: Optional[str] = Field(default=None, description='Úplný název dokumentu', examples=['Integrované povolení'])
47
+ subject: Optional[str] = Field(default=None, description='Stručný název dokumentu', examples=['Integrované povolení'])
48
+ metadata: Optional[MetadataTypeEntry] = Field(default=None, description='Metadata dokumentu')
49
+
50
+
51
+ class DocumentListType(ListTypeBase):
52
+ hits: Optional[int] = Field(default=0, description='Hits')
53
+ entries: Optional[List[DocumentEntryType]] = Field(default=None, description='Seznam dokumentů')
54
+
55
+
@@ -0,0 +1,129 @@
1
+ from __future__ import annotations
2
+
3
+ from datetime import datetime, date
4
+ from typing import Optional, List
5
+
6
+ from pydantic import BaseModel, Field, EmailStr
7
+ from sysnet_pyutils.models.general import (
8
+ RegionalValueType, GeoPointType, CodeValueType, LocationType, MetadataTypeBase, LinkedType,
9
+ MetadataType, LogItemType, TimeLimitedType, ListTypeBase)
10
+
11
+ from ippc_model.ippc_common import EquipmentStatusEnum
12
+
13
+
14
+ class EquipmentOtherInfo(BaseModel):
15
+ # Další relevantní informace k zařízení
16
+ eprtr: Optional[list[RegionalValueType]] = Field(default=None, description="E-PRTR")
17
+ irz: Optional[list[RegionalValueType]] = Field(default=None, description='Seznam navázaných provozoven IRZ')
18
+ chmu_source: Optional[list[RegionalValueType]] = Field(default=None, description='ČHMÚ - zdroje znečišťování')
19
+ chmu_incinerator: Optional[list[RegionalValueType]] = Field(default=None, description='ČHMÚ - spalovny')
20
+ rlcp: Optional[list[RegionalValueType]] = Field(default=None, description='Reporting LCP')
21
+ isoh: Optional[list[RegionalValueType]] = Field(default=None, description='ISOH')
22
+
23
+
24
+ class EquipmentReportingBase(BaseModel):
25
+ # Údaje pro reporting do EK (jen zadávané)
26
+ inspire_id: Optional[str] = Field(default=None, description='Inspire ID')
27
+ bat_conclusion_value: Optional[str] = Field(default=None, description='BAT Conclusion Value')
28
+ other_relevant_chapters: Optional[str] = Field(default=None, description='Other Relevant Chapters')
29
+ baseline_report_value: Optional[str] = Field(default=None, description='Baseline Report Value')
30
+ permit_reconsidered: Optional[str] = Field(default=None, description='Permit Reconsidered')
31
+ permit_updated: Optional[datetime] = Field(default=None, description='Permit Updated')
32
+ remarks: Optional[str] = Field(default=None, description='Remarks')
33
+ production_facility_local_id: Optional[str] = Field(default=None, description='Production Facility Local ID')
34
+
35
+
36
+ class EquipmentReporting(EquipmentReportingBase):
37
+ # Údaje pro reporting do EK (vypočítávané)
38
+ thematic_id: Optional[str] = Field(default=None, description='Thematic ID (výpočet =PID)')
39
+ point_geometry: Optional[GeoPointType] = Field(default=None, description='Point geometry (výpočet se z lokality)')
40
+ condition_of_facility_value: Optional[str] = Field(default=None, description='Condition of facility value (výpočet)')
41
+ title: Optional[str] = Field(default=None, description='Title (výpočet z title)')
42
+ competent_authority_permits: Optional[str] = Field(default=None, description='Competent authority permits (výpočet)')
43
+ competent_authority_inspections: Optional[list[str]] = Field(default=None, description='Competent authority inspections (výpočet)')
44
+ ied_annex_i_activity_value_main: Optional[str] = Field(default=None, description='IED annex i activity value (main activity) (výpočet)')
45
+ ied_annex_i_activity_value_other: Optional[list[str]] = Field(default=None, description='IED annex i activity value (other activity) (výpočet)')
46
+ permit_granted: Optional[bool] = Field(default=None, description='Permit granted (výpočet)')
47
+ bat_derogation_indicator: Optional[bool] = Field(default=None, description='BAT Derogation Indicator (výpočet)')
48
+ site_visit_number: Optional[List[str]] = Field(default=None, description='Site Visit Number (výpočet)')
49
+
50
+
51
+ class EquipmentMigration(BaseModel):
52
+ date_merged: Optional[date] = Field(default=None, description='Date_Merged')
53
+ date_data_valid: Optional[date] = Field(default=None, description='PLATNOST_DAT')
54
+ pid_merged: Optional[str] = Field(default=None, description='PID_Appliance_Merged')
55
+ pid_authority: Optional[str] = Field(default=None, description='PID_AUTHORITY')
56
+ pid_import: Optional[str] = Field(default=None, description='PID_Import')
57
+ pid_state: Optional[str] = Field(default=None, description='PID_STATE')
58
+ from_user: Optional[str] = Field(default=None, description='From')
59
+ from_user_mail: Optional[EmailStr] = Field(default=None, description='From_userEmail')
60
+ from_user_id: Optional[str] = Field(default=None, description='From_userEmail')
61
+ from_user_name: Optional[str] = Field(default=None, description='From_userName')
62
+ from_person_name: Optional[str] = Field(default=None, description='From_orgName')
63
+ from_person_uuid: Optional[str] = Field(default=None, description='From_orgUUID')
64
+ is_authorized: Optional[bool] = Field(default=False, description='Authorized')
65
+ is_closed: Optional[bool] = Field(default=False, description='isClosed')
66
+ is_compiled: Optional[bool] = Field(default=False, description='isComplied')
67
+ is_eia: Optional[bool] = Field(default=False, description='isEIA')
68
+ is_exempted: Optional[bool] = Field(default=False, description='isExempted')
69
+ is_finished: Optional[bool] = Field(default=False, description='isFinished')
70
+ is_merged: Optional[bool] = Field(default=False, description='isMerged')
71
+ is_updated: Optional[bool] = Field(default=False, description='isUpdated')
72
+ is_verified: Optional[bool] = Field(default=False, description='isVerified')
73
+ rec_no: Optional[int] = Field(default=None, description='REC_NO')
74
+ remarks: Optional[str] = Field(default=None, description='remarks')
75
+ shape: Optional[str] = Field(default=None, description='SHAPE')
76
+ history_status: Optional[List[str]] = Field(default=None, description='StatusHistory')
77
+ history_admin: Optional[List[str]] = Field(default=None, description='AdminLog')
78
+ history_logs: Optional[List[str]] = Field(default=None, description='Log')
79
+ history_events: Optional[List[str]] = Field(default=None, description='LogEvents')
80
+
81
+ @property
82
+ def status(self) -> EquipmentStatusEnum:
83
+ out = EquipmentStatusEnum.EQ_NEW
84
+ if self.is_authorized:
85
+ out = EquipmentStatusEnum.EQ_ACTIVE
86
+ if self.is_merged:
87
+ out = EquipmentStatusEnum.EQ_MERGED
88
+ if self.is_closed:
89
+ out = EquipmentStatusEnum.EQ_CLOSED
90
+ if self.is_exempted:
91
+ out = EquipmentStatusEnum.EQ_EXCLUDED
92
+ return out
93
+
94
+
95
+ class EquipmentTypeBase(BaseModel):
96
+ title: Optional[str] = Field(
97
+ default=None,
98
+ description='Úplný název zařízení',
99
+ examples=['Výroba gumových obuvnických podešví'])
100
+ name: Optional[str] = Field(default=None, description='Stručný název zařízení', examples=['Výroba obuvnických podešví'])
101
+ operator: Optional[LinkedType] = Field(default=None, description='Aktuální provozovatel')
102
+ location: Optional[LocationType] = Field(default=None, description='Umístění zařízení')
103
+ activity_main: Optional[str] = Field(default=None, description='Hlavní činnost')
104
+ activity_other: Optional[List[str]] = Field(default=None, description='Ostatní činnosti')
105
+ international: Optional[bool] = Field(default=False, description='Mezinárodní mechanismus')
106
+ office_check: Optional[list[CodeValueType]] = Field(default=None, description='Kontrolní orgán')
107
+ waste_water_disposal: Optional[str] = Field(default=None, description='Vypouštění odpadních vod')
108
+ other: Optional[EquipmentOtherInfo] = Field(default=None, description='Další relevantní informace k zařízení ')
109
+ reporting: Optional[EquipmentReportingBase] = Field(default=None, description='Reporting pro EK - zadávané hodnoty')
110
+ metadata: Optional[MetadataTypeBase] = Field(default=None, description='Metadata dokumentu')
111
+
112
+
113
+ class EquipmentType(EquipmentTypeBase):
114
+ reporting: Optional[EquipmentReporting] = Field(default=None, description='Reporting pro EK - všechny hodnoty')
115
+ merged: Optional[bool] = Field(default=False, description='Zařízení bylo sloučeno se jiným zařízením')
116
+ equipment_merged: Optional[LinkedType] = Field(default=None, description='Sloučené zařízení (PID_Appliance_Merged)')
117
+ authorized: Optional[bool] = Field(default=False, description='Dokument byl autorizován')
118
+ status: Optional[EquipmentStatusEnum] = Field(default=None, description='Stav zařízení')
119
+ metadata: Optional[MetadataType] = Field(default=None, description='Metadata dokumentu')
120
+ history: Optional[list[LogItemType]] = Field(default=None, description='Historie životního cyklu dokumentu')
121
+ operator_history: Optional[list[TimeLimitedType]] = Field(default=None, description='Historie provozovatelů')
122
+ migration: Optional[EquipmentMigration] = Field(default=None, description='Neurčená migrovaná data')
123
+
124
+
125
+ class EquipmentListType(ListTypeBase):
126
+ hits: Optional[int] = Field(default=0, description='Hits')
127
+ entries: Optional[List[EquipmentType]] = Field(default=None, description='')
128
+
129
+