"""cleanup overview demo data Revision ID: 20260331_01 Revises: 20260302_02 Create Date: 2026-03-31 10:45:00.000000 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa revision: str = "20260331_01" down_revision: Union[str, None] = "20260302_02" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None DEMO_FEASIBILITY_CODES = ("PROJ-001", "PROJ-002", "PROJ-003", "PROJ-004", "PROJ-005") DEMO_ETHICS_CODES = ("EC-001", "EC-002", "EC-003", "EC-004") DEMO_FINANCE_CONTRACT_CODES = ("CT-001", "CT-002", "CT-003") DEMO_STUDY_CODE = "DEMO-CTMS" def upgrade() -> None: conn = op.get_bind() conn.execute( sa.text( """ WITH candidate_studies AS ( SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes) UNION SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes) UNION SELECT DISTINCT study_id FROM finance_contracts WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY' UNION SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]' UNION SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$' ), candidate_sites AS ( SELECT DISTINCT site_id FROM startup_feasibility WHERE study_id IN (SELECT study_id FROM candidate_studies) AND project_no = ANY(:feasibility_codes) UNION SELECT DISTINCT site_id FROM startup_ethics WHERE study_id IN (SELECT study_id FROM candidate_studies) AND ( approval_no = ANY(:ethics_codes) OR ( approval_no IS NULL AND submit_date = DATE '2025-01-10' AND accept_date = DATE '2025-01-15' AND meeting_date IS NULL AND approved_date IS NULL ) OR ( approval_no IS NULL AND submit_date = DATE '2025-01-20' AND accept_date = DATE '2025-01-25' AND meeting_date IS NULL AND approved_date IS NULL ) OR ( approval_no IS NULL AND submit_date = DATE '2025-01-30' AND accept_date = DATE '2025-02-04' AND meeting_date IS NULL AND approved_date IS NULL ) ) UNION SELECT DISTINCT site_id FROM kickoff_meetings WHERE study_id IN (SELECT study_id FROM candidate_studies) AND attendees::text = '["研究者", "CRA", "PM"]' UNION SELECT DISTINCT site_id FROM subjects WHERE study_id IN (SELECT study_id FROM candidate_studies) AND subject_no ~ '^S0[1-3]-[0-9]{3}$' ) UPDATE sites SET enrollment_target = 0 WHERE id IN (SELECT site_id FROM candidate_sites WHERE site_id IS NOT NULL) AND enrollment_target IN (40, 50, 60, 70, 80) """ ), { "feasibility_codes": list(DEMO_FEASIBILITY_CODES), "ethics_codes": list(DEMO_ETHICS_CODES), "contract_codes": list(DEMO_FINANCE_CONTRACT_CODES), }, ) conn.execute( sa.text( """ WITH candidate_studies AS ( SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes) UNION SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes) UNION SELECT DISTINCT study_id FROM finance_contracts WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY' UNION SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]' UNION SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$' ) DELETE FROM subjects WHERE study_id IN (SELECT study_id FROM candidate_studies) AND subject_no ~ '^S0[1-3]-[0-9]{3}$' """ ), { "feasibility_codes": list(DEMO_FEASIBILITY_CODES), "ethics_codes": list(DEMO_ETHICS_CODES), "contract_codes": list(DEMO_FINANCE_CONTRACT_CODES), }, ) conn.execute( sa.text( """ WITH candidate_studies AS ( SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes) UNION SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes) UNION SELECT DISTINCT study_id FROM finance_contracts WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY' UNION SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]' UNION SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$' ) DELETE FROM kickoff_meetings WHERE study_id IN (SELECT study_id FROM candidate_studies) AND attendees::text = '["研究者", "CRA", "PM"]' """ ), { "feasibility_codes": list(DEMO_FEASIBILITY_CODES), "ethics_codes": list(DEMO_ETHICS_CODES), "contract_codes": list(DEMO_FINANCE_CONTRACT_CODES), }, ) conn.execute( sa.text( """ WITH candidate_studies AS ( SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes) UNION SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes) UNION SELECT DISTINCT study_id FROM finance_contracts WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY' UNION SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]' UNION SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$' ) DELETE FROM finance_contracts WHERE study_id IN (SELECT study_id FROM candidate_studies) AND contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY' """ ), { "feasibility_codes": list(DEMO_FEASIBILITY_CODES), "ethics_codes": list(DEMO_ETHICS_CODES), "contract_codes": list(DEMO_FINANCE_CONTRACT_CODES), }, ) conn.execute( sa.text( """ WITH candidate_studies AS ( SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes) UNION SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes) UNION SELECT DISTINCT study_id FROM finance_contracts WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY' UNION SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]' UNION SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$' ) DELETE FROM startup_ethics WHERE study_id IN (SELECT study_id FROM candidate_studies) AND ( approval_no = ANY(:ethics_codes) OR ( approval_no IS NULL AND submit_date = DATE '2025-01-10' AND accept_date = DATE '2025-01-15' AND meeting_date IS NULL AND approved_date IS NULL ) OR ( approval_no IS NULL AND submit_date = DATE '2025-01-20' AND accept_date = DATE '2025-01-25' AND meeting_date IS NULL AND approved_date IS NULL ) OR ( approval_no IS NULL AND submit_date = DATE '2025-01-30' AND accept_date = DATE '2025-02-04' AND meeting_date IS NULL AND approved_date IS NULL ) ) """ ), { "feasibility_codes": list(DEMO_FEASIBILITY_CODES), "ethics_codes": list(DEMO_ETHICS_CODES), "contract_codes": list(DEMO_FINANCE_CONTRACT_CODES), }, ) conn.execute( sa.text( """ WITH candidate_studies AS ( SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes) UNION SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes) UNION SELECT DISTINCT study_id FROM finance_contracts WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY' UNION SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]' UNION SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$' ) DELETE FROM startup_feasibility WHERE study_id IN (SELECT study_id FROM candidate_studies) AND project_no = ANY(:feasibility_codes) """ ), { "feasibility_codes": list(DEMO_FEASIBILITY_CODES), "ethics_codes": list(DEMO_ETHICS_CODES), "contract_codes": list(DEMO_FINANCE_CONTRACT_CODES), }, ) conn.execute( sa.text( """ WITH demo_study AS ( SELECT id FROM studies WHERE code = :demo_study_code ), demo_contract_fees AS ( SELECT id FROM contract_fees WHERE project_id IN (SELECT id FROM demo_study) ), demo_special_expenses AS ( SELECT id FROM special_expenses WHERE project_id IN (SELECT id FROM demo_study) ) DELETE FROM fee_attachments WHERE ( entity_type = 'contract_fee' AND entity_id IN (SELECT id FROM demo_contract_fees) ) OR ( entity_type = 'special_expense' AND entity_id IN (SELECT id FROM demo_special_expenses) ) OR ( url IN ( 'https://example.com/contract-demo.pdf', 'https://example.com/voucher-demo.pdf', 'https://example.com/invoice-demo.pdf' ) ) """ ), { "demo_study_code": DEMO_STUDY_CODE, }, ) conn.execute( sa.text( """ WITH demo_study AS ( SELECT id FROM studies WHERE code = :demo_study_code ), demo_contract_fees AS ( SELECT id FROM contract_fees WHERE project_id IN (SELECT id FROM demo_study) ) DELETE FROM contract_fee_payments WHERE contract_fee_id IN (SELECT id FROM demo_contract_fees) """ ), { "demo_study_code": DEMO_STUDY_CODE, }, ) conn.execute( sa.text( """ DELETE FROM contract_fees WHERE project_id IN ( SELECT id FROM studies WHERE code = :demo_study_code ) """ ), { "demo_study_code": DEMO_STUDY_CODE, }, ) conn.execute( sa.text( """ DELETE FROM special_expenses WHERE project_id IN ( SELECT id FROM studies WHERE code = :demo_study_code ) """ ), { "demo_study_code": DEMO_STUDY_CODE, }, ) conn.execute( sa.text( """ DELETE FROM sites WHERE study_id IN ( SELECT id FROM studies WHERE code = :demo_study_code ) AND name LIKE '示例中心 %' """ ), { "demo_study_code": DEMO_STUDY_CODE, }, ) conn.execute( sa.text( """ DELETE FROM studies WHERE code = :demo_study_code """ ), { "demo_study_code": DEMO_STUDY_CODE, }, ) def downgrade() -> None: return