File size: 4,817 Bytes
ce8f04a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import datetime
import uuid
from sqlalchemy import Column, String, DateTime, Boolean, Text, JSON, Integer, Float, Index
from core.subscription.db import Base


class Grant(Base):
    __tablename__ = "grants"

    id = Column(String, primary_key=True, index=True, default=lambda: str(uuid.uuid4()))
    source_id = Column(String, unique=True, index=True, nullable=False)
    name = Column(String, nullable=False)
    program = Column(String, nullable=True)
    status = Column(String, default="active", index=True)
    url = Column(String, nullable=True)
    deadline = Column(String, nullable=True)
    source = Column(String, nullable=False)

    instrument_type = Column(String, default="grant")
    is_financial_instrument = Column(Boolean, default=False)

    eligible_company_sizes = Column(JSON, nullable=True)
    eligible_regions = Column(JSON, nullable=True)
    eligible_beneficiaries = Column(JSON, nullable=True)
    eligible_pkd = Column(JSON, nullable=True)
    description = Column(Text, nullable=True)
    program_goals = Column(Text, nullable=True)
    eligibility_criteria = Column(Text, nullable=True)

    operator = Column(String, nullable=True, index=True)
    program_year = Column(Integer, nullable=True, index=True)
    budget_min_pln = Column(Float, nullable=True)
    budget_max_pln = Column(Float, nullable=True)

    regulation_url = Column(String, nullable=True)
    official_page_url = Column(String, nullable=True)
    application_url = Column(String, nullable=True)

    catalog_hidden = Column(Boolean, default=False, index=True)
    completeness_score = Column(Integer, default=0)
    source_credibility_score = Column(Float, default=0.5)

    eurlex_url = Column(String, nullable=True)
    official_doc_url = Column(String, nullable=True)
    precise_regulation_url = Column(String, nullable=True)

    is_outdated_warning = Column(Boolean, default=False)
    url_warning = Column(String, nullable=True)

    fetched_at = Column(DateTime, default=lambda: datetime.datetime.now(datetime.timezone.utc))
    last_verified = Column(DateTime, nullable=True)

    search_document = Column(Text, nullable=True)

    raw_data = Column(JSON, nullable=True)


class GrantVersion(Base):
    """Wersjonowanie kluczowych zmian (regulamin, termin, status)."""

    __tablename__ = "grant_versions"

    id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
    grant_source_id = Column(String, index=True, nullable=False)
    field_name = Column(String, nullable=False, index=True)
    old_value = Column(Text, nullable=True)
    new_value = Column(Text, nullable=True)
    change_summary = Column(Text, nullable=True)
    detected_at = Column(
        DateTime,
        default=lambda: datetime.datetime.now(datetime.timezone.utc),
        index=True,
    )
    source = Column(String, default="import")
    requires_verification = Column(Boolean, default=False)


class ResearchJob(Base):
    """Kolejka zadań badawczych (Live Research Layer)."""

    __tablename__ = "research_jobs"

    id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
    job_type = Column(String, nullable=False, index=True)
    target_id = Column(String, nullable=True, index=True)
    target_url = Column(String, nullable=True)
    status = Column(String, default="pending", index=True)
    priority = Column(Integer, default=5)
    payload = Column(JSON, nullable=True)
    result = Column(JSON, nullable=True)
    error_message = Column(Text, nullable=True)
    created_at = Column(
        DateTime,
        default=lambda: datetime.datetime.now(datetime.timezone.utc),
        index=True,
    )
    started_at = Column(DateTime, nullable=True)
    completed_at = Column(DateTime, nullable=True)


class HumanVerificationItem(Base):
    """Human Verification Queue dla ważnych zmian."""

    __tablename__ = "human_verification_queue"

    id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
    grant_source_id = Column(String, index=True, nullable=False)
    change_type = Column(String, nullable=False)
    field_name = Column(String, nullable=True)
    old_value = Column(Text, nullable=True)
    new_value = Column(Text, nullable=True)
    summary = Column(Text, nullable=True)
    status = Column(String, default="pending", index=True)
    priority = Column(Integer, default=5)
    created_at = Column(
        DateTime,
        default=lambda: datetime.datetime.now(datetime.timezone.utc),
        index=True,
    )
    resolved_at = Column(DateTime, nullable=True)
    resolved_by = Column(String, nullable=True)
    resolution_note = Column(Text, nullable=True)


Index("ix_grant_versions_grant_field", GrantVersion.grant_source_id, GrantVersion.field_name)
Index("ix_research_jobs_status_priority", ResearchJob.status, ResearchJob.priority)