File size: 13,996 Bytes
deb8048
 
 
 
 
 
 
 
 
 
 
9cf9a2a
 
 
 
 
 
 
 
 
 
7435134
 
deb8048
 
 
 
 
 
 
9cf9a2a
 
 
 
 
 
deb8048
9cf9a2a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
deb8048
9cf9a2a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
deb8048
9cf9a2a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
deb8048
9cf9a2a
 
deb8048
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9cf9a2a
 
 
 
 
deb8048
 
9cf9a2a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7435134
9cf9a2a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
"""
Seed database with sample Cameroonian laws for testing.

Les categories sont les 14 domaines canoniques, crees PAR LEUR NOM s'ils
manquent, et les lois s'y rattachent par le nom. L'ancienne version semait
cinq categories aux identifiants fixes (1 a 5) et aux noms d'avant la
migration 013 : sur une base migree, elle en ajoutait une quinzieme, et ses
lois pointaient sur la categorie qui portait par hasard l'identifiant 1, 2
ou 3 — le defaut meme que la resolution par le nom a corrige dans le
pipeline.
"""

import asyncio
import sys
from pathlib import Path

# Add parent directory to path
sys.path.insert(0, str(Path(__file__).parent.parent))

from datetime import date

from app.core.database import AsyncSessionLocal, Base, engine
from app.models.law import Article, Category, Law
from app.services.legal_domain_classifier import (
    AFFAIRES,
    CANONICAL_DOMAINS,
    CIVIL,
    DESCRIPTIONS_DOMAINES,
    PENAL,
)

