fixed import foglio di lavoro

This commit is contained in:
2026-10-26 13:56:01 +01:00
parent 2bac5d5b86
commit 0b9d5f5b40
3 changed files with 250 additions and 3 deletions
+99 -3
View File
@@ -177,6 +177,97 @@ function dotdec_to_comma($v)
return preg_replace('/(\d)\.(\d)/', '$1,$2', (string)$v);
}
/* ---- sezione "Imballo e confezionamento" ---- */
/** primo numero intero della cella ("80", "160 m", "12 o 14" -> 12) */
function first_int($v)
{
if (is_int($v) || is_float($v)) return (int)round($v);
if (preg_match('/\d+(?:[.,]\d+)?/', (string)$v, $m)) return (int)round((float)str_replace(',', '.', $m[0]));
return null;
}
/** la cella ha più numeri alternativi? ("12 o 14") */
function has_multi_num($v)
{
return preg_match_all('/\d+/', (string)$v) > 1;
}
function is_tolerance_txt($v)
{
$v = strtolower((string)$v);
return strpos($v, 'toll') !== false || preg_match('/[+-]\s*\d/', $v);
}
function fmt_num($n)
{
$f = (float)$n;
return (floor($f) == $f) ? (string)(int)$f : rtrim(rtrim(number_format($f, 2, '.', ''), '0'), '.');
}
/** "Toll Metrat. + 1,5m/-0" -> "-0/+1.5m" "+/- 4m" -> "+/- 4m" */
function parse_tolerance($v)
{
$s = str_replace(',', '.', (string)$v);
$num = '(\d+(?:\.\d+)?)';
if (preg_match('/\+\s*\/\s*-\s*' . $num . '/', $s, $m) || preg_match('/±\s*' . $num . '/u', $s, $m)) {
return '+/- ' . fmt_num($m[1]) . 'm';
}
$plus = preg_match('/\+\s*' . $num . '/', $s, $mp) ? fmt_num($mp[1]) : null;
$minus = preg_match('/-\s*' . $num . '/', $s, $mm) ? fmt_num($mm[1]) : null;
if ($plus !== null || $minus !== null) return '-' . ($minus ?? '0') . '/+' . ($plus ?? '0') . 'm';
return trim((string)$v); // formato non riconosciuto: testo originale
}
function extract_packaging($grid)
{
$out = [
'meters_per_package' => null,
'meters_per_package_tolerance' => '',
'meters_per_package_notes' => '',
'packages_or_pieces_per_box' => null,
'meters_per_box' => null,
'boxes_or_packages_per_pallet' => null,
];
$notes = [];
// metri/confezione: valore in D, note in E, tolleranza in E o nelle righe sotto senza etichetta
$r = row_by_label($grid, 'metri/confezione');
if ($r) {
$d = cell($grid, $r, 'D');
$out['meters_per_package'] = first_int($d);
$cand = [cell($grid, $r, 'E')];
for ($i = $r + 1; $i <= $r + 3 && norm(cell($grid, $i, 'A')) === ''; $i++) {
$cand[] = cell($grid, $i, 'D');
$cand[] = cell($grid, $i, 'E');
}
if (is_tolerance_txt($d) && has_multi_num($d)) $cand[] = $d; // "80 +1,5/-0" nella stessa cella
foreach ($cand as $c) {
if ($c === '') continue;
if ($out['meters_per_package_tolerance'] === '' && is_tolerance_txt($c)) {
$out['meters_per_package_tolerance'] = parse_tolerance($c);
} elseif (!is_tolerance_txt($c)) {
$notes[] = $c; // es. "40x2"
}
}
}
$v = val_at_label($grid, 'n confezioni o pezzi per scatola', 'D');
$out['packages_or_pieces_per_box'] = first_int($v);
if (has_multi_num($v)) $notes[] = 'Conf. x scatola ' . $v;
$out['meters_per_box'] = first_int(val_at_label($grid, 'metri/scatola', 'D'));
// "12 o 14": nel campo numerico va 12, il testo completo nelle note
$v = val_at_label($grid, 'n confezioni o scatole per bancale', 'D');
$out['boxes_or_packages_per_pallet'] = first_int($v);
if (has_multi_num($v)) $notes[] = 'Scatole x Bancale ' . $v;
$out['meters_per_package_notes'] = implode('. ', array_unique($notes));
return $out;
}
function extract_fields($grid)
{
$out = [];
@@ -229,8 +320,8 @@ function extract_fields($grid)
$out['pkg_scatola_raw'] = val_at_label($grid, 'tipo scatola', 'D');
$out['pkg_bancale_raw'] = val_at_label($grid, 'tipo di bancale', 'D');
$out['packages_or_pieces_per_box'] = num_or_null(val_at_label($grid, 'n confezioni o pezzi per scatola', 'D'));
$out['boxes_or_packages_per_pallet'] = num_or_null(val_at_label($grid, 'n confezioni o scatole per bancale', 'D'));
// metri/confezione, tolleranza, note, pezzi per scatola, metri/scatola, scatole per bancale
$out = array_merge($out, extract_packaging($grid));
// velocità
$out['speed_expected_kg_h'] = null;
@@ -250,7 +341,8 @@ function extract_fields($grid)
// note: annotazioni libere colonna E + righe istruzione in fondo
$noteBits = [];
foreach (['confezione richiesta', 'metri/confezione', 'metri/scatola'] as $lbl) {
// (metri/confezione colonna E ora va in "Note metri/confezione")
foreach (['confezione richiesta', 'metri/scatola'] as $lbl) {
$rr = row_by_label($grid, $lbl);
if ($rr && cell($grid, $rr, 'E') !== '') $noteBits[] = cell($grid, $rr, 'E');
}
@@ -523,6 +615,10 @@ try {
'profile_type_code' => $fields['profile_type_code'],
'marking' => $fields['marking'],
'prod_control_measure_settings' => $fields['prod_control_measure_settings'],
'meters_per_package' => $fields['meters_per_package'],
'meters_per_package_tolerance' => $fields['meters_per_package_tolerance'],
'meters_per_package_notes' => $fields['meters_per_package_notes'],
'meters_per_box' => $fields['meters_per_box'],
'packages_or_pieces_per_box' => $fields['packages_or_pieces_per_box'],
'boxes_or_packages_per_pallet' => $fields['boxes_or_packages_per_pallet'],
'speed_expected_kg_h' => $fields['speed_expected_kg_h'],