-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsave_jointure.php
More file actions
178 lines (149 loc) · 8.98 KB
/
Copy pathsave_jointure.php
File metadata and controls
178 lines (149 loc) · 8.98 KB
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
<?php
require_once 'api/db_connect.php';
require_once 'api/auth_check.php'; // Ajouter la vérification d'authentification pour la sécurité
if (!check_auth()) {
// Rediriger ou afficher une erreur si non authentifié
header('Location: login.html'); // Ou gérer selon le cas pour votre application
exit();
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$client_id = $_POST['client_id'] ?? '';
$equipement_a_raw_id = $_POST['site_a_id'] ?? '';
$equipement_b_raw_id = $_POST['site_b_id'] ?? '';
// Nettoyer les IDs pour retirer le suffixe '_virtual' si présent
$site_a_id = str_replace('_virtual', '', $equipement_a_raw_id);
$site_b_id = str_replace('_virtual', '', $equipement_b_raw_id);
// Validation simple
if (empty($client_id) || empty($site_a_id) || empty($site_b_id)) {
// Au lieu de faire un echo, rediriger avec un message d'erreur ou renvoyer du JSON
header("Location: ajouter_jointure.php?error=1&message=" . urlencode("Tous les champs (Client, Équipement A, et Équipement B) sont requis."));
exit();
}
// Assurez-vous que les IDs sont des entiers
$client_id = (int)$client_id;
$site_a_id = (int)$site_a_id;
$site_b_id = (int)$site_b_id;
try {
$pdo = get_db_connection();
$pdo->beginTransaction(); // Démarrer la transaction
// Vérifier les doublons de jointure (paire d'équipements)
$check_sql = "SELECT COUNT(*) FROM jointures WHERE client_id = :client_id AND ((site_id = :site_a_id_1 AND equipement_id = :site_b_id_1) OR (site_id = :site_b_id_2 AND equipement_id = :site_a_id_2))";
$check_stmt = $pdo->prepare($check_sql);
$check_stmt->bindParam(':client_id', $client_id, PDO::PARAM_INT);
$check_stmt->bindParam(':site_a_id_1', $site_a_id, PDO::PARAM_INT);
$check_stmt->bindParam(':site_b_id_1', $site_b_id, PDO::PARAM_INT);
$check_stmt->bindParam(':site_b_id_2', $site_b_id, PDO::PARAM_INT);
$check_stmt->bindParam(':site_a_id_2', $site_a_id, PDO::PARAM_INT);
$check_stmt->execute();
$count = $check_stmt->fetchColumn();
if ($count > 0) {
throw new Exception("Cette jointure existe déjà pour ce client (entre ces deux équipements).");
}
// Récupérer les wilayas des équipements pour générer la référence intelligente
$stmt_w = $pdo->prepare("SELECT id, wilaya_id FROM equipements WHERE id IN (:id1, :id2)");
$stmt_w->execute([':id1' => $site_a_id, ':id2' => $site_b_id]);
$equip_data = $stmt_w->fetchAll(PDO::FETCH_KEY_PAIR);
$wA = $equip_data[$site_a_id] ?? 0;
$wB = $equip_data[$site_b_id] ?? 0;
// Déterminer le préfixe (ex: 3416 pour une liaison BBA-Alger)
// On trie les codes pour que 3416 et 1634 donnent le même préfixe
$codes = [str_pad($wA, 2, '0', STR_PAD_LEFT), str_pad($wB, 2, '0', STR_PAD_LEFT)];
sort($codes);
$prefix = implode('', $codes);
// Chercher le prochain numéro pour ce préfixe
$stmt_count = $pdo->prepare("SELECT COUNT(*) FROM jointures WHERE ref_jointure LIKE :prefix");
$stmt_count->execute([':prefix' => $prefix . '-%']);
$next_num = $stmt_count->fetchColumn() + 1;
$ref_jointure = $prefix . '-' . $next_num;
// Récupérer le statut virtuel
$is_virtual = isset($_POST['is_virtual']) && $_POST['is_virtual'] === '1' ? 1 : 0;
// Récupérer la wilaya de l'utilisateur connecté
if (session_status() === PHP_SESSION_NONE) session_start();
$user_wilaya_id = $_SESSION['wilaya_id'] ?? null;
// Insérer la jointure avec la wilaya_id et la ref_jointure
$insert_sql = "INSERT INTO jointures (client_id, wilaya_id, ref_jointure, site_id, equipement_id, is_virtual) VALUES (:client_id, :wilaya_id, :ref_jointure, :site_a_id, :site_b_id, :is_virtual)";
$stmt = $pdo->prepare($insert_sql);
$stmt->bindParam(':client_id', $client_id, PDO::PARAM_INT);
$stmt->bindParam(':wilaya_id', $user_wilaya_id, PDO::PARAM_INT);
$stmt->bindParam(':ref_jointure', $ref_jointure, PDO::PARAM_STR);
$stmt->bindParam(':site_a_id', $site_a_id, PDO::PARAM_INT);
$stmt->bindParam(':site_b_id', $site_b_id, PDO::PARAM_INT);
$stmt->bindParam(':is_virtual', $is_virtual, PDO::PARAM_INT);
$stmt->execute();
$new_jointure_id = $pdo->lastInsertId();
// REPRISE DES DONNÉES TECHNIQUES POUR LES ÉQUIPEMENTS ÉTOILES
// On vérifie si l'un des équipements est une étoile
$stmt_star = $pdo->prepare("SELECT id, is_star, N_inv FROM equipements WHERE id IN (:id1, :id2) AND is_star = 1");
$stmt_star->execute([':id1' => $site_a_id, ':id2' => $site_b_id]);
$star_equipements = $stmt_star->fetchAll(PDO::FETCH_ASSOC);
if (!empty($star_equipements)) {
$tech_tables = [
'wave_long', 'stm', 'e1', 'lien_optique',
'fe_ge', 'voies', 'paires', 'cable_passe'
];
foreach ($star_equipements as $star_eq) {
$star_id = $star_eq['id'];
$n_inv = $star_eq['N_inv'];
$site_type = ($star_id == $site_a_id) ? 'A' : 'B';
// Trouver TOUS les équipements partageant le même N_inv
$stmt_all_eqs = $pdo->prepare("SELECT id FROM equipements WHERE N_inv = ?");
$stmt_all_eqs->execute([$n_inv]);
$related_ids = $stmt_all_eqs->fetchAll(PDO::FETCH_COLUMN);
if (!empty($related_ids)) {
$placeholders = implode(',', array_fill(0, count($related_ids), '?'));
// Trouver une jointure existante impliquant l'un de ces équipements
// pour copier ses données techniques
$stmt_source = $pdo->prepare("SELECT id, site_id, equipement_id FROM jointures WHERE (site_id IN ($placeholders) OR equipement_id IN ($placeholders)) AND id != ? LIMIT 1");
$params = array_merge($related_ids, $related_ids, [$new_jointure_id]);
$stmt_source->execute($params);
$source_row = $stmt_source->fetch(PDO::FETCH_ASSOC);
if ($source_row) {
$source_jointure_id = $source_row['id'];
// Déterminer sur quel site de la source se trouve l'équipement star
$source_site_type = (in_array($source_row['site_id'], $related_ids)) ? 'A' : 'B';
foreach ($tech_tables as $table) {
// Récupérer les colonnes de la table (sauf id et jointure_id)
$stmt_cols = $pdo->query("DESCRIBE $table");
$cols = $stmt_cols->fetchAll(PDO::FETCH_COLUMN);
$cols_to_copy = array_diff($cols, ['id', 'jointure_id', 'site_type']);
$col_list = implode(', ', $cols_to_copy);
// Insérer les données copiées pour la nouvelle jointure
// On force le site_type de la nouvelle jointure
$copy_sql = "INSERT INTO $table (jointure_id, site_type, $col_list)
SELECT :new_id, :target_site, $col_list
FROM $table
WHERE jointure_id = :source_id AND site_type = :source_site";
$stmt_copy = $pdo->prepare($copy_sql);
$stmt_copy->execute([
':new_id' => $new_jointure_id,
':target_site' => $site_type,
':source_id' => $source_jointure_id,
':source_site' => $source_site_type
]);
}
}
}
}
}
$pdo->commit(); // Valider la transaction
header("Location: liste_jointures.php?success=1&_t=" . time());
exit();
} catch (PDOException $e) {
$pdo->rollBack(); // Annuler la transaction en cas d'erreur PDO
error_log("PDO Exception lors de l'enregistrement de la jointure : " . $e->getMessage());
header("Location: ajouter_jointure.php?error=1&message=" . urlencode("Erreur de base de données : " . $e->getMessage()));
exit();
} catch (Exception $e) {
// Si la transaction a été démarrée, l'annuler
if (isset($pdo) && $pdo->inTransaction()) {
$pdo->rollBack();
}
error_log("Erreur générale lors de l'enregistrement de la jointure : " . $e->getMessage());
header("Location: ajouter_jointure.php?error=1&message=" . urlencode("Une erreur est survenue lors de l'enregistrement : " . $e->getMessage()));
exit();
}
} else {
header("Location: ajouter_jointure.php");
exit();
}
?>