SAMPLE_LAWS = [
    {
        "reference": "LOI-2024-001",
        "title": "Code Civil Camerounais - Livre 1",
        "type": "Loi",
        "domaine": CIVIL,
        "language": "fr",
        "status": "published",
        "publication_date": date(2024, 1, 15),
        "content": """
LOI N° 2024-001 DU 15 JANVIER 2024
RELATIVE AU CODE CIVIL CAMEROUNAIS

TITRE PREMIER - DES PERSONNES

Article 1er. Tout individu possède la personnalité juridique dès sa naissance vivante et viable.

Article 2. La majorité est fixée à vingt et un ans accomplis. À cet âge, toute personne est capable d'exercer tous les droits dont elle jouit.

Article 3. Le domicile d'une personne est au lieu où elle a son principal établissement. Le domicile une fois établi subsiste tant qu'il n'en a pas été créé un autre.

TITRE II - DES BIENS

Article 4. Les biens sont meubles ou immeubles. Cette distinction s'applique à tous les biens corporels ou incorporels.

Article 5. Sont immeubles par nature les fonds de terre et les bâtiments. Sont immeubles par destination les objets mobiliers que le propriétaire a attachés au fonds à perpétuelle demeure.

Article 6. Tous les autres biens sont meubles. Sont réputés meubles par anticipation les récoltes pendantes et les fruits non encore cueillis.

TITRE III - DES OBLIGATIONS

Article 7. Les contrats légalement formés tiennent lieu de loi à ceux qui les ont faits. Ils ne peuvent être révoqués que de leur consentement mutuel ou pour les causes que la loi autorise.

Article 8. Les conventions doivent être exécutées de bonne foi. Elles obligent non seulement à ce qui y est exprimé, mais encore à toutes les suites que l'équité, l'usage ou la loi donnent à l'obligation.

Article 9. La responsabilité civile engage celui qui cause un dommage à autrui à le réparer. Chacun est responsable du dommage qu'il a causé non seulement par son fait, mais encore par sa négligence ou par son imprudence.
""",
        "articles": [
            {"number": "1", "title": "Personnalité juridique", "content": "Tout individu possède la personnalité juridique dès sa naissance vivante et viable.", "order": 1},
            {"number": "2", "title": "Majorité", "content": "La majorité est fixée à vingt et un ans accomplis. À cet âge, toute personne est capable d'exercer tous les droits dont elle jouit.", "order": 2},
            {"number": "3", "title": "Domicile", "content": "Le domicile d'une personne est au lieu où elle a son principal établissement. Le domicile une fois établi subsiste tant qu'il n'en a pas été créé un autre.", "order": 3},
            {"number": "4", "title": "Classification des biens", "content": "Les biens sont meubles ou immeubles. Cette distinction s'applique à tous les biens corporels ou incorporels.", "order": 4},
            {"number": "5", "title": "Immeubles", "content": "Sont immeubles par nature les fonds de terre et les bâtiments. Sont immeubles par destination les objets mobiliers que le propriétaire a attachés au fonds à perpétuelle demeure.", "order": 5},
            {"number": "6", "title": "Meubles", "content": "Tous les autres biens sont meubles. Sont réputés meubles par anticipation les récoltes pendantes et les fruits non encore cueillis.", "order": 6},
            {"number": "7", "title": "Force obligatoire des contrats", "content": "Les contrats légalement formés tiennent lieu de loi à ceux qui les ont faits. Ils ne peuvent être révoqués que de leur consentement mutuel ou pour les causes que la loi autorise.", "order": 7},
            {"number": "8", "title": "Bonne foi", "content": "Les conventions doivent être exécutées de bonne foi. Elles obligent non seulement à ce qui y est exprimé, mais encore à toutes les suites que l'équité, l'usage ou la loi donnent à l'obligation.", "order": 8},
            {"number": "9", "title": "Responsabilité civile", "content": "La responsabilité civile engage celui qui cause un dommage à autrui à le réparer. Chacun est responsable du dommage qu'il a causé non seulement par son fait, mais encore par sa négligence ou par son imprudence.", "order": 9},
        ]
    },
    {
        "reference": "LOI-OHADA-2023-015",
        "title": "Acte Uniforme OHADA - Droit Commercial",
        "type": "Acte Uniforme",
        "domaine": AFFAIRES,
        "language": "fr",
        "status": "published",
        "publication_date": date(2023, 6, 20),
        "content": """
ACTE UNIFORME OHADA N° 2023-015 DU 20 JUIN 2023
RELATIF AU DROIT COMMERCIAL GÉNÉRAL

LIVRE PREMIER - DU COMMERÇANT

Article 1er. Est commerçant celui qui fait de l'accomplissement d'actes de commerce par nature sa profession habituelle.

Article 2. Tout commerçant doit procéder à l'immatriculation au registre du commerce et du crédit mobilier dans le mois du commencement de son activité.

Article 3. Les sociétés commerciales jouissent de la personnalité juridique à compter de leur immatriculation au registre du commerce et du crédit mobilier.

LIVRE II - DES ACTES DE COMMERCE

Article 4. Sont réputés actes de commerce par nature : l'achat de biens meubles ou immeubles en vue de leur revente, les opérations de banque, les opérations de bourse.

Article 5. Les actes de commerce par accessoire sont ceux qui, accomplis par un commerçant pour les besoins de son commerce, constituent des actes de commerce.

LIVRE III - DES SOCIÉTÉS

Article 6. La société est créée par deux ou plusieurs personnes qui conviennent par un contrat d'affecter à une entreprise commune des biens ou leur industrie en vue de partager le bénéfice ou de profiter de l'économie qui pourra en résulter.

Article 7. Les formes de sociétés commerciales reconnues sont : la société en nom collectif, la société en commandite simple, la société à responsabilité limitée, et la société anonyme.
""",
        "articles": [
            {"number": "1", "title": "Définition du commerçant", "content": "Est commerçant celui qui fait de l'accomplissement d'actes de commerce par nature sa profession habituelle.", "order": 1},
            {"number": "2", "title": "Immatriculation", "content": "Tout commerçant doit procéder à l'immatriculation au registre du commerce et du crédit mobilier dans le mois du commencement de son activité.", "order": 2},
            {"number": "3", "title": "Personnalité juridique des sociétés", "content": "Les sociétés commerciales jouissent de la personnalité juridique à compter de leur immatriculation au registre du commerce et du crédit mobilier.", "order": 3},
            {"number": "4", "title": "Actes de commerce par nature", "content": "Sont réputés actes de commerce par nature : l'achat de biens meubles ou immeubles en vue de leur revente, les opérations de banque, les opérations de bourse.", "order": 4},
            {"number": "5", "title": "Actes de commerce par accessoire", "content": "Les actes de commerce par accessoire sont ceux qui, accomplis par un commerçant pour les besoins de son commerce, constituent des actes de commerce.", "order": 5},
            {"number": "6", "title": "Définition de la société", "content": "La société est créée par deux ou plusieurs personnes qui conviennent par un contrat d'affecter à une entreprise commune des biens ou leur industrie en vue de partager le bénéfice ou de profiter de l'économie qui pourra en résulter.", "order": 6},
            {"number": "7", "title": "Formes de sociétés", "content": "Les formes de sociétés commerciales reconnues sont : la société en nom collectif, la société en commandite simple, la société à responsabilité limitée, et la société anonyme.", "order": 7},
        ]
    },
    {
        "reference": "LOI-2016-007",
        "title": "Code Pénal Camerounais",
        "type": "Loi",
        "domaine": PENAL,
        "language": "fr",
        "status": "published",
        "publication_date": date(2016, 7, 12),
        "content": """
LOI N° 2016-007 DU 12 JUILLET 2016
PORTANT CODE PÉNAL

LIVRE PREMIER - DISPOSITIONS GÉNÉRALES

Article 1er. Nul ne peut être puni qu'en vertu d'une loi antérieure aux faits qui lui sont reprochés.

Article 2. Les infractions sont classées en trois catégories : les contraventions, les délits et les crimes.

Article 3. La tentative d'un crime est toujours punissable. La tentative d'un délit n'est punissable que si la loi le prévoit expressément.

LIVRE II - DES INFRACTIONS

Article 4. Le vol est la soustraction frauduleuse de la chose d'autrui. Il est puni d'un emprisonnement de six mois à cinq ans et d'une amende.

Article 5. L'escroquerie est le fait d'obtenir un bien ou un avantage par des manœuvres frauduleuses. Elle est punie d'un emprisonnement d'un à cinq ans.

Article 6. Le meurtre est le fait de donner volontairement la mort à autrui. Il est puni de la réclusion criminelle à perpétuité.
""",
        "articles": [
            {"number": "1", "title": "Principe de légalité", "content": "Nul ne peut être puni qu'en vertu d'une loi antérieure aux faits qui lui sont reprochés.", "order": 1},
            {"number": "2", "title": "Classification des infractions", "content": "Les infractions sont classées en trois catégories : les contraventions, les délits et les crimes.", "order": 2},
            {"number": "3", "title": "Tentative", "content": "La tentative d'un crime est toujours punissable. La tentative d'un délit n'est punissable que si la loi le prévoit expressément.", "order": 3},
            {"number": "4", "title": "Vol", "content": "Le vol est la soustraction frauduleuse de la chose d'autrui. Il est puni d'un emprisonnement de six mois à cinq ans et d'une amende.", "order": 4},
            {"number": "5", "title": "Escroquerie", "content": "L'escroquerie est le fait d'obtenir un bien ou un avantage par des manœuvres frauduleuses. Elle est punie d'un emprisonnement d'un à cinq ans.", "order": 5},
            {"number": "6", "title": "Meurtre", "content": "Le meurtre est le fait de donner volontairement la mort à autrui. Il est puni de la réclusion criminelle à perpétuité.", "order": 6},
        ]
    }
]


