pricing
This commit is contained in:
51
services/cataloguePrice.go
Normal file
51
services/cataloguePrice.go
Normal file
@@ -0,0 +1,51 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// The catalogue quotes a RANGE, as a string: "₹9-11", "₹75-95", sometimes a
|
||||
// single "₹22". It is what a shopper would expect to pay across the shops the
|
||||
// catalogue was built from, not a price any particular shop has set.
|
||||
var cataloguePriceFigure = regexp.MustCompile(`[0-9]+(?:\.[0-9]+)?`)
|
||||
|
||||
// SuggestedPriceFrom reads a starting price out of a catalogue price range.
|
||||
//
|
||||
// ── Why import needs this at all ────────────────────────────────────────────
|
||||
//
|
||||
// Import deliberately wrote no price: "import is not pricing", the merchant sets
|
||||
// it. That is right about who decides and wrong about what a shopper sees in the
|
||||
// meantime — the product goes live at ₹0, which is not "unpriced" on a phone, it
|
||||
// reads as free. Products uploaded by sheet carry their price and show it; the
|
||||
// same product imported from the catalogue showed nothing.
|
||||
//
|
||||
// ── Which end of the range ──────────────────────────────────────────────────
|
||||
//
|
||||
// The LOW end. It is a suggestion the merchant will overwrite, and the two ways
|
||||
// to be wrong are not equal: too low is a margin the shop notices and corrects,
|
||||
// too high is a shopper who quietly decides the shop is expensive. The low end
|
||||
// is also the number a catalogue range is usually anchored on.
|
||||
//
|
||||
// Returns 0 when there is no figure to read — 159 of the 672 catalogue rows
|
||||
// measured on 2026-09-03 carry no range at all, and inventing a price for those
|
||||
// would be worse than showing none.
|
||||
func SuggestedPriceFrom(priceRange string) float64 {
|
||||
found := cataloguePriceFigure.FindAllString(strings.TrimSpace(priceRange), -1)
|
||||
if len(found) == 0 {
|
||||
return 0
|
||||
}
|
||||
|
||||
low := 0.0
|
||||
for _, raw := range found {
|
||||
value, err := strconv.ParseFloat(raw, 64)
|
||||
if err != nil || value <= 0 {
|
||||
continue
|
||||
}
|
||||
if low == 0 || value < low {
|
||||
low = value
|
||||
}
|
||||
}
|
||||
return low
|
||||
}
|
||||
Reference in New Issue
Block a user