'error', 'message' => 'Invalid file type.']); exit; } $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime_type = finfo_file($finfo, $image_file['tmp_name']); finfo_close($finfo); $allowed_mime_types = ['image/jpeg', 'image/png', 'image/jpg']; if (!in_array($mime_type, $allowed_mime_types)) { error_log("[add_invoice.php] ❌ Invalid MIME type: $mime_type"); echo json_encode(['status' => 'error', 'message' => 'Invalid file type (MIME mismatch).']); exit; } $new_filename = $invoiceNumber . "_" . $driverID . '.' . $image_extension; $target_dir = "invoice_images/"; $target_file = $target_dir . $new_filename; if (!is_dir($target_dir)) { if (!mkdir($target_dir, 0755, true)) { error_log("[add_invoice.php] ❌ Failed to create directory: $target_dir"); } } if (!move_uploaded_file($image_file['tmp_name'], $target_file)) { error_log("[add_invoice.php] ❌ Failed to move uploaded file."); echo json_encode(['status' => 'error', 'message' => 'Failed to upload image.']); exit; } $linkImage = 'https://intaleq.xyz/siro/Admin/adminUser/invoice_images/' . $new_filename; error_log("[add_invoice.php] ✅ Image uploaded successfully: $linkImage"); } try { $stmt = $con->prepare("INSERT INTO invoice_records (driverID, invoice_number,name, amount, date, image_link, created_at) VALUES (?, ?, ?,?, ?, ?, ?)"); $stmt->execute([$driverID, $invoiceNumber,$name, $amount, $date, $linkImage, $uploadDate]); echo json_encode([ 'status' => 'success', 'message' => 'Invoice data saved.', 'image' => $linkImage ]); error_log("[add_invoice.php] ✅ Invoice saved successfully."); } catch (PDOException $e) { $errorMsg = $e->getMessage(); error_log("[add_invoice.php] 🛑 PDO ERROR: $errorMsg"); echo json_encode([ 'status' => 'error', 'message' => "Database error: $errorMsg" ]); }