async def seed_database():
    """Seed the database with sample data."""
    print("=" * 80)
    print("SEEDING DATABASE WITH SAMPLE LAWS")
    print("=" * 80)

    # Create tables
    print("\n[1/4] Creating database tables...")
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)
    print("   Tables created successfully")

    async with AsyncSessionLocal() as session:
        # Les 14 domaines, par leur nom : seuls les manquants sont crees.
        print("\n[2/4] Creating categories...")
        from sqlalchemy import select
        presents = {
            nom.lower(): identifiant
            for nom, identifiant in (await session.execute(select(Category.name, Category.id))).all()
        }
        crees = 0
        for ordre, nom in enumerate(CANONICAL_DOMAINS):
            if nom.lower() not in presents:
                session.add(Category(
                    name=nom, description=DESCRIPTIONS_DOMAINES[nom], display_order=ordre,
                ))
                crees += 1
        await session.commit()
        ids = {
            nom.lower(): identifiant
            for nom, identifiant in (await session.execute(select(Category.name, Category.id))).all()
        }
        print(f"   {crees} created, {len(CANONICAL_DOMAINS) - crees} already present")

        # Create laws with articles
        print("\n[3/4] Creating laws and articles...")
        for law_data in SAMPLE_LAWS:
            articles_data = law_data.pop("articles")
            # Rattachement par le NOM du domaine, jamais par une position.
            law_data["category_id"] = ids[law_data.pop("domaine").lower()]
            law = Law(**law_data)
            session.add(law)
            await session.flush()  # Get law ID

            # Create articles
            for art_data in articles_data:
                article = Article(law_id=law.id, **art_data)
                session.add(article)

            print(f"   Created law: {law.reference} with {len(articles_data)} articles")

        await session.commit()
        print(f"   Total: {len(SAMPLE_LAWS)} laws created")

        # Verify
        print("\n[4/4] Verifying data...")
        from sqlalchemy import func, select

        result = await session.execute(select(func.count(Law.id)))
        law_count = result.scalar()

        result = await session.execute(select(func.count(Article.id)))
        article_count = result.scalar()

        result = await session.execute(select(func.count(Category.id)))
        category_count = result.scalar()

        print(f"   Categories: {category_count}")
        print(f"   Laws: {law_count}")
        print(f"   Articles: {article_count}")

    print("\n" + "=" * 80)
    print("[SUCCESS] Database seeded successfully!")
    print("=" * 80)


if __name__ == "__main__":
    asyncio.run(seed_database())