From b087b7eb5806091d9517d9d69155d98a4a17af75 Mon Sep 17 00:00:00 2001 From: Mikhail Chusavitin Date: Mon, 10 Aug 2026 18:41:29 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20CSV-=D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=82=20Estimate=20=D0=B8=D0=B3=D0=BD=D0=BE=D1=80=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=B0=D0=BF=D0=BB=D0=B8=D1=84=D1=82?= =?UTF-8?q?,=20=D0=B2=D1=81=D0=B5=D0=B3=D0=B4=D0=B0=20x1.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Фронтенд не отправлял значение поля "Аплифт к estimate" в запрос экспорта, из-за чего бэкенд всегда падал на дефолт 1.3. Кроме того, applyDDPMarkup применял один и тот же коэффициент к Estimate, Склад и Конкуренты — теперь Склад/Конкуренты всегда x1.3, а Estimate — по пользовательскому аплифту. Co-Authored-By: Claude Sonnet 5 --- internal/services/export.go | 14 +++++++++----- web/templates/index.html | 2 ++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/internal/services/export.go b/internal/services/export.go index 79f8874..5824505 100644 --- a/internal/services/export.go +++ b/internal/services/export.go @@ -59,7 +59,7 @@ type ProjectPricingExportOptions struct { IncludeStock bool `json:"include_stock"` IncludeCompetitor bool `json:"include_competitor"` Basis string `json:"basis"` // "fob" or "ddp"; empty defaults to "fob" - SaleMarkup float64 `json:"sale_markup"` // DDP multiplier; 0 defaults to 1.3 + SaleMarkup float64 `json:"sale_markup"` // DDP uplift applied to Estimate only; 0 defaults to 1.3 ManualPrice *float64 `json:"manual_price"` // user-defined total price; distributed proportionally across rows } @@ -514,11 +514,15 @@ func sortConfigItemsByCategoryMap(items models.ConfigItems, catOrder map[string] return sorted } -func applyDDPMarkup(rows []ProjectPricingExportRow, factor float64) { +// stockCompetitorMarkupFactor is the fixed DDP multiplier applied to Stock and +// Competitor columns, independent of the user-configurable estimate uplift. +const stockCompetitorMarkupFactor = 1.3 + +func applyDDPMarkup(rows []ProjectPricingExportRow, estimateFactor float64) { for i := range rows { - rows[i].Estimate = scaleFloatPtr(rows[i].Estimate, factor) - rows[i].Stock = scaleFloatPtr(rows[i].Stock, factor) - rows[i].Competitor = scaleFloatPtr(rows[i].Competitor, factor) + rows[i].Estimate = scaleFloatPtr(rows[i].Estimate, estimateFactor) + rows[i].Stock = scaleFloatPtr(rows[i].Stock, stockCompetitorMarkupFactor) + rows[i].Competitor = scaleFloatPtr(rows[i].Competitor, stockCompetitorMarkupFactor) } } diff --git a/web/templates/index.html b/web/templates/index.html index b99276c..c116d4d 100644 --- a/web/templates/index.html +++ b/web/templates/index.html @@ -5028,6 +5028,7 @@ async function exportPricingCSV(table) { const basis = table === 'sale' ? 'ddp' : 'fob'; const manualInputId = table === 'sale' ? 'pricing-custom-price-sale' : 'pricing-custom-price-buy'; const manualPrice = parseDecimalInput(document.getElementById(manualInputId)?.value || ''); + const saleUplift = table === 'sale' ? parseDecimalInput(document.getElementById('pricing-uplift-sale')?.value || '') : 0; try { const resp = await fetch(`/api/configs/${configUUID}/export/pricing`, { method: 'POST', @@ -5039,6 +5040,7 @@ async function exportPricingCSV(table) { include_stock: true, include_competitor: true, basis: basis, + sale_markup: saleUplift > 0 ? saleUplift : null, manual_price: manualPrice > 0 ? manualPrice : null, }), });