From 764f95ce34aa11add7b6457b167f8fbd4a57eb8b Mon Sep 17 00:00:00 2001 From: Claudio Date: Tue, 25 Feb 2025 15:52:05 +0100 Subject: [PATCH] changed assegna proprietario --- public/userportal/add-new-owner.php | 48 ++ public/userportal/add-owner-to-home.php | 39 +- public/userportal/assign-owners.php | 452 ++++++++++++++++-- public/userportal/get-available-owners.php | 40 ++ public/userportal/get-owners.php | 72 +++ public/userportal/homes-list.php | 2 +- .../mainphoto/2-cstech-1740489387.jpg | Bin 0 -> 18668 bytes 7 files changed, 591 insertions(+), 62 deletions(-) create mode 100644 public/userportal/add-new-owner.php create mode 100644 public/userportal/get-available-owners.php create mode 100644 public/userportal/get-owners.php create mode 100644 public/userportal/mainphoto/2-cstech-1740489387.jpg diff --git a/public/userportal/add-new-owner.php b/public/userportal/add-new-owner.php new file mode 100644 index 0000000..edf42d4 --- /dev/null +++ b/public/userportal/add-new-owner.php @@ -0,0 +1,48 @@ +prepare("SELECT owner_id FROM property_owners WHERE tax_code = ?"); +$checkQuery->bind_param("s", $tax_code); +$checkQuery->execute(); +$checkQuery->store_result(); + +if ($checkQuery->num_rows > 0) { + echo json_encode(["success" => false, "message" => "Questo codice fiscale esiste già!"]); + exit; +} + +// Inserisci il nuovo proprietario +$query = $conn->prepare("INSERT INTO property_owners (user_id, first_name, last_name, company_name, tax_code, email, phone, address, postal_code, city, province, country, owner_type, role, notes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); +$query->bind_param("issssssssssssss", $user_id, $first_name, $last_name, $company_name, $tax_code, $email, $phone, $address, $postal_code, $city, $province, $country, $owner_type, $role, $notes); + +if ($query->execute()) { + echo json_encode([ + "success" => true, + "message" => "Proprietario salvato con successo!", + "owner_id" => $conn->insert_id, + "owner_name" => $owner_type == "company" ? $company_name : "$first_name $last_name", + "tax_code" => $tax_code + ]); +} else { + echo json_encode(["success" => false, "message" => "Errore nell'inserimento."]); +} + +$conn->close(); diff --git a/public/userportal/add-owner-to-home.php b/public/userportal/add-owner-to-home.php index bf1635b..e0145b1 100644 --- a/public/userportal/add-owner-to-home.php +++ b/public/userportal/add-owner-to-home.php @@ -9,7 +9,7 @@ include('include/headscript.php'); $conn = new mysqli($servername, $username, $password, $database); if ($conn->connect_error) { - die("Errore di connessione: " . $conn->connect_error); + die(json_encode(["success" => false, "message" => "Errore di connessione: " . $conn->connect_error])); } // Recupera i dati inviati tramite POST @@ -18,19 +18,33 @@ $owner_id = isset($_POST['owner_id']) ? intval($_POST['owner_id']) : 0; $ownership_percentage = isset($_POST['ownership_percentage']) ? floatval($_POST['ownership_percentage']) : null; $notes = isset($_POST['notes']) ? $conn->real_escape_string($_POST['notes']) : null; -// Verifica che tutti i dati necessari siano presenti -if ($idhome <= 0 || $owner_id <= 0) { - die("Errore: Dati mancanti."); +// Verifica che tutti i dati siano presenti +if ($idhome <= 0 || $owner_id <= 0 || is_null($ownership_percentage)) { + die(json_encode(["success" => false, "message" => "Errore: Dati mancanti."])); } -// Controlla se il proprietario è già associato a questa casa -$queryCheck = $conn->prepare("SELECT * FROM home_owners WHERE home_id = ? AND owner_id = ?"); +// Controlla se il proprietario è già associato alla casa +$queryCheck = $conn->prepare("SELECT 1 FROM home_owners WHERE home_id = ? AND owner_id = ?"); $queryCheck->bind_param('ii', $idhome, $owner_id); $queryCheck->execute(); $resultCheck = $queryCheck->get_result(); if ($resultCheck->num_rows > 0) { - die("Errore: Il proprietario è già associato a questa casa."); + die(json_encode(["success" => false, "message" => "Errore: Il proprietario è già associato a questa casa."])); +} + +// Calcola la somma attuale delle percentuali di proprietà +$queryTotal = $conn->prepare("SELECT SUM(ownership_percentage) FROM home_owners WHERE home_id = ?"); +$queryTotal->bind_param('i', $idhome); +$queryTotal->execute(); +$queryTotal->bind_result($currentTotal); +$queryTotal->fetch(); +$queryTotal->close(); + +$totalAfterInsert = $currentTotal + $ownership_percentage; + +if ($totalAfterInsert > 100) { + die(json_encode(["success" => false, "message" => "Errore: La somma totale dei proprietari supererebbe il 100%."])); } // Inserisce il nuovo proprietario nella tabella home_owners @@ -38,19 +52,18 @@ $queryInsert = $conn->prepare(" INSERT INTO home_owners (home_id, owner_id, ownership_percentage, notes, created_at, updated_at) VALUES (?, ?, ?, ?, NOW(), NOW()) "); + if ($queryInsert === false) { - die("Errore nella preparazione della query: " . $conn->error); + die(json_encode(["success" => false, "message" => "Errore nella preparazione della query: " . $conn->error])); } $queryInsert->bind_param('iids', $idhome, $owner_id, $ownership_percentage, $notes); if ($queryInsert->execute()) { - // Reindirizza alla pagina di gestione dell'immobile - header("Location: assign-owners.php?idhome=$idhome&success=1"); - exit; + echo json_encode(["success" => true, "message" => "Proprietario aggiunto con successo."]); } else { - die("Errore nell'inserimento: " . $queryInsert->error); + die(json_encode(["success" => false, "message" => "Errore nell'inserimento: " . $queryInsert->error])); } -// Chiude la connessione +$queryInsert->close(); $conn->close(); diff --git a/public/userportal/assign-owners.php b/public/userportal/assign-owners.php index 1cdffae..71bc6d0 100644 --- a/public/userportal/assign-owners.php +++ b/public/userportal/assign-owners.php @@ -77,6 +77,8 @@ $resultAvailableOwners = $queryAvailableOwners->get_result(); + + @@ -105,42 +107,46 @@ $resultAvailableOwners = $queryAvailableOwners->get_result();
num_rows > 0) { ?> - - - - - - - - - - - - fetch_assoc()) { ?> +
+
NomeCodice Fiscale%NoteAzioni
+ - - - - - - + + + + + - - -
- - - - - - NomeCodice Fiscale%NoteAzioni
+ + + fetch_assoc()) { + $totalPercentage += $owner['ownership_percentage']; + echo " + " . htmlspecialchars($owner['first_name'] . ' ' . $owner['last_name']) . " + " . htmlspecialchars($owner['tax_code']) . " + " . htmlspecialchars($owner['ownership_percentage']) . " + " . htmlspecialchars($owner['notes']) . " + + + + "; + } + ?> + + + + Totale % Proprietà: + % + + + + +
+

