398 lines
14 KiB
Python
398 lines
14 KiB
Python
"""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
|