diff --git a/php/inc_fx_bib_production.php b/php/inc_fx_bib_production.php index 539c0a8..0d228e4 100644 --- a/php/inc_fx_bib_production.php +++ b/php/inc_fx_bib_production.php @@ -342,7 +342,8 @@ function fxBibProductionXmlSetFormula( $strColumn, $intRow, $strFormula, - $strStyle = '' + $strStyle = '', + $mixCachedValue = null ) { $strNs = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'; $objCell = fxBibProductionXmlEnsureCell($objDom, $objRow, $strColumn, $intRow, $strStyle); @@ -350,6 +351,13 @@ function fxBibProductionXmlSetFormula( $objFormula = $objDom->createElementNS($strNs, 'f'); $objFormula->appendChild($objDom->createTextNode($strFormula)); $objCell->appendChild($objFormula); + // MSIN-4469 — Valeur calculée en cache : sinon Excel/LibreOffice peut + // afficher le TOTAL vide tant que le recalcul n'a pas tourné. + if ($mixCachedValue !== null && $mixCachedValue !== '') { + $objValue = $objDom->createElementNS($strNs, 'v'); + $objValue->appendChild($objDom->createTextNode((string)$mixCachedValue)); + $objCell->appendChild($objValue); + } } function fxBibProductionXmlCloneRow(DOMElement $objTemplateRow, $intTargetRow) { @@ -574,23 +582,68 @@ function fxBibProductionBuildOrderXml($strXml, array $tabSnapshot, array $tabLab $objHeaderRow, 'K', 3, - $tabLabels['printer_lines'], + isset($tabLabels['printer_lines']) ? $tabLabels['printer_lines'] : 'Lignes Imprimeur', $strHeaderStyleK ); } + $intBibTotal = 0; + foreach ($tabOrderRows as $tabRow) { + $intBibTotal += (int)$tabRow['quantity']; + } + + // Reprendre la ligne TOTAL après les insertions (référence DOM à jour). + $objTotal = fxBibProductionXmlFindRow($objXpath, $intTotalRow); + if (!$objTotal) { + throw new Exception('MSIN-4469 total row missing'); + } + fxBibProductionXmlSetInlineString($objDom, $objTotal, 'A', $intTotalRow, $tabLabels['total']); - fxBibProductionXmlSetFormula($objDom, $objTotal, 'F', $intTotalRow, 'SUM(F4:F' . ($intTotalRow - 1) . ')'); - fxBibProductionXmlSetFormula($objDom, $objTotal, 'I', $intTotalRow, 'SUM(I4:I' . ($intTotalRow - 1) . ')'); - fxBibProductionXmlSetFormula($objDom, $objTotal, 'L', $intTotalRow, 'SUM(L4:L' . ($intTotalRow - 1) . ')'); - // COUNT ne compte que les numéros (ignore en-tête texte et lignes blanches entre épreuves). - fxBibProductionXmlSetFormula($objDom, $objTotal, 'K', $intTotalRow, 'COUNT(Imprimeur!A:A)'); + fxBibProductionXmlSetFormula( + $objDom, + $objTotal, + 'F', + $intTotalRow, + 'SUM(F4:F' . ($intTotalRow - 1) . ')', + '', + $intBibTotal + ); + fxBibProductionXmlSetFormula( + $objDom, + $objTotal, + 'I', + $intTotalRow, + 'SUM(I4:I' . ($intTotalRow - 1) . ')', + '', + $intBibTotal + ); + fxBibProductionXmlSetFormula( + $objDom, + $objTotal, + 'L', + $intTotalRow, + 'SUM(L4:L' . ($intTotalRow - 1) . ')', + '', + $intBibTotal + ); + // COUNT ignore l'en-tête texte et les lignes blanches entre épreuves. + fxBibProductionXmlSetFormula( + $objDom, + $objTotal, + 'K', + $intTotalRow, + 'COUNT(Imprimeur!A:A)', + '', + $intBibTotal + ); fxBibProductionXmlSetFormula( $objDom, $objTotal, 'J', $intTotalRow, - 'F' . $intTotalRow . '=K' . $intTotalRow + 'F' . $intTotalRow . '=K' . $intTotalRow, + '', + '1' ); $objDimension = $objXpath->query('//m:dimension')->item(0);