z230
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
-37
@@ -1,37 +0,0 @@
|
||||
Site,Country,Visit,Visit Collection Date,Accession,Subject,eQueryId,Create Date,Response Date Time,Issue Type,Status,Time Before Response,User Name,Email,Study Role
|
||||
CZ10012 - Dr.Ales Urban,CZECH REPUBLIC,End of Phase/Treatment,"Mar 25, 2026 5:00 PM",6226560888,CZ100120005,2064594,"Mar 27, 2026 9:33 AM","Apr 1, 2026 4:32 PM",VST,Closed,5d,,,
|
||||
CZ10012 - Dr.Ales Urban,CZECH REPUBLIC,Part 2 DB Every 12 Weeks,"Mar 6, 2026 2:00 PM",6226560891,CZ100120004,2035331,"Mar 10, 2026 11:18 AM","Mar 10, 2026 12:50 PM",ADT201,Closed,1h 31m,Marcela Sedlackova,marcelasedlackova@seznam.cz,Investigator
|
||||
CZ10012 - Dr.Ales Urban,CZECH REPUBLIC,Part 2 OL Induction Day 29,"Jan 2, 2026 12:00 PM",6226976943,CZ100120004,1936950,"Jan 6, 2026 12:29 PM","Jan 9, 2026 8:41 AM",DOB,Closed,2d,Marcela Sedlackova,marcelasedlackova@seznam.cz,Investigator
|
||||
CZ10012 - Dr.Ales Urban,CZECH REPUBLIC,End of Phase/Treatment,"Mar 25, 2026 3:00 PM",6226752555,CZ100120006,2064606,"Mar 27, 2026 9:48 AM","Apr 1, 2026 4:32 PM",VST,Closed,5d,,,
|
||||
CZ10011 - Dr. Marta Lendlova,CZECH REPUBLIC,Retest,"Dec 11, 2025 9:05 AM",6226935606,CZ100110003,1930555,"Dec 31, 2025 12:41 PM","Jan 3, 2026 5:26 PM","VST, AMT4164",Closed,3d,Marta Lendlova,studie@medipa.org,Investigator
|
||||
CZ10011 - Dr. Marta Lendlova,CZECH REPUBLIC,Retest,"Dec 11, 2025 9:05 AM",6226935606,CZ100110003,1908988,"Dec 16, 2025 2:17 PM","Dec 19, 2025 3:55 PM","VST, AMT4164",Closed,3d,Marta Lendlova,studie@medipa.org,Investigator
|
||||
CZ10011 - Dr. Marta Lendlova,CZECH REPUBLIC,Part 2 OL Induction Baseline,"Jan 6, 2026 10:11 AM",6227261836,CZ100110006,1943384,"Jan 9, 2026 2:23 PM",,VST,Closed,,,,
|
||||
CZ10011 - Dr. Marta Lendlova,CZECH REPUBLIC,Part 2 OL Induction Baseline,"Jan 6, 2026 10:11 AM",6227261836,CZ100110006,1953531,"Jan 16, 2026 7:52 AM",,VST,Closed,,,,
|
||||
CZ10011 - Dr. Marta Lendlova,CZECH REPUBLIC,Part 2 OL Induction Baseline,"Jan 6, 2026 10:11 AM",6227261836,CZ100110006,1965291,"Jan 23, 2026 11:05 AM","Jan 26, 2026 6:18 PM",VST,Closed,3d,Marta Lendlova,studie@medipa.org,Investigator
|
||||
CZ10011 - Dr. Marta Lendlova,CZECH REPUBLIC,Part 1 Screening,"Jan 21, 2026 10:11 AM",6227542160,CZ100110009,1965641,"Jan 23, 2026 12:41 PM","Jan 26, 2026 6:18 PM",ADT201,Closed,3d,Marta Lendlova,studie@medipa.org,Investigator
|
||||
CZ10011 - Dr. Marta Lendlova,CZECH REPUBLIC,Retest,"Apr 10, 2026 8:16 AM",6227542182,CZ100110010,2105984,"Apr 22, 2026 4:51 PM",,"AMT4164, ADT201",Closed,,,,
|
||||
CZ10011 - Dr. Marta Lendlova,CZECH REPUBLIC,Retest,"Apr 10, 2026 8:16 AM",6227542182,CZ100110010,2117124,"Apr 29, 2026 5:13 PM",,"AMT4164, ADT201",Open,,,,
|
||||
CZ10011 - Dr. Marta Lendlova,CZECH REPUBLIC,Retest,"Apr 10, 2026 8:16 AM",6227542182,CZ100110010,2094889,"Apr 15, 2026 7:25 PM",,"AMT4164, ADT201",Closed,,,,
|
||||
CZ10011 - Dr. Marta Lendlova,CZECH REPUBLIC,Part 2 OL Induction Day 29,"Feb 3, 2026 10:23 AM",6226561517,CZ100110006,2040081,"Mar 12, 2026 12:52 PM","Mar 20, 2026 9:35 AM",VST,Closed,7d,Marta Lendlova,studie@medipa.org,Investigator
|
||||
CZ10011 - Dr. Marta Lendlova,CZECH REPUBLIC,Part 2 OL Induction Day 29,"Feb 3, 2026 10:23 AM",6226561517,CZ100110006,2015993,"Feb 25, 2026 2:26 PM","Mar 4, 2026 4:37 PM",VST,Closed,7d,Marta Lendlova,studie@medipa.org,Investigator
|
||||
CZ10011 - Dr. Marta Lendlova,CZECH REPUBLIC,Part 2 OL Induction Day 29,"Feb 3, 2026 10:23 AM",6226561517,CZ100110006,2005997,"Feb 18, 2026 3:01 PM",,VST,Closed,,,,
|
||||
CZ10011 - Dr. Marta Lendlova,CZECH REPUBLIC,Part 2 OL Induction Day 29,"Feb 3, 2026 10:23 AM",6226561517,CZ100110006,1984511,"Feb 5, 2026 10:36 AM","Feb 10, 2026 5:12 PM",VST,Closed,5d,Marta Lendlova,studie@medipa.org,Investigator
|
||||
CZ10011 - Dr. Marta Lendlova,CZECH REPUBLIC,End of Phase/Treatment,,6228234300,CZ100110010,2112166,"Apr 27, 2026 1:26 PM",,SCD,Closed,,,,
|
||||
CZ10011 - Dr. Marta Lendlova,CZECH REPUBLIC,End of Phase/Treatment,,6228234300,CZ100110010,2124850,"May 5, 2026 1:37 PM",,SCD,Open,,,,
|
||||
CZ10008 - Dr.Zdenek Solle,CZECH REPUBLIC,Part 1 Screening,"Aug 5, 2025 11:58 AM",6225351045,CZ100080002,1712216,"Aug 7, 2025 12:05 PM","Aug 7, 2025 12:45 PM",SCT,Closed,40m,Roman Gregar,r.gregar@clintrial.cz,Investigator
|
||||
CZ10008 - Dr.Zdenek Solle,CZECH REPUBLIC,Part 2 OL Induction Baseline,"Sep 10, 2025 11:35 AM",6225351056,CZ100080001,1769239,"Sep 15, 2025 5:00 PM","Sep 16, 2025 8:14 AM",SCT,Closed,15h 14m,Roman Gregar,r.gregar@clintrial.cz,Investigator
|
||||
CZ10008 - Dr.Zdenek Solle,CZECH REPUBLIC,Early Withdrawal,"Oct 14, 2025 12:30 PM",6225351066,CZ100080004,1817448,"Oct 16, 2025 12:29 PM","Oct 16, 2025 1:37 PM",ADT201,Closed,1h 7m,Barbora Sollova,b.sollova@clintrial.cz,Investigator
|
||||
CZ10008 - Dr.Zdenek Solle,CZECH REPUBLIC,Part 2 DB Baseline,"Mar 10, 2026 11:10 AM",6226804962,CZ100080006,2039863,"Mar 12, 2026 12:07 PM","Mar 16, 2026 8:11 AM",VST,Closed,3d,Barbora Sollova,b.sollova@clintrial.cz,Investigator
|
||||
CZ10005 - Dr.Lubos Janu,CZECH REPUBLIC,Retest,"Sep 16, 2025 10:00 AM",6225351036,CZ100050001,1776942,"Sep 19, 2025 11:34 AM","Sep 23, 2025 2:21 PM",VST,Closed,4d,,,
|
||||
CZ10005 - Dr.Lubos Janu,CZECH REPUBLIC,Retest,"Nov 11, 2025 10:04 AM",6225351037,CZ100050002,1859363,"Nov 13, 2025 12:27 PM","Nov 18, 2025 10:16 AM",ADT201,Closed,4d,,,
|
||||
CZ10004 - Dr. Erik Herman,CZECH REPUBLIC,End of Phase/Treatment,"Jan 9, 2026 10:20 AM",6227178908,CZ100040002,1947467,"Jan 13, 2026 10:55 AM","Jan 16, 2026 10:51 AM","PCFCOM, ADT201",Closed,2d,Gabriela Novotna,gnovotna@email.cz,Investigator
|
||||
CZ10004 - Dr. Erik Herman,CZECH REPUBLIC,End of Phase/Treatment,"Mar 6, 2026 9:50 AM",6227178911,CZ100040002,2034798,"Mar 10, 2026 12:00 AM","Mar 12, 2026 5:11 PM",ADT201,Closed,2d,Gabriela Novotna,gnovotna@email.cz,Investigator
|
||||
CZ10004 - Dr. Erik Herman,CZECH REPUBLIC,Part 1 Screening,"Feb 27, 2026 8:00 AM",6227547329,CZ100040007,2024391,"Mar 3, 2026 12:47 PM","Mar 4, 2026 6:56 PM",PID,Closed,1d,Gabriela Novotna,gnovotna@email.cz,Investigator
|
||||
CZ10004 - Dr. Erik Herman,CZECH REPUBLIC,Part 1 DB Baseline,"Feb 27, 2026 11:35 AM",6227547332,CZ100040006,2024264,"Mar 3, 2026 12:10 PM","Mar 4, 2026 6:57 PM",PID,Closed,1d,Gabriela Novotna,gnovotna@email.cz,Investigator
|
||||
CZ10004 - Dr. Erik Herman,CZECH REPUBLIC,Part 2 OL Induction Baseline,"Apr 7, 2026 9:45 AM",6227541258,CZ100040005,2083848,"Apr 8, 2026 8:50 PM","Apr 13, 2026 5:16 PM",ADT201,Closed,4d,Erik Herman,erik.herman@seznam.cz,Investigator
|
||||
CZ10004 - Dr. Erik Herman,CZECH REPUBLIC,Part 2 DB Week 13,"Apr 7, 2026 8:35 AM",6227541264,CZ100040001,2090583,"Apr 13, 2026 6:24 PM","Apr 28, 2026 2:16 PM","VST, ADT201",Closed,14d,Gabriela Novotna,gnovotna@email.cz,Investigator
|
||||
title,value,,,,,,,,,,,,,
|
||||
Search,,,,,,,,,,,,,,
|
||||
Site,"CZ10005 - Dr.Lubos Janu, CZ10008 - Dr.Zdenek Solle, CZ10011 - Dr. Marta Lendlova, CZ10004 - Dr. Erik Herman, CZ10012 - Dr.Ales Urban",,,,,,,,,,,,,
|
||||
Unresponded Only?,FALSE,,,,,,,,,,,,,
|
||||
Posted,From - To - ,,,,,,,,,,,,,
|
||||
|
-367
@@ -1,367 +0,0 @@
|
||||
Project No.,Region,Country,Site,Kit Type,Description,Accession,Shipped Date,Expiration Date,Days to Expiration
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,1,Part 1 Screening,6225350973,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,1,Part 1 Screening,6225350970,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,1,Part 1 Screening,6225350974,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,1,Part 1 Screening,6225350976,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,1,Part 1 Screening,6225350978,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,1,Part 1 Screening,6225350979,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,1,Part 1 Screening,6227541248,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,1,Part 1 Screening,6227541247,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,1,Part 1 Screening,6228149461,"Mar 13, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,1,Part 1 Screening,6228149462,"Mar 13, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,1,Part 1 Screening,6228149463,"Mar 13, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,2,Part 1 DB Baseline,6225350980,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,2,Part 1 DB Baseline,6225350983,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,2,Part 1 DB Baseline,6227261232,"Nov 18, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,2,Part 1 DB Baseline,6227261231,"Nov 18, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,2,Part 1 DB Baseline,6227541250,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,2,Part 1 DB Baseline,6227541253,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,3,Part 2 Screening,6225350985,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,3,Part 2 Screening,6225350986,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,3,Part 2 Screening,6225350987,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,3,Part 2 Screening,6227547334,"Dec 31, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,3,Part 2 Screening,6227547335,"Dec 31, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,4,Part 2 OL Induction Baseline,6225350989,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,4,Part 2 OL Induction Baseline,6227541256,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,4,Part 2 OL Induction Baseline,6227541255,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,4,Part 2 OL Induction Baseline,6227541254,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,4,Part 2 OL Induction Baseline,6227547339,"Dec 31, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,4,Part 2 OL Induction Baseline,6227547338,"Dec 31, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,5,Part 2 OL Induction Day 29,6226573502,"Aug 21, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,5,Part 2 OL Induction Day 29,6226889397,"Oct 7, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,5,Part 2 OL Induction Day 29,6227261233,"Nov 18, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,5,Part 2 OL Induction Day 29,6227541263,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,5,Part 2 OL Induction Day 29,6227541262,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,5,Part 2 OL Induction Day 29,6227541261,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,6,Part 2 DB Baseline,6226573503,"Aug 21, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,6,Part 2 DB Baseline,6226889398,"Oct 7, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,6,Part 2 DB Baseline,6227043303,"Oct 23, 2025","Jul 31, 2026",86
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,6,Part 2 DB Baseline,6227261234,"Nov 18, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,6,Part 2 DB Baseline,6228149464,"Mar 13, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,6,Part 2 DB Baseline,6228149465,"Mar 13, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,7,Part 2 DB Week 13,6226649754,"Aug 29, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,7,Part 2 DB Week 13,6226889399,"Oct 7, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,7,Part 2 DB Week 13,6227541265,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,7,Part 2 DB Week 13,6227541267,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,7,Part 2 DB Week 13,6227541268,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,7,Part 2 DB Week 13,6227541266,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-1,Part 2 DB Every 12 Weeks,6226573504,"Aug 21, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-1,Part 2 DB Every 12 Weeks,6226573505,"Aug 21, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-1,Part 2 DB Every 12 Weeks,6226573507,"Aug 21, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-1,Part 2 DB Every 12 Weeks,6226573506,"Aug 21, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-1,Part 2 DB Every 12 Weeks,6226573508,"Aug 21, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-1,Part 2 DB Every 12 Weeks,6227541269,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-1,Part 2 DB Every 12 Weeks,6227541270,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-1,Part 2 DB Every 12 Weeks,6227541272,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-1,Part 2 DB Every 12 Weeks,6227541271,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-2,End of Phase/Treatment,6225350990,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-2,End of Phase/Treatment,6225350991,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-2,End of Phase/Treatment,6225350992,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-2,End of Phase/Treatment,6225350993,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-2,End of Phase/Treatment,6225350994,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-2,End of Phase/Treatment,6227178910,"Nov 14, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-2,End of Phase/Treatment,6227768458,"Jan 27, 2026","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-2,End of Phase/Treatment,6227768461,"Jan 27, 2026","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-3,Early Withdrawal,6225350996,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-3,Early Withdrawal,6225350995,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-3,Early Withdrawal,6225350997,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-3,Early Withdrawal,6225350998,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-3,Early Withdrawal,6225350999,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-3,Early Withdrawal,6227768462,"Jan 27, 2026","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-3,Early Withdrawal,6227768463,"Jan 27, 2026","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-3,Early Withdrawal,6227768464,"Jan 27, 2026","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-3,Early Withdrawal,6227768465,"Jan 27, 2026","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-4,Liver Monitoring,6225351000,"Feb 24, 2025","Sep 1, 2025",-246
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-4,Liver Monitoring,6227547340,"Dec 31, 2025","Sep 12, 2026",129
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-4,Liver Monitoring,6227768466,"Jan 27, 2026","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-5,Suspected Liver Event FU,6225351001,"Feb 24, 2025","Jul 31, 2025",-278
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-5,Suspected Liver Event FU,6227547341,"Dec 31, 2025","Jul 31, 2026",86
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,T-5,Suspected Liver Event FU,6227768467,"Jan 27, 2026","Jul 31, 2026",86
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,U,Retest,6225351003,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,U,Retest,6226649755,"Aug 29, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,U,Retest,6226649756,"Aug 29, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,U,Retest,6227178914,"Nov 14, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,U,Retest,6227178913,"Nov 14, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,U,Retest,6227178915,"Nov 14, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,U,Retest,6227178916,"Nov 14, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,U,Retest,6227178917,"Nov 14, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,U,Retest,6227178919,"Nov 14, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10004 - Dr. Erik Herman,U,Retest,6227178918,"Nov 14, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,1,Part 1 Screening,6225351005,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,1,Part 1 Screening,6225351007,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,1,Part 1 Screening,6225351009,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,1,Part 1 Screening,6225351010,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,1,Part 1 Screening,6225351011,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,1,Part 1 Screening,6225351012,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,1,Part 1 Screening,6225351008,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,1,Part 1 Screening,6225351013,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,1,Part 1 Screening,6227268578,"Nov 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,1,Part 1 Screening,6227268580,"Nov 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,1,Part 1 Screening,6227268579,"Nov 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,1,Part 1 Screening,6227537421,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,2,Part 1 DB Baseline,6225351015,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,2,Part 1 DB Baseline,6225351016,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,2,Part 1 DB Baseline,6225351017,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,2,Part 1 DB Baseline,6225351018,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,2,Part 1 DB Baseline,6225351014,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,2,Part 1 DB Baseline,6227268581,"Nov 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,2,Part 1 DB Baseline,6227268582,"Nov 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,2,Part 1 DB Baseline,6227537422,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,2,Part 1 DB Baseline,6227537423,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,2,Part 1 DB Baseline,6227537424,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,2,Part 1 DB Baseline,6227537425,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,3,Part 2 Screening,6225351019,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,3,Part 2 Screening,6225351020,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,3,Part 2 Screening,6225351021,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,3,Part 2 Screening,6227268583,"Nov 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,3,Part 2 Screening,6227537429,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,3,Part 2 Screening,6227537427,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,3,Part 2 Screening,6227537428,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,3,Part 2 Screening,6227537426,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,4,Part 2 OL Induction Baseline,6225351023,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,4,Part 2 OL Induction Baseline,6225351022,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,4,Part 2 OL Induction Baseline,6227268584,"Nov 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,4,Part 2 OL Induction Baseline,6227537430,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,4,Part 2 OL Induction Baseline,6227537432,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,4,Part 2 OL Induction Baseline,6227537431,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,5,Part 2 OL Induction Day 29,6226794807,"Sep 22, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,5,Part 2 OL Induction Day 29,6227268585,"Nov 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,5,Part 2 OL Induction Day 29,6227537434,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,5,Part 2 OL Induction Day 29,6227537433,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,6,Part 2 DB Baseline,6226794808,"Sep 22, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,6,Part 2 DB Baseline,6227268586,"Nov 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,6,Part 2 DB Baseline,6227537435,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,6,Part 2 DB Baseline,6227537436,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,6,Part 2 DB Baseline,6227537437,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,7,Part 2 DB Week 13,6226794809,"Sep 22, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,7,Part 2 DB Week 13,6227268587,"Nov 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-1,Part 2 DB Every 12 Weeks,6226794811,"Sep 22, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-1,Part 2 DB Every 12 Weeks,6226794814,"Sep 22, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-1,Part 2 DB Every 12 Weeks,6226794813,"Sep 22, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-1,Part 2 DB Every 12 Weeks,6226794810,"Sep 22, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-1,Part 2 DB Every 12 Weeks,6226794812,"Sep 22, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-1,Part 2 DB Every 12 Weeks,6227268588,"Nov 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-2,End of Phase/Treatment,6225351024,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-2,End of Phase/Treatment,6225351025,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-2,End of Phase/Treatment,6225351026,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-2,End of Phase/Treatment,6225351027,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-2,End of Phase/Treatment,6225351028,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-2,End of Phase/Treatment,6227268589,"Nov 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-2,End of Phase/Treatment,6227537438,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-2,End of Phase/Treatment,6227537439,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-3,Early Withdrawal,6225351030,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-3,Early Withdrawal,6225351031,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-3,Early Withdrawal,6225351032,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-3,Early Withdrawal,6225351033,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-3,Early Withdrawal,6225351029,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-3,Early Withdrawal,6227268590,"Nov 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-4,Liver Monitoring,6225351034,"Feb 24, 2025","Sep 1, 2025",-246
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-4,Liver Monitoring,6227268591,"Nov 25, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-4,Liver Monitoring,6227537440,"Dec 29, 2025","Sep 12, 2026",129
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-5,Suspected Liver Event FU,6225351035,"Feb 24, 2025","Jul 31, 2025",-278
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,T-5,Suspected Liver Event FU,6227268592,"Nov 25, 2025","Jun 30, 2026",55
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,U,Retest,6226842761,"Sep 29, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,U,Retest,6226842762,"Sep 29, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,U,Retest,6227268594,"Nov 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,U,Retest,6227268593,"Nov 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,U,Retest,6227537441,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10005 - Dr.Lubos Janu,U,Retest,6227537442,"Dec 29, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,1,Part 1 Screening,6225351038,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,1,Part 1 Screening,6225351039,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,1,Part 1 Screening,6225351043,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,1,Part 1 Screening,6227520226,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,1,Part 1 Screening,6227520225,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,1,Part 1 Screening,6227520227,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,2,Part 1 DB Baseline,6225351048,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,2,Part 1 DB Baseline,6226551696,"Aug 22, 2025","Apr 17, 2026",-18
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,2,Part 1 DB Baseline,6226551699,"Aug 22, 2025","Apr 17, 2026",-18
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,2,Part 1 DB Baseline,6226551700,"Aug 22, 2025","Apr 17, 2026",-18
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,2,Part 1 DB Baseline,6226655163,"Sep 5, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,2,Part 1 DB Baseline,6226655166,"Sep 5, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,2,Part 1 DB Baseline,6226655165,"Sep 5, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,2,Part 1 DB Baseline,6226655162,"Sep 5, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,2,Part 1 DB Baseline,6226655164,"Sep 5, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,3,Part 2 Screening,6225351053,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,3,Part 2 Screening,6225351054,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,3,Part 2 Screening,6225351055,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,3,Part 2 Screening,6227520230,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,3,Part 2 Screening,6227520228,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,3,Part 2 Screening,6227520229,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,4,Part 2 OL Induction Baseline,6226780849,"Sep 24, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,4,Part 2 OL Induction Baseline,6226780851,"Sep 24, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,4,Part 2 OL Induction Baseline,6226780848,"Sep 24, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,4,Part 2 OL Induction Baseline,6226780852,"Sep 24, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,4,Part 2 OL Induction Baseline,6226780850,"Sep 24, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,4,Part 2 OL Induction Baseline,6227520231,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,4,Part 2 OL Induction Baseline,6227520233,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,4,Part 2 OL Induction Baseline,6227520232,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,5,Part 2 OL Induction Day 29,6226550654,"Aug 21, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,5,Part 2 OL Induction Day 29,6226561520,"Aug 21, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,5,Part 2 OL Induction Day 29,6227072416,"Oct 20, 2025","Jul 31, 2026",86
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,5,Part 2 OL Induction Day 29,6227072415,"Oct 20, 2025","Jul 31, 2026",86
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,5,Part 2 OL Induction Day 29,6227072418,"Oct 20, 2025","Jul 31, 2026",86
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,5,Part 2 OL Induction Day 29,6227072417,"Oct 20, 2025","Jul 31, 2026",86
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,6,Part 2 DB Baseline,6226313626,"Jul 14, 2025","Apr 17, 2026",-18
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,6,Part 2 DB Baseline,6226550655,"Aug 21, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,6,Part 2 DB Baseline,6226561521,"Aug 21, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,6,Part 2 DB Baseline,6227520234,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,6,Part 2 DB Baseline,6227520235,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,6,Part 2 DB Baseline,6227520236,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,7,Part 2 DB Week 13,6226313627,"Jul 14, 2025","Apr 17, 2026",-18
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,7,Part 2 DB Week 13,6226550656,"Aug 21, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,7,Part 2 DB Week 13,6226561522,"Aug 21, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,7,Part 2 DB Week 13,6226804963,"Sep 25, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-1,Part 2 DB Every 12 Weeks,6226313628,"Jul 14, 2025","Apr 17, 2026",-18
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-1,Part 2 DB Every 12 Weeks,6226313629,"Jul 14, 2025","Apr 17, 2026",-18
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-1,Part 2 DB Every 12 Weeks,6226313630,"Jul 14, 2025","Apr 17, 2026",-18
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-1,Part 2 DB Every 12 Weeks,6226313631,"Jul 14, 2025","Apr 17, 2026",-18
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-1,Part 2 DB Every 12 Weeks,6226313632,"Jul 14, 2025","Apr 17, 2026",-18
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-1,Part 2 DB Every 12 Weeks,6227520237,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-1,Part 2 DB Every 12 Weeks,6227520239,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-1,Part 2 DB Every 12 Weeks,6227520240,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-1,Part 2 DB Every 12 Weeks,6227520241,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-1,Part 2 DB Every 12 Weeks,6227520238,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-2,End of Phase/Treatment,6225351058,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-2,End of Phase/Treatment,6225351059,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-2,End of Phase/Treatment,6225351061,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-2,End of Phase/Treatment,6225351062,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-2,End of Phase/Treatment,6225351060,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-2,End of Phase/Treatment,6226780854,"Sep 24, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-2,End of Phase/Treatment,6227520244,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-2,End of Phase/Treatment,6227520246,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-3,Early Withdrawal,6225351065,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-3,Early Withdrawal,6225351067,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-3,Early Withdrawal,6225351064,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-3,Early Withdrawal,6225351063,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-3,Early Withdrawal,6227520248,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-3,Early Withdrawal,6227520250,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-3,Early Withdrawal,6227520247,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-3,Early Withdrawal,6227520249,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-3,Early Withdrawal,6227520251,"Dec 26, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-4,Liver Monitoring,6225351068,"Feb 24, 2025","Sep 1, 2025",-246
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,T-5,Suspected Liver Event FU,6225351069,"Feb 24, 2025","Jul 31, 2025",-278
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,U,Retest,6225351071,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,U,Retest,6228023802,"Feb 25, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10008 - Dr.Zdenek Solle,U,Retest,6228023803,"Feb 25, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,1,Part 1 Screening,6225351073,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,1,Part 1 Screening,6225351075,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,1,Part 1 Screening,6225351079,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,1,Part 1 Screening,6227542163,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,1,Part 1 Screening,6227542162,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,1,Part 1 Screening,6228149810,"Mar 13, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,1,Part 1 Screening,6228149812,"Mar 13, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,1,Part 1 Screening,6228149811,"Mar 13, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,2,Part 1 DB Baseline,6225351085,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,2,Part 1 DB Baseline,6225351086,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,2,Part 1 DB Baseline,6227542165,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,2,Part 1 DB Baseline,6227542164,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,2,Part 1 DB Baseline,6227844727,"Feb 1, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,2,Part 1 DB Baseline,6227844726,"Feb 1, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,3,Part 2 Screening,6225351087,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,3,Part 2 Screening,6225351088,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,3,Part 2 Screening,6225351089,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,3,Part 2 Screening,6227542167,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,3,Part 2 Screening,6227542168,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,3,Part 2 Screening,6227542169,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,3,Part 2 Screening,6227542166,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,4,Part 2 OL Induction Baseline,6225351091,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,4,Part 2 OL Induction Baseline,6225351090,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,5,Part 2 OL Induction Day 29,6226935605,"Oct 14, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,5,Part 2 OL Induction Day 29,6227261835,"Nov 20, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,5,Part 2 OL Induction Day 29,6228013045,"Feb 26, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,6,Part 2 DB Baseline,6226550647,"Aug 18, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,6,Part 2 DB Baseline,6226561518,"Aug 21, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,6,Part 2 DB Baseline,6226991312,"Oct 26, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,6,Part 2 DB Baseline,6228013046,"Feb 26, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,6,Part 2 DB Baseline,6228114461,"Mar 11, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,6,Part 2 DB Baseline,6228398393,"Apr 15, 2026","Feb 28, 2027",298
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,7,Part 2 DB Week 13,6226550648,"Aug 18, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,7,Part 2 DB Week 13,6226561519,"Aug 21, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,7,Part 2 DB Week 13,6226991313,"Oct 26, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,7,Part 2 DB Week 13,6227261837,"Nov 20, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,7,Part 2 DB Week 13,6227261838,"Nov 20, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,7,Part 2 DB Week 13,6228114462,"Mar 11, 2026","Oct 11, 2026",158
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-1,Part 2 DB Every 12 Weeks,6226550649,"Aug 18, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-1,Part 2 DB Every 12 Weeks,6226550650,"Aug 18, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-1,Part 2 DB Every 12 Weeks,6226550652,"Aug 18, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-1,Part 2 DB Every 12 Weeks,6226550651,"Aug 18, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-1,Part 2 DB Every 12 Weeks,6226550653,"Aug 18, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-2,End of Phase/Treatment,6225351092,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-2,End of Phase/Treatment,6225351096,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-2,End of Phase/Treatment,6227498378,"Dec 22, 2025","Aug 31, 2026",117
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-2,End of Phase/Treatment,6228232036,"Mar 25, 2026","Jan 3, 2027",242
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-2,End of Phase/Treatment,6228232038,"Mar 25, 2026","Jan 3, 2027",242
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-2,End of Phase/Treatment,6228234299,"Mar 30, 2026","Jan 3, 2027",242
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-2,End of Phase/Treatment,6228234298,"Mar 30, 2026","Jan 3, 2027",242
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-3,Early Withdrawal,6225351097,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-3,Early Withdrawal,6225351099,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-3,Early Withdrawal,6225351101,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-3,Early Withdrawal,6225351100,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-3,Early Withdrawal,6225351098,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-3,Early Withdrawal,6227542174,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-3,Early Withdrawal,6227542176,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-3,Early Withdrawal,6227542175,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-3,Early Withdrawal,6227542177,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-4,Liver Monitoring,6225351102,"Feb 24, 2025","Sep 1, 2025",-246
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-4,Liver Monitoring,6227542179,"Dec 25, 2025","Sep 12, 2026",129
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-4,Liver Monitoring,6227542178,"Dec 25, 2025","Sep 12, 2026",129
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-5,Suspected Liver Event FU,6225351103,"Feb 24, 2025","Jul 31, 2025",-278
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-5,Suspected Liver Event FU,6227542180,"Dec 25, 2025","Jun 30, 2026",55
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,T-5,Suspected Liver Event FU,6227542181,"Dec 25, 2025","Jun 30, 2026",55
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,U,Retest,6225351104,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,U,Retest,6225351105,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,U,Retest,6227542183,"Dec 25, 2025","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,U,Retest,6228417882,"Apr 15, 2026","Feb 28, 2027",298
|
||||
212396,EMEA,CZE,CZ10011 - Dr. Marta Lendlova,U,Retest,6228417883,"Apr 15, 2026","Feb 28, 2027",298
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,1,Part 1 Screening,6225351107,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,1,Part 1 Screening,6225351108,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,1,Part 1 Screening,6225351112,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,1,Part 1 Screening,6225351113,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,1,Part 1 Screening,6225351114,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,1,Part 1 Screening,6225351115,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,1,Part 1 Screening,6227767268,"Jan 27, 2026","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,1,Part 1 Screening,6227775503,"Jan 23, 2026","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,1,Part 1 Screening,6227775504,"Jan 23, 2026","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,2,Part 1 DB Baseline,6225351117,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,2,Part 1 DB Baseline,6225351116,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,2,Part 1 DB Baseline,6225351118,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,2,Part 1 DB Baseline,6225351119,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,2,Part 1 DB Baseline,6227767269,"Jan 27, 2026","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,2,Part 1 DB Baseline,6227767270,"Jan 27, 2026","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,2,Part 1 DB Baseline,6227775506,"Jan 23, 2026","Oct 7, 2026",154
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,3,Part 2 Screening,6225351123,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,3,Part 2 Screening,6225351122,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,3,Part 2 Screening,6225351121,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,4,Part 2 OL Induction Baseline,6225351124,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,4,Part 2 OL Induction Baseline,6225351125,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,6,Part 2 DB Baseline,6226976944,"Oct 26, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,6,Part 2 DB Baseline,6228521304,"Apr 30, 2026","Feb 28, 2027",298
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,7,Part 2 DB Week 13,6226560889,"Aug 20, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,7,Part 2 DB Week 13,6226752556,"Sep 17, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,7,Part 2 DB Week 13,6226976945,"Oct 26, 2025","May 31, 2026",25
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-1,Part 2 DB Every 12 Weeks,6226560890,"Aug 20, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-1,Part 2 DB Every 12 Weeks,6226560892,"Aug 20, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-1,Part 2 DB Every 12 Weeks,6226560894,"Aug 20, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-1,Part 2 DB Every 12 Weeks,6226560893,"Aug 20, 2025","Jul 1, 2026",56
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-1,Part 2 DB Every 12 Weeks,6228389162,"Apr 15, 2026","Feb 28, 2027",298
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-1,Part 2 DB Every 12 Weeks,6228389161,"Apr 15, 2026","Feb 28, 2027",298
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-2,End of Phase/Treatment,6225351129,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-2,End of Phase/Treatment,6225351128,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-2,End of Phase/Treatment,6225351130,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-2,End of Phase/Treatment,6225351127,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-3,Early Withdrawal,6225351131,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-3,Early Withdrawal,6225351132,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-3,Early Withdrawal,6225351133,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-3,Early Withdrawal,6225351134,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-3,Early Withdrawal,6225351135,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-4,Liver Monitoring,6225351136,"Feb 24, 2025","Sep 1, 2025",-246
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,T-5,Suspected Liver Event FU,6225351137,"Feb 24, 2025","Jul 31, 2025",-278
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,U,Retest,6225351139,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
212396,EMEA,CZE,CZ10012 - Dr.Ales Urban,U,Retest,6225351138,"Feb 24, 2025","Dec 1, 2025",-155
|
||||
title,value,,,,,,,,
|
||||
Search,,,,,,,,,
|
||||
Site,"CZ10004 Dr. Erik Herman, CZ10012 Dr.Ales Urban, CZ10005 Dr.Lubos Janu, CZ10011 Dr. Marta Lendlova, CZ10008 Dr.Zdenek Solle",,,,,,,,
|
||||
Expiration Date Range,From - To - ,,,,,,,,
|
||||
Shipped Date Range,From - To - ,,,,,,,,
|
||||
Kit Type,,,,,,,,,
|
||||
Ignore Record Limit,TRUE,,,,,,,,
|
||||
|
@@ -1,52 +0,0 @@
|
||||
"""
|
||||
Vytvoří tabulku covance_samples v databázi studie.
|
||||
Spusť jednorázově pro inicializaci.
|
||||
"""
|
||||
|
||||
import mysql.connector
|
||||
import db_config
|
||||
|
||||
DDL = """
|
||||
CREATE TABLE IF NOT EXISTS covance_samples (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
import_id INT NOT NULL,
|
||||
study VARCHAR(20) NOT NULL,
|
||||
investigator_no VARCHAR(10),
|
||||
investigator_name VARCHAR(100),
|
||||
patient_no VARCHAR(20),
|
||||
collection_date DATE,
|
||||
protocol_visit_code VARCHAR(20),
|
||||
kit_receipt_date DATE,
|
||||
container_receipt_date DATE,
|
||||
accession VARCHAR(20),
|
||||
container_no TINYINT UNSIGNED,
|
||||
container_barcode VARCHAR(30),
|
||||
specimen_type VARCHAR(100),
|
||||
sample_status VARCHAR(30),
|
||||
expected_receipt_condition VARCHAR(50),
|
||||
actual_receipt_condition VARCHAR(100),
|
||||
label_line1 VARCHAR(100),
|
||||
label_line2 VARCHAR(100),
|
||||
sm_sample_status VARCHAR(50),
|
||||
smart_class_description VARCHAR(100),
|
||||
parent_barcode VARCHAR(30),
|
||||
children_barcode VARCHAR(30),
|
||||
FOREIGN KEY (import_id) REFERENCES iwrs_import(import_id),
|
||||
INDEX idx_import (import_id),
|
||||
INDEX idx_patient (patient_no),
|
||||
INDEX idx_accession (accession),
|
||||
INDEX idx_barcode (container_barcode)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
"""
|
||||
|
||||
conn = mysql.connector.connect(
|
||||
host=db_config.DB_HOST, port=db_config.DB_PORT,
|
||||
user=db_config.DB_USER, password=db_config.DB_PASSWORD,
|
||||
database=db_config.DB_NAME,
|
||||
)
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(DDL)
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
print("Tabulka covance_samples OK.")
|
||||
@@ -1,49 +0,0 @@
|
||||
"""
|
||||
Vytvoří tabulku covance_equeries v databázi studie.
|
||||
Spusť jednorázově pro inicializaci.
|
||||
"""
|
||||
|
||||
import mysql.connector
|
||||
import db_config
|
||||
|
||||
DDL = """
|
||||
CREATE TABLE IF NOT EXISTS covance_equeries (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
import_id INT NOT NULL,
|
||||
study VARCHAR(20) NOT NULL,
|
||||
site_code VARCHAR(10),
|
||||
investigator_name VARCHAR(100),
|
||||
country VARCHAR(30),
|
||||
visit VARCHAR(100),
|
||||
visit_collection_date DATETIME,
|
||||
accession VARCHAR(20),
|
||||
subject VARCHAR(20),
|
||||
equery_id INT,
|
||||
create_date DATETIME,
|
||||
response_datetime DATETIME,
|
||||
issue_type VARCHAR(100),
|
||||
status VARCHAR(20),
|
||||
time_before_response VARCHAR(20),
|
||||
user_name VARCHAR(100),
|
||||
email VARCHAR(100),
|
||||
study_role VARCHAR(50),
|
||||
FOREIGN KEY (import_id) REFERENCES iwrs_import(import_id),
|
||||
INDEX idx_import (import_id),
|
||||
INDEX idx_site (site_code),
|
||||
INDEX idx_subject (subject),
|
||||
INDEX idx_equery (equery_id),
|
||||
INDEX idx_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
"""
|
||||
|
||||
conn = mysql.connector.connect(
|
||||
host=db_config.DB_HOST, port=db_config.DB_PORT,
|
||||
user=db_config.DB_USER, password=db_config.DB_PASSWORD,
|
||||
database=db_config.DB_NAME,
|
||||
)
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(DDL)
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
print("Tabulka covance_equeries OK.")
|
||||
@@ -1,43 +0,0 @@
|
||||
"""
|
||||
Vytvoří tabulku covance_kit_inventory v databázi studie.
|
||||
Spusť jednorázově pro inicializaci.
|
||||
"""
|
||||
|
||||
import mysql.connector
|
||||
import db_config
|
||||
|
||||
DDL = """
|
||||
CREATE TABLE IF NOT EXISTS covance_kit_inventory (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
import_id INT NOT NULL,
|
||||
study VARCHAR(20) NOT NULL,
|
||||
project_no VARCHAR(10),
|
||||
region VARCHAR(10),
|
||||
country VARCHAR(10),
|
||||
site_code VARCHAR(10),
|
||||
investigator_name VARCHAR(100),
|
||||
kit_type VARCHAR(10),
|
||||
description VARCHAR(100),
|
||||
accession VARCHAR(20),
|
||||
shipped_date DATE,
|
||||
expiration_date DATE,
|
||||
days_to_expiration SMALLINT,
|
||||
FOREIGN KEY (import_id) REFERENCES iwrs_import(import_id),
|
||||
INDEX idx_import (import_id),
|
||||
INDEX idx_site (site_code),
|
||||
INDEX idx_accession (accession),
|
||||
INDEX idx_expiration (expiration_date)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
"""
|
||||
|
||||
conn = mysql.connector.connect(
|
||||
host=db_config.DB_HOST, port=db_config.DB_PORT,
|
||||
user=db_config.DB_USER, password=db_config.DB_PASSWORD,
|
||||
database=db_config.DB_NAME,
|
||||
)
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(DDL)
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
print("Tabulka covance_kit_inventory OK.")
|
||||
@@ -1,604 +0,0 @@
|
||||
"""
|
||||
Covance samples report pro studii 42847922MDD3003.
|
||||
Čte z MySQL (nejnovější import), generuje Excel s 7 listy:
|
||||
1. Přehled — agregát per pacient+visit (Received / Not Received / Cancelled)
|
||||
2. Chybějící — detail Not Received vzorků
|
||||
3. Kity — kit inventory: centra × typy kitů s expirací
|
||||
4. eQueries — přehled eQuery dotazů (Open červeně)
|
||||
5. ZDROJ Vzorky — surová data samples
|
||||
6. ZDROJ Kity — surová data kit inventory
|
||||
7. ZDROJ eQuery — surová data eQueries
|
||||
"""
|
||||
|
||||
import os
|
||||
import datetime
|
||||
|
||||
import mysql.connector
|
||||
import pandas as pd
|
||||
from openpyxl import Workbook
|
||||
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
|
||||
from openpyxl.utils import get_column_letter
|
||||
|
||||
import db_config
|
||||
|
||||
STUDY = "42847922MDD3003"
|
||||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
CREATED_DIR = os.path.join(BASE_DIR, "CreatedReports")
|
||||
|
||||
# ── styles ───────────────────────────────────────────────────────────────────
|
||||
HEADER_FILL = PatternFill("solid", fgColor="1F4E79")
|
||||
HEADER_FONT = Font(name="Arial", bold=True, color="FFFFFF", size=10)
|
||||
NORMAL_FONT = Font(name="Arial", size=10)
|
||||
BOLD_FONT = Font(name="Arial", bold=True, size=10)
|
||||
RED_FONT = Font(name="Arial", bold=True, size=10, color="C00000")
|
||||
|
||||
THIN = Side(style="thin", color="CCCCCC")
|
||||
BORDER = Border(left=THIN, right=THIN, top=THIN, bottom=THIN)
|
||||
|
||||
EVEN_FILL = PatternFill("solid", fgColor="EBF3FB")
|
||||
ODD_FILL = PatternFill("solid", fgColor="FFFFFF")
|
||||
NOTRCV_FILL = PatternFill("solid", fgColor="FCE4D6")
|
||||
CANCELLED_FILL = PatternFill("solid", fgColor="F2F2F2")
|
||||
OPEN_FILL = PatternFill("solid", fgColor="FFC7CE")
|
||||
OPEN_QUERY_FILL = PatternFill("solid", fgColor="FFD966")
|
||||
HYPERLINK_FONT = Font(name="Arial", size=10, color="0563C1", underline="single")
|
||||
|
||||
CENTER = Alignment(horizontal="center", vertical="center")
|
||||
LEFT = Alignment(horizontal="left", vertical="center")
|
||||
|
||||
|
||||
def unique_path(stem):
|
||||
path = os.path.join(CREATED_DIR, f"{stem}.xlsx")
|
||||
if not os.path.exists(path):
|
||||
return path
|
||||
tag = datetime.datetime.now().strftime("%H%M")
|
||||
return os.path.join(CREATED_DIR, f"{stem} {tag}.xlsx")
|
||||
|
||||
|
||||
# ── data load ────────────────────────────────────────────────────────────────
|
||||
|
||||
def load_data():
|
||||
conn = mysql.connector.connect(
|
||||
host=db_config.DB_HOST, port=db_config.DB_PORT,
|
||||
user=db_config.DB_USER, password=db_config.DB_PASSWORD,
|
||||
database=db_config.DB_NAME,
|
||||
)
|
||||
sql = """
|
||||
SELECT
|
||||
investigator_no, investigator_name, patient_no,
|
||||
collection_date, protocol_visit_code,
|
||||
accession, container_no, container_barcode,
|
||||
specimen_type, sample_status,
|
||||
label_line1, label_line2
|
||||
FROM covance_samples
|
||||
WHERE import_id = (
|
||||
SELECT MAX(import_id) FROM iwrs_import
|
||||
WHERE study = %s AND report_type = 'covance_samples'
|
||||
)
|
||||
ORDER BY investigator_no, patient_no, protocol_visit_code, container_no
|
||||
"""
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(sql, (STUDY,))
|
||||
cols = [d[0] for d in cursor.description]
|
||||
rows = cursor.fetchall()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
return pd.DataFrame(rows, columns=cols)
|
||||
|
||||
|
||||
def load_equery_data():
|
||||
conn = mysql.connector.connect(
|
||||
host=db_config.DB_HOST, port=db_config.DB_PORT,
|
||||
user=db_config.DB_USER, password=db_config.DB_PASSWORD,
|
||||
database=db_config.DB_NAME,
|
||||
)
|
||||
sql = """
|
||||
SELECT site_code, investigator_name, subject, visit,
|
||||
accession, visit_collection_date, equery_id,
|
||||
create_date, response_datetime, issue_type, status,
|
||||
time_before_response, user_name, study_role
|
||||
FROM covance_equeries
|
||||
WHERE import_id = (
|
||||
SELECT MAX(import_id) FROM iwrs_import
|
||||
WHERE study = %s AND report_type = 'covance_equeries'
|
||||
)
|
||||
ORDER BY site_code ASC, create_date DESC
|
||||
"""
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(sql, (STUDY,))
|
||||
cols = [d[0] for d in cursor.description]
|
||||
rows = cursor.fetchall()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
return pd.DataFrame(rows, columns=cols)
|
||||
|
||||
|
||||
def load_kit_data():
|
||||
conn = mysql.connector.connect(
|
||||
host=db_config.DB_HOST, port=db_config.DB_PORT,
|
||||
user=db_config.DB_USER, password=db_config.DB_PASSWORD,
|
||||
database=db_config.DB_NAME,
|
||||
)
|
||||
sql = """
|
||||
SELECT site_code, investigator_name, kit_type, description,
|
||||
accession, shipped_date, expiration_date, days_to_expiration
|
||||
FROM covance_kit_inventory
|
||||
WHERE import_id = (
|
||||
SELECT MAX(import_id) FROM iwrs_import
|
||||
WHERE study = %s AND report_type = 'covance_kit_inventory'
|
||||
)
|
||||
ORDER BY site_code, kit_type+0, kit_type, accession
|
||||
"""
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(sql, (STUDY,))
|
||||
cols = [d[0] for d in cursor.description]
|
||||
rows = cursor.fetchall()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
return pd.DataFrame(rows, columns=cols)
|
||||
|
||||
|
||||
# ── helpers ──────────────────────────────────────────────────────────────────
|
||||
|
||||
def test_name(row):
|
||||
l1 = str(row["label_line1"]).strip() if pd.notna(row["label_line1"]) else ""
|
||||
l2 = str(row["label_line2"]).strip() if pd.notna(row["label_line2"]) else ""
|
||||
return f"{l1} {l2}".strip() if l2 else l1
|
||||
|
||||
def write_headers(ws, headers, widths, row=2):
|
||||
for c, (h, w) in enumerate(zip(headers, widths), 1):
|
||||
cell = ws.cell(row=row, column=c, value=h)
|
||||
cell.font = HEADER_FONT
|
||||
cell.fill = HEADER_FILL
|
||||
cell.alignment = CENTER
|
||||
cell.border = BORDER
|
||||
ws.column_dimensions[get_column_letter(c)].width = w
|
||||
ws.row_dimensions[row].height = 18
|
||||
|
||||
def write_title(ws, text, ncols):
|
||||
ws.merge_cells(f"A1:{get_column_letter(ncols)}1")
|
||||
cell = ws["A1"]
|
||||
cell.value = text
|
||||
cell.font = Font(name="Arial", bold=True, size=12, color="1F4E79")
|
||||
cell.alignment = Alignment(horizontal="left", vertical="center")
|
||||
ws.row_dimensions[1].height = 22
|
||||
|
||||
|
||||
# ── sheet 1: Přehled ─────────────────────────────────────────────────────────
|
||||
|
||||
def write_prehled(wb, df, accession_eq_row=None):
|
||||
if accession_eq_row is None:
|
||||
accession_eq_row = {}
|
||||
ws = wb.create_sheet("Přehled")
|
||||
ws.sheet_view.showGridLines = False
|
||||
|
||||
today = datetime.date.today().strftime("%d-%b-%Y")
|
||||
write_title(ws, f"Covance Samples — {STUDY} ({today})", 9)
|
||||
|
||||
headers = ["Site", "Investigátor", "Pacient", "Visit", "Accession",
|
||||
"Datum odběru", "Celkem", "Received", "Not Received"]
|
||||
widths = [9, 22, 14, 12, 13, 14, 8, 10, 13]
|
||||
write_headers(ws, headers, widths)
|
||||
|
||||
agg = (
|
||||
df.groupby(["investigator_no", "investigator_name",
|
||||
"patient_no", "protocol_visit_code", "accession", "collection_date"])
|
||||
.agg(
|
||||
celkem =("sample_status", "count"),
|
||||
received =("sample_status", lambda x: (x == "Received").sum()),
|
||||
not_received=("sample_status", lambda x: (x == "Not Received").sum()),
|
||||
)
|
||||
.reset_index()
|
||||
.sort_values(["investigator_no", "patient_no", "protocol_visit_code"])
|
||||
.reset_index(drop=True)
|
||||
)
|
||||
|
||||
for r_idx, row in agg.iterrows():
|
||||
excel_row = r_idx + 3
|
||||
has_missing = row["not_received"] > 0
|
||||
accession = row["accession"]
|
||||
eq_row = accession_eq_row.get(accession) # None pokud nemá Open query
|
||||
|
||||
if eq_row:
|
||||
fill = OPEN_QUERY_FILL
|
||||
elif has_missing:
|
||||
fill = NOTRCV_FILL
|
||||
else:
|
||||
fill = EVEN_FILL if r_idx % 2 == 0 else ODD_FILL
|
||||
|
||||
col_date = row["collection_date"]
|
||||
date_str = col_date.strftime("%d-%b-%Y") if hasattr(col_date, "strftime") else str(col_date)
|
||||
|
||||
values = [
|
||||
row["investigator_no"], row["investigator_name"], row["patient_no"],
|
||||
row["protocol_visit_code"], accession, date_str,
|
||||
int(row["celkem"]), int(row["received"]), int(row["not_received"]),
|
||||
]
|
||||
for c_idx, val in enumerate(values, 1):
|
||||
cell = ws.cell(row=excel_row, column=c_idx, value=val)
|
||||
cell.fill = fill
|
||||
cell.border = BORDER
|
||||
cell.alignment = CENTER if c_idx in (1, 4, 5, 6, 7, 8, 9) else LEFT
|
||||
|
||||
if c_idx == 5 and eq_row:
|
||||
cell.hyperlink = f"#'eQueries'!A{eq_row}"
|
||||
cell.font = HYPERLINK_FONT
|
||||
elif c_idx == 9 and has_missing:
|
||||
cell.font = RED_FONT
|
||||
else:
|
||||
cell.font = NORMAL_FONT
|
||||
ws.row_dimensions[excel_row].height = 16
|
||||
|
||||
ws.freeze_panes = "A3"
|
||||
ws.auto_filter.ref = f"A2:I{len(agg) + 2}"
|
||||
|
||||
|
||||
# ── sheet 2: Chybějící ────────────────────────────────────────────────────────
|
||||
|
||||
def write_chybejici(wb, df):
|
||||
ws = wb.create_sheet("Chybějící")
|
||||
ws.sheet_view.showGridLines = False
|
||||
|
||||
today = datetime.date.today().strftime("%d-%b-%Y")
|
||||
write_title(ws, f"Not Received vzorky — {STUDY} ({today})", 8)
|
||||
|
||||
headers = ["Site", "Pacient", "Visit", "Datum odběru",
|
||||
"Accession", "Container", "Typ vzorku", "Test"]
|
||||
widths = [9, 14, 12, 14, 13, 10, 22, 30]
|
||||
write_headers(ws, headers, widths)
|
||||
|
||||
missing = df[df["sample_status"] == "Not Received"].copy()
|
||||
missing["test"] = missing.apply(test_name, axis=1)
|
||||
missing = missing.sort_values(
|
||||
["investigator_no", "patient_no", "protocol_visit_code", "container_no"]
|
||||
).reset_index(drop=True)
|
||||
|
||||
for r_idx, row in missing.iterrows():
|
||||
excel_row = r_idx + 3
|
||||
fill = EVEN_FILL if r_idx % 2 == 0 else ODD_FILL
|
||||
|
||||
col_date = row["collection_date"]
|
||||
date_str = col_date.strftime("%d-%b-%Y") if hasattr(col_date, "strftime") else str(col_date)
|
||||
|
||||
values = [
|
||||
row["investigator_no"], row["patient_no"],
|
||||
row["protocol_visit_code"], date_str,
|
||||
row["accession"], int(row["container_no"]) if pd.notna(row["container_no"]) else "",
|
||||
row["specimen_type"], row["test"],
|
||||
]
|
||||
for c_idx, val in enumerate(values, 1):
|
||||
cell = ws.cell(row=excel_row, column=c_idx, value=val)
|
||||
cell.fill = fill
|
||||
cell.border = BORDER
|
||||
cell.alignment = CENTER if c_idx in (1, 3, 4, 5, 6) else LEFT
|
||||
cell.font = NORMAL_FONT
|
||||
ws.row_dimensions[excel_row].height = 16
|
||||
|
||||
ws.freeze_panes = "A3"
|
||||
ws.auto_filter.ref = f"A2:H{len(missing) + 2}"
|
||||
|
||||
|
||||
# ── sheet 3: Kity (per centrum) ──────────────────────────────────────────────
|
||||
|
||||
def kit_sort_key(kt):
|
||||
try:
|
||||
return (0, int(kt), "")
|
||||
except ValueError:
|
||||
pass
|
||||
if str(kt).upper().startswith("T-"):
|
||||
try:
|
||||
return (1, int(str(kt)[2:]), "")
|
||||
except ValueError:
|
||||
pass
|
||||
return (2, 0, str(kt))
|
||||
|
||||
SITE_HDR_FILL = PatternFill("solid", fgColor="2E75B6")
|
||||
SITE_HDR_FONT = Font(name="Arial", bold=True, color="FFFFFF", size=10)
|
||||
TOTAL_FILL = PatternFill("solid", fgColor="D6E4F0")
|
||||
SOON_FILL = PatternFill("solid", fgColor="FCE4D6")
|
||||
|
||||
def _cell(ws, row, col, value, font, fill, alignment, border):
|
||||
c = ws.cell(row=row, column=col, value=value)
|
||||
c.font = font; c.fill = fill; c.alignment = alignment; c.border = border
|
||||
return c
|
||||
|
||||
def write_kity(wb, df_kits):
|
||||
ws = wb.create_sheet("Kity")
|
||||
ws.sheet_view.showGridLines = False
|
||||
|
||||
today = datetime.date.today()
|
||||
cutoff = today + datetime.timedelta(days=30)
|
||||
today_str = today.strftime("%d-%b-%Y")
|
||||
|
||||
# sada kitů napříč celou studií (seřazeno)
|
||||
kit_types = sorted(df_kits["kit_type"].dropna().unique(), key=kit_sort_key)
|
||||
kt_desc = (df_kits.drop_duplicates("kit_type")
|
||||
.set_index("kit_type")["description"].to_dict())
|
||||
|
||||
# centra seřazená
|
||||
sites = (df_kits[["site_code", "investigator_name"]]
|
||||
.drop_duplicates()
|
||||
.sort_values("site_code")
|
||||
.values.tolist())
|
||||
|
||||
# sloupce: A=Kit Type, B=Popis, C=≤30 dní, D=>30 dní, E=Celkem
|
||||
ws.column_dimensions["A"].width = 9
|
||||
ws.column_dimensions["B"].width = 28
|
||||
ws.column_dimensions["C"].width = 14
|
||||
ws.column_dimensions["D"].width = 14
|
||||
ws.column_dimensions["E"].width = 10
|
||||
|
||||
write_title(ws, f"Kit Inventory — {STUDY} ({today_str})", 5)
|
||||
|
||||
# sub-header (řádek 2) — bez pevné výšky, Excel si ji sám přizpůsobí
|
||||
for col, txt in [(1, "Kit Type"), (2, "Popis"),
|
||||
(3, f"Expiruje ≤30 dní\n({cutoff.strftime('%d-%b-%Y')})"),
|
||||
(4, "Expiruje >30 dní"),
|
||||
(5, "Celkem")]:
|
||||
c = ws.cell(row=2, column=col, value=txt)
|
||||
c.font = HEADER_FONT; c.fill = HEADER_FILL
|
||||
c.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)
|
||||
c.border = BORDER
|
||||
|
||||
cur_row = 3
|
||||
|
||||
for site_code, investigator in sites:
|
||||
# ── site header ───────────────────────────────────────────────────────
|
||||
ws.merge_cells(f"A{cur_row}:E{cur_row}")
|
||||
c = ws.cell(row=cur_row, column=1,
|
||||
value=f"{site_code} — {investigator}")
|
||||
c.font = SITE_HDR_FONT; c.fill = SITE_HDR_FILL
|
||||
c.alignment = LEFT; c.border = BORDER
|
||||
for col in range(2, 6):
|
||||
ws.cell(row=cur_row, column=col).fill = SITE_HDR_FILL
|
||||
ws.cell(row=cur_row, column=col).border = BORDER
|
||||
ws.row_dimensions[cur_row].height = 17
|
||||
cur_row += 1
|
||||
|
||||
# kity tohoto centra
|
||||
site_df = df_kits[df_kits["site_code"] == site_code].copy()
|
||||
site_df["exp_date"] = pd.to_datetime(site_df["expiration_date"]).dt.date
|
||||
|
||||
site_soon = 0
|
||||
site_later = 0
|
||||
|
||||
for kt_idx, kt in enumerate(kit_types):
|
||||
kt_df = site_df[site_df["kit_type"] == kt]
|
||||
soon = int((kt_df["exp_date"].apply(
|
||||
lambda d: d is not None and today <= d <= cutoff)).sum())
|
||||
later = int((kt_df["exp_date"].apply(
|
||||
lambda d: d is not None and d > cutoff)).sum())
|
||||
site_soon += soon
|
||||
site_later += later
|
||||
total = soon + later
|
||||
|
||||
fill = EVEN_FILL if kt_idx % 2 == 0 else ODD_FILL
|
||||
|
||||
_cell(ws, cur_row, 1, kt, BOLD_FONT, fill, CENTER, BORDER)
|
||||
_cell(ws, cur_row, 2, kt_desc.get(kt, ""), NORMAL_FONT, fill, LEFT, BORDER)
|
||||
_cell(ws, cur_row, 3, soon if soon else None,
|
||||
RED_FONT if soon else NORMAL_FONT,
|
||||
SOON_FILL if soon else fill, CENTER, BORDER)
|
||||
_cell(ws, cur_row, 4, later if later else None,
|
||||
NORMAL_FONT, fill, CENTER, BORDER)
|
||||
_cell(ws, cur_row, 5, total if total else None,
|
||||
BOLD_FONT, fill, CENTER, BORDER)
|
||||
ws.row_dimensions[cur_row].height = 16
|
||||
cur_row += 1
|
||||
|
||||
# ── součet centra ─────────────────────────────────────────────────────
|
||||
site_total = site_soon + site_later
|
||||
_cell(ws, cur_row, 1, "Celkem", BOLD_FONT, TOTAL_FILL, CENTER, BORDER)
|
||||
_cell(ws, cur_row, 2, "", BOLD_FONT, TOTAL_FILL, LEFT, BORDER)
|
||||
_cell(ws, cur_row, 3, site_soon if site_soon else None,
|
||||
BOLD_FONT, TOTAL_FILL, CENTER, BORDER)
|
||||
_cell(ws, cur_row, 4, site_later if site_later else None,
|
||||
BOLD_FONT, TOTAL_FILL, CENTER, BORDER)
|
||||
_cell(ws, cur_row, 5, site_total if site_total else None,
|
||||
BOLD_FONT, TOTAL_FILL, CENTER, BORDER)
|
||||
ws.row_dimensions[cur_row].height = 16
|
||||
cur_row += 2 # prázdný řádek mezi centry
|
||||
|
||||
ws.freeze_panes = "A3"
|
||||
|
||||
|
||||
# ── sheet 4: eQueries ────────────────────────────────────────────────────────
|
||||
|
||||
def write_equeries(wb, df_eq):
|
||||
ws = wb.create_sheet("eQueries")
|
||||
ws.sheet_view.showGridLines = False
|
||||
|
||||
today = datetime.date.today().strftime("%d-%b-%Y")
|
||||
write_title(ws, f"eQueries — {STUDY} ({today})", 14)
|
||||
|
||||
headers = ["Site", "Investigátor", "Pacient", "Visit", "Accession",
|
||||
"Visit Datum", "eQuery ID", "Vytvořeno", "Odpovězeno",
|
||||
"Issue Type", "Status", "Čas odpovědi", "Uživatel", "Role"]
|
||||
widths = [9, 22, 14, 26, 13, 13, 10, 16, 16, 20, 9, 13, 22, 13]
|
||||
write_headers(ws, headers, widths)
|
||||
|
||||
def fmt_dt(val, fmt="%d-%b-%Y %H:%M"):
|
||||
if val is None or (isinstance(val, float) and val != val):
|
||||
return None
|
||||
try:
|
||||
if pd.isna(val):
|
||||
return None
|
||||
except (TypeError, ValueError):
|
||||
pass
|
||||
if hasattr(val, "strftime"):
|
||||
return val.strftime(fmt)
|
||||
return str(val)
|
||||
|
||||
for r_idx, row in df_eq.iterrows():
|
||||
excel_row = r_idx + 3
|
||||
is_open = str(row.get("status", "")).strip().lower() == "open"
|
||||
fill = OPEN_FILL if is_open else (EVEN_FILL if r_idx % 2 == 0 else ODD_FILL)
|
||||
font = Font(name="Arial", bold=True, size=10, color="9C0006") if is_open else NORMAL_FONT
|
||||
|
||||
values = [
|
||||
row["site_code"], row["investigator_name"], row["subject"],
|
||||
row["visit"], row["accession"],
|
||||
fmt_dt(row["visit_collection_date"], "%d-%b-%Y"),
|
||||
row["equery_id"],
|
||||
fmt_dt(row["create_date"]),
|
||||
fmt_dt(row["response_datetime"]),
|
||||
row["issue_type"], row["status"],
|
||||
row["time_before_response"], row["user_name"], row["study_role"],
|
||||
]
|
||||
for c_idx, val in enumerate(values, 1):
|
||||
if isinstance(val, float) and val != val:
|
||||
val = None
|
||||
cell = ws.cell(row=excel_row, column=c_idx, value=val)
|
||||
cell.fill = fill
|
||||
cell.border = BORDER
|
||||
cell.font = font
|
||||
cell.alignment = CENTER if c_idx in (1, 6, 7, 8, 9, 11, 12) else LEFT
|
||||
ws.row_dimensions[excel_row].height = 16
|
||||
|
||||
ws.freeze_panes = "A3"
|
||||
ws.auto_filter.ref = f"A2:N{len(df_eq) + 2}"
|
||||
|
||||
|
||||
# ── sheet 5: ZDROJ Vzorky ────────────────────────────────────────────────────
|
||||
|
||||
# ── sheet 6: ZDROJ Kity ──────────────────────────────────────────────────────
|
||||
|
||||
def write_zdroj_kity(wb, df_kits):
|
||||
ws = wb.create_sheet("ZDROJ Kity")
|
||||
ws.sheet_view.showGridLines = True
|
||||
|
||||
headers = list(df_kits.columns)
|
||||
for c, h in enumerate(headers, 1):
|
||||
cell = ws.cell(row=1, column=c, value=h)
|
||||
cell.font = Font(name="Arial", bold=True, size=9, color="FFFFFF")
|
||||
cell.fill = PatternFill("solid", fgColor="404040")
|
||||
cell.alignment = LEFT
|
||||
cell.border = BORDER
|
||||
ws.column_dimensions[get_column_letter(c)].width = 20
|
||||
|
||||
for r_idx, (_, row) in enumerate(df_kits.iterrows(), 2):
|
||||
fill = EVEN_FILL if r_idx % 2 == 0 else ODD_FILL
|
||||
for c_idx, col in enumerate(headers, 1):
|
||||
val = row[col]
|
||||
if pd.isna(val):
|
||||
val = ""
|
||||
elif hasattr(val, "strftime"):
|
||||
val = val.strftime("%Y-%m-%d")
|
||||
cell = ws.cell(row=r_idx, column=c_idx, value=val)
|
||||
cell.font = Font(name="Arial", size=9)
|
||||
cell.fill = fill
|
||||
cell.border = BORDER
|
||||
cell.alignment = LEFT
|
||||
|
||||
ws.freeze_panes = "A2"
|
||||
ws.auto_filter.ref = f"A1:{get_column_letter(len(headers))}1"
|
||||
|
||||
|
||||
# ── sheet 4: ZDROJ ───────────────────────────────────────────────────────────
|
||||
|
||||
def write_zdroj(wb, df):
|
||||
ws = wb.create_sheet("ZDROJ Vzorky")
|
||||
ws.sheet_view.showGridLines = True
|
||||
|
||||
headers = list(df.columns)
|
||||
for c, h in enumerate(headers, 1):
|
||||
cell = ws.cell(row=1, column=c, value=h)
|
||||
cell.font = Font(name="Arial", bold=True, size=9, color="FFFFFF")
|
||||
cell.fill = PatternFill("solid", fgColor="404040")
|
||||
cell.alignment = LEFT
|
||||
cell.border = BORDER
|
||||
ws.column_dimensions[get_column_letter(c)].width = 18
|
||||
|
||||
for r_idx, (_, row) in enumerate(df.iterrows(), 2):
|
||||
fill = EVEN_FILL if r_idx % 2 == 0 else ODD_FILL
|
||||
for c_idx, col in enumerate(headers, 1):
|
||||
val = row[col]
|
||||
if pd.isna(val):
|
||||
val = ""
|
||||
elif hasattr(val, "strftime"):
|
||||
val = val.strftime("%Y-%m-%d")
|
||||
cell = ws.cell(row=r_idx, column=c_idx, value=val)
|
||||
cell.font = Font(name="Arial", size=9)
|
||||
cell.fill = fill
|
||||
cell.border = BORDER
|
||||
cell.alignment = LEFT
|
||||
|
||||
ws.freeze_panes = "A2"
|
||||
ws.auto_filter.ref = f"A1:{get_column_letter(len(headers))}1"
|
||||
|
||||
|
||||
def write_zdroj_equeries(wb, df_eq):
|
||||
ws = wb.create_sheet("ZDROJ eQuery")
|
||||
ws.sheet_view.showGridLines = True
|
||||
|
||||
headers = list(df_eq.columns)
|
||||
for c, h in enumerate(headers, 1):
|
||||
cell = ws.cell(row=1, column=c, value=h)
|
||||
cell.font = Font(name="Arial", bold=True, size=9, color="FFFFFF")
|
||||
cell.fill = PatternFill("solid", fgColor="404040")
|
||||
cell.alignment = LEFT
|
||||
cell.border = BORDER
|
||||
ws.column_dimensions[get_column_letter(c)].width = 20
|
||||
|
||||
for r_idx, (_, row) in enumerate(df_eq.iterrows(), 2):
|
||||
fill = EVEN_FILL if r_idx % 2 == 0 else ODD_FILL
|
||||
for c_idx, col in enumerate(headers, 1):
|
||||
val = row[col]
|
||||
try:
|
||||
is_na = pd.isna(val)
|
||||
except (TypeError, ValueError):
|
||||
is_na = False
|
||||
if is_na or val is None:
|
||||
val = ""
|
||||
elif hasattr(val, "strftime"):
|
||||
val = val.strftime("%Y-%m-%d %H:%M")
|
||||
cell = ws.cell(row=r_idx, column=c_idx, value=val)
|
||||
cell.font = Font(name="Arial", size=9)
|
||||
cell.fill = fill
|
||||
cell.border = BORDER
|
||||
cell.alignment = LEFT
|
||||
|
||||
ws.freeze_panes = "A2"
|
||||
ws.auto_filter.ref = f"A1:{get_column_letter(len(headers))}1"
|
||||
|
||||
|
||||
# ── main ─────────────────────────────────────────────────────────────────────
|
||||
|
||||
def main():
|
||||
os.makedirs(CREATED_DIR, exist_ok=True)
|
||||
|
||||
print("Načítám data z MySQL...")
|
||||
df = load_data()
|
||||
df_kits = load_kit_data()
|
||||
df_eq = load_equery_data()
|
||||
print(f" Vzorky: {len(df)} řádků, {df['patient_no'].nunique()} pacientů")
|
||||
print(f" Kity: {len(df_kits)} kitů, {df_kits['site_code'].nunique()} center")
|
||||
print(f" eQueries: {len(df_eq)} záznamů ({(df_eq['status']=='Open').sum()} Open)")
|
||||
|
||||
# mapping accession → řádek v listu eQueries (jen Open queries, první výskyt)
|
||||
open_accs = set(df_eq[df_eq["status"] == "Open"]["accession"].dropna())
|
||||
accession_eq_row = {}
|
||||
for r_idx, row in df_eq.iterrows():
|
||||
acc = row.get("accession")
|
||||
if acc and acc in open_accs and acc not in accession_eq_row:
|
||||
accession_eq_row[acc] = r_idx + 3 # řádek 1=title, 2=header, data od 3
|
||||
|
||||
wb = Workbook()
|
||||
wb.remove(wb.active)
|
||||
|
||||
write_prehled(wb, df, accession_eq_row)
|
||||
write_chybejici(wb, df)
|
||||
write_kity(wb, df_kits)
|
||||
write_equeries(wb, df_eq)
|
||||
write_zdroj(wb, df)
|
||||
write_zdroj_kity(wb, df_kits)
|
||||
write_zdroj_equeries(wb, df_eq)
|
||||
|
||||
now = datetime.datetime.now()
|
||||
stamp = now.strftime("%Y-%m-%d %H%M%S")
|
||||
out_path = unique_path(f"{stamp} {STUDY} Covance")
|
||||
wb.save(out_path)
|
||||
print(f"Uloženo: {out_path}")
|
||||
|
||||
|
||||
main()
|
||||
@@ -1,5 +0,0 @@
|
||||
DB_HOST = "192.168.1.76"
|
||||
DB_PORT = 3306
|
||||
DB_USER = "root"
|
||||
DB_PASSWORD = "Vlado9674+"
|
||||
DB_NAME = "studie"
|
||||
@@ -1,182 +0,0 @@
|
||||
"""
|
||||
Import Covance eQuery CSV do MySQL tabulky covance_equeries.
|
||||
Strategie: versioning — každý import = nový import_id.
|
||||
"""
|
||||
|
||||
import os
|
||||
import glob
|
||||
import datetime
|
||||
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
import mysql.connector
|
||||
|
||||
import db_config
|
||||
|
||||
STUDY = "42847922MDD3003"
|
||||
SOURCE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "SourceData")
|
||||
|
||||
|
||||
# ── type converters ──────────────────────────────────────────────────────────
|
||||
|
||||
def _py(val):
|
||||
if isinstance(val, np.generic):
|
||||
return val.item()
|
||||
return val
|
||||
|
||||
def to_str(val):
|
||||
val = _py(val)
|
||||
if val is None:
|
||||
return None
|
||||
if isinstance(val, float) and (val != val):
|
||||
return None
|
||||
s = str(val).strip()
|
||||
return None if s.lower() in ("nan", "nat", "none", "") else s
|
||||
|
||||
def to_int(val):
|
||||
val = _py(val)
|
||||
try:
|
||||
v = float(val)
|
||||
return None if (v != v) else int(v)
|
||||
except (TypeError, ValueError):
|
||||
return None
|
||||
|
||||
def to_datetime(val):
|
||||
val = _py(val)
|
||||
if val is None:
|
||||
return None
|
||||
if isinstance(val, float) and (val != val):
|
||||
return None
|
||||
try:
|
||||
if pd.isna(val):
|
||||
return None
|
||||
except (TypeError, ValueError):
|
||||
pass
|
||||
if isinstance(val, pd.Timestamp):
|
||||
return None if pd.isna(val) else val.to_pydatetime()
|
||||
if isinstance(val, datetime.datetime):
|
||||
return val
|
||||
if isinstance(val, datetime.date):
|
||||
return datetime.datetime(val.year, val.month, val.day)
|
||||
s = str(val).strip()
|
||||
if not s or s.lower() in ("nat", "nan", "none", ""):
|
||||
return None
|
||||
for fmt in ("%b %d, %Y %I:%M %p", "%b %d, %Y",
|
||||
"%Y-%m-%d %H:%M:%S", "%Y-%m-%d"):
|
||||
try:
|
||||
return datetime.datetime.strptime(s, fmt)
|
||||
except ValueError:
|
||||
pass
|
||||
return None
|
||||
|
||||
|
||||
# ── DB helpers ───────────────────────────────────────────────────────────────
|
||||
|
||||
def get_conn():
|
||||
return mysql.connector.connect(
|
||||
host=db_config.DB_HOST, port=db_config.DB_PORT,
|
||||
user=db_config.DB_USER, password=db_config.DB_PASSWORD,
|
||||
database=db_config.DB_NAME,
|
||||
)
|
||||
|
||||
def insert_import(cursor, study, source_file):
|
||||
cursor.execute(
|
||||
"INSERT INTO iwrs_import (study, imported_at, source_file, report_type) VALUES (%s, %s, %s, %s)",
|
||||
(study, datetime.datetime.now(), source_file, "covance_equeries"),
|
||||
)
|
||||
return cursor.lastrowid
|
||||
|
||||
|
||||
# ── parser ───────────────────────────────────────────────────────────────────
|
||||
|
||||
def find_csv(study):
|
||||
pattern = os.path.join(SOURCE_DIR, f"Protocol {study} *equery*.csv")
|
||||
files = glob.glob(pattern)
|
||||
if not files:
|
||||
raise FileNotFoundError(f"Nenalezen CSV soubor: {pattern}")
|
||||
return sorted(files)[-1]
|
||||
|
||||
def parse_site(site_str):
|
||||
"""'CZ10004 - Dr. Erik Herman' → ('CZ10004', 'Dr. Erik Herman')"""
|
||||
if not site_str:
|
||||
return None, None
|
||||
parts = site_str.split(" - ", 1)
|
||||
code = parts[0].strip()
|
||||
name = parts[1].strip() if len(parts) > 1 else None
|
||||
return code, name
|
||||
|
||||
def parse_csv(path):
|
||||
df = pd.read_csv(path, dtype=str)
|
||||
# odstraň metadata řádky (eQueryId není číslo)
|
||||
df = df[pd.to_numeric(df["eQueryId"], errors="coerce").notna()].copy()
|
||||
|
||||
rows = []
|
||||
for _, r in df.iterrows():
|
||||
site_code, investigator_name = parse_site(to_str(r.get("Site")))
|
||||
rows.append({
|
||||
"site_code": site_code,
|
||||
"investigator_name": investigator_name,
|
||||
"country": to_str(r.get("Country")),
|
||||
"visit": to_str(r.get("Visit")),
|
||||
"visit_collection_date": to_datetime(r.get("Visit Collection Date")),
|
||||
"accession": to_str(r.get("Accession")),
|
||||
"subject": to_str(r.get("Subject")),
|
||||
"equery_id": to_int(r.get("eQueryId")),
|
||||
"create_date": to_datetime(r.get("Create Date")),
|
||||
"response_datetime": to_datetime(r.get("Response Date Time")),
|
||||
"issue_type": to_str(r.get("Issue Type")),
|
||||
"status": to_str(r.get("Status")),
|
||||
"time_before_response": to_str(r.get("Time Before Response")),
|
||||
"user_name": to_str(r.get("User Name")),
|
||||
"email": to_str(r.get("Email")),
|
||||
"study_role": to_str(r.get("Study Role")),
|
||||
})
|
||||
return rows
|
||||
|
||||
|
||||
# ── insert ───────────────────────────────────────────────────────────────────
|
||||
|
||||
def insert_equeries(cursor, import_id, rows):
|
||||
sql = """INSERT INTO covance_equeries
|
||||
(import_id, study, site_code, investigator_name, country,
|
||||
visit, visit_collection_date, accession, subject, equery_id,
|
||||
create_date, response_datetime, issue_type, status,
|
||||
time_before_response, user_name, email, study_role)
|
||||
VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""
|
||||
for r in rows:
|
||||
cursor.execute(sql, (
|
||||
import_id, STUDY,
|
||||
r["site_code"], r["investigator_name"], r["country"],
|
||||
r["visit"], r["visit_collection_date"], r["accession"],
|
||||
r["subject"], r["equery_id"],
|
||||
r["create_date"], r["response_datetime"],
|
||||
r["issue_type"], r["status"],
|
||||
r["time_before_response"], r["user_name"],
|
||||
r["email"], r["study_role"],
|
||||
))
|
||||
|
||||
|
||||
# ── main ─────────────────────────────────────────────────────────────────────
|
||||
|
||||
def main():
|
||||
csv_path = find_csv(STUDY)
|
||||
print(f"Soubor: {os.path.basename(csv_path)}")
|
||||
|
||||
rows = parse_csv(csv_path)
|
||||
print(f"Načteno řádků: {len(rows)}")
|
||||
|
||||
conn = get_conn()
|
||||
cursor = conn.cursor()
|
||||
|
||||
import_id = insert_import(cursor, STUDY, os.path.basename(csv_path))
|
||||
print(f"import_id = {import_id}")
|
||||
|
||||
insert_equeries(cursor, import_id, rows)
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
print(f"Hotovo — {len(rows)} eQuery záznamů importováno.")
|
||||
|
||||
|
||||
main()
|
||||
@@ -1,172 +0,0 @@
|
||||
"""
|
||||
Import Covance kit inventory CSV do MySQL tabulky covance_kit_inventory.
|
||||
Strategie: versioning — každý import = nový import_id.
|
||||
Metadata řádky na konci CSV (začínají "title" / "Search" / ...) jsou ignorovány.
|
||||
"""
|
||||
|
||||
import os
|
||||
import glob
|
||||
import datetime
|
||||
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
import mysql.connector
|
||||
|
||||
import db_config
|
||||
|
||||
STUDY = "42847922MDD3003"
|
||||
SOURCE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "SourceData")
|
||||
|
||||
|
||||
# ── type converters ──────────────────────────────────────────────────────────
|
||||
|
||||
def _py(val):
|
||||
if isinstance(val, np.generic):
|
||||
return val.item()
|
||||
return val
|
||||
|
||||
def to_str(val):
|
||||
val = _py(val)
|
||||
if val is None:
|
||||
return None
|
||||
if isinstance(val, float) and (val != val):
|
||||
return None
|
||||
s = str(val).strip()
|
||||
return None if s.lower() in ("nan", "nat", "none", "") else s
|
||||
|
||||
def to_int(val):
|
||||
val = _py(val)
|
||||
try:
|
||||
v = float(val)
|
||||
return None if (v != v) else int(v)
|
||||
except (TypeError, ValueError):
|
||||
return None
|
||||
|
||||
def to_date(val):
|
||||
val = _py(val)
|
||||
if val is None:
|
||||
return None
|
||||
if isinstance(val, float) and (val != val):
|
||||
return None
|
||||
try:
|
||||
if pd.isna(val):
|
||||
return None
|
||||
except (TypeError, ValueError):
|
||||
pass
|
||||
if isinstance(val, pd.Timestamp):
|
||||
return None if pd.isna(val) else val.date()
|
||||
if isinstance(val, datetime.datetime):
|
||||
return val.date()
|
||||
if isinstance(val, datetime.date):
|
||||
return val
|
||||
s = str(val).strip()
|
||||
if not s or s.lower() in ("nat", "nan", "none", ""):
|
||||
return None
|
||||
for fmt in ("%b %d, %Y", "%d-%b-%Y", "%Y-%m-%d", "%d-%m-%Y"):
|
||||
try:
|
||||
return datetime.datetime.strptime(s, fmt).date()
|
||||
except ValueError:
|
||||
pass
|
||||
return None
|
||||
|
||||
|
||||
# ── DB helpers ───────────────────────────────────────────────────────────────
|
||||
|
||||
def get_conn():
|
||||
return mysql.connector.connect(
|
||||
host=db_config.DB_HOST, port=db_config.DB_PORT,
|
||||
user=db_config.DB_USER, password=db_config.DB_PASSWORD,
|
||||
database=db_config.DB_NAME,
|
||||
)
|
||||
|
||||
def insert_import(cursor, study, source_file):
|
||||
cursor.execute(
|
||||
"INSERT INTO iwrs_import (study, imported_at, source_file, report_type) VALUES (%s, %s, %s, %s)",
|
||||
(study, datetime.datetime.now(), source_file, "covance_kit_inventory"),
|
||||
)
|
||||
return cursor.lastrowid
|
||||
|
||||
|
||||
# ── parser ───────────────────────────────────────────────────────────────────
|
||||
|
||||
def find_csv(study):
|
||||
pattern = os.path.join(SOURCE_DIR, f"Protocol {study} sponsor-study-*kit-inventory*.csv")
|
||||
files = glob.glob(pattern)
|
||||
if not files:
|
||||
raise FileNotFoundError(f"Nenalezen CSV soubor: {pattern}")
|
||||
return sorted(files)[-1]
|
||||
|
||||
def parse_site(site_str):
|
||||
"""'CZ10004 - Dr. Erik Herman' → ('CZ10004', 'Dr. Erik Herman')"""
|
||||
if not site_str:
|
||||
return None, None
|
||||
parts = site_str.split(" - ", 1)
|
||||
code = parts[0].strip()
|
||||
name = parts[1].strip() if len(parts) > 1 else None
|
||||
return code, name
|
||||
|
||||
def parse_csv(path):
|
||||
df = pd.read_csv(path, dtype=str)
|
||||
# odstraň metadata řádky na konci (Project No. není číslo)
|
||||
df = df[pd.to_numeric(df["Project No."], errors="coerce").notna()].copy()
|
||||
|
||||
rows = []
|
||||
for _, r in df.iterrows():
|
||||
site_code, investigator_name = parse_site(to_str(r.get("Site")))
|
||||
rows.append({
|
||||
"project_no": to_str(r.get("Project No.")),
|
||||
"region": to_str(r.get("Region")),
|
||||
"country": to_str(r.get("Country")),
|
||||
"site_code": site_code,
|
||||
"investigator_name": investigator_name,
|
||||
"kit_type": to_str(r.get("Kit Type")),
|
||||
"description": to_str(r.get("Description")),
|
||||
"accession": to_str(r.get("Accession")),
|
||||
"shipped_date": to_date(r.get("Shipped Date")),
|
||||
"expiration_date": to_date(r.get("Expiration Date")),
|
||||
"days_to_expiration": to_int(r.get("Days to Expiration")),
|
||||
})
|
||||
return rows
|
||||
|
||||
|
||||
# ── insert ───────────────────────────────────────────────────────────────────
|
||||
|
||||
def insert_kits(cursor, import_id, rows):
|
||||
sql = """INSERT INTO covance_kit_inventory
|
||||
(import_id, study, project_no, region, country, site_code, investigator_name,
|
||||
kit_type, description, accession, shipped_date, expiration_date, days_to_expiration)
|
||||
VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""
|
||||
for r in rows:
|
||||
cursor.execute(sql, (
|
||||
import_id, STUDY,
|
||||
r["project_no"], r["region"], r["country"],
|
||||
r["site_code"], r["investigator_name"],
|
||||
r["kit_type"], r["description"], r["accession"],
|
||||
r["shipped_date"], r["expiration_date"], r["days_to_expiration"],
|
||||
))
|
||||
|
||||
|
||||
# ── main ─────────────────────────────────────────────────────────────────────
|
||||
|
||||
def main():
|
||||
csv_path = find_csv(STUDY)
|
||||
print(f"Soubor: {os.path.basename(csv_path)}")
|
||||
|
||||
rows = parse_csv(csv_path)
|
||||
print(f"Načteno řádků: {len(rows)}")
|
||||
|
||||
conn = get_conn()
|
||||
cursor = conn.cursor()
|
||||
|
||||
import_id = insert_import(cursor, STUDY, os.path.basename(csv_path))
|
||||
print(f"import_id = {import_id}")
|
||||
|
||||
insert_kits(cursor, import_id, rows)
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
print(f"Hotovo — {len(rows)} kitů importováno.")
|
||||
|
||||
|
||||
main()
|
||||
@@ -1,179 +0,0 @@
|
||||
"""
|
||||
Import Covance "All Samples" CSV do MySQL tabulky covance_samples.
|
||||
Strategie: versioning — každý import = nový import_id.
|
||||
Aktuální data: WHERE import_id = (SELECT MAX(import_id) FROM iwrs_import
|
||||
WHERE study = '...' AND report_type = 'covance_samples')
|
||||
"""
|
||||
|
||||
import os
|
||||
import glob
|
||||
import datetime
|
||||
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
import mysql.connector
|
||||
|
||||
import db_config
|
||||
|
||||
SOURCE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "SourceData")
|
||||
STUDY = "42847922MDD3003"
|
||||
|
||||
|
||||
# ── type converters ──────────────────────────────────────────────────────────
|
||||
|
||||
def _py(val):
|
||||
if isinstance(val, np.generic):
|
||||
return val.item()
|
||||
return val
|
||||
|
||||
def to_str(val):
|
||||
val = _py(val)
|
||||
if val is None:
|
||||
return None
|
||||
if isinstance(val, float) and (val != val):
|
||||
return None
|
||||
s = str(val).strip()
|
||||
return None if s.lower() in ("nan", "nat", "none", "") else s
|
||||
|
||||
def to_int(val):
|
||||
val = _py(val)
|
||||
try:
|
||||
v = float(val)
|
||||
return None if (v != v) else int(v)
|
||||
except (TypeError, ValueError):
|
||||
return None
|
||||
|
||||
def to_date(val):
|
||||
val = _py(val)
|
||||
if val is None:
|
||||
return None
|
||||
if isinstance(val, float) and (val != val):
|
||||
return None
|
||||
try:
|
||||
if pd.isna(val):
|
||||
return None
|
||||
except (TypeError, ValueError):
|
||||
pass
|
||||
if isinstance(val, pd.Timestamp):
|
||||
return None if pd.isna(val) else val.date()
|
||||
if isinstance(val, datetime.datetime):
|
||||
return val.date()
|
||||
if isinstance(val, datetime.date):
|
||||
return val
|
||||
s = str(val).strip()
|
||||
if not s or s.lower() in ("nat", "nan", "none", ""):
|
||||
return None
|
||||
for fmt in ("%d-%b-%Y", "%Y-%m-%d", "%d-%m-%Y", "%Y-%m-%d %H:%M:%S"):
|
||||
try:
|
||||
return datetime.datetime.strptime(s, fmt).date()
|
||||
except ValueError:
|
||||
pass
|
||||
return None
|
||||
|
||||
|
||||
# ── DB helpers ───────────────────────────────────────────────────────────────
|
||||
|
||||
def get_conn():
|
||||
return mysql.connector.connect(
|
||||
host=db_config.DB_HOST, port=db_config.DB_PORT,
|
||||
user=db_config.DB_USER, password=db_config.DB_PASSWORD,
|
||||
database=db_config.DB_NAME,
|
||||
)
|
||||
|
||||
def insert_import(cursor, study, source_file):
|
||||
cursor.execute(
|
||||
"INSERT INTO iwrs_import (study, imported_at, source_file, report_type) VALUES (%s, %s, %s, %s)",
|
||||
(study, datetime.datetime.now(), source_file, "covance_samples"),
|
||||
)
|
||||
return cursor.lastrowid
|
||||
|
||||
|
||||
# ── parser ───────────────────────────────────────────────────────────────────
|
||||
|
||||
def find_csv(study):
|
||||
pattern = os.path.join(SOURCE_DIR, f"Protocol {study} - All Samples.csv")
|
||||
files = glob.glob(pattern)
|
||||
if not files:
|
||||
raise FileNotFoundError(f"Nenalezen CSV soubor: {pattern}")
|
||||
return files[0]
|
||||
|
||||
def parse_csv(path):
|
||||
df = pd.read_csv(path, dtype=str)
|
||||
rows = []
|
||||
for _, r in df.iterrows():
|
||||
rows.append({
|
||||
"study": to_str(r.get("Protocol Code")),
|
||||
"investigator_no": to_str(r.get("Investigator No.")),
|
||||
"investigator_name": to_str(r.get("Investigator Name")),
|
||||
"patient_no": to_str(r.get("Patient No.")),
|
||||
"collection_date": to_date(r.get("Collection Date")),
|
||||
"protocol_visit_code": to_str(r.get("Protocol Visit Code")),
|
||||
"kit_receipt_date": to_date(r.get("Kit Receipt Date")),
|
||||
"container_receipt_date": to_date(r.get("Container Receipt Date")),
|
||||
"accession": to_str(r.get("Accession")),
|
||||
"container_no": to_int(r.get("Container No.")),
|
||||
"container_barcode": to_str(r.get("Container Barcode No.")),
|
||||
"specimen_type": to_str(r.get("Specimen Type")),
|
||||
"sample_status": to_str(r.get("Sample Status")),
|
||||
"expected_receipt_condition": to_str(r.get("Expected Receipt Condition")),
|
||||
"actual_receipt_condition": to_str(r.get("Actual Receipt Condition")),
|
||||
"label_line1": to_str(r.get("Container Label Line 1")),
|
||||
"label_line2": to_str(r.get("Container Label Line 2")),
|
||||
"sm_sample_status": to_str(r.get("SM Sample Status")),
|
||||
"smart_class_description": to_str(r.get("SMART Specimen Class Description")),
|
||||
"parent_barcode": to_str(r.get("Parent Barcode")),
|
||||
"children_barcode": to_str(r.get("Children Barcode")),
|
||||
})
|
||||
return rows
|
||||
|
||||
|
||||
# ── insert ───────────────────────────────────────────────────────────────────
|
||||
|
||||
def insert_samples(cursor, import_id, rows):
|
||||
sql = """INSERT INTO covance_samples
|
||||
(import_id, study, investigator_no, investigator_name, patient_no,
|
||||
collection_date, protocol_visit_code, kit_receipt_date, container_receipt_date,
|
||||
accession, container_no, container_barcode, specimen_type, sample_status,
|
||||
expected_receipt_condition, actual_receipt_condition,
|
||||
label_line1, label_line2, sm_sample_status, smart_class_description,
|
||||
parent_barcode, children_barcode)
|
||||
VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""
|
||||
for r in rows:
|
||||
cursor.execute(sql, (
|
||||
import_id,
|
||||
r["study"], r["investigator_no"], r["investigator_name"], r["patient_no"],
|
||||
r["collection_date"], r["protocol_visit_code"],
|
||||
r["kit_receipt_date"], r["container_receipt_date"],
|
||||
r["accession"], r["container_no"], r["container_barcode"],
|
||||
r["specimen_type"], r["sample_status"],
|
||||
r["expected_receipt_condition"], r["actual_receipt_condition"],
|
||||
r["label_line1"], r["label_line2"],
|
||||
r["sm_sample_status"], r["smart_class_description"],
|
||||
r["parent_barcode"], r["children_barcode"],
|
||||
))
|
||||
|
||||
|
||||
# ── main ─────────────────────────────────────────────────────────────────────
|
||||
|
||||
def main():
|
||||
csv_path = find_csv(STUDY)
|
||||
print(f"Soubor: {os.path.basename(csv_path)}")
|
||||
|
||||
rows = parse_csv(csv_path)
|
||||
print(f"Načteno řádků: {len(rows)}")
|
||||
|
||||
conn = get_conn()
|
||||
cursor = conn.cursor()
|
||||
|
||||
import_id = insert_import(cursor, STUDY, os.path.basename(csv_path))
|
||||
print(f"import_id = {import_id}")
|
||||
|
||||
insert_samples(cursor, import_id, rows)
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
print(f"Hotovo — {len(rows)} vzorků importováno.")
|
||||
|
||||
|
||||
main()
|
||||
Reference in New Issue
Block a user