Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -1098,6 +1098,7 @@ const form = reactive({
|
|||||||
kategori: '',
|
kategori: '',
|
||||||
askiliyan: '',
|
askiliyan: '',
|
||||||
yetiskinGarson: '',
|
yetiskinGarson: '',
|
||||||
|
yasPayloadMap: {},
|
||||||
seri: '',
|
seri: '',
|
||||||
bedenLabels: [],
|
bedenLabels: [],
|
||||||
bedenler: [],
|
bedenler: [],
|
||||||
@@ -1256,6 +1257,7 @@ async function resetEditor(force = false) {
|
|||||||
drop: '',
|
drop: '',
|
||||||
askiliyan: '',
|
askiliyan: '',
|
||||||
yetiskinGarson: '',
|
yetiskinGarson: '',
|
||||||
|
yasPayloadMap: {},
|
||||||
|
|
||||||
adet: 0,
|
adet: 0,
|
||||||
fiyat: 0,
|
fiyat: 0,
|
||||||
@@ -1371,17 +1373,29 @@ const selectedRow = computed(() => {
|
|||||||
const groupOpen = reactive({})
|
const groupOpen = reactive({})
|
||||||
|
|
||||||
function normalizeYetiskinGarsonToken (row) {
|
function normalizeYetiskinGarsonToken (row) {
|
||||||
const raw = String(
|
const raw = [
|
||||||
row?.yetiskinGarson ||
|
row?.yetiskinGarson,
|
||||||
row?.YETISKIN_GARSON ||
|
row?.YETISKIN_GARSON,
|
||||||
row?.YetiskinGarson ||
|
row?.YetiskinGarson,
|
||||||
row?.kategori ||
|
row?.askiliyan,
|
||||||
row?.Kategori ||
|
row?.AskiliYan,
|
||||||
''
|
row?.kategori,
|
||||||
).toUpperCase()
|
row?.Kategori
|
||||||
|
]
|
||||||
|
.map(v => String(v || '').trim())
|
||||||
|
.filter(Boolean)
|
||||||
|
.join(' ')
|
||||||
|
|
||||||
if (raw.includes('GARSON')) return 'GARSON'
|
const normalized = raw
|
||||||
if (raw.includes('YETISKIN') || raw.includes('YETİSKİN')) return 'YETISKIN'
|
.toUpperCase()
|
||||||
|
.normalize('NFD')
|
||||||
|
.replace(/[\u0300-\u036f]/g, '')
|
||||||
|
.replace(/[^A-Z0-9/ ]+/g, ' ')
|
||||||
|
.replace(/\s+/g, ' ')
|
||||||
|
.trim()
|
||||||
|
|
||||||
|
if (normalized.includes('GARSON')) return 'GARSON'
|
||||||
|
if (normalized.includes('YETISKIN')) return 'YETISKIN'
|
||||||
return 'GENEL'
|
return 'GENEL'
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1428,10 +1442,7 @@ const groupedRows = computed(() => {
|
|||||||
return order.map(bucketKey => {
|
return order.map(bucketKey => {
|
||||||
const grp = buckets[bucketKey]
|
const grp = buckets[bucketKey]
|
||||||
const schema = schemaMap?.[grp.grpKey]
|
const schema = schemaMap?.[grp.grpKey]
|
||||||
const schemaTitle = String(schema?.title || grp.grpKey || '').trim()
|
const displayName = `${grp.yg} ${grp.name}`.trim()
|
||||||
const displayName = schemaTitle
|
|
||||||
? `${grp.yg} ${grp.name} (${schemaTitle})`
|
|
||||||
: `${grp.yg} ${grp.name}`
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...grp,
|
...grp,
|
||||||
@@ -2349,6 +2360,7 @@ async function hydrateEditorFromRow(row, opts = {}) {
|
|||||||
drop: row.drop || row.Drop || modelMeta?.Drop || '',
|
drop: row.drop || row.Drop || modelMeta?.Drop || '',
|
||||||
askiliyan: rowAskili,
|
askiliyan: rowAskili,
|
||||||
yetiskinGarson: rowYetiskinGarson,
|
yetiskinGarson: rowYetiskinGarson,
|
||||||
|
yasPayloadMap: { ...(row.yasPayloadMap || {}) },
|
||||||
kategori: rowKategori,
|
kategori: rowKategori,
|
||||||
aciklama: row.aciklama,
|
aciklama: row.aciklama,
|
||||||
fiyat: Number(row.fiyat || 0),
|
fiyat: Number(row.fiyat || 0),
|
||||||
@@ -2790,6 +2802,7 @@ async function onModelChange(modelCode) {
|
|||||||
kategori: d.Kategori || '',
|
kategori: d.Kategori || '',
|
||||||
askiliyan: d.AskiliYan || '',
|
askiliyan: d.AskiliYan || '',
|
||||||
yetiskinGarson: d.YETISKIN_GARSON || d.YetiskinGarson || d.AskiliYan || '',
|
yetiskinGarson: d.YETISKIN_GARSON || d.YetiskinGarson || d.AskiliYan || '',
|
||||||
|
yasPayloadMap: {},
|
||||||
aciklama: keep.aciklama,
|
aciklama: keep.aciklama,
|
||||||
fiyat: keep.fiyat,
|
fiyat: keep.fiyat,
|
||||||
adet: keep.adet,
|
adet: keep.adet,
|
||||||
@@ -3096,12 +3109,34 @@ async function loadOrderInventory(merge = false) {
|
|||||||
console.log(`📦 MSSQL stok verisi geldi: ${data.length}`)
|
console.log(`📦 MSSQL stok verisi geldi: ${data.length}`)
|
||||||
console.table(data)
|
console.table(data)
|
||||||
|
|
||||||
|
const pickPreferredYasPayloadLabel = (currentRaw, nextRaw) => {
|
||||||
|
const cur = String(currentRaw || '').trim().toUpperCase()
|
||||||
|
const nxt = String(nextRaw || '').trim().toUpperCase()
|
||||||
|
if (!nxt) return cur
|
||||||
|
if (!cur) return nxt
|
||||||
|
const curYas = /YAS$|YAŞ$/.test(cur)
|
||||||
|
const nxtYas = /YAS$|YAŞ$/.test(nxt)
|
||||||
|
if (!curYas && nxtYas) return nxt
|
||||||
|
return cur
|
||||||
|
}
|
||||||
|
|
||||||
// 1️⃣ Normalize (gelen büyük harfli)
|
// 1️⃣ Normalize (gelen büyük harfli)
|
||||||
const invMap = {}
|
const invMap = {}
|
||||||
|
const invYasPayloadMap = {}
|
||||||
for (const x of data) {
|
for (const x of data) {
|
||||||
const beden = normalizeBedenLabel(String(x.Beden || '').trim())
|
const rawBeden = String(x.Beden || '').trim()
|
||||||
|
const beden = normalizeBedenLabel(rawBeden)
|
||||||
const stokDeger = Number(x.KullanilabilirAdet ?? 0)
|
const stokDeger = Number(x.KullanilabilirAdet ?? 0)
|
||||||
invMap[beden] = stokDeger
|
invMap[beden] = stokDeger
|
||||||
|
|
||||||
|
const rawUpper = rawBeden.toUpperCase()
|
||||||
|
if (/^(\d+)\s*(Y|YAS|YAŞ)$/.test(rawUpper)) {
|
||||||
|
const canonical = normalizeBedenLabel(rawUpper)
|
||||||
|
invYasPayloadMap[canonical] = pickPreferredYasPayloadLabel(
|
||||||
|
invYasPayloadMap[canonical],
|
||||||
|
rawUpper
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2️⃣ Form bedenlerine göre map oluştur
|
// 2️⃣ Form bedenlerine göre map oluştur
|
||||||
@@ -3125,6 +3160,7 @@ async function loadOrderInventory(merge = false) {
|
|||||||
beden,
|
beden,
|
||||||
stok
|
stok
|
||||||
}))
|
}))
|
||||||
|
form.yasPayloadMap = { ...(form.yasPayloadMap || {}), ...invYasPayloadMap }
|
||||||
|
|
||||||
console.log('✅ Stok haritası güncellendi:', stockMap.value)
|
console.log('✅ Stok haritası güncellendi:', stockMap.value)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
@@ -2521,6 +2521,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
|
|||||||
? ''
|
? ''
|
||||||
: String(raw.ItemDim1Code).trim()
|
: String(raw.ItemDim1Code).trim()
|
||||||
const beden = bedenRaw === '' ? ' ' : normalizeBedenLabel(bedenRaw)
|
const beden = bedenRaw === '' ? ' ' : normalizeBedenLabel(bedenRaw)
|
||||||
|
const bedenRawUpper = safeTrimUpperJs(bedenRaw)
|
||||||
|
|
||||||
const qty = Number(raw.Qty1 || raw.Qty || 0)
|
const qty = Number(raw.Qty1 || raw.Qty || 0)
|
||||||
|
|
||||||
@@ -2562,6 +2563,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
|
|||||||
|
|
||||||
__tmpMap: {}, // beden → qty
|
__tmpMap: {}, // beden → qty
|
||||||
lineIdMap: {}, // beden → OrderLineID
|
lineIdMap: {}, // beden → OrderLineID
|
||||||
|
yasPayloadMap: {},
|
||||||
|
|
||||||
adet: 0,
|
adet: 0,
|
||||||
tutar: 0,
|
tutar: 0,
|
||||||
@@ -2586,6 +2588,14 @@ export const useOrderEntryStore = defineStore('orderentry', {
|
|||||||
entry.lineIdMap[beden] = String(rawLineId)
|
entry.lineIdMap[beden] = String(rawLineId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bedenRawUpper && /^(\d+)\s*(Y|YAS|YAŞ)$/.test(bedenRawUpper)) {
|
||||||
|
const canonical = normalizeBedenLabel(bedenRawUpper)
|
||||||
|
entry.yasPayloadMap[canonical] = pickPreferredYasPayloadLabel(
|
||||||
|
entry.yasPayloadMap[canonical],
|
||||||
|
bedenRawUpper
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
if (qty > 0) {
|
if (qty > 0) {
|
||||||
entry.__tmpMap[beden] = (entry.__tmpMap[beden] || 0) + qty
|
entry.__tmpMap[beden] = (entry.__tmpMap[beden] || 0) + qty
|
||||||
entry.adet += qty
|
entry.adet += qty
|
||||||
@@ -2644,6 +2654,16 @@ export const useOrderEntryStore = defineStore('orderentry', {
|
|||||||
row.bedenMap[grpKey][' '] = Number(row.adet || 0)
|
row.bedenMap[grpKey][' '] = Number(row.adet || 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (grpKey === 'yas') {
|
||||||
|
row.yasPayloadMap = row.yasPayloadMap || {}
|
||||||
|
for (const b of Object.keys(cleanedMap || {})) {
|
||||||
|
const s = String(b || '').trim()
|
||||||
|
if (/^\d+$/.test(s) && !row.yasPayloadMap[s]) {
|
||||||
|
row.yasPayloadMap[s] = `${s}Y`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
delete row.__tmpMap
|
delete row.__tmpMap
|
||||||
out.push(row)
|
out.push(row)
|
||||||
}
|
}
|
||||||
@@ -2695,6 +2715,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
|
|||||||
const cached = sizeCache.value[cacheKey]
|
const cached = sizeCache.value[cacheKey]
|
||||||
bedenStock.value = [...cached.stockArray]
|
bedenStock.value = [...cached.stockArray]
|
||||||
stockMap.value = { ...cached.stockMap }
|
stockMap.value = { ...cached.stockMap }
|
||||||
|
form.yasPayloadMap = { ...(cached.yasPayloadMap || {}) }
|
||||||
console.log(`♻️ loadProductSizes CACHE → ${grpKey}`)
|
console.log(`♻️ loadProductSizes CACHE → ${grpKey}`)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -2719,12 +2740,25 @@ export const useOrderEntryStore = defineStore('orderentry', {
|
|||||||
📦 STOK MAP (' ' KORUNUR)
|
📦 STOK MAP (' ' KORUNUR)
|
||||||
======================================================= */
|
======================================================= */
|
||||||
const apiStockMap = {}
|
const apiStockMap = {}
|
||||||
|
const apiYasPayloadMap = {}
|
||||||
for (const x of data) {
|
for (const x of data) {
|
||||||
const key =
|
const rawDim1 =
|
||||||
x.item_dim1_code === null || x.item_dim1_code === ''
|
x.item_dim1_code == null
|
||||||
? ' '
|
? ' '
|
||||||
: normalizeBedenLabel(String(x.item_dim1_code))
|
: String(x.item_dim1_code)
|
||||||
|
const key = rawDim1 === ' '
|
||||||
|
? ' '
|
||||||
|
: normalizeBedenLabel(rawDim1)
|
||||||
apiStockMap[key] = Number(x.kullanilabilir_envanter ?? 0)
|
apiStockMap[key] = Number(x.kullanilabilir_envanter ?? 0)
|
||||||
|
|
||||||
|
const rawUpper = safeTrimUpperJs(rawDim1)
|
||||||
|
if (grpKey === 'yas' && /^(\d+)\s*(Y|YAS|YAŞ)$/.test(rawUpper)) {
|
||||||
|
const canonical = normalizeBedenLabel(rawUpper)
|
||||||
|
apiYasPayloadMap[canonical] = pickPreferredYasPayloadLabel(
|
||||||
|
apiYasPayloadMap[canonical],
|
||||||
|
rawUpper
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const finalStockMap = {}
|
const finalStockMap = {}
|
||||||
@@ -2740,6 +2774,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
|
|||||||
bedenStock.value = Object.entries(stockMap.value).map(
|
bedenStock.value = Object.entries(stockMap.value).map(
|
||||||
([beden, stok]) => ({ beden, stok })
|
([beden, stok]) => ({ beden, stok })
|
||||||
)
|
)
|
||||||
|
form.yasPayloadMap = { ...(form.yasPayloadMap || {}), ...apiYasPayloadMap }
|
||||||
|
|
||||||
/* =======================================================
|
/* =======================================================
|
||||||
💾 CACHE
|
💾 CACHE
|
||||||
@@ -2747,7 +2782,8 @@ export const useOrderEntryStore = defineStore('orderentry', {
|
|||||||
sizeCache.value[cacheKey] = {
|
sizeCache.value[cacheKey] = {
|
||||||
labels: [...form.bedenLabels],
|
labels: [...form.bedenLabels],
|
||||||
stockArray: [...bedenStock.value],
|
stockArray: [...bedenStock.value],
|
||||||
stockMap: { ...stockMap.value }
|
stockMap: { ...stockMap.value },
|
||||||
|
yasPayloadMap: { ...(form.yasPayloadMap || {}) }
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(`✅ loadProductSizes FINAL v4.2 → ${grpKey}`)
|
console.log(`✅ loadProductSizes FINAL v4.2 → ${grpKey}`)
|
||||||
@@ -3334,10 +3370,16 @@ export const useOrderEntryStore = defineStore('orderentry', {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// UI'de yas grubu 2/4/6... gösterilir; payload'a 2Y/4Y/6... yazılır.
|
// UI'de yas grubu 2/4/6... gösterilir; payload'a 2Y/4Y/6... yazılır.
|
||||||
const toPayloadBeden = (grpKey, v) => {
|
const toPayloadBeden = (row, grpKey, v) => {
|
||||||
const base = normBeden(v)
|
const base = normBeden(v)
|
||||||
if (!base) return ''
|
if (!base) return ''
|
||||||
if (grpKey === 'yas' && /^\d+$/.test(base)) {
|
if (grpKey === 'yas' && /^\d+$/.test(base)) {
|
||||||
|
const map =
|
||||||
|
row?.yasPayloadMap && typeof row.yasPayloadMap === 'object'
|
||||||
|
? row.yasPayloadMap
|
||||||
|
: {}
|
||||||
|
const mapped = safeStr(map[base]).toUpperCase()
|
||||||
|
if (mapped) return mapped
|
||||||
return `${base}Y`
|
return `${base}Y`
|
||||||
}
|
}
|
||||||
return base
|
return base
|
||||||
@@ -3591,7 +3633,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
|
|||||||
// ✅ UI/combokey için kanonik beden (yas'ta 2/4/6...)
|
// ✅ UI/combokey için kanonik beden (yas'ta 2/4/6...)
|
||||||
const bedenCanonical = normBeden(bedenRaw)
|
const bedenCanonical = normBeden(bedenRaw)
|
||||||
// ✅ payload beden: yas grubunda 2Y/4Y/6..., diğerlerinde normal
|
// ✅ payload beden: yas grubunda 2Y/4Y/6..., diğerlerinde normal
|
||||||
const bedenPayload = toPayloadBeden(grpKey, bedenRaw)
|
const bedenPayload = toPayloadBeden(row, grpKey, bedenRaw)
|
||||||
// ✅ combokey beden: boşsa '_' ile stabil kalsın
|
// ✅ combokey beden: boşsa '_' ile stabil kalsın
|
||||||
const bedenKey = bedenCanonical || '_'
|
const bedenKey = bedenCanonical || '_'
|
||||||
|
|
||||||
@@ -3746,6 +3788,17 @@ function parseNumericSizeJs(v) {
|
|||||||
return Number.isNaN(n) ? null : n
|
return Number.isNaN(n) ? null : n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function pickPreferredYasPayloadLabel(currentRaw, nextRaw) {
|
||||||
|
const cur = safeTrimUpperJs(currentRaw)
|
||||||
|
const nxt = safeTrimUpperJs(nextRaw)
|
||||||
|
if (!nxt) return cur
|
||||||
|
if (!cur) return nxt
|
||||||
|
const curYas = /YAS$|YAŞ$/.test(cur)
|
||||||
|
const nxtYas = /YAS$|YAŞ$/.test(nxt)
|
||||||
|
if (!curYas && nxtYas) return nxt
|
||||||
|
return cur
|
||||||
|
}
|
||||||
|
|
||||||
export function normalizeBedenLabel(v) {
|
export function normalizeBedenLabel(v) {
|
||||||
let s = (v == null ? '' : String(v)).trim()
|
let s = (v == null ? '' : String(v)).trim()
|
||||||
if (s === '') return ' '
|
if (s === '') return ' '
|
||||||
@@ -4059,6 +4112,7 @@ export function toSummaryRowFromForm(form) {
|
|||||||
urunAltGrubu: form.urunAltGrubu || '',
|
urunAltGrubu: form.urunAltGrubu || '',
|
||||||
kategori: form.kategori || '',
|
kategori: form.kategori || '',
|
||||||
yetiskinGarson: form.yetiskinGarson || form.askiliyan || '',
|
yetiskinGarson: form.yetiskinGarson || form.askiliyan || '',
|
||||||
|
yasPayloadMap: { ...(form.yasPayloadMap || {}) },
|
||||||
aciklama: form.aciklama || '',
|
aciklama: form.aciklama || '',
|
||||||
|
|
||||||
fiyat: Number(form.fiyat || 0),
|
fiyat: Number(form.fiyat || 0),
|
||||||
|
|||||||
Reference in New Issue
Block a user