Nessun proprietario associato.

@@ -151,7 +157,7 @@ $resultAvailableOwners = $queryAvailableOwners->get_result();
-
Aggiungi Proprietari
+
Assegna Proprietari
@@ -171,17 +177,24 @@ $resultAvailableOwners = $queryAvailableOwners->get_result(); ?> +
+ +
- +
- + + +
@@ -198,26 +211,293 @@ $resultAvailableOwners = $queryAvailableOwners->get_result(); + + + + - - if (confirm('Sei sicuro di voler rimuovere questo proprietario?')) { - $.post('remove-owner-from-home.php', { - owner_id: ownerId, - idhome: idhome - }, function(response) { - location.reload(); + + + + + + + + + + \ No newline at end of file diff --git a/public/userportal/get-available-owners.php b/public/userportal/get-available-owners.php new file mode 100644 index 0000000..8d59c98 --- /dev/null +++ b/public/userportal/get-available-owners.php @@ -0,0 +1,40 @@ +connect_error) { + die("Errore di connessione: " . $conn->connect_error); +} + +$idhome = isset($_GET['idhome']) ? intval($_GET['idhome']) : 0; + +// Recupera tutti i proprietari disponibili per l'assegnazione +$queryAvailableOwners = $conn->prepare(" + SELECT owner_id, first_name, last_name, company_name, tax_code + FROM property_owners + WHERE user_id = ? + AND owner_id NOT IN ( + SELECT owner_id FROM home_owners WHERE home_id = ? + ) +"); +$queryAvailableOwners->bind_param('ii', $iduserlogin, $idhome); +$queryAvailableOwners->execute(); +$resultAvailableOwners = $queryAvailableOwners->get_result(); + +// Genera il nuovo dropdown +echo ''; + +$conn->close(); diff --git a/public/userportal/get-owners.php b/public/userportal/get-owners.php new file mode 100644 index 0000000..f0240b3 --- /dev/null +++ b/public/userportal/get-owners.php @@ -0,0 +1,72 @@ +connect_error) { + die("Errore di connessione: " . $conn->connect_error); +} + +$idhome = isset($_GET['idhome']) ? intval($_GET['idhome']) : 0; + +$queryOwners = $conn->prepare(" + SELECT + po.owner_id, + po.first_name, + po.last_name, + po.company_name, + po.tax_code, + po.email, + ho.ownership_percentage, + ho.notes + FROM + home_owners AS ho + INNER JOIN + property_owners AS po ON ho.owner_id = po.owner_id + WHERE + ho.home_id = ? +"); +$queryOwners->bind_param('i', $idhome); +$queryOwners->execute(); +$resultOwners = $queryOwners->get_result(); + +$totalPercentage = 0; + +echo ' + + + + + + + + + + '; + +while ($owner = $resultOwners->fetch_assoc()) { + $totalPercentage += $owner['ownership_percentage']; + echo " + + + + + + "; +} + +echo ' + + + + + + + +
NomeCodice Fiscale%NoteAzioni
" . htmlspecialchars($owner['first_name'] . ' ' . $owner['last_name']) . "" . htmlspecialchars($owner['tax_code']) . "" . htmlspecialchars($owner['ownership_percentage']) . "" . htmlspecialchars($owner['notes']) . " + +
Totale % Proprietà:' . $totalPercentage . '%
'; + +$queryOwners->close(); +$conn->close(); diff --git a/public/userportal/homes-list.php b/public/userportal/homes-list.php index 021d57e..8723776 100644 --- a/public/userportal/homes-list.php +++ b/public/userportal/homes-list.php @@ -316,7 +316,7 @@ $result = $stmt->get_result(); Foto - Nome + Nome di Riferimento Città / Nazione Indirizzo Proprietari diff --git a/public/userportal/mainphoto/2-cstech-1740489387.jpg b/public/userportal/mainphoto/2-cstech-1740489387.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89eb3447294000b08a08fb02b2ed685a285c4917 GIT binary patch literal 18668 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 literal 0 HcmV?d00001