/** * POST /api/settings/price-sheet/row-persist (staff only) — persist ALL weight columns of a row as flat Tier rows * (a single tier edit would leave the other weights on the €25 billing fallback). * Body: { scope, organizationId, bpartnerId, shipperId, countryId, serviceCode, cells: { weight, prevWeight, price }[] } * → { status, rowIds, failed[] } */ import { gateFromEvent } from '../../../utils/chatAccess' import { upsertTierRow } from '../../../utils/shipping/priceSheet' export default defineEventHandler(async (event) => { const { token } = await gateFromEvent(event, { requireChat: false }) const body: any = await readBody(event).catch(() => ({})) const cells: any[] = Array.isArray(body?.cells) ? body.cells.filter((c: any) => Number(c?.weight) > 0 && c?.price !== null && c?.price !== undefined) : [] if (!cells.length) return { status: 400, message: 'cells missing' } const sorted = [...cells].sort((a, b) => Number(a.weight) - Number(b.weight)) const rowIds: number[] = [], failed: { weight: number; message: string }[] = [] let prev = 0 for (const c of sorted) { try { const r = await upsertTierRow(event, token, { scope: body.scope, organizationId: Number(body.organizationId) || 0, bpartnerId: body.bpartnerId ?? null, shipperId: Number(body.shipperId), countryId: Number(body.countryId), mode: 'tier', weight: Number(c.weight), prevWeight: prev, price: Number(c.price), validFrom: body.validFrom, validTo: body.validTo }) rowIds.push(r.rowId) } catch (err: any) { failed.push({ weight: Number(c.weight), message: err?.statusMessage || err?.data?.detail || err?.message || 'Save failed' }) } prev = Number(c.weight) } return { status: failed.length ? 207 : 200, rowIds, failed } })