diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala deleted file mode 100644 index e37aa8a..0000000 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala +++ /dev/null @@ -1,28 +0,0 @@ -package cz.e_bs.cmi.mdr.pdb.app - -import java.time.LocalDate -import java.time.Instant -import cz.e_bs.cmi.mdr.pdb.OsobniCislo - -case class Potvrzeni( - uzivatel: String, - datum: Instant -) - -case class Dukaz( - doklady: List[String], - potvrzeno: Option[Potvrzeni], - platiDo: Option[Instant] -) - -case class Kriterium( - id: String, - nazev: String, - dukaz: Option[Dukaz] -) - -case class Parametr( - id: String, - nazev: String, - kriteria: List[Kriterium] -) diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala deleted file mode 100644 index e37aa8a..0000000 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala +++ /dev/null @@ -1,28 +0,0 @@ -package cz.e_bs.cmi.mdr.pdb.app - -import java.time.LocalDate -import java.time.Instant -import cz.e_bs.cmi.mdr.pdb.OsobniCislo - -case class Potvrzeni( - uzivatel: String, - datum: Instant -) - -case class Dukaz( - doklady: List[String], - potvrzeno: Option[Potvrzeni], - platiDo: Option[Instant] -) - -case class Kriterium( - id: String, - nazev: String, - dukaz: Option[Dukaz] -) - -case class Parametr( - id: String, - nazev: String, - kriteria: List[Kriterium] -) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index de29954..5f08310 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -8,6 +8,7 @@ import scala.scalajs.js import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.Parameter // enum is not working with Waypoints' SplitRender collectStatic sealed abstract class Page(val title: String, val parent: Option[Page]) @@ -36,8 +37,8 @@ ) object DetailParametru { - def apply(o: UserInfo, p: Parametr): DetailParametru = - DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.nazev)) + def apply(o: UserInfo, p: Parameter): DetailParametru = + DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.name)) } case class NotFound(url: String) extends Page("404", Some(Directory)) diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala deleted file mode 100644 index e37aa8a..0000000 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala +++ /dev/null @@ -1,28 +0,0 @@ -package cz.e_bs.cmi.mdr.pdb.app - -import java.time.LocalDate -import java.time.Instant -import cz.e_bs.cmi.mdr.pdb.OsobniCislo - -case class Potvrzeni( - uzivatel: String, - datum: Instant -) - -case class Dukaz( - doklady: List[String], - potvrzeno: Option[Potvrzeni], - platiDo: Option[Instant] -) - -case class Kriterium( - id: String, - nazev: String, - dukaz: Option[Dukaz] -) - -case class Parametr( - id: String, - nazev: String, - kriteria: List[Kriterium] -) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index de29954..5f08310 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -8,6 +8,7 @@ import scala.scalajs.js import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.Parameter // enum is not working with Waypoints' SplitRender collectStatic sealed abstract class Page(val title: String, val parent: Option[Page]) @@ -36,8 +37,8 @@ ) object DetailParametru { - def apply(o: UserInfo, p: Parametr): DetailParametru = - DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.nazev)) + def apply(o: UserInfo, p: Parameter): DetailParametru = + DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.name)) } case class NotFound(url: String) extends Page("404", Some(Directory)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala index bd498bd..36c9c10 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala @@ -7,4 +7,5 @@ case object FetchDirectory extends Action case class FetchUserDetails(osc: OsobniCislo) extends Action case class FetchParameters(osc: OsobniCislo) extends Action +case class FetchParameter(osc: OsobniCislo, paramId: String) extends Action case class NavigateTo(page: Page) extends Action diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala deleted file mode 100644 index e37aa8a..0000000 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala +++ /dev/null @@ -1,28 +0,0 @@ -package cz.e_bs.cmi.mdr.pdb.app - -import java.time.LocalDate -import java.time.Instant -import cz.e_bs.cmi.mdr.pdb.OsobniCislo - -case class Potvrzeni( - uzivatel: String, - datum: Instant -) - -case class Dukaz( - doklady: List[String], - potvrzeno: Option[Potvrzeni], - platiDo: Option[Instant] -) - -case class Kriterium( - id: String, - nazev: String, - dukaz: Option[Dukaz] -) - -case class Parametr( - id: String, - nazev: String, - kriteria: List[Kriterium] -) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index de29954..5f08310 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -8,6 +8,7 @@ import scala.scalajs.js import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.Parameter // enum is not working with Waypoints' SplitRender collectStatic sealed abstract class Page(val title: String, val parent: Option[Page]) @@ -36,8 +37,8 @@ ) object DetailParametru { - def apply(o: UserInfo, p: Parametr): DetailParametru = - DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.nazev)) + def apply(o: UserInfo, p: Parameter): DetailParametru = + DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.name)) } case class NotFound(url: String) extends Page("404", Some(Directory)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala index bd498bd..36c9c10 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala @@ -7,4 +7,5 @@ case object FetchDirectory extends Action case class FetchUserDetails(osc: OsobniCislo) extends Action case class FetchParameters(osc: OsobniCislo) extends Action +case class FetchParameter(osc: OsobniCislo, paramId: String) extends Action case class NavigateTo(page: Page) extends Action diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index 20393ef..038d2d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -35,7 +35,6 @@ case None => renderHome(page) case Some(p) => a( - href := router.absoluteUrlForPage(p), navigateTo(p), cls := "group inline-flex space-x-3 text-sm font-medium text-gray-500 hover:text-gray-700", Icons.solid.`arrow-narrow-left`, @@ -53,9 +52,9 @@ cls := "flex items-center", slash, a( - href := "#", + navigateTo(p), cls := "ml-4 text-sm font-medium text-gray-500 hover:text-gray-700", - page.title + p.title ) ) ) diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala deleted file mode 100644 index e37aa8a..0000000 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala +++ /dev/null @@ -1,28 +0,0 @@ -package cz.e_bs.cmi.mdr.pdb.app - -import java.time.LocalDate -import java.time.Instant -import cz.e_bs.cmi.mdr.pdb.OsobniCislo - -case class Potvrzeni( - uzivatel: String, - datum: Instant -) - -case class Dukaz( - doklady: List[String], - potvrzeno: Option[Potvrzeni], - platiDo: Option[Instant] -) - -case class Kriterium( - id: String, - nazev: String, - dukaz: Option[Dukaz] -) - -case class Parametr( - id: String, - nazev: String, - kriteria: List[Kriterium] -) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index de29954..5f08310 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -8,6 +8,7 @@ import scala.scalajs.js import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.Parameter // enum is not working with Waypoints' SplitRender collectStatic sealed abstract class Page(val title: String, val parent: Option[Page]) @@ -36,8 +37,8 @@ ) object DetailParametru { - def apply(o: UserInfo, p: Parametr): DetailParametru = - DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.nazev)) + def apply(o: UserInfo, p: Parameter): DetailParametru = + DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.name)) } case class NotFound(url: String) extends Page("404", Some(Directory)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala index bd498bd..36c9c10 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala @@ -7,4 +7,5 @@ case object FetchDirectory extends Action case class FetchUserDetails(osc: OsobniCislo) extends Action case class FetchParameters(osc: OsobniCislo) extends Action +case class FetchParameter(osc: OsobniCislo, paramId: String) extends Action case class NavigateTo(page: Page) extends Action diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index 20393ef..038d2d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -35,7 +35,6 @@ case None => renderHome(page) case Some(p) => a( - href := router.absoluteUrlForPage(p), navigateTo(p), cls := "group inline-flex space-x-3 text-sm font-medium text-gray-500 hover:text-gray-700", Icons.solid.`arrow-narrow-left`, @@ -53,9 +52,9 @@ cls := "flex items-center", slash, a( - href := "#", + navigateTo(p), cls := "ml-4 text-sm font-medium text-gray-500 hover:text-gray-700", - page.title + p.title ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala index fefb4a6..a8f025e 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala @@ -47,21 +47,6 @@ p: List[Parameter] ): DetailPage.ViewModel = DetailPage.ViewModel( - DetailOsoby.ViewModel( - o.personalNumber, - o.name, - o.email, - o.phone, - o.img, - None, - None - ), - p.map { param => - SeznamParametru.Parametr( - id = param.name, - nazev = param.name, - status = "Nesplněno", - statusColor = Color.red - ) - } + o.toViewModel, + p.map(_.toViewModel) ) diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala deleted file mode 100644 index e37aa8a..0000000 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala +++ /dev/null @@ -1,28 +0,0 @@ -package cz.e_bs.cmi.mdr.pdb.app - -import java.time.LocalDate -import java.time.Instant -import cz.e_bs.cmi.mdr.pdb.OsobniCislo - -case class Potvrzeni( - uzivatel: String, - datum: Instant -) - -case class Dukaz( - doklady: List[String], - potvrzeno: Option[Potvrzeni], - platiDo: Option[Instant] -) - -case class Kriterium( - id: String, - nazev: String, - dukaz: Option[Dukaz] -) - -case class Parametr( - id: String, - nazev: String, - kriteria: List[Kriterium] -) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index de29954..5f08310 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -8,6 +8,7 @@ import scala.scalajs.js import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.Parameter // enum is not working with Waypoints' SplitRender collectStatic sealed abstract class Page(val title: String, val parent: Option[Page]) @@ -36,8 +37,8 @@ ) object DetailParametru { - def apply(o: UserInfo, p: Parametr): DetailParametru = - DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.nazev)) + def apply(o: UserInfo, p: Parameter): DetailParametru = + DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.name)) } case class NotFound(url: String) extends Page("404", Some(Directory)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala index bd498bd..36c9c10 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala @@ -7,4 +7,5 @@ case object FetchDirectory extends Action case class FetchUserDetails(osc: OsobniCislo) extends Action case class FetchParameters(osc: OsobniCislo) extends Action +case class FetchParameter(osc: OsobniCislo, paramId: String) extends Action case class NavigateTo(page: Page) extends Action diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index 20393ef..038d2d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -35,7 +35,6 @@ case None => renderHome(page) case Some(p) => a( - href := router.absoluteUrlForPage(p), navigateTo(p), cls := "group inline-flex space-x-3 text-sm font-medium text-gray-500 hover:text-gray-700", Icons.solid.`arrow-narrow-left`, @@ -53,9 +52,9 @@ cls := "flex items-center", slash, a( - href := "#", + navigateTo(p), cls := "ml-4 text-sm font-medium text-gray-500 hover:text-gray-700", - page.title + p.title ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala index fefb4a6..a8f025e 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala @@ -47,21 +47,6 @@ p: List[Parameter] ): DetailPage.ViewModel = DetailPage.ViewModel( - DetailOsoby.ViewModel( - o.personalNumber, - o.name, - o.email, - o.phone, - o.img, - None, - None - ), - p.map { param => - SeznamParametru.Parametr( - id = param.name, - nazev = param.name, - status = "Nesplněno", - statusColor = Color.red - ) - } + o.toViewModel, + p.map(_.toViewModel) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala new file mode 100644 index 0000000..870e2a4 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala @@ -0,0 +1,57 @@ +package cz.e_bs.cmi.mdr.pdb.app +package connectors + +import com.raquo.laminar.api.L.{*, given} +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.DetailParametruPage +import pages.detail.DetailParametruPage +import com.raquo.waypoint.Router +import cz.e_bs.cmi.mdr.pdb.app.components.AppPage + +object DetailParametruPageConnector { + trait AppState { + def details: EventStream[UserInfo] + def parameters: EventStream[List[Parameter]] + def actionBus: Observer[Action] + } +} + +case class DetailParametruPageConnector( + state: DetailParametruPageConnector.AppState +)( + $page: Signal[Page.DetailParametru] +)(using router: Router[Page]): + val $paramChangeSignal = + $page.splitOne(p => (p.osobniCislo, p.idParametru))((x, _, _) => x) + val $pageChangeSignal = + $paramChangeSignal.map(FetchParameter(_, _)) + + val $data = state.details.startWithNone + val $params = state.parameters.startWithNone + + val $merged = + $data.combineWithFn($params, $paramChangeSignal)((d, p, pc) => + for { + da <- d + pa <- p + pb <- pa.find(_.id == pc._2) + } yield (da, pb) + ) + + def render: HtmlElement = + AppPage().render( + $merged.map(_.map(buildModel)) + .split(_ => ())((_, _, s) => DetailParametruPage.render(s)), + $pageChangeSignal --> state.actionBus + ) + + private def buildModel( + o: UserInfo, + p: Parameter + ): DetailParametruPage.ViewModel = + DetailParametruPage.ViewModel( + o.toViewModel, + p.toViewModel, + p.criteria.map(_.toViewModel) + ) diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala deleted file mode 100644 index e37aa8a..0000000 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala +++ /dev/null @@ -1,28 +0,0 @@ -package cz.e_bs.cmi.mdr.pdb.app - -import java.time.LocalDate -import java.time.Instant -import cz.e_bs.cmi.mdr.pdb.OsobniCislo - -case class Potvrzeni( - uzivatel: String, - datum: Instant -) - -case class Dukaz( - doklady: List[String], - potvrzeno: Option[Potvrzeni], - platiDo: Option[Instant] -) - -case class Kriterium( - id: String, - nazev: String, - dukaz: Option[Dukaz] -) - -case class Parametr( - id: String, - nazev: String, - kriteria: List[Kriterium] -) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index de29954..5f08310 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -8,6 +8,7 @@ import scala.scalajs.js import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.Parameter // enum is not working with Waypoints' SplitRender collectStatic sealed abstract class Page(val title: String, val parent: Option[Page]) @@ -36,8 +37,8 @@ ) object DetailParametru { - def apply(o: UserInfo, p: Parametr): DetailParametru = - DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.nazev)) + def apply(o: UserInfo, p: Parameter): DetailParametru = + DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.name)) } case class NotFound(url: String) extends Page("404", Some(Directory)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala index bd498bd..36c9c10 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala @@ -7,4 +7,5 @@ case object FetchDirectory extends Action case class FetchUserDetails(osc: OsobniCislo) extends Action case class FetchParameters(osc: OsobniCislo) extends Action +case class FetchParameter(osc: OsobniCislo, paramId: String) extends Action case class NavigateTo(page: Page) extends Action diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index 20393ef..038d2d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -35,7 +35,6 @@ case None => renderHome(page) case Some(p) => a( - href := router.absoluteUrlForPage(p), navigateTo(p), cls := "group inline-flex space-x-3 text-sm font-medium text-gray-500 hover:text-gray-700", Icons.solid.`arrow-narrow-left`, @@ -53,9 +52,9 @@ cls := "flex items-center", slash, a( - href := "#", + navigateTo(p), cls := "ml-4 text-sm font-medium text-gray-500 hover:text-gray-700", - page.title + p.title ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala index fefb4a6..a8f025e 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala @@ -47,21 +47,6 @@ p: List[Parameter] ): DetailPage.ViewModel = DetailPage.ViewModel( - DetailOsoby.ViewModel( - o.personalNumber, - o.name, - o.email, - o.phone, - o.img, - None, - None - ), - p.map { param => - SeznamParametru.Parametr( - id = param.name, - nazev = param.name, - status = "Nesplněno", - statusColor = Color.red - ) - } + o.toViewModel, + p.map(_.toViewModel) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala new file mode 100644 index 0000000..870e2a4 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala @@ -0,0 +1,57 @@ +package cz.e_bs.cmi.mdr.pdb.app +package connectors + +import com.raquo.laminar.api.L.{*, given} +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.DetailParametruPage +import pages.detail.DetailParametruPage +import com.raquo.waypoint.Router +import cz.e_bs.cmi.mdr.pdb.app.components.AppPage + +object DetailParametruPageConnector { + trait AppState { + def details: EventStream[UserInfo] + def parameters: EventStream[List[Parameter]] + def actionBus: Observer[Action] + } +} + +case class DetailParametruPageConnector( + state: DetailParametruPageConnector.AppState +)( + $page: Signal[Page.DetailParametru] +)(using router: Router[Page]): + val $paramChangeSignal = + $page.splitOne(p => (p.osobniCislo, p.idParametru))((x, _, _) => x) + val $pageChangeSignal = + $paramChangeSignal.map(FetchParameter(_, _)) + + val $data = state.details.startWithNone + val $params = state.parameters.startWithNone + + val $merged = + $data.combineWithFn($params, $paramChangeSignal)((d, p, pc) => + for { + da <- d + pa <- p + pb <- pa.find(_.id == pc._2) + } yield (da, pb) + ) + + def render: HtmlElement = + AppPage().render( + $merged.map(_.map(buildModel)) + .split(_ => ())((_, _, s) => DetailParametruPage.render(s)), + $pageChangeSignal --> state.actionBus + ) + + private def buildModel( + o: UserInfo, + p: Parameter + ): DetailParametruPage.ViewModel = + DetailParametruPage.ViewModel( + o.toViewModel, + p.toViewModel, + p.criteria.map(_.toViewModel) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala new file mode 100644 index 0000000..c4c0433 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -0,0 +1,41 @@ +package cz.e_bs.cmi.mdr.pdb.app.connectors + +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.DetailOsoby +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamParametru +import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.ParameterCriteria +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamKriterii + +extension (o: UserInfo) + def toViewModel: DetailOsoby.ViewModel = + DetailOsoby.ViewModel( + o.personalNumber, + o.name, + o.email, + o.phone, + o.img, + None, + None + ) + +extension (param: Parameter) + def toViewModel: SeznamParametru.Parametr = + SeznamParametru.Parametr( + id = param.id, + nazev = param.name, + status = "Nesplněno", + statusColor = Color.red + ) + +extension (crit: ParameterCriteria) + def toViewModel: SeznamKriterii.Kriterium = + SeznamKriterii.Kriterium( + nazev = crit.criteriumText, + kapitola = crit.chapterId, + bod = crit.itemId, + status = "Nesplněno", + statusColor = Color.red, + splneno = false + ) diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala deleted file mode 100644 index e37aa8a..0000000 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala +++ /dev/null @@ -1,28 +0,0 @@ -package cz.e_bs.cmi.mdr.pdb.app - -import java.time.LocalDate -import java.time.Instant -import cz.e_bs.cmi.mdr.pdb.OsobniCislo - -case class Potvrzeni( - uzivatel: String, - datum: Instant -) - -case class Dukaz( - doklady: List[String], - potvrzeno: Option[Potvrzeni], - platiDo: Option[Instant] -) - -case class Kriterium( - id: String, - nazev: String, - dukaz: Option[Dukaz] -) - -case class Parametr( - id: String, - nazev: String, - kriteria: List[Kriterium] -) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index de29954..5f08310 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -8,6 +8,7 @@ import scala.scalajs.js import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.Parameter // enum is not working with Waypoints' SplitRender collectStatic sealed abstract class Page(val title: String, val parent: Option[Page]) @@ -36,8 +37,8 @@ ) object DetailParametru { - def apply(o: UserInfo, p: Parametr): DetailParametru = - DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.nazev)) + def apply(o: UserInfo, p: Parameter): DetailParametru = + DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.name)) } case class NotFound(url: String) extends Page("404", Some(Directory)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala index bd498bd..36c9c10 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala @@ -7,4 +7,5 @@ case object FetchDirectory extends Action case class FetchUserDetails(osc: OsobniCislo) extends Action case class FetchParameters(osc: OsobniCislo) extends Action +case class FetchParameter(osc: OsobniCislo, paramId: String) extends Action case class NavigateTo(page: Page) extends Action diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index 20393ef..038d2d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -35,7 +35,6 @@ case None => renderHome(page) case Some(p) => a( - href := router.absoluteUrlForPage(p), navigateTo(p), cls := "group inline-flex space-x-3 text-sm font-medium text-gray-500 hover:text-gray-700", Icons.solid.`arrow-narrow-left`, @@ -53,9 +52,9 @@ cls := "flex items-center", slash, a( - href := "#", + navigateTo(p), cls := "ml-4 text-sm font-medium text-gray-500 hover:text-gray-700", - page.title + p.title ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala index fefb4a6..a8f025e 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala @@ -47,21 +47,6 @@ p: List[Parameter] ): DetailPage.ViewModel = DetailPage.ViewModel( - DetailOsoby.ViewModel( - o.personalNumber, - o.name, - o.email, - o.phone, - o.img, - None, - None - ), - p.map { param => - SeznamParametru.Parametr( - id = param.name, - nazev = param.name, - status = "Nesplněno", - statusColor = Color.red - ) - } + o.toViewModel, + p.map(_.toViewModel) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala new file mode 100644 index 0000000..870e2a4 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala @@ -0,0 +1,57 @@ +package cz.e_bs.cmi.mdr.pdb.app +package connectors + +import com.raquo.laminar.api.L.{*, given} +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.DetailParametruPage +import pages.detail.DetailParametruPage +import com.raquo.waypoint.Router +import cz.e_bs.cmi.mdr.pdb.app.components.AppPage + +object DetailParametruPageConnector { + trait AppState { + def details: EventStream[UserInfo] + def parameters: EventStream[List[Parameter]] + def actionBus: Observer[Action] + } +} + +case class DetailParametruPageConnector( + state: DetailParametruPageConnector.AppState +)( + $page: Signal[Page.DetailParametru] +)(using router: Router[Page]): + val $paramChangeSignal = + $page.splitOne(p => (p.osobniCislo, p.idParametru))((x, _, _) => x) + val $pageChangeSignal = + $paramChangeSignal.map(FetchParameter(_, _)) + + val $data = state.details.startWithNone + val $params = state.parameters.startWithNone + + val $merged = + $data.combineWithFn($params, $paramChangeSignal)((d, p, pc) => + for { + da <- d + pa <- p + pb <- pa.find(_.id == pc._2) + } yield (da, pb) + ) + + def render: HtmlElement = + AppPage().render( + $merged.map(_.map(buildModel)) + .split(_ => ())((_, _, s) => DetailParametruPage.render(s)), + $pageChangeSignal --> state.actionBus + ) + + private def buildModel( + o: UserInfo, + p: Parameter + ): DetailParametruPage.ViewModel = + DetailParametruPage.ViewModel( + o.toViewModel, + p.toViewModel, + p.criteria.map(_.toViewModel) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala new file mode 100644 index 0000000..c4c0433 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -0,0 +1,41 @@ +package cz.e_bs.cmi.mdr.pdb.app.connectors + +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.DetailOsoby +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamParametru +import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.ParameterCriteria +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamKriterii + +extension (o: UserInfo) + def toViewModel: DetailOsoby.ViewModel = + DetailOsoby.ViewModel( + o.personalNumber, + o.name, + o.email, + o.phone, + o.img, + None, + None + ) + +extension (param: Parameter) + def toViewModel: SeznamParametru.Parametr = + SeznamParametru.Parametr( + id = param.id, + nazev = param.name, + status = "Nesplněno", + statusColor = Color.red + ) + +extension (crit: ParameterCriteria) + def toViewModel: SeznamKriterii.Kriterium = + SeznamKriterii.Kriterium( + nazev = crit.criteriumText, + kapitola = crit.chapterId, + bod = crit.itemId, + status = "Nesplněno", + statusColor = Color.red, + splneno = false + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala index c3b60ae..50afeea 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala @@ -3,6 +3,8 @@ import com.raquo.laminar.api.L.{*, given} import components._ +import cz.e_bs.cmi.mdr.pdb.app.Page +import com.raquo.waypoint.Router object DetailPage: @@ -11,12 +13,16 @@ parametry: SeznamParametru.ViewModel ) - def render($m: Signal[ViewModel]): HtmlElement = + def render($m: Signal[ViewModel])(using router: Router[Page]): HtmlElement = div( cls := "max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", div( cls := "flex flex-col space-y-4", DetailOsoby.render($m.map(_.osoba)), - SeznamParametru.render($m.map(_.parametry)) + child <-- $m.map(m => + SeznamParametru.render($m.map(_.parametry))(p => + Page.DetailParametru(m.osoba.osobniCislo, p.id) + ) + ) ) ) diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala deleted file mode 100644 index e37aa8a..0000000 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala +++ /dev/null @@ -1,28 +0,0 @@ -package cz.e_bs.cmi.mdr.pdb.app - -import java.time.LocalDate -import java.time.Instant -import cz.e_bs.cmi.mdr.pdb.OsobniCislo - -case class Potvrzeni( - uzivatel: String, - datum: Instant -) - -case class Dukaz( - doklady: List[String], - potvrzeno: Option[Potvrzeni], - platiDo: Option[Instant] -) - -case class Kriterium( - id: String, - nazev: String, - dukaz: Option[Dukaz] -) - -case class Parametr( - id: String, - nazev: String, - kriteria: List[Kriterium] -) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index de29954..5f08310 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -8,6 +8,7 @@ import scala.scalajs.js import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.Parameter // enum is not working with Waypoints' SplitRender collectStatic sealed abstract class Page(val title: String, val parent: Option[Page]) @@ -36,8 +37,8 @@ ) object DetailParametru { - def apply(o: UserInfo, p: Parametr): DetailParametru = - DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.nazev)) + def apply(o: UserInfo, p: Parameter): DetailParametru = + DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.name)) } case class NotFound(url: String) extends Page("404", Some(Directory)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala index bd498bd..36c9c10 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala @@ -7,4 +7,5 @@ case object FetchDirectory extends Action case class FetchUserDetails(osc: OsobniCislo) extends Action case class FetchParameters(osc: OsobniCislo) extends Action +case class FetchParameter(osc: OsobniCislo, paramId: String) extends Action case class NavigateTo(page: Page) extends Action diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index 20393ef..038d2d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -35,7 +35,6 @@ case None => renderHome(page) case Some(p) => a( - href := router.absoluteUrlForPage(p), navigateTo(p), cls := "group inline-flex space-x-3 text-sm font-medium text-gray-500 hover:text-gray-700", Icons.solid.`arrow-narrow-left`, @@ -53,9 +52,9 @@ cls := "flex items-center", slash, a( - href := "#", + navigateTo(p), cls := "ml-4 text-sm font-medium text-gray-500 hover:text-gray-700", - page.title + p.title ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala index fefb4a6..a8f025e 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala @@ -47,21 +47,6 @@ p: List[Parameter] ): DetailPage.ViewModel = DetailPage.ViewModel( - DetailOsoby.ViewModel( - o.personalNumber, - o.name, - o.email, - o.phone, - o.img, - None, - None - ), - p.map { param => - SeznamParametru.Parametr( - id = param.name, - nazev = param.name, - status = "Nesplněno", - statusColor = Color.red - ) - } + o.toViewModel, + p.map(_.toViewModel) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala new file mode 100644 index 0000000..870e2a4 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala @@ -0,0 +1,57 @@ +package cz.e_bs.cmi.mdr.pdb.app +package connectors + +import com.raquo.laminar.api.L.{*, given} +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.DetailParametruPage +import pages.detail.DetailParametruPage +import com.raquo.waypoint.Router +import cz.e_bs.cmi.mdr.pdb.app.components.AppPage + +object DetailParametruPageConnector { + trait AppState { + def details: EventStream[UserInfo] + def parameters: EventStream[List[Parameter]] + def actionBus: Observer[Action] + } +} + +case class DetailParametruPageConnector( + state: DetailParametruPageConnector.AppState +)( + $page: Signal[Page.DetailParametru] +)(using router: Router[Page]): + val $paramChangeSignal = + $page.splitOne(p => (p.osobniCislo, p.idParametru))((x, _, _) => x) + val $pageChangeSignal = + $paramChangeSignal.map(FetchParameter(_, _)) + + val $data = state.details.startWithNone + val $params = state.parameters.startWithNone + + val $merged = + $data.combineWithFn($params, $paramChangeSignal)((d, p, pc) => + for { + da <- d + pa <- p + pb <- pa.find(_.id == pc._2) + } yield (da, pb) + ) + + def render: HtmlElement = + AppPage().render( + $merged.map(_.map(buildModel)) + .split(_ => ())((_, _, s) => DetailParametruPage.render(s)), + $pageChangeSignal --> state.actionBus + ) + + private def buildModel( + o: UserInfo, + p: Parameter + ): DetailParametruPage.ViewModel = + DetailParametruPage.ViewModel( + o.toViewModel, + p.toViewModel, + p.criteria.map(_.toViewModel) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala new file mode 100644 index 0000000..c4c0433 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -0,0 +1,41 @@ +package cz.e_bs.cmi.mdr.pdb.app.connectors + +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.DetailOsoby +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamParametru +import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.ParameterCriteria +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamKriterii + +extension (o: UserInfo) + def toViewModel: DetailOsoby.ViewModel = + DetailOsoby.ViewModel( + o.personalNumber, + o.name, + o.email, + o.phone, + o.img, + None, + None + ) + +extension (param: Parameter) + def toViewModel: SeznamParametru.Parametr = + SeznamParametru.Parametr( + id = param.id, + nazev = param.name, + status = "Nesplněno", + statusColor = Color.red + ) + +extension (crit: ParameterCriteria) + def toViewModel: SeznamKriterii.Kriterium = + SeznamKriterii.Kriterium( + nazev = crit.criteriumText, + kapitola = crit.chapterId, + bod = crit.itemId, + status = "Nesplněno", + statusColor = Color.red, + splneno = false + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala index c3b60ae..50afeea 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala @@ -3,6 +3,8 @@ import com.raquo.laminar.api.L.{*, given} import components._ +import cz.e_bs.cmi.mdr.pdb.app.Page +import com.raquo.waypoint.Router object DetailPage: @@ -11,12 +13,16 @@ parametry: SeznamParametru.ViewModel ) - def render($m: Signal[ViewModel]): HtmlElement = + def render($m: Signal[ViewModel])(using router: Router[Page]): HtmlElement = div( cls := "max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", div( cls := "flex flex-col space-y-4", DetailOsoby.render($m.map(_.osoba)), - SeznamParametru.render($m.map(_.parametry)) + child <-- $m.map(m => + SeznamParametru.render($m.map(_.parametry))(p => + Page.DetailParametru(m.osoba.osobniCislo, p.id) + ) + ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala new file mode 100644 index 0000000..ae7a965 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala @@ -0,0 +1,24 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail + +import com.raquo.laminar.api.L.{*, given} + +import components._ + +object DetailParametruPage: + + case class ViewModel( + osoba: DetailOsoby.ViewModel, + parametr: SeznamParametru.Parametr, + kriteria: SeznamKriterii.ViewModel + ) + + def render($m: Signal[ViewModel]): HtmlElement = + div( + cls := "max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", + div( + cls := "flex flex-col space-y-4", + DetailOsoby.render($m.map(_.osoba)), + DetailParametru.render($m.map(_.parametr)), + SeznamKriterii.render($m.map(_.kriteria)) + ) + ) diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala deleted file mode 100644 index e37aa8a..0000000 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala +++ /dev/null @@ -1,28 +0,0 @@ -package cz.e_bs.cmi.mdr.pdb.app - -import java.time.LocalDate -import java.time.Instant -import cz.e_bs.cmi.mdr.pdb.OsobniCislo - -case class Potvrzeni( - uzivatel: String, - datum: Instant -) - -case class Dukaz( - doklady: List[String], - potvrzeno: Option[Potvrzeni], - platiDo: Option[Instant] -) - -case class Kriterium( - id: String, - nazev: String, - dukaz: Option[Dukaz] -) - -case class Parametr( - id: String, - nazev: String, - kriteria: List[Kriterium] -) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index de29954..5f08310 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -8,6 +8,7 @@ import scala.scalajs.js import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.Parameter // enum is not working with Waypoints' SplitRender collectStatic sealed abstract class Page(val title: String, val parent: Option[Page]) @@ -36,8 +37,8 @@ ) object DetailParametru { - def apply(o: UserInfo, p: Parametr): DetailParametru = - DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.nazev)) + def apply(o: UserInfo, p: Parameter): DetailParametru = + DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.name)) } case class NotFound(url: String) extends Page("404", Some(Directory)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala index bd498bd..36c9c10 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala @@ -7,4 +7,5 @@ case object FetchDirectory extends Action case class FetchUserDetails(osc: OsobniCislo) extends Action case class FetchParameters(osc: OsobniCislo) extends Action +case class FetchParameter(osc: OsobniCislo, paramId: String) extends Action case class NavigateTo(page: Page) extends Action diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index 20393ef..038d2d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -35,7 +35,6 @@ case None => renderHome(page) case Some(p) => a( - href := router.absoluteUrlForPage(p), navigateTo(p), cls := "group inline-flex space-x-3 text-sm font-medium text-gray-500 hover:text-gray-700", Icons.solid.`arrow-narrow-left`, @@ -53,9 +52,9 @@ cls := "flex items-center", slash, a( - href := "#", + navigateTo(p), cls := "ml-4 text-sm font-medium text-gray-500 hover:text-gray-700", - page.title + p.title ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala index fefb4a6..a8f025e 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala @@ -47,21 +47,6 @@ p: List[Parameter] ): DetailPage.ViewModel = DetailPage.ViewModel( - DetailOsoby.ViewModel( - o.personalNumber, - o.name, - o.email, - o.phone, - o.img, - None, - None - ), - p.map { param => - SeznamParametru.Parametr( - id = param.name, - nazev = param.name, - status = "Nesplněno", - statusColor = Color.red - ) - } + o.toViewModel, + p.map(_.toViewModel) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala new file mode 100644 index 0000000..870e2a4 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala @@ -0,0 +1,57 @@ +package cz.e_bs.cmi.mdr.pdb.app +package connectors + +import com.raquo.laminar.api.L.{*, given} +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.DetailParametruPage +import pages.detail.DetailParametruPage +import com.raquo.waypoint.Router +import cz.e_bs.cmi.mdr.pdb.app.components.AppPage + +object DetailParametruPageConnector { + trait AppState { + def details: EventStream[UserInfo] + def parameters: EventStream[List[Parameter]] + def actionBus: Observer[Action] + } +} + +case class DetailParametruPageConnector( + state: DetailParametruPageConnector.AppState +)( + $page: Signal[Page.DetailParametru] +)(using router: Router[Page]): + val $paramChangeSignal = + $page.splitOne(p => (p.osobniCislo, p.idParametru))((x, _, _) => x) + val $pageChangeSignal = + $paramChangeSignal.map(FetchParameter(_, _)) + + val $data = state.details.startWithNone + val $params = state.parameters.startWithNone + + val $merged = + $data.combineWithFn($params, $paramChangeSignal)((d, p, pc) => + for { + da <- d + pa <- p + pb <- pa.find(_.id == pc._2) + } yield (da, pb) + ) + + def render: HtmlElement = + AppPage().render( + $merged.map(_.map(buildModel)) + .split(_ => ())((_, _, s) => DetailParametruPage.render(s)), + $pageChangeSignal --> state.actionBus + ) + + private def buildModel( + o: UserInfo, + p: Parameter + ): DetailParametruPage.ViewModel = + DetailParametruPage.ViewModel( + o.toViewModel, + p.toViewModel, + p.criteria.map(_.toViewModel) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala new file mode 100644 index 0000000..c4c0433 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -0,0 +1,41 @@ +package cz.e_bs.cmi.mdr.pdb.app.connectors + +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.DetailOsoby +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamParametru +import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.ParameterCriteria +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamKriterii + +extension (o: UserInfo) + def toViewModel: DetailOsoby.ViewModel = + DetailOsoby.ViewModel( + o.personalNumber, + o.name, + o.email, + o.phone, + o.img, + None, + None + ) + +extension (param: Parameter) + def toViewModel: SeznamParametru.Parametr = + SeznamParametru.Parametr( + id = param.id, + nazev = param.name, + status = "Nesplněno", + statusColor = Color.red + ) + +extension (crit: ParameterCriteria) + def toViewModel: SeznamKriterii.Kriterium = + SeznamKriterii.Kriterium( + nazev = crit.criteriumText, + kapitola = crit.chapterId, + bod = crit.itemId, + status = "Nesplněno", + statusColor = Color.red, + splneno = false + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala index c3b60ae..50afeea 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala @@ -3,6 +3,8 @@ import com.raquo.laminar.api.L.{*, given} import components._ +import cz.e_bs.cmi.mdr.pdb.app.Page +import com.raquo.waypoint.Router object DetailPage: @@ -11,12 +13,16 @@ parametry: SeznamParametru.ViewModel ) - def render($m: Signal[ViewModel]): HtmlElement = + def render($m: Signal[ViewModel])(using router: Router[Page]): HtmlElement = div( cls := "max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", div( cls := "flex flex-col space-y-4", DetailOsoby.render($m.map(_.osoba)), - SeznamParametru.render($m.map(_.parametry)) + child <-- $m.map(m => + SeznamParametru.render($m.map(_.parametry))(p => + Page.DetailParametru(m.osoba.osobniCislo, p.id) + ) + ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala new file mode 100644 index 0000000..ae7a965 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala @@ -0,0 +1,24 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail + +import com.raquo.laminar.api.L.{*, given} + +import components._ + +object DetailParametruPage: + + case class ViewModel( + osoba: DetailOsoby.ViewModel, + parametr: SeznamParametru.Parametr, + kriteria: SeznamKriterii.ViewModel + ) + + def render($m: Signal[ViewModel]): HtmlElement = + div( + cls := "max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", + div( + cls := "flex flex-col space-y-4", + DetailOsoby.render($m.map(_.osoba)), + DetailParametru.render($m.map(_.parametr)), + SeznamKriterii.render($m.map(_.kriteria)) + ) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala new file mode 100644 index 0000000..8fff452 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala @@ -0,0 +1,11 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail.components + +import com.raquo.laminar.api.L.{*, given} + +object DetailParametru: + type ViewModel = SeznamParametru.Parametr + def render($m: Signal[ViewModel]): HtmlElement = + div( + h2(cls := "text-xl font-bold text-gray-900"), + child.text <-- $m.map(_.nazev) + ) diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala deleted file mode 100644 index e37aa8a..0000000 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala +++ /dev/null @@ -1,28 +0,0 @@ -package cz.e_bs.cmi.mdr.pdb.app - -import java.time.LocalDate -import java.time.Instant -import cz.e_bs.cmi.mdr.pdb.OsobniCislo - -case class Potvrzeni( - uzivatel: String, - datum: Instant -) - -case class Dukaz( - doklady: List[String], - potvrzeno: Option[Potvrzeni], - platiDo: Option[Instant] -) - -case class Kriterium( - id: String, - nazev: String, - dukaz: Option[Dukaz] -) - -case class Parametr( - id: String, - nazev: String, - kriteria: List[Kriterium] -) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index de29954..5f08310 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -8,6 +8,7 @@ import scala.scalajs.js import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.Parameter // enum is not working with Waypoints' SplitRender collectStatic sealed abstract class Page(val title: String, val parent: Option[Page]) @@ -36,8 +37,8 @@ ) object DetailParametru { - def apply(o: UserInfo, p: Parametr): DetailParametru = - DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.nazev)) + def apply(o: UserInfo, p: Parameter): DetailParametru = + DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.name)) } case class NotFound(url: String) extends Page("404", Some(Directory)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala index bd498bd..36c9c10 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala @@ -7,4 +7,5 @@ case object FetchDirectory extends Action case class FetchUserDetails(osc: OsobniCislo) extends Action case class FetchParameters(osc: OsobniCislo) extends Action +case class FetchParameter(osc: OsobniCislo, paramId: String) extends Action case class NavigateTo(page: Page) extends Action diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index 20393ef..038d2d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -35,7 +35,6 @@ case None => renderHome(page) case Some(p) => a( - href := router.absoluteUrlForPage(p), navigateTo(p), cls := "group inline-flex space-x-3 text-sm font-medium text-gray-500 hover:text-gray-700", Icons.solid.`arrow-narrow-left`, @@ -53,9 +52,9 @@ cls := "flex items-center", slash, a( - href := "#", + navigateTo(p), cls := "ml-4 text-sm font-medium text-gray-500 hover:text-gray-700", - page.title + p.title ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala index fefb4a6..a8f025e 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala @@ -47,21 +47,6 @@ p: List[Parameter] ): DetailPage.ViewModel = DetailPage.ViewModel( - DetailOsoby.ViewModel( - o.personalNumber, - o.name, - o.email, - o.phone, - o.img, - None, - None - ), - p.map { param => - SeznamParametru.Parametr( - id = param.name, - nazev = param.name, - status = "Nesplněno", - statusColor = Color.red - ) - } + o.toViewModel, + p.map(_.toViewModel) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala new file mode 100644 index 0000000..870e2a4 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala @@ -0,0 +1,57 @@ +package cz.e_bs.cmi.mdr.pdb.app +package connectors + +import com.raquo.laminar.api.L.{*, given} +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.DetailParametruPage +import pages.detail.DetailParametruPage +import com.raquo.waypoint.Router +import cz.e_bs.cmi.mdr.pdb.app.components.AppPage + +object DetailParametruPageConnector { + trait AppState { + def details: EventStream[UserInfo] + def parameters: EventStream[List[Parameter]] + def actionBus: Observer[Action] + } +} + +case class DetailParametruPageConnector( + state: DetailParametruPageConnector.AppState +)( + $page: Signal[Page.DetailParametru] +)(using router: Router[Page]): + val $paramChangeSignal = + $page.splitOne(p => (p.osobniCislo, p.idParametru))((x, _, _) => x) + val $pageChangeSignal = + $paramChangeSignal.map(FetchParameter(_, _)) + + val $data = state.details.startWithNone + val $params = state.parameters.startWithNone + + val $merged = + $data.combineWithFn($params, $paramChangeSignal)((d, p, pc) => + for { + da <- d + pa <- p + pb <- pa.find(_.id == pc._2) + } yield (da, pb) + ) + + def render: HtmlElement = + AppPage().render( + $merged.map(_.map(buildModel)) + .split(_ => ())((_, _, s) => DetailParametruPage.render(s)), + $pageChangeSignal --> state.actionBus + ) + + private def buildModel( + o: UserInfo, + p: Parameter + ): DetailParametruPage.ViewModel = + DetailParametruPage.ViewModel( + o.toViewModel, + p.toViewModel, + p.criteria.map(_.toViewModel) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala new file mode 100644 index 0000000..c4c0433 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -0,0 +1,41 @@ +package cz.e_bs.cmi.mdr.pdb.app.connectors + +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.DetailOsoby +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamParametru +import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.ParameterCriteria +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamKriterii + +extension (o: UserInfo) + def toViewModel: DetailOsoby.ViewModel = + DetailOsoby.ViewModel( + o.personalNumber, + o.name, + o.email, + o.phone, + o.img, + None, + None + ) + +extension (param: Parameter) + def toViewModel: SeznamParametru.Parametr = + SeznamParametru.Parametr( + id = param.id, + nazev = param.name, + status = "Nesplněno", + statusColor = Color.red + ) + +extension (crit: ParameterCriteria) + def toViewModel: SeznamKriterii.Kriterium = + SeznamKriterii.Kriterium( + nazev = crit.criteriumText, + kapitola = crit.chapterId, + bod = crit.itemId, + status = "Nesplněno", + statusColor = Color.red, + splneno = false + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala index c3b60ae..50afeea 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala @@ -3,6 +3,8 @@ import com.raquo.laminar.api.L.{*, given} import components._ +import cz.e_bs.cmi.mdr.pdb.app.Page +import com.raquo.waypoint.Router object DetailPage: @@ -11,12 +13,16 @@ parametry: SeznamParametru.ViewModel ) - def render($m: Signal[ViewModel]): HtmlElement = + def render($m: Signal[ViewModel])(using router: Router[Page]): HtmlElement = div( cls := "max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", div( cls := "flex flex-col space-y-4", DetailOsoby.render($m.map(_.osoba)), - SeznamParametru.render($m.map(_.parametry)) + child <-- $m.map(m => + SeznamParametru.render($m.map(_.parametry))(p => + Page.DetailParametru(m.osoba.osobniCislo, p.id) + ) + ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala new file mode 100644 index 0000000..ae7a965 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala @@ -0,0 +1,24 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail + +import com.raquo.laminar.api.L.{*, given} + +import components._ + +object DetailParametruPage: + + case class ViewModel( + osoba: DetailOsoby.ViewModel, + parametr: SeznamParametru.Parametr, + kriteria: SeznamKriterii.ViewModel + ) + + def render($m: Signal[ViewModel]): HtmlElement = + div( + cls := "max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", + div( + cls := "flex flex-col space-y-4", + DetailOsoby.render($m.map(_.osoba)), + DetailParametru.render($m.map(_.parametr)), + SeznamKriterii.render($m.map(_.kriteria)) + ) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala new file mode 100644 index 0000000..8fff452 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala @@ -0,0 +1,11 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail.components + +import com.raquo.laminar.api.L.{*, given} + +object DetailParametru: + type ViewModel = SeznamParametru.Parametr + def render($m: Signal[ViewModel]): HtmlElement = + div( + h2(cls := "text-xl font-bold text-gray-900"), + child.text <-- $m.map(_.nazev) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamKriterii.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamKriterii.scala new file mode 100644 index 0000000..905dce2 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamKriterii.scala @@ -0,0 +1,43 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail.components + +import com.raquo.laminar.api.L.{*, given} +import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.app.components.list.StackedList +import cz.e_bs.cmi.mdr.pdb.app.components.list.ListRow +import cz.e_bs.cmi.mdr.pdb.app.components.list.RowTag +import cz.e_bs.cmi.mdr.pdb.app.components.list.RowNext + +object SeznamKriterii: + case class Kriterium( + nazev: String, + kapitola: String, + bod: String, + status: String, + statusColor: Color, + splneno: Boolean + ) { + val id = s"${kapitola}${bod}" + } + type ViewModel = List[Kriterium] + + private val kritList = new StackedList[Kriterium] + + def render($m: Signal[ViewModel]): HtmlElement = + div( + cls := "bg-white shadow overflow-hidden sm:rounded-md", + kritList.render($m, _.id) { $i => + $i.map { i => + ListRow.ViewModel( + title = i.nazev, + topRight = RowTag.render( + $i.map(x => RowTag.ViewModel(x.status, x.statusColor)) + ), + bottomLeft = + p(cls := "text-sm text-gray-500", s"${i.kapitola}${i.bod}"), + bottomRight = emptyNode, + farRight = RowNext.render, + containerElement = a() + ) + } + } + ) diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala deleted file mode 100644 index e37aa8a..0000000 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala +++ /dev/null @@ -1,28 +0,0 @@ -package cz.e_bs.cmi.mdr.pdb.app - -import java.time.LocalDate -import java.time.Instant -import cz.e_bs.cmi.mdr.pdb.OsobniCislo - -case class Potvrzeni( - uzivatel: String, - datum: Instant -) - -case class Dukaz( - doklady: List[String], - potvrzeno: Option[Potvrzeni], - platiDo: Option[Instant] -) - -case class Kriterium( - id: String, - nazev: String, - dukaz: Option[Dukaz] -) - -case class Parametr( - id: String, - nazev: String, - kriteria: List[Kriterium] -) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index de29954..5f08310 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -8,6 +8,7 @@ import scala.scalajs.js import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.Parameter // enum is not working with Waypoints' SplitRender collectStatic sealed abstract class Page(val title: String, val parent: Option[Page]) @@ -36,8 +37,8 @@ ) object DetailParametru { - def apply(o: UserInfo, p: Parametr): DetailParametru = - DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.nazev)) + def apply(o: UserInfo, p: Parameter): DetailParametru = + DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.name)) } case class NotFound(url: String) extends Page("404", Some(Directory)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala index bd498bd..36c9c10 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala @@ -7,4 +7,5 @@ case object FetchDirectory extends Action case class FetchUserDetails(osc: OsobniCislo) extends Action case class FetchParameters(osc: OsobniCislo) extends Action +case class FetchParameter(osc: OsobniCislo, paramId: String) extends Action case class NavigateTo(page: Page) extends Action diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index 20393ef..038d2d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -35,7 +35,6 @@ case None => renderHome(page) case Some(p) => a( - href := router.absoluteUrlForPage(p), navigateTo(p), cls := "group inline-flex space-x-3 text-sm font-medium text-gray-500 hover:text-gray-700", Icons.solid.`arrow-narrow-left`, @@ -53,9 +52,9 @@ cls := "flex items-center", slash, a( - href := "#", + navigateTo(p), cls := "ml-4 text-sm font-medium text-gray-500 hover:text-gray-700", - page.title + p.title ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala index fefb4a6..a8f025e 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala @@ -47,21 +47,6 @@ p: List[Parameter] ): DetailPage.ViewModel = DetailPage.ViewModel( - DetailOsoby.ViewModel( - o.personalNumber, - o.name, - o.email, - o.phone, - o.img, - None, - None - ), - p.map { param => - SeznamParametru.Parametr( - id = param.name, - nazev = param.name, - status = "Nesplněno", - statusColor = Color.red - ) - } + o.toViewModel, + p.map(_.toViewModel) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala new file mode 100644 index 0000000..870e2a4 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala @@ -0,0 +1,57 @@ +package cz.e_bs.cmi.mdr.pdb.app +package connectors + +import com.raquo.laminar.api.L.{*, given} +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.DetailParametruPage +import pages.detail.DetailParametruPage +import com.raquo.waypoint.Router +import cz.e_bs.cmi.mdr.pdb.app.components.AppPage + +object DetailParametruPageConnector { + trait AppState { + def details: EventStream[UserInfo] + def parameters: EventStream[List[Parameter]] + def actionBus: Observer[Action] + } +} + +case class DetailParametruPageConnector( + state: DetailParametruPageConnector.AppState +)( + $page: Signal[Page.DetailParametru] +)(using router: Router[Page]): + val $paramChangeSignal = + $page.splitOne(p => (p.osobniCislo, p.idParametru))((x, _, _) => x) + val $pageChangeSignal = + $paramChangeSignal.map(FetchParameter(_, _)) + + val $data = state.details.startWithNone + val $params = state.parameters.startWithNone + + val $merged = + $data.combineWithFn($params, $paramChangeSignal)((d, p, pc) => + for { + da <- d + pa <- p + pb <- pa.find(_.id == pc._2) + } yield (da, pb) + ) + + def render: HtmlElement = + AppPage().render( + $merged.map(_.map(buildModel)) + .split(_ => ())((_, _, s) => DetailParametruPage.render(s)), + $pageChangeSignal --> state.actionBus + ) + + private def buildModel( + o: UserInfo, + p: Parameter + ): DetailParametruPage.ViewModel = + DetailParametruPage.ViewModel( + o.toViewModel, + p.toViewModel, + p.criteria.map(_.toViewModel) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala new file mode 100644 index 0000000..c4c0433 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -0,0 +1,41 @@ +package cz.e_bs.cmi.mdr.pdb.app.connectors + +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.DetailOsoby +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamParametru +import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.ParameterCriteria +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamKriterii + +extension (o: UserInfo) + def toViewModel: DetailOsoby.ViewModel = + DetailOsoby.ViewModel( + o.personalNumber, + o.name, + o.email, + o.phone, + o.img, + None, + None + ) + +extension (param: Parameter) + def toViewModel: SeznamParametru.Parametr = + SeznamParametru.Parametr( + id = param.id, + nazev = param.name, + status = "Nesplněno", + statusColor = Color.red + ) + +extension (crit: ParameterCriteria) + def toViewModel: SeznamKriterii.Kriterium = + SeznamKriterii.Kriterium( + nazev = crit.criteriumText, + kapitola = crit.chapterId, + bod = crit.itemId, + status = "Nesplněno", + statusColor = Color.red, + splneno = false + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala index c3b60ae..50afeea 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala @@ -3,6 +3,8 @@ import com.raquo.laminar.api.L.{*, given} import components._ +import cz.e_bs.cmi.mdr.pdb.app.Page +import com.raquo.waypoint.Router object DetailPage: @@ -11,12 +13,16 @@ parametry: SeznamParametru.ViewModel ) - def render($m: Signal[ViewModel]): HtmlElement = + def render($m: Signal[ViewModel])(using router: Router[Page]): HtmlElement = div( cls := "max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", div( cls := "flex flex-col space-y-4", DetailOsoby.render($m.map(_.osoba)), - SeznamParametru.render($m.map(_.parametry)) + child <-- $m.map(m => + SeznamParametru.render($m.map(_.parametry))(p => + Page.DetailParametru(m.osoba.osobniCislo, p.id) + ) + ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala new file mode 100644 index 0000000..ae7a965 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala @@ -0,0 +1,24 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail + +import com.raquo.laminar.api.L.{*, given} + +import components._ + +object DetailParametruPage: + + case class ViewModel( + osoba: DetailOsoby.ViewModel, + parametr: SeznamParametru.Parametr, + kriteria: SeznamKriterii.ViewModel + ) + + def render($m: Signal[ViewModel]): HtmlElement = + div( + cls := "max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", + div( + cls := "flex flex-col space-y-4", + DetailOsoby.render($m.map(_.osoba)), + DetailParametru.render($m.map(_.parametr)), + SeznamKriterii.render($m.map(_.kriteria)) + ) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala new file mode 100644 index 0000000..8fff452 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala @@ -0,0 +1,11 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail.components + +import com.raquo.laminar.api.L.{*, given} + +object DetailParametru: + type ViewModel = SeznamParametru.Parametr + def render($m: Signal[ViewModel]): HtmlElement = + div( + h2(cls := "text-xl font-bold text-gray-900"), + child.text <-- $m.map(_.nazev) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamKriterii.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamKriterii.scala new file mode 100644 index 0000000..905dce2 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamKriterii.scala @@ -0,0 +1,43 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail.components + +import com.raquo.laminar.api.L.{*, given} +import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.app.components.list.StackedList +import cz.e_bs.cmi.mdr.pdb.app.components.list.ListRow +import cz.e_bs.cmi.mdr.pdb.app.components.list.RowTag +import cz.e_bs.cmi.mdr.pdb.app.components.list.RowNext + +object SeznamKriterii: + case class Kriterium( + nazev: String, + kapitola: String, + bod: String, + status: String, + statusColor: Color, + splneno: Boolean + ) { + val id = s"${kapitola}${bod}" + } + type ViewModel = List[Kriterium] + + private val kritList = new StackedList[Kriterium] + + def render($m: Signal[ViewModel]): HtmlElement = + div( + cls := "bg-white shadow overflow-hidden sm:rounded-md", + kritList.render($m, _.id) { $i => + $i.map { i => + ListRow.ViewModel( + title = i.nazev, + topRight = RowTag.render( + $i.map(x => RowTag.ViewModel(x.status, x.statusColor)) + ), + bottomLeft = + p(cls := "text-sm text-gray-500", s"${i.kapitola}${i.bod}"), + bottomRight = emptyNode, + farRight = RowNext.render, + containerElement = a() + ) + } + } + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala index c47dad4..70b86f4 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala @@ -10,8 +10,14 @@ RowNext } import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.waypoint.components.Navigator +import com.raquo.waypoint.Router +import cz.e_bs.cmi.mdr.pdb.app.Page object SeznamParametru: + sealed trait Action + case object Selected extends Action + case class Parametr( id: String, nazev: String, @@ -22,7 +28,9 @@ private val parametrList = new StackedList[Parametr] - def render($m: Signal[ViewModel]): HtmlElement = + def render($m: Signal[ViewModel])(pageF: Parametr => Page)(using + router: Router[Page] + ): HtmlElement = div( cls := "bg-white shadow overflow-hidden sm:rounded-md", parametrList.render($m, _.id) { $i => @@ -35,7 +43,7 @@ bottomLeft = emptyNode, bottomRight = emptyNode, farRight = RowNext.render, - containerElement = a() + containerElement = a(Navigator.navigateTo(pageF(i))) ) } } diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala deleted file mode 100644 index e37aa8a..0000000 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala +++ /dev/null @@ -1,28 +0,0 @@ -package cz.e_bs.cmi.mdr.pdb.app - -import java.time.LocalDate -import java.time.Instant -import cz.e_bs.cmi.mdr.pdb.OsobniCislo - -case class Potvrzeni( - uzivatel: String, - datum: Instant -) - -case class Dukaz( - doklady: List[String], - potvrzeno: Option[Potvrzeni], - platiDo: Option[Instant] -) - -case class Kriterium( - id: String, - nazev: String, - dukaz: Option[Dukaz] -) - -case class Parametr( - id: String, - nazev: String, - kriteria: List[Kriterium] -) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index de29954..5f08310 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -8,6 +8,7 @@ import scala.scalajs.js import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.Parameter // enum is not working with Waypoints' SplitRender collectStatic sealed abstract class Page(val title: String, val parent: Option[Page]) @@ -36,8 +37,8 @@ ) object DetailParametru { - def apply(o: UserInfo, p: Parametr): DetailParametru = - DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.nazev)) + def apply(o: UserInfo, p: Parameter): DetailParametru = + DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.name)) } case class NotFound(url: String) extends Page("404", Some(Directory)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala index bd498bd..36c9c10 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala @@ -7,4 +7,5 @@ case object FetchDirectory extends Action case class FetchUserDetails(osc: OsobniCislo) extends Action case class FetchParameters(osc: OsobniCislo) extends Action +case class FetchParameter(osc: OsobniCislo, paramId: String) extends Action case class NavigateTo(page: Page) extends Action diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index 20393ef..038d2d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -35,7 +35,6 @@ case None => renderHome(page) case Some(p) => a( - href := router.absoluteUrlForPage(p), navigateTo(p), cls := "group inline-flex space-x-3 text-sm font-medium text-gray-500 hover:text-gray-700", Icons.solid.`arrow-narrow-left`, @@ -53,9 +52,9 @@ cls := "flex items-center", slash, a( - href := "#", + navigateTo(p), cls := "ml-4 text-sm font-medium text-gray-500 hover:text-gray-700", - page.title + p.title ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala index fefb4a6..a8f025e 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala @@ -47,21 +47,6 @@ p: List[Parameter] ): DetailPage.ViewModel = DetailPage.ViewModel( - DetailOsoby.ViewModel( - o.personalNumber, - o.name, - o.email, - o.phone, - o.img, - None, - None - ), - p.map { param => - SeznamParametru.Parametr( - id = param.name, - nazev = param.name, - status = "Nesplněno", - statusColor = Color.red - ) - } + o.toViewModel, + p.map(_.toViewModel) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala new file mode 100644 index 0000000..870e2a4 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala @@ -0,0 +1,57 @@ +package cz.e_bs.cmi.mdr.pdb.app +package connectors + +import com.raquo.laminar.api.L.{*, given} +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.DetailParametruPage +import pages.detail.DetailParametruPage +import com.raquo.waypoint.Router +import cz.e_bs.cmi.mdr.pdb.app.components.AppPage + +object DetailParametruPageConnector { + trait AppState { + def details: EventStream[UserInfo] + def parameters: EventStream[List[Parameter]] + def actionBus: Observer[Action] + } +} + +case class DetailParametruPageConnector( + state: DetailParametruPageConnector.AppState +)( + $page: Signal[Page.DetailParametru] +)(using router: Router[Page]): + val $paramChangeSignal = + $page.splitOne(p => (p.osobniCislo, p.idParametru))((x, _, _) => x) + val $pageChangeSignal = + $paramChangeSignal.map(FetchParameter(_, _)) + + val $data = state.details.startWithNone + val $params = state.parameters.startWithNone + + val $merged = + $data.combineWithFn($params, $paramChangeSignal)((d, p, pc) => + for { + da <- d + pa <- p + pb <- pa.find(_.id == pc._2) + } yield (da, pb) + ) + + def render: HtmlElement = + AppPage().render( + $merged.map(_.map(buildModel)) + .split(_ => ())((_, _, s) => DetailParametruPage.render(s)), + $pageChangeSignal --> state.actionBus + ) + + private def buildModel( + o: UserInfo, + p: Parameter + ): DetailParametruPage.ViewModel = + DetailParametruPage.ViewModel( + o.toViewModel, + p.toViewModel, + p.criteria.map(_.toViewModel) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala new file mode 100644 index 0000000..c4c0433 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -0,0 +1,41 @@ +package cz.e_bs.cmi.mdr.pdb.app.connectors + +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.DetailOsoby +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamParametru +import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.ParameterCriteria +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamKriterii + +extension (o: UserInfo) + def toViewModel: DetailOsoby.ViewModel = + DetailOsoby.ViewModel( + o.personalNumber, + o.name, + o.email, + o.phone, + o.img, + None, + None + ) + +extension (param: Parameter) + def toViewModel: SeznamParametru.Parametr = + SeznamParametru.Parametr( + id = param.id, + nazev = param.name, + status = "Nesplněno", + statusColor = Color.red + ) + +extension (crit: ParameterCriteria) + def toViewModel: SeznamKriterii.Kriterium = + SeznamKriterii.Kriterium( + nazev = crit.criteriumText, + kapitola = crit.chapterId, + bod = crit.itemId, + status = "Nesplněno", + statusColor = Color.red, + splneno = false + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala index c3b60ae..50afeea 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala @@ -3,6 +3,8 @@ import com.raquo.laminar.api.L.{*, given} import components._ +import cz.e_bs.cmi.mdr.pdb.app.Page +import com.raquo.waypoint.Router object DetailPage: @@ -11,12 +13,16 @@ parametry: SeznamParametru.ViewModel ) - def render($m: Signal[ViewModel]): HtmlElement = + def render($m: Signal[ViewModel])(using router: Router[Page]): HtmlElement = div( cls := "max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", div( cls := "flex flex-col space-y-4", DetailOsoby.render($m.map(_.osoba)), - SeznamParametru.render($m.map(_.parametry)) + child <-- $m.map(m => + SeznamParametru.render($m.map(_.parametry))(p => + Page.DetailParametru(m.osoba.osobniCislo, p.id) + ) + ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala new file mode 100644 index 0000000..ae7a965 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala @@ -0,0 +1,24 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail + +import com.raquo.laminar.api.L.{*, given} + +import components._ + +object DetailParametruPage: + + case class ViewModel( + osoba: DetailOsoby.ViewModel, + parametr: SeznamParametru.Parametr, + kriteria: SeznamKriterii.ViewModel + ) + + def render($m: Signal[ViewModel]): HtmlElement = + div( + cls := "max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", + div( + cls := "flex flex-col space-y-4", + DetailOsoby.render($m.map(_.osoba)), + DetailParametru.render($m.map(_.parametr)), + SeznamKriterii.render($m.map(_.kriteria)) + ) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala new file mode 100644 index 0000000..8fff452 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala @@ -0,0 +1,11 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail.components + +import com.raquo.laminar.api.L.{*, given} + +object DetailParametru: + type ViewModel = SeznamParametru.Parametr + def render($m: Signal[ViewModel]): HtmlElement = + div( + h2(cls := "text-xl font-bold text-gray-900"), + child.text <-- $m.map(_.nazev) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamKriterii.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamKriterii.scala new file mode 100644 index 0000000..905dce2 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamKriterii.scala @@ -0,0 +1,43 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail.components + +import com.raquo.laminar.api.L.{*, given} +import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.app.components.list.StackedList +import cz.e_bs.cmi.mdr.pdb.app.components.list.ListRow +import cz.e_bs.cmi.mdr.pdb.app.components.list.RowTag +import cz.e_bs.cmi.mdr.pdb.app.components.list.RowNext + +object SeznamKriterii: + case class Kriterium( + nazev: String, + kapitola: String, + bod: String, + status: String, + statusColor: Color, + splneno: Boolean + ) { + val id = s"${kapitola}${bod}" + } + type ViewModel = List[Kriterium] + + private val kritList = new StackedList[Kriterium] + + def render($m: Signal[ViewModel]): HtmlElement = + div( + cls := "bg-white shadow overflow-hidden sm:rounded-md", + kritList.render($m, _.id) { $i => + $i.map { i => + ListRow.ViewModel( + title = i.nazev, + topRight = RowTag.render( + $i.map(x => RowTag.ViewModel(x.status, x.statusColor)) + ), + bottomLeft = + p(cls := "text-sm text-gray-500", s"${i.kapitola}${i.bod}"), + bottomRight = emptyNode, + farRight = RowNext.render, + containerElement = a() + ) + } + } + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala index c47dad4..70b86f4 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala @@ -10,8 +10,14 @@ RowNext } import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.waypoint.components.Navigator +import com.raquo.waypoint.Router +import cz.e_bs.cmi.mdr.pdb.app.Page object SeznamParametru: + sealed trait Action + case object Selected extends Action + case class Parametr( id: String, nazev: String, @@ -22,7 +28,9 @@ private val parametrList = new StackedList[Parametr] - def render($m: Signal[ViewModel]): HtmlElement = + def render($m: Signal[ViewModel])(pageF: Parametr => Page)(using + router: Router[Page] + ): HtmlElement = div( cls := "bg-white shadow overflow-hidden sm:rounded-md", parametrList.render($m, _.id) { $i => @@ -35,7 +43,7 @@ bottomLeft = emptyNode, bottomRight = emptyNode, farRight = RowNext.render, - containerElement = a() + containerElement = a(Navigator.navigateTo(pageF(i))) ) } } diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala index 8fd44ae..1d98f64 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala @@ -13,7 +13,9 @@ import cz.e_bs.cmi.mdr.pdb.Parameter import cz.e_bs.cmi.mdr.pdb.ParameterCriteria -trait AppState extends connectors.DetailPageConnector.AppState: +trait AppState + extends connectors.DetailPageConnector.AppState + with connectors.DetailParametruPageConnector.AppState: def users: EventStream[List[UserInfo]] def details: EventStream[UserInfo] def parameters: EventStream[List[Parameter]] @@ -54,6 +56,7 @@ .collect { case Right(p) => p } .toList + // TODO: Extract to separate event handler actions.events.foreach { case FetchDirectory => pushUsers(mockData) case FetchUserDetails(osc) => @@ -63,6 +66,14 @@ } case FetchParameters(osc) => pushParameters(mockParameters) + case FetchParameter(osc, paramId) => + for + o <- mockData.find(_.personalNumber == osc) + p <- mockParameters.find(_.id == paramId) + do + pushDetails(o) + pushParameters(mockParameters) + router.replaceState(Page.DetailParametru(o, p)) case NavigateTo(page) => router.pushState(page) } diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala deleted file mode 100644 index e37aa8a..0000000 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala +++ /dev/null @@ -1,28 +0,0 @@ -package cz.e_bs.cmi.mdr.pdb.app - -import java.time.LocalDate -import java.time.Instant -import cz.e_bs.cmi.mdr.pdb.OsobniCislo - -case class Potvrzeni( - uzivatel: String, - datum: Instant -) - -case class Dukaz( - doklady: List[String], - potvrzeno: Option[Potvrzeni], - platiDo: Option[Instant] -) - -case class Kriterium( - id: String, - nazev: String, - dukaz: Option[Dukaz] -) - -case class Parametr( - id: String, - nazev: String, - kriteria: List[Kriterium] -) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index de29954..5f08310 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -8,6 +8,7 @@ import scala.scalajs.js import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.Parameter // enum is not working with Waypoints' SplitRender collectStatic sealed abstract class Page(val title: String, val parent: Option[Page]) @@ -36,8 +37,8 @@ ) object DetailParametru { - def apply(o: UserInfo, p: Parametr): DetailParametru = - DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.nazev)) + def apply(o: UserInfo, p: Parameter): DetailParametru = + DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.name)) } case class NotFound(url: String) extends Page("404", Some(Directory)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala index bd498bd..36c9c10 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala @@ -7,4 +7,5 @@ case object FetchDirectory extends Action case class FetchUserDetails(osc: OsobniCislo) extends Action case class FetchParameters(osc: OsobniCislo) extends Action +case class FetchParameter(osc: OsobniCislo, paramId: String) extends Action case class NavigateTo(page: Page) extends Action diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index 20393ef..038d2d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -35,7 +35,6 @@ case None => renderHome(page) case Some(p) => a( - href := router.absoluteUrlForPage(p), navigateTo(p), cls := "group inline-flex space-x-3 text-sm font-medium text-gray-500 hover:text-gray-700", Icons.solid.`arrow-narrow-left`, @@ -53,9 +52,9 @@ cls := "flex items-center", slash, a( - href := "#", + navigateTo(p), cls := "ml-4 text-sm font-medium text-gray-500 hover:text-gray-700", - page.title + p.title ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala index fefb4a6..a8f025e 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala @@ -47,21 +47,6 @@ p: List[Parameter] ): DetailPage.ViewModel = DetailPage.ViewModel( - DetailOsoby.ViewModel( - o.personalNumber, - o.name, - o.email, - o.phone, - o.img, - None, - None - ), - p.map { param => - SeznamParametru.Parametr( - id = param.name, - nazev = param.name, - status = "Nesplněno", - statusColor = Color.red - ) - } + o.toViewModel, + p.map(_.toViewModel) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala new file mode 100644 index 0000000..870e2a4 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala @@ -0,0 +1,57 @@ +package cz.e_bs.cmi.mdr.pdb.app +package connectors + +import com.raquo.laminar.api.L.{*, given} +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.DetailParametruPage +import pages.detail.DetailParametruPage +import com.raquo.waypoint.Router +import cz.e_bs.cmi.mdr.pdb.app.components.AppPage + +object DetailParametruPageConnector { + trait AppState { + def details: EventStream[UserInfo] + def parameters: EventStream[List[Parameter]] + def actionBus: Observer[Action] + } +} + +case class DetailParametruPageConnector( + state: DetailParametruPageConnector.AppState +)( + $page: Signal[Page.DetailParametru] +)(using router: Router[Page]): + val $paramChangeSignal = + $page.splitOne(p => (p.osobniCislo, p.idParametru))((x, _, _) => x) + val $pageChangeSignal = + $paramChangeSignal.map(FetchParameter(_, _)) + + val $data = state.details.startWithNone + val $params = state.parameters.startWithNone + + val $merged = + $data.combineWithFn($params, $paramChangeSignal)((d, p, pc) => + for { + da <- d + pa <- p + pb <- pa.find(_.id == pc._2) + } yield (da, pb) + ) + + def render: HtmlElement = + AppPage().render( + $merged.map(_.map(buildModel)) + .split(_ => ())((_, _, s) => DetailParametruPage.render(s)), + $pageChangeSignal --> state.actionBus + ) + + private def buildModel( + o: UserInfo, + p: Parameter + ): DetailParametruPage.ViewModel = + DetailParametruPage.ViewModel( + o.toViewModel, + p.toViewModel, + p.criteria.map(_.toViewModel) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala new file mode 100644 index 0000000..c4c0433 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -0,0 +1,41 @@ +package cz.e_bs.cmi.mdr.pdb.app.connectors + +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.DetailOsoby +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamParametru +import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.ParameterCriteria +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamKriterii + +extension (o: UserInfo) + def toViewModel: DetailOsoby.ViewModel = + DetailOsoby.ViewModel( + o.personalNumber, + o.name, + o.email, + o.phone, + o.img, + None, + None + ) + +extension (param: Parameter) + def toViewModel: SeznamParametru.Parametr = + SeznamParametru.Parametr( + id = param.id, + nazev = param.name, + status = "Nesplněno", + statusColor = Color.red + ) + +extension (crit: ParameterCriteria) + def toViewModel: SeznamKriterii.Kriterium = + SeznamKriterii.Kriterium( + nazev = crit.criteriumText, + kapitola = crit.chapterId, + bod = crit.itemId, + status = "Nesplněno", + statusColor = Color.red, + splneno = false + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala index c3b60ae..50afeea 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala @@ -3,6 +3,8 @@ import com.raquo.laminar.api.L.{*, given} import components._ +import cz.e_bs.cmi.mdr.pdb.app.Page +import com.raquo.waypoint.Router object DetailPage: @@ -11,12 +13,16 @@ parametry: SeznamParametru.ViewModel ) - def render($m: Signal[ViewModel]): HtmlElement = + def render($m: Signal[ViewModel])(using router: Router[Page]): HtmlElement = div( cls := "max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", div( cls := "flex flex-col space-y-4", DetailOsoby.render($m.map(_.osoba)), - SeznamParametru.render($m.map(_.parametry)) + child <-- $m.map(m => + SeznamParametru.render($m.map(_.parametry))(p => + Page.DetailParametru(m.osoba.osobniCislo, p.id) + ) + ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala new file mode 100644 index 0000000..ae7a965 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala @@ -0,0 +1,24 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail + +import com.raquo.laminar.api.L.{*, given} + +import components._ + +object DetailParametruPage: + + case class ViewModel( + osoba: DetailOsoby.ViewModel, + parametr: SeznamParametru.Parametr, + kriteria: SeznamKriterii.ViewModel + ) + + def render($m: Signal[ViewModel]): HtmlElement = + div( + cls := "max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", + div( + cls := "flex flex-col space-y-4", + DetailOsoby.render($m.map(_.osoba)), + DetailParametru.render($m.map(_.parametr)), + SeznamKriterii.render($m.map(_.kriteria)) + ) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala new file mode 100644 index 0000000..8fff452 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala @@ -0,0 +1,11 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail.components + +import com.raquo.laminar.api.L.{*, given} + +object DetailParametru: + type ViewModel = SeznamParametru.Parametr + def render($m: Signal[ViewModel]): HtmlElement = + div( + h2(cls := "text-xl font-bold text-gray-900"), + child.text <-- $m.map(_.nazev) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamKriterii.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamKriterii.scala new file mode 100644 index 0000000..905dce2 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamKriterii.scala @@ -0,0 +1,43 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail.components + +import com.raquo.laminar.api.L.{*, given} +import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.app.components.list.StackedList +import cz.e_bs.cmi.mdr.pdb.app.components.list.ListRow +import cz.e_bs.cmi.mdr.pdb.app.components.list.RowTag +import cz.e_bs.cmi.mdr.pdb.app.components.list.RowNext + +object SeznamKriterii: + case class Kriterium( + nazev: String, + kapitola: String, + bod: String, + status: String, + statusColor: Color, + splneno: Boolean + ) { + val id = s"${kapitola}${bod}" + } + type ViewModel = List[Kriterium] + + private val kritList = new StackedList[Kriterium] + + def render($m: Signal[ViewModel]): HtmlElement = + div( + cls := "bg-white shadow overflow-hidden sm:rounded-md", + kritList.render($m, _.id) { $i => + $i.map { i => + ListRow.ViewModel( + title = i.nazev, + topRight = RowTag.render( + $i.map(x => RowTag.ViewModel(x.status, x.statusColor)) + ), + bottomLeft = + p(cls := "text-sm text-gray-500", s"${i.kapitola}${i.bod}"), + bottomRight = emptyNode, + farRight = RowNext.render, + containerElement = a() + ) + } + } + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala index c47dad4..70b86f4 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala @@ -10,8 +10,14 @@ RowNext } import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.waypoint.components.Navigator +import com.raquo.waypoint.Router +import cz.e_bs.cmi.mdr.pdb.app.Page object SeznamParametru: + sealed trait Action + case object Selected extends Action + case class Parametr( id: String, nazev: String, @@ -22,7 +28,9 @@ private val parametrList = new StackedList[Parametr] - def render($m: Signal[ViewModel]): HtmlElement = + def render($m: Signal[ViewModel])(pageF: Parametr => Page)(using + router: Router[Page] + ): HtmlElement = div( cls := "bg-white shadow overflow-hidden sm:rounded-md", parametrList.render($m, _.id) { $i => @@ -35,7 +43,7 @@ bottomLeft = emptyNode, bottomRight = emptyNode, farRight = RowNext.render, - containerElement = a() + containerElement = a(Navigator.navigateTo(pageF(i))) ) } } diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala index 8fd44ae..1d98f64 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala @@ -13,7 +13,9 @@ import cz.e_bs.cmi.mdr.pdb.Parameter import cz.e_bs.cmi.mdr.pdb.ParameterCriteria -trait AppState extends connectors.DetailPageConnector.AppState: +trait AppState + extends connectors.DetailPageConnector.AppState + with connectors.DetailParametruPageConnector.AppState: def users: EventStream[List[UserInfo]] def details: EventStream[UserInfo] def parameters: EventStream[List[Parameter]] @@ -54,6 +56,7 @@ .collect { case Right(p) => p } .toList + // TODO: Extract to separate event handler actions.events.foreach { case FetchDirectory => pushUsers(mockData) case FetchUserDetails(osc) => @@ -63,6 +66,14 @@ } case FetchParameters(osc) => pushParameters(mockParameters) + case FetchParameter(osc, paramId) => + for + o <- mockData.find(_.personalNumber == osc) + p <- mockParameters.find(_.id == paramId) + do + pushDetails(o) + pushParameters(mockParameters) + router.replaceState(Page.DetailParametru(o, p)) case NavigateTo(page) => router.pushState(page) } diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/waypoint/components/Navigator.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/waypoint/components/Navigator.scala index 2fc3d8e..8b9edd7 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/waypoint/components/Navigator.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/waypoint/components/Navigator.scala @@ -3,6 +3,7 @@ import com.raquo.laminar.api.L.{*, given} import com.raquo.waypoint.Router import org.scalajs.dom +import com.raquo.domtypes.jsdom.defs.events.TypedTargetMouseEvent trait Navigator[P](using router: Router[P]): def navigateTo(page: P): Binder[HtmlElement] = Navigator.navigateTo[P](page) diff --git a/app/pdb-params/pdb-params.json b/app/pdb-params/pdb-params.json index 6b277f4..2014591 100644 --- a/app/pdb-params/pdb-params.json +++ b/app/pdb-params/pdb-params.json @@ -1,5 +1,6 @@ { "KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ":{ + "id": "1", "name":"KOMISE PRO POVĚŘOVÁNÍ PRACOVNÍKŮ", "description":"Člen KPP\ndle G5.8/1 – je tato role bez kódů.\nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPP (tato budou označena).\nNěkteří z členů KPP jsou tkzv. plniči – oprávnění vkládat důkazy do PDB.\nPracovníci odpovědní za \n- stanovení kvalifikačních kritérií a za \n- pověřování jiných pracovníků prováděním konkrétních činností posuzování shody musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky nebo subdodavateli. \nUvedení pracovníci musí mít prokazatelné znalosti a zkušenosti ve všech těchto oblastech:", "criteria":[ @@ -56,6 +57,7 @@ ] }, "VEDOUCÍ PROJEKTU":{ + "id": "2", "name":"VEDOUCÍ PROJEKTU", "description":"Vedoucí projektu\nU každé žádosti musí oznámený … určit jednu osobu odpovědnou za zajištění toho, aby bylo posouzení dané žádosti provedeno v souladu s příslušnými postupy a aby byly pro každý z úkolů v rámci posuzování využity vhodné zdroje včetně pracovníků.\nTato role je bez kódů, pokud není vedoucí projektu zároveň PR (což většinou je).\nV takovém případě bude mít v PDB jak parametr VP tak PR.\nKritéria si definujeme sami.", "criteria":[ @@ -82,6 +84,7 @@ ] }, "INTERNÍ KLINIK":{ + "id": "3", "name":"INTERNÍ KLINIK", "description":"Interní klinik dle G5.5/2, může a nemusí být zařazen do přímého přezkumu technické dokumentace, pokud ano pak přiděleny MD kódy a klinická specializace (viz níže G6.3.2/2)\nParametr bude dělený – k obecným kritériím na IK budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nNutno ověřit u ÚNMZ, zda musí nutně mít IK, pokud provádí přezkum, kódy! Postačuje specializace? Viz G6.3.2/2\nPokud nebude provádět přezkum klinických aspektů technické dokumentace nemusí mít kódy!\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.\nOznámené subjekty musí mít trvale k dispozici pracovníky s příslušnými odbornými klinickými znalostmi, přičemž tito pracovníci musí být, pokud možno, přímo zaměstnanci oznámeného subjektu. \nTito pracovníci musí být zapojeni do všech fází posuzování a rozhodování uplatňovaného oznámeným subjektem, aby:", "criteria":[ @@ -148,6 +151,7 @@ ] }, "KLINICKÝ SPECIALISTA":{ + "id": "4", "name":"KLINICKÝ SPECIALISTA", "description":"Klinický specialista dle G6.4 \nobvykle se jedná o lékaře specialisty (nebo držitele alternativních titulů, např. zubního lékaře) s certifikovanou specializací v lékařském oboru, který je relevantní pro kódy MDR, k nimž má být osoba pověřena.\nMá přiděleny MD kódy nebo klinickou specializaci (viz níže G6.4.2/1)\nParametr bude dělený – k obecným kritériím na KS budou přidány specifická kritéria pro specifické kódy a také specifické specializace.\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY.", "criteria":[ @@ -169,6 +173,7 @@ ] }, "HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)":{ + "id": "5", "name":"HODNOTITEL VÝROBKU (RECENZENT, PROVĚŘOVATEL, OVĚŘOVATEL, REVIZOR?)", "description":"Hodnotitel (recenzent) výrobku\npřiděleny kódy MDA/MDN/MDS\nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nParametr bude dělený - k obecným kritériím na PR budou přidána specifická kritéria pro specifické kódy. \nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY ČI PRŮŘEZOVÉ SPECIALIZACE (TJ. DRUHY PROSTŘEDKŮ, NORMY) BUDOU DOPLNĚNY", "criteria":[ @@ -235,6 +240,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie":{ + "id": "6", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 1. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -336,6 +342,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie":{ + "id": "7", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 2. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -437,6 +444,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie":{ + "id": "8", "name":"HODNOTITEL VÝROBKU – specifické oblasti – biologické hodnocení 3. kategorie", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -538,6 +546,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace":{ + "id": "9", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Fyzikální charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -639,6 +648,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace":{ + "id": "10", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Chemická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -740,6 +750,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace":{ + "id": "11", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Mikrobiologická charakterizace", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -841,6 +852,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita":{ + "id": "12", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Elektrická bezpečnost a elektromagnetická kompatibilita", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -942,6 +954,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software":{ + "id": "13", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ověřování a validace software", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1043,6 +1056,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení":{ + "id": "14", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Balení a značení", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1144,6 +1158,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy":{ + "id": "15", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Sterilizační procesy", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1245,6 +1260,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí":{ + "id": "16", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Zdravotnické prostředky s diagnostickou nebo měřicí funkcí", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1346,6 +1362,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti":{ + "id": "17", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Předklinické aspekty bezpečnosti a účinnosti", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1447,6 +1464,7 @@ ] }, "HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením":{ + "id": "18", "name":"HODNOTITEL VÝROBKU – specifické oblasti – Ochrana před zářením", "description":"Hodnotitel (recenzent) výrobku\nPřidělena specifická oblast (~kódu] \nPracovníci odpovědní za provádění přezkumů týkajících se výrobků (osoby provádějící přezkum výrobků), jako například přezkumů technické dokumentace nebo přezkoušení typu včetně takových aspektů, jako je klinické hodnocení, biologická bezpečnost, sterilizace a validace softwaru, musí mít všechny tyto prokazatelné kvalifikace\nAplikace obecných kritérií zahrnuje specifická kritéria pro posuzované aspekty.", "criteria":[ @@ -1548,6 +1566,7 @@ ] }, "AUDITOR":{ + "id": "19", "name":"AUDITOR", "description":"Auditor\npřiděleny kódy MDT\nKRITÉRIA A PRŮKAZY SPECIFICKÉ PRO KÓDY (TJ. QMS, TECHNOLOGIE, NORMY) BUDOU DOPLNĚNY\nPracovníci odpovědní za provádění auditů systému výrobce v oblasti řízení kvality (osoby provádějící audit na místě) musí mít všechny tyto prokazatelné kvalifikace:", "criteria":[ @@ -1609,6 +1628,7 @@ ] }, "KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)":{ + "id": "20", "name":"KOMISE PRO KONEČNÉ HODNOCENÍ (ZÁVĚREČNÉ OVĚŘENÍ, PROVĚŘENÍ, PŘEZKUM, RECENZI, REVIZI?)", "description":"Pracovníci s celkovou odpovědností za konečné přezkumy (s širokou skupinou MD kódů) ohledně certifikace musí být přímo zaměstnanci oznámeného subjektu a nesmějí být externími odborníky ani subdodavateli. Tito pracovníci musí mít jako skupina prokazatelné znalosti a komplexní zkušenosti ve všech těchto oblastech\nPŘIDĚLENY KÓDY POKRÝVAJÍCÍ ŠIROKÝ ROZSAH (NAPŘ. CELÉ MDA)\nParametr nebude dělený - k obecným kritériím na IK nebudou přidána specifická kritéria pro specifické kódy. \nSdílená kompetence, jako celek musí komise splnit veškerá kritéria.\nNěkterá kritéria budou povinná pro všechny členy KPKH (tato budou označena).", "criteria":[ @@ -1720,4 +1740,4 @@ } ] } -} \ No newline at end of file +} diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala index 977b85f..22994dc 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Main.scala @@ -65,6 +65,11 @@ .DetailPageConnector(state)(_) .render ) + .collectSignal[Page.DetailParametru]( + connectors + .DetailParametruPageConnector(state)(_) + .render + ) .collectStatic(Page.Dashboard)(connectors.DashboardPageConnector().render) .collect[Page.NotFound](pg => pages.errors.NotFoundPage(Routes.homePage, pg.url) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala deleted file mode 100644 index e37aa8a..0000000 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Osoba.scala +++ /dev/null @@ -1,28 +0,0 @@ -package cz.e_bs.cmi.mdr.pdb.app - -import java.time.LocalDate -import java.time.Instant -import cz.e_bs.cmi.mdr.pdb.OsobniCislo - -case class Potvrzeni( - uzivatel: String, - datum: Instant -) - -case class Dukaz( - doklady: List[String], - potvrzeno: Option[Potvrzeni], - platiDo: Option[Instant] -) - -case class Kriterium( - id: String, - nazev: String, - dukaz: Option[Dukaz] -) - -case class Parametr( - id: String, - nazev: String, - kriteria: List[Kriterium] -) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala index de29954..5f08310 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/Routes.scala @@ -8,6 +8,7 @@ import scala.scalajs.js import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.Parameter // enum is not working with Waypoints' SplitRender collectStatic sealed abstract class Page(val title: String, val parent: Option[Page]) @@ -36,8 +37,8 @@ ) object DetailParametru { - def apply(o: UserInfo, p: Parametr): DetailParametru = - DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.nazev)) + def apply(o: UserInfo, p: Parameter): DetailParametru = + DetailParametru(o.personalNumber, p.id, Some(o.name), Some(p.name)) } case class NotFound(url: String) extends Page("404", Some(Directory)) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala index bd498bd..36c9c10 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/actions.scala @@ -7,4 +7,5 @@ case object FetchDirectory extends Action case class FetchUserDetails(osc: OsobniCislo) extends Action case class FetchParameters(osc: OsobniCislo) extends Action +case class FetchParameter(osc: OsobniCislo, paramId: String) extends Action case class NavigateTo(page: Page) extends Action diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala index 20393ef..038d2d8 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/components/Breadcrumbs.scala @@ -35,7 +35,6 @@ case None => renderHome(page) case Some(p) => a( - href := router.absoluteUrlForPage(p), navigateTo(p), cls := "group inline-flex space-x-3 text-sm font-medium text-gray-500 hover:text-gray-700", Icons.solid.`arrow-narrow-left`, @@ -53,9 +52,9 @@ cls := "flex items-center", slash, a( - href := "#", + navigateTo(p), cls := "ml-4 text-sm font-medium text-gray-500 hover:text-gray-700", - page.title + p.title ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala index fefb4a6..a8f025e 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailPageConnector.scala @@ -47,21 +47,6 @@ p: List[Parameter] ): DetailPage.ViewModel = DetailPage.ViewModel( - DetailOsoby.ViewModel( - o.personalNumber, - o.name, - o.email, - o.phone, - o.img, - None, - None - ), - p.map { param => - SeznamParametru.Parametr( - id = param.name, - nazev = param.name, - status = "Nesplněno", - statusColor = Color.red - ) - } + o.toViewModel, + p.map(_.toViewModel) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala new file mode 100644 index 0000000..870e2a4 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/DetailParametruPageConnector.scala @@ -0,0 +1,57 @@ +package cz.e_bs.cmi.mdr.pdb.app +package connectors + +import com.raquo.laminar.api.L.{*, given} +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.DetailParametruPage +import pages.detail.DetailParametruPage +import com.raquo.waypoint.Router +import cz.e_bs.cmi.mdr.pdb.app.components.AppPage + +object DetailParametruPageConnector { + trait AppState { + def details: EventStream[UserInfo] + def parameters: EventStream[List[Parameter]] + def actionBus: Observer[Action] + } +} + +case class DetailParametruPageConnector( + state: DetailParametruPageConnector.AppState +)( + $page: Signal[Page.DetailParametru] +)(using router: Router[Page]): + val $paramChangeSignal = + $page.splitOne(p => (p.osobniCislo, p.idParametru))((x, _, _) => x) + val $pageChangeSignal = + $paramChangeSignal.map(FetchParameter(_, _)) + + val $data = state.details.startWithNone + val $params = state.parameters.startWithNone + + val $merged = + $data.combineWithFn($params, $paramChangeSignal)((d, p, pc) => + for { + da <- d + pa <- p + pb <- pa.find(_.id == pc._2) + } yield (da, pb) + ) + + def render: HtmlElement = + AppPage().render( + $merged.map(_.map(buildModel)) + .split(_ => ())((_, _, s) => DetailParametruPage.render(s)), + $pageChangeSignal --> state.actionBus + ) + + private def buildModel( + o: UserInfo, + p: Parameter + ): DetailParametruPage.ViewModel = + DetailParametruPage.ViewModel( + o.toViewModel, + p.toViewModel, + p.criteria.map(_.toViewModel) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala new file mode 100644 index 0000000..c4c0433 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/connectors/conversions.scala @@ -0,0 +1,41 @@ +package cz.e_bs.cmi.mdr.pdb.app.connectors + +import cz.e_bs.cmi.mdr.pdb.UserInfo +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.DetailOsoby +import cz.e_bs.cmi.mdr.pdb.Parameter +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamParametru +import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.ParameterCriteria +import cz.e_bs.cmi.mdr.pdb.app.pages.detail.components.SeznamKriterii + +extension (o: UserInfo) + def toViewModel: DetailOsoby.ViewModel = + DetailOsoby.ViewModel( + o.personalNumber, + o.name, + o.email, + o.phone, + o.img, + None, + None + ) + +extension (param: Parameter) + def toViewModel: SeznamParametru.Parametr = + SeznamParametru.Parametr( + id = param.id, + nazev = param.name, + status = "Nesplněno", + statusColor = Color.red + ) + +extension (crit: ParameterCriteria) + def toViewModel: SeznamKriterii.Kriterium = + SeznamKriterii.Kriterium( + nazev = crit.criteriumText, + kapitola = crit.chapterId, + bod = crit.itemId, + status = "Nesplněno", + statusColor = Color.red, + splneno = false + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala index c3b60ae..50afeea 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailPage.scala @@ -3,6 +3,8 @@ import com.raquo.laminar.api.L.{*, given} import components._ +import cz.e_bs.cmi.mdr.pdb.app.Page +import com.raquo.waypoint.Router object DetailPage: @@ -11,12 +13,16 @@ parametry: SeznamParametru.ViewModel ) - def render($m: Signal[ViewModel]): HtmlElement = + def render($m: Signal[ViewModel])(using router: Router[Page]): HtmlElement = div( cls := "max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", div( cls := "flex flex-col space-y-4", DetailOsoby.render($m.map(_.osoba)), - SeznamParametru.render($m.map(_.parametry)) + child <-- $m.map(m => + SeznamParametru.render($m.map(_.parametry))(p => + Page.DetailParametru(m.osoba.osobniCislo, p.id) + ) + ) ) ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala new file mode 100644 index 0000000..ae7a965 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/DetailParametruPage.scala @@ -0,0 +1,24 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail + +import com.raquo.laminar.api.L.{*, given} + +import components._ + +object DetailParametruPage: + + case class ViewModel( + osoba: DetailOsoby.ViewModel, + parametr: SeznamParametru.Parametr, + kriteria: SeznamKriterii.ViewModel + ) + + def render($m: Signal[ViewModel]): HtmlElement = + div( + cls := "max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8", + div( + cls := "flex flex-col space-y-4", + DetailOsoby.render($m.map(_.osoba)), + DetailParametru.render($m.map(_.parametr)), + SeznamKriterii.render($m.map(_.kriteria)) + ) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala new file mode 100644 index 0000000..8fff452 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/DetailParametru.scala @@ -0,0 +1,11 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail.components + +import com.raquo.laminar.api.L.{*, given} + +object DetailParametru: + type ViewModel = SeznamParametru.Parametr + def render($m: Signal[ViewModel]): HtmlElement = + div( + h2(cls := "text-xl font-bold text-gray-900"), + child.text <-- $m.map(_.nazev) + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamKriterii.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamKriterii.scala new file mode 100644 index 0000000..905dce2 --- /dev/null +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamKriterii.scala @@ -0,0 +1,43 @@ +package cz.e_bs.cmi.mdr.pdb.app.pages.detail.components + +import com.raquo.laminar.api.L.{*, given} +import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.app.components.list.StackedList +import cz.e_bs.cmi.mdr.pdb.app.components.list.ListRow +import cz.e_bs.cmi.mdr.pdb.app.components.list.RowTag +import cz.e_bs.cmi.mdr.pdb.app.components.list.RowNext + +object SeznamKriterii: + case class Kriterium( + nazev: String, + kapitola: String, + bod: String, + status: String, + statusColor: Color, + splneno: Boolean + ) { + val id = s"${kapitola}${bod}" + } + type ViewModel = List[Kriterium] + + private val kritList = new StackedList[Kriterium] + + def render($m: Signal[ViewModel]): HtmlElement = + div( + cls := "bg-white shadow overflow-hidden sm:rounded-md", + kritList.render($m, _.id) { $i => + $i.map { i => + ListRow.ViewModel( + title = i.nazev, + topRight = RowTag.render( + $i.map(x => RowTag.ViewModel(x.status, x.statusColor)) + ), + bottomLeft = + p(cls := "text-sm text-gray-500", s"${i.kapitola}${i.bod}"), + bottomRight = emptyNode, + farRight = RowNext.render, + containerElement = a() + ) + } + } + ) diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala index c47dad4..70b86f4 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/pages/detail/components/SeznamParametru.scala @@ -10,8 +10,14 @@ RowNext } import cz.e_bs.cmi.mdr.pdb.app.components.Color +import cz.e_bs.cmi.mdr.pdb.waypoint.components.Navigator +import com.raquo.waypoint.Router +import cz.e_bs.cmi.mdr.pdb.app.Page object SeznamParametru: + sealed trait Action + case object Selected extends Action + case class Parametr( id: String, nazev: String, @@ -22,7 +28,9 @@ private val parametrList = new StackedList[Parametr] - def render($m: Signal[ViewModel]): HtmlElement = + def render($m: Signal[ViewModel])(pageF: Parametr => Page)(using + router: Router[Page] + ): HtmlElement = div( cls := "bg-white shadow overflow-hidden sm:rounded-md", parametrList.render($m, _.id) { $i => @@ -35,7 +43,7 @@ bottomLeft = emptyNode, bottomRight = emptyNode, farRight = RowNext.render, - containerElement = a() + containerElement = a(Navigator.navigateTo(pageF(i))) ) } } diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala index 8fd44ae..1d98f64 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/app/state/AppState.scala @@ -13,7 +13,9 @@ import cz.e_bs.cmi.mdr.pdb.Parameter import cz.e_bs.cmi.mdr.pdb.ParameterCriteria -trait AppState extends connectors.DetailPageConnector.AppState: +trait AppState + extends connectors.DetailPageConnector.AppState + with connectors.DetailParametruPageConnector.AppState: def users: EventStream[List[UserInfo]] def details: EventStream[UserInfo] def parameters: EventStream[List[Parameter]] @@ -54,6 +56,7 @@ .collect { case Right(p) => p } .toList + // TODO: Extract to separate event handler actions.events.foreach { case FetchDirectory => pushUsers(mockData) case FetchUserDetails(osc) => @@ -63,6 +66,14 @@ } case FetchParameters(osc) => pushParameters(mockParameters) + case FetchParameter(osc, paramId) => + for + o <- mockData.find(_.personalNumber == osc) + p <- mockParameters.find(_.id == paramId) + do + pushDetails(o) + pushParameters(mockParameters) + router.replaceState(Page.DetailParametru(o, p)) case NavigateTo(page) => router.pushState(page) } diff --git a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/waypoint/components/Navigator.scala b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/waypoint/components/Navigator.scala index 2fc3d8e..8b9edd7 100644 --- a/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/waypoint/components/Navigator.scala +++ b/app/src/main/scala/cz/e_bs/cmi/mdr/pdb/waypoint/components/Navigator.scala @@ -3,6 +3,7 @@ import com.raquo.laminar.api.L.{*, given} import com.raquo.waypoint.Router import org.scalajs.dom +import com.raquo.domtypes.jsdom.defs.events.TypedTargetMouseEvent trait Navigator[P](using router: Router[P]): def navigateTo(page: P): Binder[HtmlElement] = Navigator.navigateTo[P](page) diff --git a/core/src/main/scala/cz/e_bs/cmi/mdr/pdb/Parameter.scala b/core/src/main/scala/cz/e_bs/cmi/mdr/pdb/Parameter.scala index 8fe82b2..9c9113f 100644 --- a/core/src/main/scala/cz/e_bs/cmi/mdr/pdb/Parameter.scala +++ b/core/src/main/scala/cz/e_bs/cmi/mdr/pdb/Parameter.scala @@ -1,5 +1,8 @@ package cz.e_bs.cmi.mdr.pdb +import java.math.BigInteger +import java.security.MessageDigest + case class ParameterCriteria( chapterId: String, itemId: String, @@ -7,6 +10,7 @@ ) case class Parameter( + id: String, name: String, description: String, criteria: List[ParameterCriteria]