z230
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
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
+367
@@ -0,0 +1,367 @@
|
||||
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,,,,,,,,
|
||||
|
@@ -0,0 +1,52 @@
|
||||
"""
|
||||
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.")
|
||||
@@ -0,0 +1,43 @@
|
||||
"""
|
||||
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.")
|
||||
@@ -0,0 +1,447 @@
|
||||
"""
|
||||
Covance samples report pro studii 42847922MDD3003.
|
||||
Čte z MySQL (nejnovější import), generuje Excel s 5 listy:
|
||||
1. Přehled — agregát per pacient+visit (Received / Not Received / Cancelled)
|
||||
2. Chybějící — detail Not Received vzorků
|
||||
3. Kity — pivot kit inventory: centra × typy kitů
|
||||
4. ZDROJ — surová data samples
|
||||
5. ZDROJ Kity — surová data kit inventory
|
||||
"""
|
||||
|
||||
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")
|
||||
|
||||
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_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):
|
||||
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})", 8)
|
||||
|
||||
headers = ["Site", "Investigátor", "Pacient", "Visit", "Datum odběru",
|
||||
"Celkem", "Received", "Not Received"]
|
||||
widths = [9, 22, 14, 12, 14, 8, 10, 13]
|
||||
write_headers(ws, headers, widths)
|
||||
|
||||
agg = (
|
||||
df.groupby(["investigator_no", "investigator_name",
|
||||
"patient_no", "protocol_visit_code", "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
|
||||
fill = NOTRCV_FILL if has_missing else (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"], 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) else LEFT
|
||||
if c_idx == 8 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:H{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í
|
||||
ws.column_dimensions["A"].width = 9
|
||||
ws.column_dimensions["B"].width = 28
|
||||
ws.column_dimensions["C"].width = 14
|
||||
ws.column_dimensions["D"].width = 14
|
||||
|
||||
write_title(ws, f"Kit Inventory — {STUDY} ({today_str})", 4)
|
||||
|
||||
# sub-header (řádek 2)
|
||||
for col, txt in [(1, "Kit Type"), (2, "Popis"),
|
||||
(3, f"Expiruje ≤30 dní\n({cutoff.strftime('%d-%b-%Y')})"),
|
||||
(4, "Expiruje >30 dní")]:
|
||||
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
|
||||
ws.row_dimensions[2].height = 28
|
||||
|
||||
cur_row = 3
|
||||
|
||||
for site_code, investigator in sites:
|
||||
# ── site header ───────────────────────────────────────────────────────
|
||||
ws.merge_cells(f"A{cur_row}:D{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, 5):
|
||||
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()
|
||||
# přepočítej expiraci od dnešního dne
|
||||
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
|
||||
|
||||
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)
|
||||
ws.row_dimensions[cur_row].height = 16
|
||||
cur_row += 1
|
||||
|
||||
# ── součet centra ─────────────────────────────────────────────────────
|
||||
_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)
|
||||
ws.row_dimensions[cur_row].height = 16
|
||||
cur_row += 2 # prázdný řádek mezi centry
|
||||
|
||||
ws.freeze_panes = "A3"
|
||||
|
||||
|
||||
# ── sheet 4: ZDROJ (samples) ─────────────────────────────────────────────────
|
||||
|
||||
# ── sheet 5: 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"
|
||||
|
||||
|
||||
# ── 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()
|
||||
print(f" Vzorky: {len(df)} řádků, {df['patient_no'].nunique()} pacientů")
|
||||
print(f" Kity: {len(df_kits)} kitů, {df_kits['site_code'].nunique()} center")
|
||||
|
||||
wb = Workbook()
|
||||
wb.remove(wb.active)
|
||||
|
||||
write_prehled(wb, df)
|
||||
write_chybejici(wb, df)
|
||||
write_kity(wb, df_kits)
|
||||
write_zdroj(wb, df)
|
||||
write_zdroj_kity(wb, df_kits)
|
||||
|
||||
today = datetime.date.today().strftime("%Y-%m-%d")
|
||||
out_path = unique_path(f"{today} {STUDY} Covance Samples")
|
||||
wb.save(out_path)
|
||||
print(f"Uloženo: {out_path}")
|
||||
|
||||
|
||||
main()
|
||||
@@ -0,0 +1,5 @@
|
||||
DB_HOST = "192.168.1.76"
|
||||
DB_PORT = 3306
|
||||
DB_USER = "root"
|
||||
DB_PASSWORD = "Vlado9674+"
|
||||
DB_NAME = "studie"
|
||||
@@ -0,0 +1,172 @@
|
||||
"""
|
||||
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()
|
||||
@@ -0,0 +1,179 @@
|
||||
"""
|
||||
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