File size: 6,634 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
"""
Module pour la génération des contrats en format PDF.
"""
import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm
from reportlab.platypus import SimpleDocTemplate
from reportlab.pdfbase import pdfform
from reportlab.lib.colors import black

from config import PDF_CONFIG
from contract_builder import ContractBuilder
from utils import create_temp_file, ensure_default_supports


def generate_pdf(contract_type, is_free, author_type, author_info,
                work_description, image_description, supports,
                additional_rights, remuneration, is_exclusive):
    """
    Génère un PDF du contrat avec des champs interactifs.
    
    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:
        str: Chemin vers le fichier PDF généré
    """
    # Conversion des paramètres
    is_free_bool = (is_free == "Gratuite")
    is_exclusive_bool = bool(is_exclusive)
    
    # Ajouter les supports par défaut
    final_supports = ensure_default_supports(supports)
    
    # Créer un nom de fichier temporaire pour le PDF
    output_filename = create_temp_file(prefix="contrat_cession_", suffix=".pdf")
    
    # Générer le contenu du contrat
    contract_elements = ContractBuilder.build_contract_elements(
        contract_type, is_free_bool, author_type, author_info,
        work_description, image_description, final_supports,
        additional_rights, remuneration, is_exclusive_bool
    )
    
    # Créer un document PDF
    buffer = io.BytesIO()
    doc = SimpleDocTemplate(buffer, pagesize=A4,
                           rightMargin=PDF_CONFIG['margin_right']*mm, 
                           leftMargin=PDF_CONFIG['margin_left']*mm,
                           topMargin=PDF_CONFIG['margin_top']*mm, 
                           bottomMargin=PDF_CONFIG['margin_bottom']*mm)
    
    # Construire le document avec tous les éléments
    doc.build(contract_elements)
    
    # Ajouter des champs interactifs pour les signatures
    buffer.seek(0)
    buffer_champs = io.BytesIO()
    
    p = canvas.Canvas(buffer_champs, pagesize=A4)
    form = p.acroForm
    
    # Déterminer le nom du cédant en fonction du type de contrat
    if "Auteur (droits d'auteur)" in contract_type and "Image (droit à l'image)" in contract_type:
        cedant_label = "l'Auteur et Modèle"
    elif "Auteur (droits d'auteur)" in contract_type:
        cedant_label = "l'Auteur"
    else:
        cedant_label = "le Modèle"
    
    # Champ pour le lieu (position sur dernière page)
    form.textfield(name='lieu', tooltip='Lieu de signature',
                  x=80, y=140, width=100, height=15,
                  borderWidth=0, forceBorder=True)
    
    # Champ pour la date
    form.textfield(name='date', tooltip='Date de signature',
                  x=230, y=140, width=100, height=15, 
                  borderWidth=0, forceBorder=True)
    
    # Champ pour la mention "Lu et approuvé" du cédant
    form.textfield(name='mention_cedant', tooltip='Mention "Lu et approuvé"',
                  x=70, y=95, width=150, height=15,
                  borderWidth=0, forceBorder=True)
    
    # Champ pour la mention "Lu et approuvé" du cessionnaire
    form.textfield(name='mention_cessionnaire', tooltip='Mention "Lu et approuvé"',
                  x=350, y=95, width=150, height=15,
                  borderWidth=0, forceBorder=True)
    
    # Champs pour les signatures
    form.textfield(name='signature_cedant', tooltip=f'Signature de {cedant_label}',
                  x=70, y=60, width=150, height=30,
                  borderWidth=0, forceBorder=True)
    
    form.textfield(name='signature_cessionnaire', tooltip='Signature du Cessionnaire',
                  x=350, y=60, width=150, height=30,
                  borderWidth=0, forceBorder=True)
    
    # Ajouter des champs pour le paraphe sur chaque page
    # Ces champs sont placés en bas de chaque page pour permettre le paraphe
    page_count = doc.page_count
    for page in range(1, page_count):
        p.showPage()  # Aller à la page suivante
        form.textfield(name=f'paraphe_cedant_{page}', tooltip=f'Paraphe {cedant_label} - page {page}',
                      x=70, y=30, width=50, height=20,
                      borderWidth=0, forceBorder=True)
        form.textfield(name=f'paraphe_cessionnaire_{page}', tooltip=f'Paraphe Cessionnaire - page {page}',
                      x=350, y=30, width=50, height=20,
                      borderWidth=0, forceBorder=True)
    
    # Finaliser et sauvegarder le PDF
    p.save()
    
    # Sauvegarder le PDF dans un fichier temporaire
    with open(output_filename, 'wb') as f:
        f.write(buffer.getvalue())
        f.write(buffer_champs.getvalue())
    
    return output_filename


def add_interactive_fields(pdf_path, contract_type):
    """
    Ajoute des champs interactifs à un PDF existant.
    
    Args:
        pdf_path (str): Chemin vers le PDF
        contract_type (list): Liste des types de contrats sélectionnés
        
    Returns:
        str: Chemin vers le PDF avec champs interactifs
    """
    # Ce code peut être utilisé si on veut ajouter des champs à un PDF existant
    # plutôt que de les créer en même temps
    output_filename = create_temp_file(prefix="contrat_interactif_", suffix=".pdf")
    
    p = canvas.Canvas(output_filename, pagesize=A4)
    form = p.acroForm
    
    # Déterminer le nom du cédant en fonction du type de contrat
    if "Auteur (droits d'auteur)" in contract_type and "Image (droit à l'image)" in contract_type:
        cedant_label = "l'Auteur et Modèle"
    elif "Auteur (droits d'auteur)" in contract_type:
        cedant_label = "l'Auteur"
    else:
        cedant_label = "le Modèle"
    
    # Ajouter des champs similaires à ceux de la fonction generate_pdf
    # Ici, on assume que le PDF a une structure similaire
    
    # Sauvegarder le PDF
    p.save()
    
    return output_filename