Suma faktur
0.00 PLN
'48784422001', 'Tomasza' => '48502645894' ); $UPLOAD_DIR = 'uploads/'; $DATA_FILE = 'data.php'; $DATA_PREFIX = "\n"; // Automatyczne przygotowanie środowiska if (!file_exists($UPLOAD_DIR)) { mkdir($UPLOAD_DIR, 0755, true); file_put_contents($UPLOAD_DIR . '.htaccess', "Options -Indexes\n"); } if (!file_exists($DATA_FILE)) { file_put_contents($DATA_FILE, $DATA_PREFIX . json_encode(array())); chmod($DATA_FILE, 0666); } // ========================================== // 2. LOGIKA LOGOWANIA // ========================================== if (isset($_GET['logout'])) { session_destroy(); header('Location: index.php'); exit; } $error_msg = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['login_password'])) { if ($_POST['login_password'] === $HASLO_ADMIN) { $_SESSION['zalogowany'] = true; $_SESSION['rola'] = 'admin'; header('Location: index.php'); exit; } elseif ($_POST['login_password'] === $HASLO_ANIA) { $_SESSION['zalogowany'] = true; $_SESSION['rola'] = 'ania'; header('Location: index.php'); exit; } elseif ($_POST['login_password'] === $HASLO_WIDZ) { $_SESSION['zalogowany'] = true; $_SESSION['rola'] = 'widz'; header('Location: index.php'); exit; } else { $error_msg = "Nieprawidłowe hasło!"; } } $zalogowany = isset($_SESSION['zalogowany']) && $_SESSION['zalogowany'] === true; // ========================================== // 3. OBSŁUGA GEMINI I BAZY (Dla zalogowanych) // ========================================== if ($zalogowany) { function get_amount_from_gemini($imagePath, $apiKey) { if (empty($apiKey)) return array('amount' => 0.00, 'error' => 'Brak klucza API'); $imageData = base64_encode(file_get_contents($imagePath)); $url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=" . $apiKey; $payload = array( "contents" => array( array( "parts" => array( array("text" => "Znajdź na tym dokumencie CAŁKOWITĄ KWOTĘ DO ZAPŁATY (Total, Suma, Do zapłaty). Zwróć TYLKO I WYŁĄCZNIE samą liczbę. Użyj kropki jako separatora (np. 150.50). Żadnych słów, walut ani dodatkowych znaków."), array("inlineData" => array("mimeType" => "image/jpeg", "data" => $imageData)) ) ) ), "generationConfig" => array("temperature" => 0.1) ); $ch = curl_init($url); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_TIMEOUT, 30); $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($http_code !== 200 || $response === false) return array('amount' => 0.00, 'error' => 'Błąd API.'); $result = json_decode($response, true); if (isset($result['candidates'][0]['content']['parts'][0]['text'])) { $text = trim($result['candidates'][0]['content']['parts'][0]['text']); $text = str_replace(array(' ', ','), array('', '.'), $text); preg_match('/[0-9]+(?:\.[0-9]+)?/', $text, $matches); return array('amount' => isset($matches[0]) ? floatval($matches[0]) : 0.00, 'error' => null); } return array('amount' => 0.00, 'error' => 'Model AI nie odnalazł kwoty.'); } function get_db_array() { global $DATA_FILE, $DATA_PREFIX; if (!file_exists($DATA_FILE)) return array(); $content = file_get_contents($DATA_FILE); $json = str_replace($DATA_PREFIX, "", $content); $array = json_decode($json, true); $array = is_array($array) ? $array : array(); foreach ($array as $date => $files) { foreach ($files as $idx => $file) { if (is_string($file)) { $array[$date][$idx] = array("id" => uniqid(), "path" => $file, "amount" => 0.00); } elseif (!isset($file['id'])) { $array[$date][$idx]['id'] = uniqid(); } } } return $array; } function save_db_data($array) { global $DATA_FILE, $DATA_PREFIX; file_put_contents($DATA_FILE, $DATA_PREFIX . json_encode($array)); } if (isset($_GET['action']) && $_GET['action'] === 'get_data') { header('Content-Type: application/json'); echo json_encode(get_db_array()); exit; } // Dodanie Kwoty Zgłoszonej (Ania i Wacław) if (isset($_GET['action']) && $_GET['action'] === 'add_amount' && isset($_POST['data']) && isset($_POST['amount'])) { if ($_SESSION['rola'] !== 'admin' && $_SESSION['rola'] !== 'ania') exit; $data = $_POST['data']; $amount = floatval(preg_replace('/[^0-9.-]/', '', str_replace(',', '.', $_POST['amount']))); $baza = get_db_array(); if (!isset($baza[$data])) $baza[$data] = array(); $baza[$data][] = array("id" => uniqid(), "path" => "", "amount" => $amount); save_db_data($baza); echo json_encode(array('success' => true)); exit; } // Edycja Kwoty Zgłoszonej (Ania i Wacław) if (isset($_GET['action']) && $_GET['action'] === 'edit_amount' && isset($_POST['data']) && isset($_POST['id']) && isset($_POST['amount'])) { if ($_SESSION['rola'] !== 'admin' && $_SESSION['rola'] !== 'ania') exit; $id = $_POST['id']; $data = $_POST['data']; $amount = floatval(preg_replace('/[^0-9.-]/', '', str_replace(',', '.', $_POST['amount']))); $baza = get_db_array(); if (isset($baza[$data])) { foreach($baza[$data] as $k => $f) { if ($f['id'] === $id) { $baza[$data][$k]['amount'] = $amount; break; } } save_db_data($baza); echo json_encode(array('success' => true)); } exit; } // Usuwanie Zgłoszonej Kwoty (Ania i Wacław) if (isset($_GET['action']) && $_GET['action'] === 'delete' && isset($_POST['data']) && isset($_POST['id'])) { if ($_SESSION['rola'] !== 'admin' && $_SESSION['rola'] !== 'ania') exit; $id = $_POST['id']; $data = $_POST['data']; $baza = get_db_array(); if (isset($baza[$data])) { foreach($baza[$data] as $k => $f) { if ($f['id'] === $id) { if (!empty($f['path']) && file_exists($f['path'])) unlink($f['path']); unset($baza[$data][$k]); $baza[$data] = array_values($baza[$data]); break; } } save_db_data($baza); echo json_encode(array('success' => true)); } exit; } // Wgrywanie Paragonu (Tylko Wacław) if (isset($_GET['action']) && $_GET['action'] === 'upload' && isset($_FILES['zdjecie']) && isset($_POST['data'])) { if ($_SESSION['rola'] !== 'admin') exit; $data = $_POST['data']; $plik = $_FILES['zdjecie']; $id_to_update = isset($_POST['id']) ? $_POST['id'] : null; if ($plik['error'] === UPLOAD_ERR_OK && $id_to_update) { $sciezka = $UPLOAD_DIR . 'paragon_' . date('Ymd_His') . '_' . uniqid() . '.jpg'; if (function_exists('imagecreatefromjpeg')) { $img = ($plik['type'] == 'image/png') ? @imagecreatefrompng($plik['tmp_name']) : @imagecreatefromjpeg($plik['tmp_name']); if ($img) { imagejpeg($img, $sciezka, 70); imagedestroy($img); } else move_uploaded_file($plik['tmp_name'], $sciezka); } else move_uploaded_file($plik['tmp_name'], $sciezka); $baza = get_db_array(); if (isset($baza[$data])) { $ai = get_amount_from_gemini($sciezka, $GEMINI_API_KEY); foreach($baza[$data] as $k => $f) { if ($f['id'] === $id_to_update) { $baza[$data][$k]['path'] = $sciezka; // Zapisanie kwoty odczytanej przez AI $baza[$data][$k]['ai_amount'] = $ai['amount']; break; } } save_db_data($baza); echo json_encode(array('success' => true, 'ai_error' => $ai['error'])); } exit; } } // Usuwanie SAMEGO Paragonu z wewnątrz zgłoszenia (Tylko Wacław) if (isset($_GET['action']) && $_GET['action'] === 'delete_file' && isset($_POST['data']) && isset($_POST['id'])) { if ($_SESSION['rola'] !== 'admin') exit; $id = $_POST['id']; $data = $_POST['data']; $baza = get_db_array(); if (isset($baza[$data])) { foreach($baza[$data] as $k => $f) { if ($f['id'] === $id) { if (!empty($f['path']) && file_exists($f['path'])) unlink($f['path']); $baza[$data][$k]['path'] = ''; $baza[$data][$k]['ai_amount'] = 0.00; break; } } save_db_data($baza); echo json_encode(array('success' => true)); } exit; } // Edycja Kwoty z AI (Tylko Wacław) if (isset($_GET['action']) && $_GET['action'] === 'edit_ai_amount' && isset($_POST['data']) && isset($_POST['id']) && isset($_POST['amount'])) { if ($_SESSION['rola'] !== 'admin') exit; $id = $_POST['id']; $data = $_POST['data']; $amount = floatval(preg_replace('/[^0-9.-]/', '', str_replace(',', '.', $_POST['amount']))); $baza = get_db_array(); if (isset($baza[$data])) { foreach($baza[$data] as $k => $f) { if ($f['id'] === $id) { $baza[$data][$k]['ai_amount'] = $amount; break; } } save_db_data($baza); echo json_encode(array('success' => true)); } exit; } if (isset($_GET['action']) && $_GET['action'] === 'download_zip') { $year = $_GET['year']; $month = $_GET['month']; $baza = get_db_array(); $filesToZip = array(); $prefix = $year . '-' . $month; foreach ($baza as $date => $files) { if (strpos($date, $prefix) === 0) { foreach ($files as $f) { if (!empty($f['path']) && file_exists($f['path'])) $filesToZip[] = $f['path']; } } } if (empty($filesToZip)) exit("Brak plików"); $zipPath = $UPLOAD_DIR . 'faktury_' . uniqid() . '.zip'; $zip = new ZipArchive(); if ($zip->open($zipPath, ZipArchive::CREATE) === TRUE) { foreach ($filesToZip as $f) $zip->addFile($f, basename($f)); $zip->close(); header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename="faktury_'.$prefix.'.zip"'); readfile($zipPath); unlink($zipPath); exit; } } } ?>
Suma faktur
0.00 PLN