File size: 7,796 Bytes
2e25654
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
Module pour la construction des contrats à partir des templates.
"""
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_JUSTIFY
from reportlab.platypus import Paragraph, Spacer

from contract_templates import ContractTemplates
from utils import ensure_default_supports, sanitize_text


class ContractBuilder:
    """
    Classe responsable de la construction des contrats complets à partir des templates.
    """
    
    @staticmethod
    def get_styles():
        """
        Retourne les styles pour le document PDF.
        
        Returns:
            dict: Dictionnaire des styles
        """
        styles = getSampleStyleSheet()
        styles.add(ParagraphStyle(name='Titre', 
                                 fontName='Helvetica-Bold', 
                                 fontSize=14, 
                                 alignment=TA_CENTER,
                                 spaceAfter=12))
        styles.add(ParagraphStyle(name='Sous-titre', 
                                 fontName='Helvetica-Bold', 
                                 fontSize=12, 
                                 spaceAfter=10))
        styles.add(ParagraphStyle(name='Normal', 
                                 fontName='Helvetica', 
                                 fontSize=10, 
                                 alignment=TA_JUSTIFY,
                                 spaceAfter=6))
        styles.add(ParagraphStyle(name='Article', 
                                 fontName='Helvetica-Bold', 
                                 fontSize=11, 
                                 spaceAfter=8))
        return styles
    
    @staticmethod
    def build_contract_elements(contract_type, is_free, author_type, author_info, 
                               work_description, image_description, supports, 
                               additional_rights, remuneration, is_exclusive):
        """
        Construit tous les éléments du contrat.
        
        Args:
            contract_type (list): Liste des types de contrats sélectionnés
            is_free (bool): True si la cession est gratuite, False sinon
            author_type (str): Type d'auteur ("Personne physique" ou "Personne morale")
            author_info (dict): Informations sur l'auteur
            work_description (str): Description de l'œuvre
            image_description (str): Description de l'image
            supports (list): Liste des supports sélectionnés
            additional_rights (list): Liste des droits supplémentaires sélectionnés
            remuneration (str): Modalités de rémunération
            is_exclusive (bool): True si la cession est exclusive, False sinon
            
        Returns:
            list: Liste des éléments du contrat pour ReportLab
        """
        # Obtenir les styles
        styles = ContractBuilder.get_styles()
        
        # Initialiser la liste des éléments
        elements = []
        
        # 1. Titre du contrat
        title = ContractTemplates.get_title(contract_type)
        elements.append(Paragraph(title, styles['Titre']))
        elements.append(Spacer(1, 10))
        
        # 2. Préambule
        preamble_text = ContractTemplates.get_preamble_text(contract_type, author_type, author_info)
        for paragraph in preamble_text.split('\n\n'):
            if paragraph.strip():
                elements.append(Paragraph(paragraph, styles['Normal']))
                elements.append(Spacer(1, 6))
        
        # 3. Article 1 - Objet
        object_clause = ContractTemplates.get_object_clause(
            contract_type, 
            sanitize_text(work_description), 
            sanitize_text(image_description)
        )
        elements.append(Paragraph(object_clause, styles['Article']))
        elements.append(Spacer(1, 10))
        
        # Compteur d'articles
        article_num = 2
        
        # 4. Article 2 - Droits cédés (pour contrat droits d'auteur)
        if "Auteur (droits d'auteur)" in contract_type:
            rights_clause = ContractTemplates.get_author_rights_clause(is_free, is_exclusive, additional_rights)
            for paragraph in rights_clause.split('\n\n'):
                if paragraph.strip():
                    elements.append(Paragraph(paragraph, styles['Normal']))
                    elements.append(Spacer(1, 6))
            article_num += 1
        
        # 5. Article sur les droits à l'image (pour contrat droit à l'image)
        if "Image (droit à l'image)" in contract_type:
            image_rights_article_num = article_num if "Auteur (droits d'auteur)" not in contract_type else article_num
            image_clause = ContractTemplates.get_image_rights_clause(is_free, is_exclusive)
            image_clause = image_clause.replace("Article 2", f"Article {image_rights_article_num}")
            for paragraph in image_clause.split('\n\n'):
                if paragraph.strip():
                    elements.append(Paragraph(paragraph, styles['Normal']))
                    elements.append(Spacer(1, 6))
            article_num += 1
        
        # 6. Article - Durée et territoire
        duration_clause = ContractTemplates.get_duration_territory_clause(article_num)
        for paragraph in duration_clause.split('\n\n'):
            if paragraph.strip():
                elements.append(Paragraph(paragraph, styles['Normal']))
                elements.append(Spacer(1, 6))
        article_num += 1
        
        # 7. Article - Supports d'exploitation
        final_supports = ensure_default_supports(supports)
        supports_clause = ContractTemplates.get_supports_clause(article_num, final_supports)
        for paragraph in supports_clause.split('\n\n'):
            if paragraph.strip():
                elements.append(Paragraph(paragraph, styles['Normal']))
                elements.append(Spacer(1, 6))
        article_num += 1
        
        # 8. Article - Rémunération
        remuneration_clause = ContractTemplates.get_remuneration_clause(article_num, is_free, sanitize_text(remuneration))
        for paragraph in remuneration_clause.split('\n\n'):
            if paragraph.strip():
                elements.append(Paragraph(paragraph, styles['Normal']))
                elements.append(Spacer(1, 6))
        article_num += 1
        
        # 9. Article - Garanties
        warranties_clause = ContractTemplates.get_warranties_clause(article_num, contract_type)
        for paragraph in warranties_clause.split('\n\n'):
            if paragraph.strip():
                elements.append(Paragraph(paragraph, styles['Normal']))
                elements.append(Spacer(1, 6))
        article_num += 1
        
        # 10. Article - Résiliation
        termination_clause = ContractTemplates.get_termination_clause(article_num)
        for paragraph in termination_clause.split('\n\n'):
            if paragraph.strip():
                elements.append(Paragraph(paragraph, styles['Normal']))
                elements.append(Spacer(1, 6))
        article_num += 1
        
        # 11. Article - Loi applicable
        law_clause = ContractTemplates.get_applicable_law_clause(article_num)
        for paragraph in law_clause.split('\n\n'):
            if paragraph.strip():
                elements.append(Paragraph(paragraph, styles['Normal']))
                elements.append(Spacer(1, 6))
        
        # 12. Signatures
        elements.append(Spacer(1, 20))
        signatures = ContractTemplates.get_signatures_template(contract_type)
        for paragraph in signatures.split('\n\n'):
            if paragraph.strip():
                elements.append(Paragraph(paragraph, styles['Normal']))
                elements.append(Spacer(1, 8))
        
        return elements