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, }), });