130 lines
3.9 KiB
PHP
130 lines
3.9 KiB
PHP
<?php
|
|
ob_start();
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
ini_set('display_errors', 0);
|
|
error_reporting(E_ERROR | E_PARSE);
|
|
|
|
require_once(__DIR__ . '/class/db-functions.php');
|
|
require_once(__DIR__ . '/class/chatpdf_helper.php');
|
|
|
|
try {
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
|
throw new Exception('Invalid request method.');
|
|
}
|
|
|
|
$db = DBHandlerSelect::getInstance();
|
|
$pdo = $db->getConnection();
|
|
|
|
$rows = json_decode($_POST['rows'] ?? '[]', true);
|
|
$idclient = intval($_POST['idclient'] ?? 0);
|
|
|
|
if (!$idclient) {
|
|
throw new Exception('Missing idclient.');
|
|
}
|
|
if (empty($rows) || !is_array($rows)) {
|
|
throw new Exception('No rows provided.');
|
|
}
|
|
|
|
// Recupera il SOURCE_ID del listino
|
|
$stmt = $pdo->prepare("
|
|
SELECT source_id
|
|
FROM client_files
|
|
WHERE idclient = :idclient
|
|
AND file_type = 'pricelist'
|
|
AND source_id IS NOT NULL
|
|
ORDER BY upload_date DESC
|
|
LIMIT 1
|
|
");
|
|
$stmt->execute([':idclient' => $idclient]);
|
|
$sourceId = $stmt->fetchColumn();
|
|
|
|
if (!$sourceId) {
|
|
throw new Exception('No valid pricelist (source_id) found for this client.');
|
|
}
|
|
|
|
// Helper format codice
|
|
$formatRef = function (string $modCode): ?string {
|
|
$code = preg_replace('/\s+/', '', strtoupper($modCode));
|
|
if (strlen($code) < 12) return null;
|
|
$core = substr($code, 3, -2);
|
|
if (strlen($core) < 7) return null;
|
|
return substr($core, 0, 3) . ' ' . substr($core, 3, 2) . ' ' . substr($core, 5, 2);
|
|
};
|
|
|
|
// Helper estrazione prezzo
|
|
$extractPrice = function (string $text): ?float {
|
|
if (preg_match('/(\d{1,6}[.,]\d{2})/', $text, $m)) {
|
|
$num = str_replace(',', '.', $m[1]);
|
|
return floatval($num);
|
|
}
|
|
return null;
|
|
};
|
|
|
|
$chatpdf = new ChatPDFHelper();
|
|
$updated = 0;
|
|
$results = [];
|
|
|
|
$pdo->beginTransaction();
|
|
|
|
foreach ($rows as $r) {
|
|
$modCode = $r['mod_code'] ?? '';
|
|
$rowId = $r['id'] ?? 0;
|
|
|
|
if (!$modCode) {
|
|
$results[] = ['id' => $rowId, 'mod_code' => $modCode, 'status' => 'skip'];
|
|
continue;
|
|
}
|
|
|
|
$formattedRef = $formatRef($modCode);
|
|
if (!$formattedRef) {
|
|
$results[] = ['id' => $rowId, 'mod_code' => $modCode, 'status' => 'invalid_format'];
|
|
continue;
|
|
}
|
|
|
|
$question = "In this price list, find the price in euros for the code reference: {$formattedRef}. Return only the number (e.g. 123,45).";
|
|
$answer = $chatpdf->askPdf($sourceId, $question);
|
|
|
|
$price = $extractPrice($answer ?? '');
|
|
if ($price) {
|
|
$stmtU = $pdo->prepare("
|
|
UPDATE importdb
|
|
SET price = :price, updated_on = NOW()
|
|
WHERE mod_code = :code AND idclient = :idclient
|
|
");
|
|
$stmtU->execute([
|
|
':price' => $price,
|
|
':code' => $modCode,
|
|
':idclient' => $idclient
|
|
]);
|
|
|
|
if ($stmtU->rowCount() > 0) {
|
|
$updated++;
|
|
$results[] = [
|
|
'id' => $rowId,
|
|
'mod_code' => $modCode,
|
|
'status' => 'updated',
|
|
'price' => $price
|
|
];
|
|
}
|
|
} else {
|
|
$results[] = [
|
|
'id' => $rowId,
|
|
'mod_code' => $modCode,
|
|
'status' => 'notfound',
|
|
'answer' => $answer
|
|
];
|
|
}
|
|
}
|
|
|
|
$pdo->commit();
|
|
ob_clean();
|
|
echo json_encode(['status' => 'ok', 'updated' => $updated, 'details' => $results], JSON_UNESCAPED_UNICODE);
|
|
} catch (Exception $e) {
|
|
if (isset($pdo) && $pdo->inTransaction()) {
|
|
$pdo->rollBack();
|
|
}
|
|
ob_clean();
|
|
echo json_encode(['status' => 'error', 'message' => $e->getMessage()], JSON_UNESCAPED_UNICODE);
|
|
}
|
|
exit;
|