@@ -1,25 +1,25 @@
/* ===========================================================
/* ===========================================================
📦 orderentryStore.js (v3.4 CLEAN — AUTH + LOCAL PERSIST + AUTO RESUME)
📦 orderentryStore.js (v3.4 CLEAN — AUTH + LOCAL PERSIST + AUTO RESUME)
=========================================================== */
=========================================================== */
import { defineStore } from 'pinia'
import { defineStore } from 'pinia'
import api , { extractApiErrorDetail } from 'src/services/api'
import api , { extractApiErrorDetail } from 'src/services/api'
import dayjs from 'src/boot/dayjs'
import dayjs from 'src/boot/dayjs'
import { ref , toRaw , nextTick } from 'vue' // ✅ dü zeltildi
import { ref , toRaw , nextTick } from 'vue' // ✅ dü zeltildi
import { useAuthStore } from 'src/stores/authStore'
import { useAuthStore } from 'src/stores/authStore'
// ===========================================================
// ===========================================================
// 🔹 Shared Reactive Referanslar (Global, Reaktif Nesneler)
// 🔹 Shared Reactive Referanslar (Global, Reaktif Nesneler)
// ===========================================================
// ===========================================================
/* ===========================================================
/* ===========================================================
🔹 BEDEN ŠEMALARI — STORE SOURCE OF TRUTH
🔹 BEDEN Ş EMALARI — STORE SOURCE OF TRUTH
=========================================================== */
=========================================================== */
// â¬†ï¸ orderentryStore.js EN ÜSTÜ NE
// ⬆️ orderentryStore.js EN ÜSTÜ NE
// ===========================================================
// ===========================================================
// 🔑 COMBO KEY CONTRACT (Frontend ↔ Backend) — v1
// 🔑 COMBO KEY CONTRACT (Frontend ↔ Backend) — v1
// - trim + UPPER
// - trim + UPPER
// - dim1 boÅŸ sa " "
// - dim1 boş sa " "
// - dim2 boÅŸ sa ""
// - dim2 boş sa ""
// ===========================================================
// ===========================================================
const BEDEN _EMPTY = '_'
const BEDEN _EMPTY = '_'
@@ -33,7 +33,7 @@ export function buildComboKey(row, beden) {
const bdn = normUpper ( beden )
const bdn = normUpper ( beden )
const bedenFinal = bdn === '' ? BEDEN _EMPTY : bdn
const bedenFinal = bdn === '' ? BEDEN _EMPTY : bdn
// 🔒 KANONİ K SIRA
// 🔒 KANONİ K SIRA
return ` ${ model } || ${ renk } || ${ renk2 } || ${ bedenFinal } `
return ` ${ model } || ${ renk } || ${ renk2 } || ${ bedenFinal } `
}
}
@@ -61,10 +61,10 @@ export const stockMap = ref({})
export const bedenStock = ref ( [ ] )
export const bedenStock = ref ( [ ] )
export const sizeCache = ref ( { } )
export const sizeCache = ref ( { } )
// ===========================================================
// ===========================================================
// 🔹 Shared Reactive Referanslar (Global, Reaktif Nesneler)
// 🔹 Shared Reactive Referanslar (Global, Reaktif Nesneler)
// ===========================================================
// ===========================================================
// ========================
// ========================
// 🧰 GLOBAL DATE NORMALIZER
// 🧰 GLOBAL DATE NORMALIZER
// ========================
// ========================
function newGuid ( ) {
function newGuid ( ) {
@@ -73,7 +73,7 @@ function newGuid() {
// 🔑 Her beden satırı iç in deterministik clientKey ü retimi
// 🔑 Her beden satı rı iç in deterministik clientKey ü retimi
function makeLineClientKey ( row , grpKey , beden ) {
function makeLineClientKey ( row , grpKey , beden ) {
const base =
const base =
row . clientRowKey ||
row . clientRowKey ||
@@ -89,7 +89,7 @@ function makeLineClientKey(row, grpKey, beden) {
// ===========================================================
// ===========================================================
// 🧩 Pinia Store — ORDER ENTRY STORE (REV 2025-11-03.2)
// 🧩 Pinia Store — ORDER ENTRY STORE (REV 2025-11-03.2)
// ===========================================================
// ===========================================================
export const useOrderEntryStore = defineStore ( 'orderentry' , {
export const useOrderEntryStore = defineStore ( 'orderentry' , {
state : ( ) => ( {
state : ( ) => ( {
@@ -145,12 +145,12 @@ export const useOrderEntryStore = defineStore('orderentry', {
getters : {
getters : {
getDraftKey ( ) {
getDraftKey ( ) {
// NEW taslak → GLOBAL ama tekil
// NEW taslak → GLOBAL ama tekil
return 'bss_orderentry_new_draft'
return 'bss_orderentry_new_draft'
} ,
} ,
getEditKey ( ) {
getEditKey ( ) {
// EDIT → OrderHeaderID’ ye bağlı
// EDIT → OrderHeaderID’ ye bağlı
const id = this . header ? . OrderHeaderID
const id = this . header ? . OrderHeaderID
return id ? ` bss_orderentry_edit: ${ id } ` : null
return id ? ` bss_orderentry_edit: ${ id } ` : null
}
}
@@ -201,7 +201,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
,
,
/* ===========================================================
/* ===========================================================
🧩 initSchemaMap — BEDEN ŠEMA İNİ T
🧩 initSchemaMap — BEDEN Ş EMA İNİ T
- TEK SOURCE OF TRUTH: BEDEN_SCHEMA
- TEK SOURCE OF TRUTH: BEDEN_SCHEMA
=========================================================== */
=========================================================== */
initSchemaMap ( ) {
initSchemaMap ( ) {
@@ -222,7 +222,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
this . schemaMap = map
this . schemaMap = map
console . log (
console . log (
'🧩 schemaMap INIT edildi:' ,
'🧩 schemaMap INIT edildi:' ,
Object . keys ( this . schemaMap )
Object . keys ( this . schemaMap )
)
)
} ,
} ,
@@ -244,32 +244,32 @@ export const useOrderEntryStore = defineStore('orderentry', {
0
0
)
)
// Header sadece GÖ STERİ M / BACKEND iç in
// Header sadece GÖ STERİ M / BACKEND iç in
if ( this . header ) {
if ( this . header ) {
this . header . TotalAmount = Number ( total . toFixed ( 2 ) )
this . header . TotalAmount = Number ( total . toFixed ( 2 ) )
}
}
return total
return total
} catch ( err ) {
} catch ( err ) {
console . error ( '⌠updateHeaderTotals hata:' , err )
console . error ( '❌ updateHeaderTotals hata:' , err )
return 0
return 0
}
}
}
}
,
,
/* ===========================================================
/* ===========================================================
🚨 showInvalidVariantDialog — FINAL
🚨 showInvalidVariantDialog — FINAL
-----------------------------------------------------------
-----------------------------------------------------------
✔ prItemVariant olmayan satı rları listeler
✔ prItemVariant olmayan satı rları listeler
✔ Satı ra tı kla → scroll + highlight
✔ Satı ra tı kla → scroll + highlight
✔ Kaydı BLOKLAYAN tek UI noktası
✔ Kaydı BLOKLAYAN tek UI noktası
=========================================================== */
=========================================================== */
async showInvalidVariantDialog ( $q , invalidList = [ ] ) {
async showInvalidVariantDialog ( $q , invalidList = [ ] ) {
if ( ! Array . isArray ( invalidList ) || invalidList . length === 0 ) return
if ( ! Array . isArray ( invalidList ) || invalidList . length === 0 ) return
return new Promise ( resolve => {
return new Promise ( resolve => {
const dlg = $q . dialog ( {
const dlg = $q . dialog ( {
title : '🚨 Tanımsız Ürü n Kombinasyonları ' ,
title : '🚨 Tanı msı z Ürü n Kombinasyonları ' ,
message : `
message : `
<div style="max-height:60vh;overflow:auto">
<div style="max-height:60vh;overflow:auto">
${ invalidList . map ( ( v , i ) => `
${ invalidList . map ( ( v , i ) => `
@@ -288,12 +288,12 @@ export const useOrderEntryStore = defineStore('orderentry', {
# ${ i + 1 } | Item: ${ v . itemCode }
# ${ i + 1 } | Item: ${ v . itemCode }
</div>
</div>
<div style="font-size:13px">
<div style="font-size:13px">
Beden: ${ v . dim1 || '(boÅŸ )' } |
Beden: ${ v . dim1 || '(boş )' } |
Renk: ${ v . colorCode || '-' } |
Renk: ${ v . colorCode || '-' } |
Qty: ${ v . qty1 }
Qty: ${ v . qty1 }
</div>
</div>
<div style="font-size:12px;color:#c10015">
<div style="font-size:12px;color:#c10015">
Sebep: ${ v . reason || 'Tanımsız ürü n kombinasyonu' }
Sebep: ${ v . reason || 'Tanı msı z ürü n kombinasyonu' }
</div>
</div>
</div>
</div>
` ) . join ( '' ) }
` ) . join ( '' ) }
@@ -301,7 +301,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
` ,
` ,
html : true ,
html : true ,
ok : {
ok : {
label : 'Dü zelt' ,
label : 'Dü zelt' ,
color : 'negative'
color : 'negative'
} ,
} ,
cancel : false ,
cancel : false ,
@@ -310,7 +310,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
. onOk ( ( ) => resolve ( ) )
. onOk ( ( ) => resolve ( ) )
. onDismiss ( ( ) => resolve ( ) )
. onDismiss ( ( ) => resolve ( ) )
// Quasar v2 chain API'de onShown yok; dialog DOM'u render olduktan sonra baÄŸ la.
// Quasar v2 chain API'de onShown yok; dialog DOM'u render olduktan sonra bağ la.
setTimeout ( ( ) => {
setTimeout ( ( ) => {
if ( ! dlg ) return
if ( ! dlg ) return
const nodes = document . querySelectorAll ( '.invalid-row' )
const nodes = document . querySelectorAll ( '.invalid-row' )
@@ -325,42 +325,42 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
,
,
/* ===========================================================
/* ===========================================================
🯠scrollToInvalidRow — FINAL
🎯 scrollToInvalidRow — FINAL
-----------------------------------------------------------
-----------------------------------------------------------
✔ ClientKey bazlı scroll
✔ ClientKey bazlı scroll
✔ Hem summaryRows hem orders destekli
✔ Hem summaryRows hem orders destekli
✔ Highlight otomatik kalkar
✔ Highlight otomatik kalkar
=========================================================== */
=========================================================== */
scrollToInvalidRow ( clientKey ) {
scrollToInvalidRow ( clientKey ) {
if ( ! clientKey ) return
if ( ! clientKey ) return
// 1ï¸âƒ£ Store iç indeki satırı bul
// 1️⃣ Store iç indeki satı rı bul
const idx = this . summaryRows ? . findIndex (
const idx = this . summaryRows ? . findIndex (
r => r . clientKey === clientKey
r => r . clientKey === clientKey
)
)
if ( idx === - 1 ) {
if ( idx === - 1 ) {
console . warn ( '⌠Satı r bulunamadı :' , clientKey )
console . warn ( '❌ Satı r bulunamadı :' , clientKey )
return
return
}
}
// 2ï¸âƒ£ DOM node
// 2️⃣ DOM node
const el = document . querySelector (
const el = document . querySelector (
` [data-clientkey=" ${ clientKey } "] `
` [data-clientkey=" ${ clientKey } "] `
)
)
if ( ! el ) {
if ( ! el ) {
console . warn ( '⌠DOM satırı bulunamadı :' , clientKey )
console . warn ( '❌ DOM satı rı bulunamadı :' , clientKey )
return
return
}
}
// 3ï¸âƒ£ Scroll
// 3️⃣ Scroll
el . scrollIntoView ( {
el . scrollIntoView ( {
behavior : 'smooth' ,
behavior : 'smooth' ,
block : 'center'
block : 'center'
} )
} )
// 4ï¸âƒ£ Highlight
// 4️⃣ Highlight
el . classList . add ( 'invalid-highlight' )
el . classList . add ( 'invalid-highlight' )
setTimeout ( ( ) => {
setTimeout ( ( ) => {
@@ -375,10 +375,10 @@ export const useOrderEntryStore = defineStore('orderentry', {
const res = await api . get ( ` /orders/check/ ${ orderHeaderID } ` )
const res = await api . get ( ` /orders/check/ ${ orderHeaderID } ` )
// Backend “ true/false†dö ner varsayımı
// Backend “ true/false” dö ner varsayı mı
return res ? . data ? . exists === true
return res ? . data ? . exists === true
} catch ( err ) {
} catch ( err ) {
console . warn ( "âš checkHeaderExists hata:" , err )
console . warn ( "⚠ checkHeaderExists hata:" , err )
return false
return false
}
}
}
}
@@ -393,7 +393,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
} catch ( err ) {
} catch ( err ) {
const detail = await extractApiErrorDetail ( err )
const detail = await extractApiErrorDetail ( err )
const status = err ? . status || err ? . response ? . status || '-'
const status = err ? . status || err ? . response ? . status || '-'
console . error ( ` ❌ fetchOrderPdf hata [${ status } ] order= ${ orderId } : ${ detail } ` )
console . error ( ` ? fetchOrderPdf hata [${ status } ] order= ${ orderId } : ${ detail } ` )
throw new Error ( detail )
throw new Error ( detail )
}
}
}
}
@@ -403,7 +403,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
try {
try {
const orderId = id || this . header ? . OrderHeaderID
const orderId = id || this . header ? . OrderHeaderID
if ( ! orderId ) {
if ( ! orderId ) {
console . error ( '⌠PDF ID bulunamadı ' )
console . error ( '❌ PDF ID bulunamadı ' )
return
return
}
}
@@ -421,7 +421,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
const detail = await extractApiErrorDetail ( err )
const detail = await extractApiErrorDetail ( err )
const orderId = id || this . header ? . OrderHeaderID || '-'
const orderId = id || this . header ? . OrderHeaderID || '-'
const status = err ? . status || err ? . response ? . status || '-'
const status = err ? . status || err ? . response ? . status || '-'
console . error ( ` ❌ PDF aç ma hatası [${ status } ] order= ${ orderId } : ${ detail } ` )
console . error ( ` ? PDF a<EFBFBD> ma hatas<EFBFBD> [${ status } ] order= ${ orderId } : ${ detail } ` )
throw new Error ( detail )
throw new Error ( detail )
}
}
}
}
@@ -442,14 +442,14 @@ export const useOrderEntryStore = defineStore('orderentry', {
} ,
} ,
/* ===========================================================
/* ===========================================================
🧩 initFromRoute (v5.6 — groupedRows TOUCH YOK)
🧩 initFromRoute (v5.6 — groupedRows TOUCH YOK)
-----------------------------------------------------------
-----------------------------------------------------------
- Route ID ve bss_last_txn arası nda en dolu snapshot'ı seç er
- Route ID ve bss_last_txn arası nda en dolu snapshot'ı seç er
- header + orders + summaryRows restore edilir
- header + orders + summaryRows restore edilir
- groupedRows hydrate edilmez / resetlenmez / dokunulmaz
- groupedRows hydrate edilmez / resetlenmez / dokunulmaz
- Route ID farklı ysa router.replace ile URL dü zeltilir
- Route ID farklı ysa router.replace ile URL dü zeltilir
=========================================================== */
=========================================================== */
async initFromRoute ( orderId , router = null ) { // ✅ NEW MODE → SADECE global draft
async initFromRoute ( orderId , router = null ) { // ✅ NEW MODE → SADECE global draft
if ( this . mode === 'new' ) {
if ( this . mode === 'new' ) {
const raw = localStorage . getItem ( this . getDraftKey )
const raw = localStorage . getItem ( this . getDraftKey )
if ( raw ) {
if ( raw ) {
@@ -458,11 +458,11 @@ export const useOrderEntryStore = defineStore('orderentry', {
this . header = payload . header || { }
this . header = payload . header || { }
this . orders = payload . orders || [ ]
this . orders = payload . orders || [ ]
this . summaryRows = payload . summaryRows || this . orders
this . summaryRows = payload . summaryRows || this . orders
console . log ( 'â™»ï¸ NEW draft restore edildi (global)' )
console . log ( '♻️ NEW draft restore edildi (global)' )
return
return
} catch { }
} catch { }
}
}
console . log ( '⚪ NEW draft yok, boş baş latılı yor' )
console . log ( '⚪ NEW draft yok, boş baş latı lı yor' )
return
return
}
}
if ( ! this . schemaMap || ! Object . keys ( this . schemaMap ) . length ) {
if ( ! this . schemaMap || ! Object . keys ( this . schemaMap ) . length ) {
@@ -470,7 +470,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
try {
try {
console . log ( '🧩 [initFromRoute] orderId:' , orderId )
console . log ( '🧩 [initFromRoute] orderId:' , orderId )
const lastTxn = localStorage . getItem ( 'bss_last_txn' ) || null
const lastTxn = localStorage . getItem ( 'bss_last_txn' ) || null
@@ -500,18 +500,18 @@ export const useOrderEntryStore = defineStore('orderentry', {
if ( hasData ( fromRoute ) ) {
if ( hasData ( fromRoute ) ) {
chosenId = orderId
chosenId = orderId
chosenPayload = fromRoute
chosenPayload = fromRoute
console . log ( '✅ [initFromRoute] Route ID snapshot seç ildi:' , chosenId )
console . log ( '✅ [initFromRoute] Route ID snapshot seç ildi:' , chosenId )
} else if ( hasData ( fromLast ) ) {
} else if ( hasData ( fromLast ) ) {
chosenId = lastTxn
chosenId = lastTxn
chosenPayload = fromLast
chosenPayload = fromLast
console . log ( '✅ [initFromRoute] lastTxn snapshot seç ildi:' , chosenId )
console . log ( '✅ [initFromRoute] lastTxn snapshot seç ildi:' , chosenId )
}
}
/* -------------------------------------------------------
/* -------------------------------------------------------
🚫 SNAPSHOT YOK → BOŠBAŠLA
🚫 SNAPSHOT YOK → BOŞ BAŞ LA
-------------------------------------------------------- */
-------------------------------------------------------- */
if ( ! chosenId || ! chosenPayload ) {
if ( ! chosenId || ! chosenPayload ) {
console . log ( '⚪ [initFromRoute] Snapshot yok, boş baş latılı yor' )
console . log ( '⚪ [initFromRoute] Snapshot yok, boş baş latı lı yor' )
this . header = {
this . header = {
... ( this . header || { } ) ,
... ( this . header || { } ) ,
@@ -521,12 +521,12 @@ export const useOrderEntryStore = defineStore('orderentry', {
this . orders = [ ]
this . orders = [ ]
this . summaryRows = [ ]
this . summaryRows = [ ]
// â— groupedRows'a DOKUNMA
// ❗ groupedRows'a DOKUNMA
return
return
}
}
/* -------------------------------------------------------
/* -------------------------------------------------------
✅ SNAPSHOT RESTORE (SAFE CLONE)
✅ SNAPSHOT RESTORE (SAFE CLONE)
-------------------------------------------------------- */
-------------------------------------------------------- */
this . header = {
this . header = {
... ( chosenPayload . header || { } ) ,
... ( chosenPayload . header || { } ) ,
@@ -544,22 +544,22 @@ export const useOrderEntryStore = defineStore('orderentry', {
this . orders = orders
this . orders = orders
this . summaryRows = summaryRows
this . summaryRows = summaryRows
// â— groupedRows hydrate edilmez, resetlenmez
// ❗ groupedRows hydrate edilmez, resetlenmez
/* -------------------------------------------------------
/* -------------------------------------------------------
🔠lastTxn SENKRON
🔁 lastTxn SENKRON
-------------------------------------------------------- */
-------------------------------------------------------- */
try {
try {
localStorage . setItem ( 'bss_last_txn' , chosenId )
localStorage . setItem ( 'bss_last_txn' , chosenId )
} catch ( e ) {
} catch ( e ) {
console . warn ( 'âš ï¸ bss_last_txn yazı lamadı :' , e )
console . warn ( '⚠️ bss_last_txn yazı lamadı :' , e )
}
}
/* -------------------------------------------------------
/* -------------------------------------------------------
🔠ROUTE DÜ ZELTME (GEREKİ RSE)
🔁 ROUTE DÜ ZELTME (GEREKİ RSE)
-------------------------------------------------------- */
-------------------------------------------------------- */
if ( router && orderId && orderId !== chosenId ) {
if ( router && orderId && orderId !== chosenId ) {
console . log ( '🔠[initFromRoute] Route ID dü zeltiliyor → ' , chosenId )
console . log ( '🔁 [initFromRoute] Route ID dü zeltiliyor → ' , chosenId )
await router . replace ( {
await router . replace ( {
name : 'order-entry' ,
name : 'order-entry' ,
params : { orderHeaderID : chosenId }
params : { orderHeaderID : chosenId }
@@ -567,19 +567,19 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
console . log (
console . log (
'✅ [initFromRoute] Restore tamam. Satı r sayısı :' ,
'✅ [initFromRoute] Restore tamam. Satı r sayı sı :' ,
this . summaryRows . length
this . summaryRows . length
)
)
} catch ( err ) {
} catch ( err ) {
console . error ( '⌠[initFromRoute] hata:' , err )
console . error ( '❌ [initFromRoute] hata:' , err )
}
}
}
}
,
,
/* ===========================================================
/* ===========================================================
🆕 startNewOrder (v8.3 — FINAL & STABLE)
🆕 startNewOrder (v8.3 — FINAL & STABLE)
=========================================================== */
=========================================================== */
async startNewOrder ( { $q } ) {
async startNewOrder ( { $q } ) {
@@ -597,7 +597,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
orderNumber = res . data . OrderNumber
orderNumber = res . data . OrderNumber
}
}
} catch {
} catch {
console . info ( 'â„¹ï¸ Backend order number yok, LOCAL kullanıldı ' )
console . info ( 'ℹ ️ Backend order number yok, LOCAL kullanı ldı ' )
}
}
this . mode = 'new'
this . mode = 'new'
@@ -617,10 +617,10 @@ export const useOrderEntryStore = defineStore('orderentry', {
this . orders = [ ]
this . orders = [ ]
this . summaryRows = [ ]
this . summaryRows = [ ]
// ✅ fingerprint bazlı sistem iç in reset
// ✅ fingerprint bazlı sistem iç in reset
this . _lastSavedFingerprint = null
this . _lastSavedFingerprint = null
// ✅ NEW draft hemen yazılı r
// ✅ NEW draft hemen yazı lı r
this . persistLocalStorage ? . ( )
this . persistLocalStorage ? . ( )
return this . header
return this . header
@@ -647,7 +647,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
const ex = map . get ( key )
const ex = map . get ( key )
ex . Qty1 = ( Number ( ex . Qty1 ) || 0 ) + ( Number ( ln . Qty1 ) || 0 )
ex . Qty1 = ( Number ( ex . Qty1 ) || 0 ) + ( Number ( ln . Qty1 ) || 0 )
// OrderLineID boş sa doldur (editte ö nemli)
// OrderLineID boş sa doldur (editte ö nemli)
if ( ! ex . OrderLineID && ln . OrderLineID ) ex . OrderLineID = ln . OrderLineID
if ( ! ex . OrderLineID && ln . OrderLineID ) ex . OrderLineID = ln . OrderLineID
}
}
return Array . from ( map . values ( ) )
return Array . from ( map . values ( ) )
@@ -656,7 +656,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
,
,
/* ===========================================================
/* ===========================================================
🧹 Core reset helper — sadece state'i sıfı rlar
🧹 Core reset helper — sadece state'i sı fı rlar
=========================================================== */
=========================================================== */
resetCoreState ( ) {
resetCoreState ( ) {
this . orders = [ ]
this . orders = [ ]
@@ -666,14 +666,14 @@ export const useOrderEntryStore = defineStore('orderentry', {
this . editingKey = null
this . editingKey = null
this . currentOrderId = null
this . currentOrderId = null
} , resetForNewOrder ( ) {
} , resetForNewOrder ( ) {
// mevcut her ÅŸ eyi temizle
// mevcut her ş eyi temizle
this . header = {
this . header = {
OrderHeaderID : this . header ? . OrderHeaderID || null ,
OrderHeaderID : this . header ? . OrderHeaderID || null ,
OrderDate : new Date ( ) . toISOString ( ) . slice ( 0 , 10 ) ,
OrderDate : new Date ( ) . toISOString ( ) . slice ( 0 , 10 ) ,
CurrAccCode : null ,
CurrAccCode : null ,
DocCurrencyCode : 'TRY' ,
DocCurrencyCode : 'TRY' ,
PriceCurrencyCode : 'TRY' ,
PriceCurrencyCode : 'TRY' ,
// ihtiyaç duyduğ un diğ er default header alanları
// ihtiyaç duyduğ un diğ er default header alanları
}
}
this . orders = [ ]
this . orders = [ ]
@@ -685,7 +685,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
,
,
resetForEdit ( ) {
resetForEdit ( ) {
// EDIT modda grid temizlenmez — sadece UI state resetlenir
// EDIT modda grid temizlenmez — sadece UI state resetlenir
this . editingKey = null
this . editingKey = null
this . groupedRows = [ ]
this . groupedRows = [ ]
this . mode = 'edit'
this . mode = 'edit'
@@ -694,9 +694,9 @@ export const useOrderEntryStore = defineStore('orderentry', {
, markAsSaved ( ) {
, markAsSaved ( ) {
try {
try {
this . _lastSavedFingerprint = this . _persistFingerprint ( )
this . _lastSavedFingerprint = this . _persistFingerprint ( )
console . log ( '✅ markAsSaved → fingerprint senkron' )
console . log ( '✅ markAsSaved → fingerprint senkron' )
} catch ( e ) {
} catch ( e ) {
console . warn ( 'âš ï¸ markAsSaved hata:' , e )
console . warn ( '⚠️ markAsSaved hata:' , e )
}
}
}
}
, clearLocalSnapshot ( ) {
, clearLocalSnapshot ( ) {
@@ -704,12 +704,12 @@ export const useOrderEntryStore = defineStore('orderentry', {
const id = this . header ? . OrderHeaderID
const id = this . header ? . OrderHeaderID
if ( ! id ) return
if ( ! id ) return
localStorage . removeItem ( ` bss_orderentry_data: ${ id } ` )
localStorage . removeItem ( ` bss_orderentry_data: ${ id } ` )
console . log ( '🧹 Local snapshot temizlendi:' , id )
console . log ( '🧹 Local snapshot temizlendi:' , id )
} catch ( e ) {
} catch ( e ) {
console . warn ( 'âš ï¸ clearLocalSnapshot hata:' , e )
console . warn ( '⚠️ clearLocalSnapshot hata:' , e )
}
}
} , /* ===========================================================
} , /* ===========================================================
🧹 HARD CLEAN — ALL ORDERENTRY SNAPSHOTS
🧹 HARD CLEAN — ALL ORDERENTRY SNAPSHOTS
=========================================================== */
=========================================================== */
clearAllOrderSnapshots ( ) {
clearAllOrderSnapshots ( ) {
Object . keys ( localStorage )
Object . keys ( localStorage )
@@ -718,7 +718,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
k . startsWith ( 'bss_orderentry_edit:' )
k . startsWith ( 'bss_orderentry_edit:' )
)
)
. forEach ( k => {
. forEach ( k => {
console . log ( '🧹 snapshot silindi:' , k )
console . log ( '🧹 snapshot silindi:' , k )
localStorage . removeItem ( k )
localStorage . removeItem ( k )
} )
} )
@@ -730,18 +730,18 @@ export const useOrderEntryStore = defineStore('orderentry', {
,
,
/* ===========================================================
/* ===========================================================
🧹 Store Hard Reset — Submit Sonrası Temizlik (FIXED)
🧹 Store Hard Reset — Submit Sonrası Temizlik (FIXED)
- Grid, header, toplamlar, local state'ler sıfı rlanı r
- Grid, header, toplamlar, local state'ler sı fı rlanı r
- persistKey / lastSnapshotKey NULL yapı lmaz (config sabit kalı r)
- persistKey / lastSnapshotKey NULL yapı lmaz (config sabit kalı r)
- localStorage txn/snapshot temizliğ i gü venli yapılı r
- localStorage txn/snapshot temizliğ i gü venli yapı lı r
=========================================================== */
=========================================================== */
hardResetAfterSubmit ( ) {
hardResetAfterSubmit ( ) {
try {
try {
// 🔑 mevcut id’ yi yakala (local temizliğ i iç in)
// 🔑 mevcut id’ yi yakala (local temizliğ i iç in)
const id = this . header ? . OrderHeaderID || null
const id = this . header ? . OrderHeaderID || null
/* -------------------------------------------------------
/* -------------------------------------------------------
1) Grid ve satı rlar
1) Grid ve satı rlar
-------------------------------------------------------- */
-------------------------------------------------------- */
this . orders = [ ]
this . orders = [ ]
this . summaryRows = [ ]
this . summaryRows = [ ]
@@ -761,12 +761,12 @@ export const useOrderEntryStore = defineStore('orderentry', {
/* -------------------------------------------------------
/* -------------------------------------------------------
4) Snapshot / transaction meta
4) Snapshot / transaction meta
âš ï¸ persistKey / lastSnapshotKey store config → NULL YAPMA
⚠️ persistKey / lastSnapshotKey store config → NULL YAPMA
-------------------------------------------------------- */
-------------------------------------------------------- */
this . activeTransactionId = null
this . activeTransactionId = null
this . submitted = false
this . submitted = false
// fingerprint / debounce meta varsa sıfı rla
// fingerprint / debounce meta varsa sı fı rla
this . _lastSavedFingerprint = null
this . _lastSavedFingerprint = null
this . _lastPersistFingerprint = null
this . _lastPersistFingerprint = null
if ( this . _persistTimeout ) {
if ( this . _persistTimeout ) {
@@ -775,7 +775,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
/* -------------------------------------------------------
/* -------------------------------------------------------
5) LocalStorage temizlik (opsiyonel ama submit sonrası doğ ru)
5) LocalStorage temizlik (opsiyonel ama submit sonrası doğ ru)
-------------------------------------------------------- */
-------------------------------------------------------- */
try {
try {
if ( id ) {
if ( id ) {
@@ -785,32 +785,32 @@ export const useOrderEntryStore = defineStore('orderentry', {
localStorage . removeItem ( 'bss_last_txn' )
localStorage . removeItem ( 'bss_last_txn' )
localStorage . removeItem ( 'bss_active_new_header' )
localStorage . removeItem ( 'bss_active_new_header' )
} catch ( e ) {
} catch ( e ) {
console . warn ( 'âš ï¸ hardResetAfterSubmit localStorage temizliÄŸ i hata:' , e )
console . warn ( '⚠️ hardResetAfterSubmit localStorage temizliğ i hata:' , e )
}
}
console . log ( '🧹 Store resetlendi (submit sonrası ).' )
console . log ( '🧹 Store resetlendi (submit sonrası ).' )
} catch ( err ) {
} catch ( err ) {
console . error ( '⌠hardResetAfterSubmit hata:' , err )
console . error ( '❌ hardResetAfterSubmit hata:' , err )
}
}
}
}
,
,
/* ===========================================================
/* ===========================================================
âœï¸ openExistingForEdit (v12 — FINAL & CLEAN)
✏️ openExistingForEdit (v12 — FINAL & CLEAN)
-----------------------------------------------------------
-----------------------------------------------------------
✔ Backend authoritative (orderlist açılışı local'i dikkate almaz)
✔ Backend authoritative (orderlist açı lı şı local'i dikkate almaz)
✔ mode=new → backend çağrısı YOK
✔ mode=new → backend çağrı sı YOK
✔ normalizeOrderLines → grpKey + bedenMap garanti
✔ normalizeOrderLines → grpKey + bedenMap garanti
✔ isClosed varsa → view, yoksa → edit
✔ isClosed varsa → view, yoksa → edit
✔ Form sync opsiyonel
✔ Form sync opsiyonel
✔ İlk açılış ta snapshot yazılı r (edit boyunca persist ile gü ncellenir)
✔ İlk açı lı ş ta snapshot yazı lı r (edit boyunca persist ile gü ncellenir)
=========================================================== */
=========================================================== */
async openExistingForEdit (
async openExistingForEdit (
orderId ,
orderId ,
{ $q = null , form = null , productCache = null } = { }
{ $q = null , form = null , productCache = null } = { }
) {
) {
// 🔑 schemaMap garanti
// 🔑 schemaMap garanti
if ( ! this . schemaMap || ! Object . keys ( this . schemaMap ) . length ) {
if ( ! this . schemaMap || ! Object . keys ( this . schemaMap ) . length ) {
this . initSchemaMap ? . ( )
this . initSchemaMap ? . ( )
}
}
@@ -818,25 +818,25 @@ export const useOrderEntryStore = defineStore('orderentry', {
if ( ! orderId ) return false
if ( ! orderId ) return false
/* =======================================================
/* =======================================================
🟦 NEW MODE — ASLA backend çağrısı yok
🟦 NEW MODE — ASLA backend çağrı sı yok
======================================================= */
======================================================= */
if ( this . mode === 'new' ) {
if ( this . mode === 'new' ) {
console . log ( '⚪ openExistingForEdit skip (mode=new)' )
console . log ( '⚪ openExistingForEdit skip (mode=new)' )
return false
return false
}
}
// productCache hem ref hem reactive olabilir → gü venli oku
// productCache hem ref hem reactive olabilir → gü venli oku
const pc =
const pc =
productCache ? . value
productCache ? . value
? productCache . value
? productCache . value
: ( productCache && typeof productCache === 'object' ? productCache : { } )
: ( productCache && typeof productCache === 'object' ? productCache : { } )
try {
try {
// geç ici varsayı m (sonra isClosed durumuna gö re set edilecek)
// geç ici varsayı m (sonra isClosed durumuna gö re set edilecek)
this . setMode ? . ( 'edit' )
this . setMode ? . ( 'edit' )
/* =======================================================
/* =======================================================
🔹 BACKEND — authoritative load
🔹 BACKEND — authoritative load
======================================================= */
======================================================= */
const res = await api . get ( ` /order/get/ ${ orderId } ` )
const res = await api . get ( ` /order/get/ ${ orderId } ` )
const backend = res ? . data
const backend = res ? . data
@@ -846,8 +846,8 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
/* =======================================================
/* =======================================================
🔹 HEADER — SADECE BACKEND
🔹 HEADER — SADECE BACKEND
(orderlist açılışı nda local merge YOK)
(orderlist açı lı şı nda local merge YOK)
======================================================= */
======================================================= */
this . header = {
this . header = {
... backend . header ,
... backend . header ,
@@ -855,11 +855,11 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
/* =======================================================
/* =======================================================
🔹 NORMALIZE LINES (TEK KAYNAK)
🔹 NORMALIZE LINES (TEK KAYNAK)
normalizeOrderLines ş u alanları ü retmeli:
normalizeOrderLines ş u alanları ü retmeli:
✔ row.grpKey
✔ row.grpKey
✔ row.bedenMap[grpKey]
✔ row.bedenMap[grpKey]
✔ row.isClosed (boolean)
✔ row.isClosed (boolean)
======================================================= */
======================================================= */
const normalized = this . normalizeOrderLines (
const normalized = this . normalizeOrderLines (
backend . lines || [ ] ,
backend . lines || [ ] ,
@@ -871,31 +871,31 @@ export const useOrderEntryStore = defineStore('orderentry', {
this . summaryRows = [ ... this . orders ]
this . summaryRows = [ ... this . orders ]
/* =======================================================
/* =======================================================
🔹 MODE KARARI (BACKEND SATIRLARI Ü ZERİ NDEN)
🔹 MODE KARARI (BACKEND SATIRLARI Ü ZERİ NDEN)
- herhangi bir isClosed=true → view
- herhangi bir isClosed=true → view
- değ ilse → edit
- değ ilse → edit
======================================================= */
======================================================= */
const hasClosedLine = ( this . summaryRows || [ ] ) . some ( r => r ? . isClosed === true )
const hasClosedLine = ( this . summaryRows || [ ] ) . some ( r => r ? . isClosed === true )
this . setMode ? . ( hasClosedLine ? 'view' : 'edit' )
this . setMode ? . ( hasClosedLine ? 'view' : 'edit' )
/* =======================================================
/* =======================================================
🔹 FORM SYNC (opsiyonel)
🔹 FORM SYNC (opsiyonel)
======================================================= */
======================================================= */
if ( form ) {
if ( form ) {
Object . assign ( form , this . header )
Object . assign ( form , this . header )
}
}
/* =======================================================
/* =======================================================
🔹 LOCAL SNAPSHOT (edit boyunca tutulacak temel)
🔹 LOCAL SNAPSHOT (edit boyunca tutulacak temel)
- Açılış ta snapshot yaz
- Açı lı ş ta snapshot yaz
- Sonraki değiş ikliklerde zaten persistLocalStorage çağrı ları var
- Sonraki değiş ikliklerde zaten persistLocalStorage çağrı ları var
======================================================= */
======================================================= */
this . persistLocalStorage ? . ( )
this . persistLocalStorage ? . ( )
try {
try {
localStorage . setItem ( 'bss_last_txn' , String ( orderId ) )
localStorage . setItem ( 'bss_last_txn' , String ( orderId ) )
} catch { }
} catch { }
console . log ( '✅ openExistingForEdit OK:' , {
console . log ( '✅ openExistingForEdit OK:' , {
id : orderId ,
id : orderId ,
rows : this . summaryRows . length ,
rows : this . summaryRows . length ,
mode : this . mode ,
mode : this . mode ,
@@ -904,13 +904,13 @@ export const useOrderEntryStore = defineStore('orderentry', {
return true
return true
} catch ( err ) {
} catch ( err ) {
console . error ( '⌠openExistingForEdit hata:' , err )
console . error ( '❌ openExistingForEdit hata:' , err )
// new deÄŸ ilse uyar
// new değ ilse uyar
if ( this . mode !== 'new' ) {
if ( this . mode !== 'new' ) {
$q ? . notify ? . ( {
$q ? . notify ? . ( {
type : 'negative' ,
type : 'negative' ,
message : 'Sipariş yü klenemedi'
message : 'Sipariş yü klenemedi'
} )
} )
}
}
@@ -920,12 +920,12 @@ export const useOrderEntryStore = defineStore('orderentry', {
,
,
/* ===========================================================
/* ===========================================================
â™»ï¸ hydrateFromLocalStorage (v5.5 — FIXED & CLEAN)
♻️ hydrateFromLocalStorage (v5.5 — FIXED & CLEAN)
-----------------------------------------------------------
-----------------------------------------------------------
- Tek assign (double overwrite YOK)
- Tek assign (double overwrite YOK)
- groupedRows hydrate edilmez
- groupedRows hydrate edilmez
- mode ASLA set edilmez
- mode ASLA set edilmez
- header + rows gü venli restore
- header + rows gü venli restore
=========================================================== */
=========================================================== */
async hydrateFromLocalStorage ( orderId , log = false ) { if ( this . mode === 'new' ) {
async hydrateFromLocalStorage ( orderId , log = false ) { if ( this . mode === 'new' ) {
return this . hydrateFromLocalStorageIfExists ( )
return this . hydrateFromLocalStorageIfExists ( )
@@ -936,15 +936,15 @@ export const useOrderEntryStore = defineStore('orderentry', {
const payload = JSON . parse ( localStorage . getItem ( key ) || 'null' )
const payload = JSON . parse ( localStorage . getItem ( key ) || 'null' )
if ( ! payload ) {
if ( ! payload ) {
log && console . log ( 'â„¹ï¸ hydrate → snapshot yok:' , orderId )
log && console . log ( 'ℹ ️ hydrate → snapshot yok:' , orderId )
return null
return null
}
}
// 🔑 source bilgisi (mode set edilmez)
// 🔑 source bilgisi (mode set edilmez)
this . source = payload . source || 'local'
this . source = payload . source || 'local'
/* -------------------------------------------------------
/* -------------------------------------------------------
MSSQL tarih helper’ ları
MSSQL tarih helper’ ları
-------------------------------------------------------- */
-------------------------------------------------------- */
const safeDateTime = v => {
const safeDateTime = v => {
if ( ! v ) return null
if ( ! v ) return null
@@ -994,11 +994,11 @@ export const useOrderEntryStore = defineStore('orderentry', {
? payload . summaryRows
? payload . summaryRows
: orders
: orders
// ⌠groupedRows hydrate edilmez (computed olmalı )
// ❌ groupedRows hydrate edilmez (computed olmalı )
this . groupedRows = [ ]
this . groupedRows = [ ]
/* -------------------------------------------------------
/* -------------------------------------------------------
SNAPSHOT Ö ZET
SNAPSHOT Ö ZET
-------------------------------------------------------- */
-------------------------------------------------------- */
const output = {
const output = {
type : payload . submitted === true ? 'submitted' : 'draft' ,
type : payload . submitted === true ? 'submitted' : 'draft' ,
@@ -1011,11 +1011,11 @@ export const useOrderEntryStore = defineStore('orderentry', {
payload . header ? . IsSubmitted === true
payload . header ? . IsSubmitted === true
}
}
log && console . log ( 'â™»ï¸ hydrate sonuc (FIXED):' , output )
log && console . log ( '♻️ hydrate sonuc (FIXED):' , output )
return output
return output
} catch ( err ) {
} catch ( err ) {
console . warn ( 'âš ï¸ hydrateFromLocalStorage hata:' , err )
console . warn ( '⚠️ hydrateFromLocalStorage hata:' , err )
return null
return null
}
}
}
}
@@ -1027,11 +1027,11 @@ export const useOrderEntryStore = defineStore('orderentry', {
let raw = null
let raw = null
if ( this . mode === 'new' ) {
if ( this . mode === 'new' ) {
raw = localStorage . getItem ( this . getDraftKey ) // ✅
raw = localStorage . getItem ( this . getDraftKey ) // ✅
}
}
if ( this . mode === 'edit' ) {
if ( this . mode === 'edit' ) {
const key = this . getEditKey // ✅
const key = this . getEditKey // ✅
if ( key ) raw = localStorage . getItem ( key )
if ( key ) raw = localStorage . getItem ( key )
}
}
@@ -1043,7 +1043,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
this . orders = payload . orders || [ ]
this . orders = payload . orders || [ ]
this . summaryRows = payload . summaryRows || this . orders
this . summaryRows = payload . summaryRows || this . orders
console . log ( 'â™»ï¸ hydrate OK:' , this . mode )
console . log ( '♻️ hydrate OK:' , this . mode )
return true
return true
} catch ( err ) {
} catch ( err ) {
@@ -1055,8 +1055,8 @@ export const useOrderEntryStore = defineStore('orderentry', {
,
,
/* ===========================================================
/* ===========================================================
🔀 mergeOrders (local + backend)
🔀 mergeOrders (local + backend)
normalizeISO → kaldırıldı
normalizeISO → kaldı rı ldı
safe MSSQL helpers eklendi
safe MSSQL helpers eklendi
=========================================================== */
=========================================================== */
mergeOrders ( local , backend , preferLocal = true ) {
mergeOrders ( local , backend , preferLocal = true ) {
@@ -1087,12 +1087,12 @@ export const useOrderEntryStore = defineStore('orderentry', {
const map = new Map ( )
const map = new Map ( )
// Backend satı rları
// Backend satı rları
for ( const b of ( backend ? . lines || backend ? . orders || [ ] ) ) {
for ( const b of ( backend ? . lines || backend ? . orders || [ ] ) ) {
map . set ( getKey ( b ) , { ... b , _src : 'backend' } )
map . set ( getKey ( b ) , { ... b , _src : 'backend' } )
}
}
// Local satı rları merge et
// Local satı rları merge et
for ( const l of ( local ? . orders || [ ] ) ) {
for ( const l of ( local ? . orders || [ ] ) ) {
const k = getKey ( l )
const k = getKey ( l )
if ( map . has ( k ) ) {
if ( map . has ( k ) ) {
@@ -1105,10 +1105,10 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
const mergedOrders = Array . from ( map . values ( ) )
const mergedOrders = Array . from ( map . values ( ) )
console . log ( ` 🧩 mergeOrders → ${ mergedOrders . length } satı r birleş ti (ID: ${ header . OrderHeaderID } ) ` )
console . log ( ` 🧩 mergeOrders → ${ mergedOrders . length } satı r birleş ti (ID: ${ header . OrderHeaderID } ) ` )
// ====================================================
// ====================================================
// 🕒 HEADER TARİ HLERİNİ MSSQL FORMATINA NORMALİ ZE ET
// 🕒 HEADER TARİ HLERİNİ MSSQL FORMATINA NORMALİ ZE ET
// ====================================================
// ====================================================
const safeDateTime = v => {
const safeDateTime = v => {
if ( ! v ) return null
if ( ! v ) return null
@@ -1141,14 +1141,14 @@ export const useOrderEntryStore = defineStore('orderentry', {
,
,
markRowSource ( row ) {
markRowSource ( row ) {
if ( row . _src === 'local-only' ) return '🟠Offline'
if ( row . _src === 'local-only' ) return '🟠 Offline'
if ( row . _src === 'local' ) return '🔵 Local'
if ( row . _src === 'local' ) return '🔵 Local'
return '⚪ Backend'
return '⚪ Backend'
}
}
,
,
/* ===========================================================
/* ===========================================================
🔄 mergeAndPersistBackendOrder (edit mode)
🔄 mergeAndPersistBackendOrder (edit mode)
=========================================================== */
=========================================================== */
mergeAndPersistBackendOrder ( orderId , backendPayload ) {
mergeAndPersistBackendOrder ( orderId , backendPayload ) {
const key = ` bss_orderentry_data: ${ orderId } `
const key = ` bss_orderentry_data: ${ orderId } `
@@ -1163,7 +1163,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
updatedAt : new Date ( ) . toISOString ( )
updatedAt : new Date ( ) . toISOString ( )
} ) )
} ) )
console . log ( ` 💾 mergeAndPersistBackendOrder → ${ orderId } localStorage’ a yazıldı ` )
console . log ( ` 💾 mergeAndPersistBackendOrder → ${ orderId } localStorage’ a yazı ldı ` )
}
}
,
,
@@ -1180,19 +1180,19 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
/* ===============================
/* ===============================
🟢 NEW MODE — GLOBAL TEK TASLAK
🟢 NEW MODE — GLOBAL TEK TASLAK
=============================== */
=============================== */
if ( this . mode === 'new' ) {
if ( this . mode === 'new' ) {
localStorage . setItem ( this . getDraftKey , JSON . stringify ( payload ) )
localStorage . setItem ( this . getDraftKey , JSON . stringify ( payload ) )
// 🔒 sadece aktif new header bilgisi
// 🔒 sadece aktif new header bilgisi
this . setActiveNewHeader ? . ( this . header ? . OrderHeaderID )
this . setActiveNewHeader ? . ( this . header ? . OrderHeaderID )
return
return
}
}
/* ===============================
/* ===============================
🔵 EDIT MODE — ID BAZLI
🔵 EDIT MODE — ID BAZLI
=============================== */
=============================== */
if ( this . mode === 'edit' ) {
if ( this . mode === 'edit' ) {
const key = this . getEditKey
const key = this . getEditKey
@@ -1211,26 +1211,26 @@ export const useOrderEntryStore = defineStore('orderentry', {
clearEditSnapshotIfExists ( ) {
clearEditSnapshotIfExists ( ) {
if ( this . mode !== 'edit' ) return
if ( this . mode !== 'edit' ) return
const key = this . getEditKey // ✅
const key = this . getEditKey // ✅
if ( ! key ) return
if ( ! key ) return
localStorage . removeItem ( key )
localStorage . removeItem ( key )
console . log ( '🧹 EDIT snapshot silindi:' , key )
console . log ( '🧹 EDIT snapshot silindi:' , key )
}
}
, /* ===========================================================
, /* ===========================================================
🧠_persistFingerprint — kritik state’ leri tek stringe indirger
🧠 _persistFingerprint — kritik state’ leri tek stringe indirger
- X3: orders+header yetmez → mode, summaryRows, id/no, map’ ler dahil
- X3: orders+header yetmez → mode, summaryRows, id/no, map’ ler dahil
=========================================================== */
=========================================================== */
_persistFingerprint ( ) {
_persistFingerprint ( ) {
// 🔹 orders: ç ok büyü rse pahalı olabilir ama snapshot tutarlılığı iç in ö nemli
// 🔹 orders: ç ok büyü rse pahalı olabilir ama snapshot tutarlı lı ğı iç in ö nemli
// (istersen burada sadece length + rowKey listesi gibi optimize ederiz)
// (istersen burada sadece length + rowKey listesi gibi optimize ederiz)
const ordersSnap = JSON . stringify ( this . orders || [ ] )
const ordersSnap = JSON . stringify ( this . orders || [ ] )
// 🔹 header: sadece kritik alanları al (tam header yerine daha stabil)
// 🔹 header: sadece kritik alanları al (tam header yerine daha stabil)
const h = this . header || { }
const h = this . header || { }
const headerSnap = JSON . stringify ( {
const headerSnap = JSON . stringify ( {
OrderHeaderID : h . OrderHeaderID || '' ,
OrderHeaderID : h . OrderHeaderID || '' ,
@@ -1240,14 +1240,14 @@ export const useOrderEntryStore = defineStore('orderentry', {
ExchangeRate : h . ExchangeRate ? ? null
ExchangeRate : h . ExchangeRate ? ? null
} )
} )
// 🔹 summaryRows: hash yerine ş imdilik “ length + rowKey listesi†(hafif + etkili)
// 🔹 summaryRows: hash yerine ş imdilik “ length + rowKey listesi” (hafif + etkili)
const sr = Array . isArray ( this . summaryRows ) ? this . summaryRows : [ ]
const sr = Array . isArray ( this . summaryRows ) ? this . summaryRows : [ ]
const summaryMeta = JSON . stringify ( {
const summaryMeta = JSON . stringify ( {
len : sr . length ,
len : sr . length ,
keys : sr . map ( r => this . getRowKey ? . ( r ) || r ? . key || r ? . id || '' ) . filter ( Boolean )
keys : sr . map ( r => this . getRowKey ? . ( r ) || r ? . key || r ? . id || '' ) . filter ( Boolean )
} )
} )
// 🔹 comboLineIds / lineIdMap gibi kritik map’ ler
// 🔹 comboLineIds / lineIdMap gibi kritik map’ ler
// (sende hangisi varsa onu otomatik topluyoruz)
// (sende hangisi varsa onu otomatik topluyoruz)
const mapSnap = JSON . stringify ( {
const mapSnap = JSON . stringify ( {
lineIdMap : this . lineIdMap || null ,
lineIdMap : this . lineIdMap || null ,
@@ -1256,15 +1256,15 @@ export const useOrderEntryStore = defineStore('orderentry', {
comboLineIdSet : this . comboLineIdSet ? Array . from ( this . comboLineIdSet ) : null
comboLineIdSet : this . comboLineIdSet ? Array . from ( this . comboLineIdSet ) : null
} )
} )
// 🔹 mode
// 🔹 mode
const modeSnap = String ( this . mode || 'new' )
const modeSnap = String ( this . mode || 'new' )
// ✅ Tek fingerprint
// ✅ Tek fingerprint
return ` ${ modeSnap } | ${ headerSnap } | ${ summaryMeta } | ${ mapSnap } | ${ ordersSnap } `
return ` ${ modeSnap } | ${ headerSnap } | ${ summaryMeta } | ${ mapSnap } | ${ ordersSnap } `
}
}
,
,
/* ===========================================================
/* ===========================================================
🕒 _safePersistDebounced — snapshot değiş mediğ i sü rece yazmaz (X3)
🕒 _safePersistDebounced — snapshot değiş mediğ i sü rece yazmaz (X3)
- fingerprint: mode + header(id/no) + summaryRows meta + lineIdMap/combo + orders
- fingerprint: mode + header(id/no) + summaryRows meta + lineIdMap/combo + orders
=========================================================== */
=========================================================== */
_safePersistDebounced ( delay = 1200 ) {
_safePersistDebounced ( delay = 1200 ) {
@@ -1272,7 +1272,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
this . _persistTimeout = setTimeout ( ( ) => {
this . _persistTimeout = setTimeout ( ( ) => {
try {
try {
// ✅ Persist guard’ ları (varsa)
// ✅ Persist guard’ ları (varsa)
if ( this . preventPersist ) return
if ( this . preventPersist ) return
if ( this . _uiBusy ) return
if ( this . _uiBusy ) return
@@ -1285,9 +1285,9 @@ export const useOrderEntryStore = defineStore('orderentry', {
this . _lastPersistFingerprint = fp
this . _lastPersistFingerprint = fp
this . persistLocalStorage ( )
this . persistLocalStorage ( )
console . log ( ` 🕒 Otomatik LocalStorage senkron (${ this . orders ? . length || 0 } satı r). ` )
console . log ( ` 🕒 Otomatik LocalStorage senkron (${ this . orders ? . length || 0 } satı r). ` )
} catch ( err ) {
} catch ( err ) {
console . warn ( 'âš ï¸ Debounce persist hata:' , err )
console . warn ( '⚠️ Debounce persist hata:' , err )
}
}
} , delay )
} , delay )
}
}
@@ -1295,7 +1295,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
,
,
/* ===========================================================
/* ===========================================================
💰 fetchMinPrice — model/pb iç in min fiyat
💰 fetchMinPrice — model/pb iç in min fiyat
=========================================================== */
=========================================================== */
async fetchMinPrice ( model , currency , $q ) {
async fetchMinPrice ( model , currency , $q ) {
try {
try {
@@ -1303,17 +1303,17 @@ export const useOrderEntryStore = defineStore('orderentry', {
params : { model , currency }
params : { model , currency }
} )
} )
const data = res ? . data || { }
const data = res ? . data || { }
console . log ( '💰 [store.fetchMinPrice] yanı t:' , data )
console . log ( '💰 [store.fetchMinPrice] yanı t:' , data )
return {
return {
price : Number ( data . price || 0 ) ,
price : Number ( data . price || 0 ) ,
rateToTRY : Number ( data . rateToTRY || 1 ) ,
rateToTRY : Number ( data . rateToTRY || 1 ) ,
priceTRY : Number ( data . priceTRY || 0 )
priceTRY : Number ( data . priceTRY || 0 )
}
}
} catch ( err ) {
} catch ( err ) {
console . error ( '⌠[store.fetchMinPrice] Min fiyat alı namadı :' , err )
console . error ( '❌ [store.fetchMinPrice] Min fiyat alı namadı :' , err )
$q ? . notify ? . ( {
$q ? . notify ? . ( {
type : 'warning' ,
type : 'warning' ,
message : 'Min. fiyat bilgisi alı namadı , kontrol atlandı âš ï¸ ' ,
message : 'Min. fiyat bilgisi alı namadı , kontrol atlandı ⚠️ ' ,
position : 'top-right'
position : 'top-right'
} )
} )
return { price : 0 , rateToTRY : 1 , priceTRY : 0 }
return { price : 0 , rateToTRY : 1 , priceTRY : 0 }
@@ -1323,13 +1323,13 @@ export const useOrderEntryStore = defineStore('orderentry', {
applyCurrencyToLines ( newPB ) {
applyCurrencyToLines ( newPB ) {
if ( ! newPB ) return
if ( ! newPB ) return
// 🔹 Header
// 🔹 Header
if ( this . header ) {
if ( this . header ) {
this . header . DocCurrencyCode = newPB
this . header . DocCurrencyCode = newPB
this . header . PriceCurrencyCode = newPB
this . header . PriceCurrencyCode = newPB
}
}
// 🔹 Lines
// 🔹 Lines
if ( Array . isArray ( this . orders ) ) {
if ( Array . isArray ( this . orders ) ) {
this . orders = this . orders . map ( r => ( {
this . orders = this . orders . map ( r => ( {
... r ,
... r ,
@@ -1339,7 +1339,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
} ) )
} ) )
}
}
// 🔹 Summary
// 🔹 Summary
if ( Array . isArray ( this . summaryRows ) ) {
if ( Array . isArray ( this . summaryRows ) ) {
this . summaryRows = this . summaryRows . map ( r => ( {
this . summaryRows = this . summaryRows . map ( r => ( {
... r ,
... r ,
@@ -1349,14 +1349,14 @@ export const useOrderEntryStore = defineStore('orderentry', {
} ) )
} ) )
}
}
// â— totalAmount SET ETME
// ❗ totalAmount SET ETME
// âœ”ï¸ TEK MERKEZ
// ✔️ TEK MERKEZ
this . updateHeaderTotals ? . ( )
this . updateHeaderTotals ? . ( )
}
}
,
,
/* ===========================================================
/* ===========================================================
💠HEADER SET & CURRENCY PROPAGATION
💠 HEADER SET & CURRENCY PROPAGATION
=========================================================== */
=========================================================== */
setHeaderFields ( fields , opts = { } ) {
setHeaderFields ( fields , opts = { } ) {
const {
const {
@@ -1364,13 +1364,13 @@ export const useOrderEntryStore = defineStore('orderentry', {
immediatePersist = false
immediatePersist = false
} = opts
} = opts
// 1ï¸âƒ£ HEADER
// 1️⃣ HEADER
this . header = {
this . header = {
... ( this . header || { } ) ,
... ( this . header || { } ) ,
... fields
... fields
}
}
// 2ï¸âƒ£ SATIRLARA GERÇ EKTEN YAY
// 2️⃣ SATIRLARA GERÇ EKTEN YAY
if ( applyCurrencyToLines && Array . isArray ( this . summaryRows ) ) {
if ( applyCurrencyToLines && Array . isArray ( this . summaryRows ) ) {
this . summaryRows = this . summaryRows . map ( r => ( {
this . summaryRows = this . summaryRows . map ( r => ( {
... r ,
... r ,
@@ -1380,11 +1380,11 @@ export const useOrderEntryStore = defineStore('orderentry', {
} ) )
} ) )
}
}
// 3ï¸âƒ£ STORE ORDERS REFERANSI
// 3️⃣ STORE ORDERS REFERANSI
this . orders = [ ... this . summaryRows ]
this . orders = [ ... this . summaryRows ]
// 4ï¸âƒ£ PERSIST
// 4️⃣ PERSIST
if ( immediatePersist ) {
if ( immediatePersist ) {
this . persistLocalStorage ( 'header-change' )
this . persistLocalStorage ( 'header-change' )
}
}
@@ -1408,12 +1408,12 @@ export const useOrderEntryStore = defineStore('orderentry', {
cnt ++
cnt ++
}
}
console . log ( ` 💱 ${ cnt } satı rda PB gü ncellendi → Doc: ${ doc } Price: ${ prc } Rate: ${ rate } ` )
console . log ( ` 💱 ${ cnt } satı rda PB gü ncellendi → Doc: ${ doc } Price: ${ prc } Rate: ${ rate } ` )
}
}
, /* ===========================================================
, /* ===========================================================
📸 saveSnapshot — küçü k debug snapshot
📸 saveSnapshot — küçü k debug snapshot
=========================================================== */
=========================================================== */
saveSnapshot ( tag = 'snapshot' ) {
saveSnapshot ( tag = 'snapshot' ) {
try {
try {
@@ -1431,26 +1431,26 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
localStorage . setItem ( key , JSON . stringify ( snap ) )
localStorage . setItem ( key , JSON . stringify ( snap ) )
console . log ( ` 📸 Snapshot kaydedildi [${ key } ] ` )
console . log ( ` 📸 Snapshot kaydedildi [${ key } ] ` )
} catch ( err ) {
} catch ( err ) {
console . warn ( 'âš ï¸ saveSnapshot hata:' , err )
console . warn ( '⚠️ saveSnapshot hata:' , err )
}
}
}
}
,
,
/* ===========================================================
/* ===========================================================
â™»ï¸ loadFromStorage — eski generic persist iç in
♻️ loadFromStorage — eski generic persist iç in
=========================================================== */
=========================================================== */
loadFromStorage ( force = false ) {
loadFromStorage ( force = false ) {
try {
try {
const raw = localStorage . getItem ( this . getPersistKey )
const raw = localStorage . getItem ( this . getPersistKey )
if ( ! raw ) {
if ( ! raw ) {
console . info ( 'â„¹ï¸ LocalStorage boÅŸ , grid baÅŸ latı lmadı .' )
console . info ( 'ℹ ️ LocalStorage boş , grid baş latı lmadı .' )
return false
return false
}
}
if ( ! force && this . mode === 'edit' ) {
if ( ! force && this . mode === 'edit' ) {
console . info ( 'âš ï¸ Edit modda local restore atlandı (force=false).' )
console . info ( '⚠️ Edit modda local restore atlandı (force=false).' )
return false
return false
}
}
@@ -1461,21 +1461,21 @@ export const useOrderEntryStore = defineStore('orderentry', {
this . currentOrderId = data . currentOrderId || null
this . currentOrderId = data . currentOrderId || null
this . selectedCustomer = data . selectedCustomer || null
this . selectedCustomer = data . selectedCustomer || null
// 🔧 Temiz ID
// 🔧 Temiz ID
this . header . OrderHeaderID = data . header ? . OrderHeaderID || null
this . header . OrderHeaderID = data . header ? . OrderHeaderID || null
this . mode = data . mode || 'new'
this . mode = data . mode || 'new'
this . lastSavedAt = data . savedAt || null
this . lastSavedAt = data . savedAt || null
console . log ( ` â™»ï¸ Storage yü klendi • txn:${ this . header . OrderHeaderID } ( ${ this . orders . length } satı r) ` )
console . log ( ` ♻️ Storage yü klendi • txn:${ this . header . OrderHeaderID } ( ${ this . orders . length } satı r) ` )
// Header PB -> satı rlara
// Header PB -> satı rlara
this . applyHeaderCurrencyToOrders ( )
this . applyHeaderCurrencyToOrders ( )
this . _safePersistDebounced ( 200 )
this . _safePersistDebounced ( 200 )
return data
return data
} catch ( err ) {
} catch ( err ) {
console . warn ( 'âš ï¸ localStorage okuma hatası :' , err )
console . warn ( '⚠️ localStorage okuma hatası :' , err )
return false
return false
}
}
}
}
@@ -1484,23 +1484,23 @@ export const useOrderEntryStore = defineStore('orderentry', {
clearStorage ( ) {
clearStorage ( ) {
try {
try {
localStorage . removeItem ( this . getPersistKey )
localStorage . removeItem ( this . getPersistKey )
console . log ( ` ğŸ—‘ï¸ LocalStorage temizlendi [${ this . getPersistKey } ] ` )
console . log ( ` 🗑️ LocalStorage temizlendi [${ this . getPersistKey } ] ` )
} catch ( err ) {
} catch ( err ) {
console . warn ( 'âš ï¸ clearStorage hatası :' , err )
console . warn ( '⚠️ clearStorage hatası :' , err )
}
}
}
}
,
,
clearNewDraft ( ) {
clearNewDraft ( ) {
localStorage . removeItem ( this . getDraftKey ) // ✅
localStorage . removeItem ( this . getDraftKey ) // ✅
localStorage . removeItem ( 'bss_last_txn' )
localStorage . removeItem ( 'bss_last_txn' )
console . log ( '🧹 NEW taslak temizlendi' )
console . log ( '🧹 NEW taslak temizlendi' )
}
}
,
,
// ===========================================================
// ===========================================================
// 🔹 isSameCombo — STORE LEVEL (TEK KAYNAK)
// 🔹 isSameCombo — STORE LEVEL (TEK KAYNAK)
// - model ZORUNLU eÅŸleÅŸ ir
// - model ZORUNLU eşleş ir
// - renk / renk2 boş sa → joker
// - renk / renk2 boş sa → joker
// ===========================================================
// ===========================================================
isSameCombo ( a , b ) {
isSameCombo ( a , b ) {
if ( ! a || ! b ) return false
if ( ! a || ! b ) return false
@@ -1521,11 +1521,11 @@ export const useOrderEntryStore = defineStore('orderentry', {
// ===========================================================
// ===========================================================
// 🔹 saveOrUpdateRowUnified (v6.6 — COMBO SAFE + FIXED STOCK+PRICE + UI)
// 🔹 saveOrUpdateRowUnified (v6.6 — COMBO SAFE + FIXED STOCK+PRICE + UI)
// - v6.5 korunur (stok+min fiyat + this.loadProductSizes)
// - v6.5 korunur (stok+min fiyat + this.loadProductSizes)
// - ✅ NEW MODE: dupIdx artı k _deleteSignal satı rlarını BAŠTAN hariç tutar
// - ✅ NEW MODE: dupIdx artı k _deleteSignal satı rları nı BAŞ TAN hariç tutar
// - EDIT MODE: sameCombo → update, combo değişti → delete + insert (korundu)
// - EDIT MODE: sameCombo → update, combo değişti → delete + insert (korundu)
// - lineIdMap koruması korunur
// - lineIdMap koruması korunur
// ===========================================================
// ===========================================================
async saveOrUpdateRowUnified ( {
async saveOrUpdateRowUnified ( {
form ,
form ,
@@ -1536,7 +1536,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
$q = null
$q = null
} ) {
} ) {
try {
try {
console . log ( '🔥 saveOrUpdateRowUnified v6.6' , {
console . log ( '🔥 saveOrUpdateRowUnified v6.6' , {
model : form ? . model ,
model : form ? . model ,
mode : this . mode ,
mode : this . mode ,
editingKey : this . editingKey
editingKey : this . editingKey
@@ -1552,10 +1552,10 @@ export const useOrderEntryStore = defineStore('orderentry', {
: [ ]
: [ ]
/* =======================================================
/* =======================================================
1ï¸âƒ£ ZORUNLU KONTROLLER
1️⃣ ZORUNLU KONTROLLER
======================================================= */
======================================================= */
if ( ! form ? . model ) {
if ( ! form ? . model ) {
$q ? . notify ? . ( { type : 'warning' , message : 'Model seç iniz' } )
$q ? . notify ? . ( { type : 'warning' , message : 'Model seç iniz' } )
return false
return false
}
}
@@ -1564,28 +1564,28 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
/* =======================================================
/* =======================================================
2ï¸âƒ£ STOK KONTROLÜ (FIXED)
2️⃣ STOK KONTROLÜ (FIXED)
- stok guard’ dan ö nce this.loadProductSizes(form,true,$q)
- stok guard’ dan ö nce this.loadProductSizes(form,true,$q)
- opsiyonel callback loadProductSizes(true)
- opsiyonel callback loadProductSizes(true)
- tek dialog + doÄŸ ru await
- tek dialog + doğ ru await
======================================================= */
======================================================= */
// ✅ store fonksiyonu
// ✅ store fonksiyonu
try {
try {
if ( typeof this . loadProductSizes === 'function' ) {
if ( typeof this . loadProductSizes === 'function' ) {
await this . loadProductSizes ( form , true , $q )
await this . loadProductSizes ( form , true , $q )
}
}
} catch ( err ) {
} catch ( err ) {
console . warn ( 'âš this.loadProductSizes hata:' , err )
console . warn ( '⚠ this.loadProductSizes hata:' , err )
}
}
// ✅ dışarı dan callback geldiyse
// ✅ dı şarı dan callback geldiyse
try {
try {
if ( typeof loadProductSizes === 'function' ) {
if ( typeof loadProductSizes === 'function' ) {
await loadProductSizes ( true )
await loadProductSizes ( true )
}
}
} catch ( err ) {
} catch ( err ) {
console . warn ( 'âš loadProductSizes hata:' , err )
console . warn ( '⚠ loadProductSizes hata:' , err )
}
}
const stockMapLocal = stockMap ? . value || stockMap || { }
const stockMapLocal = stockMap ? . value || stockMap || { }
@@ -1605,16 +1605,16 @@ export const useOrderEntryStore = defineStore('orderentry', {
if ( overLimit . length && $q ) {
if ( overLimit . length && $q ) {
const msg = overLimit
const msg = overLimit
. map ( x => ` • <b>${ x . beden } </b>: ${ x . girilen } (Stok: ${ x . stok } ) ` )
. map ( x => ` • <b>${ x . beden } </b>: ${ x . girilen } (Stok: ${ x . stok } ) ` )
. join ( '<br>' )
. join ( '<br>' )
const stokOK = await new Promise ( resolve => {
const stokOK = await new Promise ( resolve => {
$q . dialog ( {
$q . dialog ( {
title : 'Stok Uyarısı ' ,
title : 'Stok Uyarı sı ' ,
message : ` Bazı bedenlerde stoktan fazla giriş yaptını z:<br><br> ${ msg } ` ,
message : ` Bazı bedenlerde stoktan fazla giriş yaptı nı z:<br><br> ${ msg } ` ,
html : true ,
html : true ,
ok : { label : 'Devam' , color : 'primary' } ,
ok : { label : 'Devam' , color : 'primary' } ,
cancel : { label : 'İ ptal' , color : 'negative' }
cancel : { label : 'İ ptal' , color : 'negative' }
} )
} )
. onOk ( ( ) => resolve ( true ) )
. onOk ( ( ) => resolve ( true ) )
. onCancel ( ( ) => resolve ( false ) )
. onCancel ( ( ) => resolve ( false ) )
@@ -1625,7 +1625,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
/* =======================================================
/* =======================================================
3ï¸âƒ£ Fİ YAT (MIN) KONTROLÜ (FIXED)
3️⃣ Fİ YAT (MIN) KONTROLÜ (FIXED)
======================================================= */
======================================================= */
let fiyatOK = true
let fiyatOK = true
try {
try {
@@ -1643,13 +1643,13 @@ export const useOrderEntryStore = defineStore('orderentry', {
if ( minFiyat > 0 && girilen > 0 && girilen < minFiyat && $q ) {
if ( minFiyat > 0 && girilen > 0 && girilen < minFiyat && $q ) {
fiyatOK = await new Promise ( resolve => {
fiyatOK = await new Promise ( resolve => {
$q . dialog ( {
$q . dialog ( {
title : 'Fiyat Uyarısı ' ,
title : 'Fiyat Uyarı sı ' ,
message :
message :
` <b>Min. Fiyat:</b> ${ minFiyat } ${ form . pb } <br> ` +
` <b>Min. Fiyat:</b> ${ minFiyat } ${ form . pb } <br> ` +
` <b>GirdiÄŸ iniz:</b> ${ girilen } ${ form . pb } ` ,
` <b>Girdiğ iniz:</b> ${ girilen } ${ form . pb } ` ,
html : true ,
html : true ,
ok : { label : 'Devam' , color : 'primary' } ,
ok : { label : 'Devam' , color : 'primary' } ,
cancel : { label : 'İ ptal' , color : 'negative' }
cancel : { label : 'İ ptal' , color : 'negative' }
} )
} )
. onOk ( ( ) => resolve ( true ) )
. onOk ( ( ) => resolve ( true ) )
. onCancel ( ( ) => resolve ( false ) )
. onCancel ( ( ) => resolve ( false ) )
@@ -1657,12 +1657,12 @@ export const useOrderEntryStore = defineStore('orderentry', {
} )
} )
}
}
} catch ( err ) {
} catch ( err ) {
console . warn ( 'âš Min fiyat hata:' , err )
console . warn ( '⚠ Min fiyat hata:' , err )
}
}
if ( ! fiyatOK ) return false
if ( ! fiyatOK ) return false
/* =======================================================
/* =======================================================
4ï¸âƒ£ TOPLAM HESABI
4️⃣ TOPLAM HESABI
======================================================= */
======================================================= */
const adet = ( form . bedenler || [ ] ) . reduce ( ( a , b ) => a + Number ( b || 0 ) , 0 )
const adet = ( form . bedenler || [ ] ) . reduce ( ( a , b ) => a + Number ( b || 0 ) , 0 )
form . adet = adet
form . adet = adet
@@ -1671,7 +1671,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
const newRow = toSummaryRowFromForm ( form )
const newRow = toSummaryRowFromForm ( form )
/* =======================================================
/* =======================================================
5ï¸âƒ£ EDIT MODE (editingKey ZORUNLU)
5️⃣ EDIT MODE (editingKey ZORUNLU)
======================================================= */
======================================================= */
if ( this . editingKey ) {
if ( this . editingKey ) {
const idx = rows . findIndex ( r => getKey ( r ) === this . editingKey )
const idx = rows . findIndex ( r => getKey ( r ) === this . editingKey )
@@ -1684,13 +1684,13 @@ export const useOrderEntryStore = defineStore('orderentry', {
const prev = rows [ idx ]
const prev = rows [ idx ]
if ( this . isRowLocked ? . ( prev ) ) {
if ( this . isRowLocked ? . ( prev ) ) {
$q ? . notify ? . ( { type : 'warning' , message : 'Satı r kapalı ' } )
$q ? . notify ? . ( { type : 'warning' , message : 'Satı r kapalı ' } )
this . editingKey = null
this . editingKey = null
resetEditor ? . ( true )
resetEditor ? . ( true )
return false
return false
}
}
// ✅ kritik: store-level
// ✅ kritik: store-level
const sameCombo = this . isSameCombo ( prev , newRow )
const sameCombo = this . isSameCombo ( prev , newRow )
const preservedLineIdMap =
const preservedLineIdMap =
@@ -1700,7 +1700,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
? { ... newRow . lineIdMap }
? { ... newRow . lineIdMap }
: { }
: { }
/* ===== SAME COMBO → UPDATE ===== */
/* ===== SAME COMBO → UPDATE ===== */
if ( sameCombo ) {
if ( sameCombo ) {
rows [ idx ] = {
rows [ idx ] = {
... prev ,
... prev ,
@@ -1720,11 +1720,11 @@ export const useOrderEntryStore = defineStore('orderentry', {
resetEditor ? . ( true )
resetEditor ? . ( true )
recalcVat ? . ( )
recalcVat ? . ( )
$q ? . notify ? . ( { type : 'positive' , message : 'Satı r gü ncellendi' } )
$q ? . notify ? . ( { type : 'positive' , message : 'Satı r gü ncellendi' } )
return true
return true
}
}
/* ===== COMBO CHANGED → DELETE + INSERT ===== */
/* ===== COMBO CHANGED → DELETE + INSERT ===== */
const grpKey =
const grpKey =
prev ? . grpKey ||
prev ? . grpKey ||
Object . keys ( prev ? . bedenMap || { } ) [ 0 ] ||
Object . keys ( prev ? . bedenMap || { } ) [ 0 ] ||
@@ -1780,22 +1780,22 @@ export const useOrderEntryStore = defineStore('orderentry', {
resetEditor ? . ( true )
resetEditor ? . ( true )
recalcVat ? . ( )
recalcVat ? . ( )
$q ? . notify ? . ( { type : 'positive' , message : 'Kombinasyon deÄŸiÅŸ ti' } )
$q ? . notify ? . ( { type : 'positive' , message : 'Kombinasyon değiş ti' } )
return true
return true
}
}
/* =======================================================
/* =======================================================
6ï¸âƒ£ NEW MODE (MERGE / INSERT) — COMBO SAFE
6️⃣ NEW MODE (MERGE / INSERT) — COMBO SAFE
- aynı combo → bedenMap merge (satı r sayısı artmaz)
- aynı combo → bedenMap merge (satı r sayı sı artmaz)
- farklı combo → yeni satı r
- farklı combo → yeni satı r
- ✅ FIX: _deleteSignal satı rlarını dup araması nda hariç tut
- ✅ FIX: _deleteSignal satı rları nı dup araması nda hariç tut
======================================================= */
======================================================= */
const dupIdx = rows . findIndex ( r =>
const dupIdx = rows . findIndex ( r =>
! r ? . _deleteSignal &&
! r ? . _deleteSignal &&
this . isSameCombo ( r , newRow )
this . isSameCombo ( r , newRow )
)
)
// helper: bedenMap çı kar (gruplu ya da dü z)
// helper: bedenMap çı kar (gruplu ya da dü z)
const extractMap = ( row ) => {
const extractMap = ( row ) => {
const grpKey =
const grpKey =
row ? . grpKey ||
row ? . grpKey ||
@@ -1813,15 +1813,15 @@ export const useOrderEntryStore = defineStore('orderentry', {
if ( dupIdx !== - 1 ) {
if ( dupIdx !== - 1 ) {
const prev = rows [ dupIdx ]
const prev = rows [ dupIdx ]
// delete satırı na merge yapma (ek gü venlik)
// delete satı rı na merge yapma (ek gü venlik)
if ( prev ? . _deleteSignal !== true ) {
if ( prev ? . _deleteSignal !== true ) {
const { grpKey : prevGrp , map : prevMap } = extractMap ( prev )
const { grpKey : prevGrp , map : prevMap } = extractMap ( prev )
const { grpKey : newGrp , map : newMap } = extractMap ( newRow )
const { grpKey : newGrp , map : newMap } = extractMap ( newRow )
// hangi grpKey kullanı lacak?
// hangi grpKey kullanı lacak?
const grpKey = newRow ? . grpKey || prevGrp || newGrp || 'GENEL'
const grpKey = newRow ? . grpKey || prevGrp || newGrp || 'GENEL'
// MERGE: bedenleri topluyoruz (override deÄŸ il)
// MERGE: bedenleri topluyoruz (override değ il)
const merged = { ... ( prevMap || { } ) }
const merged = { ... ( prevMap || { } ) }
for ( const [ k , v ] of Object . entries ( newMap || { } ) ) {
for ( const [ k , v ] of Object . entries ( newMap || { } ) ) {
const beden = ( k == null || String ( k ) . trim ( ) === '' )
const beden = ( k == null || String ( k ) . trim ( ) === '' )
@@ -1863,12 +1863,12 @@ export const useOrderEntryStore = defineStore('orderentry', {
resetEditor ? . ( true )
resetEditor ? . ( true )
recalcVat ? . ( )
recalcVat ? . ( )
$q ? . notify ? . ( { type : 'positive' , message : 'Aynı kombinasyon bulundu, bedenler birleş tirildi' } )
$q ? . notify ? . ( { type : 'positive' , message : 'Aynı kombinasyon bulundu, bedenler birleş tirildi' } )
return true
return true
}
}
}
}
// dup yoksa (veya dup delete satırıydı) → yeni satı r
// dup yoksa (veya dup delete satı rı ydı ) → yeni satı r
rows . push ( {
rows . push ( {
... newRow ,
... newRow ,
id : newRow . id || crypto . randomUUID ( ) ,
id : newRow . id || crypto . randomUUID ( ) ,
@@ -1884,12 +1884,12 @@ export const useOrderEntryStore = defineStore('orderentry', {
resetEditor ? . ( true )
resetEditor ? . ( true )
recalcVat ? . ( )
recalcVat ? . ( )
$q ? . notify ? . ( { type : 'positive' , message : 'Yeni satı r eklendi' } )
$q ? . notify ? . ( { type : 'positive' , message : 'Yeni satı r eklendi' } )
return true
return true
} catch ( err ) {
} catch ( err ) {
console . error ( '⌠saveOrUpdateRowUnified:' , err )
console . error ( '❌ saveOrUpdateRowUnified:' , err )
$q ? . notify ? . ( { type : 'negative' , message : 'Satı r kaydı başarısı z' } )
$q ? . notify ? . ( { type : 'negative' , message : 'Satı r kaydı başarı sı z' } )
return false
return false
}
}
}
}
@@ -1900,24 +1900,24 @@ export const useOrderEntryStore = defineStore('orderentry', {
,
,
/* ===========================================================
/* ===========================================================
🔄 setTransaction — yeni transaction ID set et
🔄 setTransaction — yeni transaction ID set et
=========================================================== */
=========================================================== */
setTransaction ( id , autoResume = true ) {
setTransaction ( id , autoResume = true ) {
if ( ! id ) return
if ( ! id ) return
// 🔧 temiz ID
// 🔧 temiz ID
this . header . OrderHeaderID = id
this . header . OrderHeaderID = id
localStorage . setItem ( 'bss_last_txn' , id )
localStorage . setItem ( 'bss_last_txn' , id )
console . log ( '🔄 Transaction değiş tirildi:' , id )
console . log ( '🔄 Transaction değiş tirildi:' , id )
if ( autoResume ) {
if ( autoResume ) {
const hasData = Array . isArray ( this . orders ) && this . orders . length > 0
const hasData = Array . isArray ( this . orders ) && this . orders . length > 0
if ( ! hasData ) {
if ( ! hasData ) {
const ok = this . hydrateFromLocalStorage ( id , true )
const ok = this . hydrateFromLocalStorage ( id , true )
if ( ok ) console . info ( '📦 Local kayı t geri yü klendi (boş grid iç in).' )
if ( ok ) console . info ( '📦 Local kayı t geri yü klendi (boş grid iç in).' )
} else {
} else {
console . log ( '🚫 Grid dolu, auto-resume atlandı (mevcut satı rlar korundu).' )
console . log ( '🚫 Grid dolu, auto-resume atlandı (mevcut satı rlar korundu).' )
}
}
}
}
}
}
@@ -1925,7 +1925,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
/* ===========================================================
/* ===========================================================
🧹 clearTransaction — sadece NEW MODE taslaklarını temizler
🧹 clearTransaction — sadece NEW MODE taslakları nı temizler
=========================================================== */
=========================================================== */
clearTransaction ( ) {
clearTransaction ( ) {
try {
try {
@@ -1942,22 +1942,22 @@ export const useOrderEntryStore = defineStore('orderentry', {
localStorage . removeItem ( 'bss_last_txn' )
localStorage . removeItem ( 'bss_last_txn' )
console . log ( '🧹 Transaction temizlendi' )
console . log ( '🧹 Transaction temizlendi' )
} catch ( err ) {
} catch ( err ) {
console . warn ( 'âš ï¸ clearTransaction hata:' , err )
console . warn ( '⚠️ clearTransaction hata:' , err )
}
}
}
}
,
,
// =======================================================
// =======================================================
// 🔒 KİLİ T KONTROLÜ — Sadece EDIT modunda, backend satırı
// 🔒 KİLİ T KONTROLÜ — Sadece EDIT modunda, backend satı rı
// =======================================================
// =======================================================
isRowLocked ( row ) {
isRowLocked ( row ) {
if ( ! row ) return false
if ( ! row ) return false
// Sadece edit modunda,
// Sadece edit modunda,
// ve backend'den gelen gerç ek OrderLineID varsa,
// ve backend'den gelen gerç ek OrderLineID varsa,
// ve IsClosed=1 ise satı r kilitli
// ve IsClosed=1 ise satı r kilitli
return (
return (
this . mode === 'edit' &&
this . mode === 'edit' &&
! ! row . OrderLineID &&
! ! row . OrderLineID &&
@@ -1990,10 +1990,10 @@ export const useOrderEntryStore = defineStore('orderentry', {
aciklama : row . aciklama || old . aciklama ,
aciklama : row . aciklama || old . aciklama ,
updatedAt : dayjs ( ) . toISOString ( )
updatedAt : dayjs ( ) . toISOString ( )
}
}
console . log ( ` âš ï¸ Aynı kombinasyon bulundu, satı r gü ncellendi: ${ row . model } ${ row . renk || '' } ${ row . renk2 || '' } ` )
console . log ( ` ⚠️ Aynı kombinasyon bulundu, satı r gü ncellendi: ${ row . model } ${ row . renk || '' } ${ row . renk2 || '' } ` )
} else {
} else {
this . orders . push ( toRaw ( row ) )
this . orders . push ( toRaw ( row ) )
console . log ( ` â• Yeni kombinasyon eklendi: ${ row . model } ${ row . renk || '' } ${ row . renk2 || '' } ` )
console . log ( ` ➕ Yeni kombinasyon eklendi: ${ row . model } ${ row . renk || '' } ${ row . renk2 || '' } ` )
}
}
this . persistLocalStorage ( )
this . persistLocalStorage ( )
@@ -2009,7 +2009,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
this . persistLocalStorage ( )
this . persistLocalStorage ( )
this . saveSnapshot ( 'after-update' )
this . saveSnapshot ( 'after-update' )
console . log ( ` âœï¸ Satı r gü ncellendi (store): #${ index } ` )
console . log ( ` ✏️ Satı r gü ncellendi (store): #${ index } ` )
} ,
} ,
@@ -2023,27 +2023,27 @@ export const useOrderEntryStore = defineStore('orderentry', {
this . persistLocalStorage ( )
this . persistLocalStorage ( )
this . saveSnapshot ( 'after-remove' )
this . saveSnapshot ( 'after-remove' )
console . log ( ` ğŸ—‘ï¸ Satı r silindi: ${ removed [ 0 ] ? . model || '(model yok)' } ` )
console . log ( ` 🗑️ Satı r silindi: ${ removed [ 0 ] ? . model || '(model yok)' } ` )
} ,
} ,
removeSelectedRow ( row , $q = null ) {
removeSelectedRow ( row , $q = null ) {
if ( ! row ) return
if ( ! row ) return
// 1) Kilitli satı r silinemez
// 1) Kilitli satı r silinemez
if ( this . isRowLocked ( row ) ) {
if ( this . isRowLocked ( row ) ) {
$q ? . notify ? . ( {
$q ? . notify ? . ( {
type : 'warning' ,
type : 'warning' ,
message : '🔒 Bu satı r (IsClosed=1) kapatılmış . Silinemez.'
message : '🔒 Bu satı r (IsClosed=1) kapatı lmı ş . Silinemez.'
} )
} )
return false
return false
}
}
// 2) Kullanıcı ya onay sor
// 2) Kullanı cı ya onay sor
return new Promise ( resolve => {
return new Promise ( resolve => {
$q ? . dialog ( {
$q ? . dialog ( {
title : 'Satı r Sil' ,
title : 'Satı r Sil' ,
message : ` ${ row . model } / ${ row . renk } / ${ row . renk2 } kombinasyonu silinsin mi? ` ,
message : ` ${ row . model } / ${ row . renk } / ${ row . renk2 } kombinasyonu silinsin mi? ` ,
ok : { label : 'Evet' , color : 'negative' } ,
ok : { label : 'Evet' , color : 'negative' } ,
cancel : { label : 'Vazgeç ' }
cancel : { label : 'Vazgeç ' }
} )
} )
. onOk ( ( ) => {
. onOk ( ( ) => {
this . removeRowInternal ( row )
this . removeRowInternal ( row )
@@ -2056,9 +2056,9 @@ export const useOrderEntryStore = defineStore('orderentry', {
removeRowInternal ( row ) {
removeRowInternal ( row ) {
if ( ! row ) return false
if ( ! row ) return false
// 1ï¸âƒ£ Kilit kontrolü
// 1️⃣ Kilit kontrolü
if ( this . isRowLocked ( row ) ) {
if ( this . isRowLocked ( row ) ) {
console . warn ( '🔒 Kilitli satı r silinemez.' )
console . warn ( '🔒 Kilitli satı r silinemez.' )
return false
return false
}
}
@@ -2073,27 +2073,27 @@ export const useOrderEntryStore = defineStore('orderentry', {
const idx = this . summaryRows . findIndex ( r => getKey ( r ) === rowKey )
const idx = this . summaryRows . findIndex ( r => getKey ( r ) === rowKey )
if ( idx === - 1 ) return false
if ( idx === - 1 ) return false
console . log ( 'ğŸ—‘ï¸ X2 removeRowInternal → ' , row )
console . log ( '🗑️ X2 removeRowInternal → ' , row )
// 🔠UI BUSY
// 🔐 UI BUSY
this . _uiBusy = true
this . _uiBusy = true
this . preventPersist = true
this . preventPersist = true
try {
try {
// 2ï¸âƒ£ UI’ dan kaldı r
// 2️⃣ UI’ dan kaldı r
this . summaryRows . splice ( idx , 1 )
this . summaryRows . splice ( idx , 1 )
// orders = UI satı rları (temiz kopya)
// orders = UI satı rları (temiz kopya)
this . orders = [ ... this . summaryRows ]
this . orders = [ ... this . summaryRows ]
// 3ï¸âƒ£ EDIT MODE → DELETE Sİ NYALİ
// 3️⃣ EDIT MODE → DELETE Sİ NYALİ
if ( this . mode === 'edit' ) {
if ( this . mode === 'edit' ) {
const grpKey =
const grpKey =
row . grpKey ||
row . grpKey ||
Object . keys ( row . bedenMap || { } ) [ 0 ] ||
Object . keys ( row . bedenMap || { } ) [ 0 ] ||
'tak'
'tak'
// ✅ lineIdMap referansı (varsa)
// ✅ lineIdMap referansı (varsa)
const lineIdMap =
const lineIdMap =
( row . lineIdMap && typeof row . lineIdMap === 'object' )
( row . lineIdMap && typeof row . lineIdMap === 'object' )
? { ... row . lineIdMap }
? { ... row . lineIdMap }
@@ -2101,7 +2101,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
const emptyMap = { }
const emptyMap = { }
// Ö ncelik: bedenMap[grpKey] → lineIdMap → fallback
// Ö ncelik: bedenMap[grpKey] → lineIdMap → fallback
if ( row . bedenMap && row . bedenMap [ grpKey ] ) {
if ( row . bedenMap && row . bedenMap [ grpKey ] ) {
for ( const beden of Object . keys ( row . bedenMap [ grpKey ] || { } ) ) {
for ( const beden of Object . keys ( row . bedenMap [ grpKey ] || { } ) ) {
emptyMap [ beden ] = 0
emptyMap [ beden ] = 0
@@ -2117,21 +2117,21 @@ export const useOrderEntryStore = defineStore('orderentry', {
const deleteSignalRow = {
const deleteSignalRow = {
... row ,
... row ,
// 🔴 UI KEY
// 🔴 UI KEY
id : ` DEL:: ${ row . id || row . OrderLineID || crypto . randomUUID ( ) } ` ,
id : ` DEL:: ${ row . id || row . OrderLineID || crypto . randomUUID ( ) } ` ,
// 🔴 BACKEND DELETE SIGNAL
// 🔴 BACKEND DELETE SIGNAL
adet : 0 ,
adet : 0 ,
Qty1 : 0 ,
Qty1 : 0 ,
tutar : 0 ,
tutar : 0 ,
// 🔴 CRITICAL: duplicate guard'a girmesin
// 🔴 CRITICAL: duplicate guard'a girmesin
ComboKey : '' ,
ComboKey : '' ,
// 🔴 legacy tekil alan (varsa kalsı n)
// 🔴 legacy tekil alan (varsa kalsı n)
OrderLineID : row . OrderLineID || null ,
OrderLineID : row . OrderLineID || null ,
// ✅ CRITICAL
// ✅ CRITICAL
grpKey ,
grpKey ,
bedenMap : { [ grpKey ] : emptyMap } ,
bedenMap : { [ grpKey ] : emptyMap } ,
lineIdMap ,
lineIdMap ,
@@ -2140,21 +2140,21 @@ export const useOrderEntryStore = defineStore('orderentry', {
_deleteSignal : true
_deleteSignal : true
}
}
console . log ( '📡 DELETE sinyali ü retildi:' , deleteSignalRow )
console . log ( '📡 DELETE sinyali ü retildi:' , deleteSignalRow )
this . orders . push ( deleteSignalRow )
this . orders . push ( deleteSignalRow )
}
}
// 4ï¸âƒ£ Totals (persist YOK)
// 4️⃣ Totals (persist YOK)
this . updateHeaderTotals ? . ( )
this . updateHeaderTotals ? . ( )
} finally {
} finally {
// 🔓 GUARD KAPAT
// 🔓 GUARD KAPAT
this . preventPersist = false
this . preventPersist = false
this . _uiBusy = false
this . _uiBusy = false
}
}
// 5ï¸âƒ£ TEK VE KONTROLLÜ persist
// 5️⃣ TEK VE KONTROLLÜ persist
this . persistLocalStorage ( )
this . persistLocalStorage ( )
return true
return true
@@ -2164,12 +2164,12 @@ export const useOrderEntryStore = defineStore('orderentry', {
/* ===========================================================
/* ===========================================================
📦 normalizeOrderLines (v9 — lineIdMap FIXED + AKSBİ R SAFE)
📦 normalizeOrderLines (v9 — lineIdMap FIXED + AKSBİ R SAFE)
-----------------------------------------------------------
-----------------------------------------------------------
✔ grpKey SADECE burada set edilir
✔ grpKey SADECE burada set edilir
✔ detectBedenGroup SADECE store’ da kullanılı r
✔ detectBedenGroup SADECE store’ da kullanı lı r
✔ aksbir → ' ' bedeni = GERÇ EK adet
✔ aksbir → ' ' bedeni = GERÇ EK adet
✔ backend satı rları nda BEDEN → OrderLineID map’i ü retilir
✔ backend satı rları nda BEDEN → OrderLineID map’ i ü retilir
=========================================================== */
=========================================================== */
normalizeOrderLines ( lines , pbFallback = 'USD' ) {
normalizeOrderLines ( lines , pbFallback = 'USD' ) {
if ( ! Array . isArray ( lines ) ) return [ ]
if ( ! Array . isArray ( lines ) ) return [ ]
@@ -2188,17 +2188,17 @@ export const useOrderEntryStore = defineStore('orderentry', {
raw . IsClosed ? . Bool === true
raw . IsClosed ? . Bool === true
/* =======================================================
/* =======================================================
1ï¸âƒ£ UI / SNAPSHOT KAYNAKLI SATIR
1️⃣ UI / SNAPSHOT KAYNAKLI SATIR
-------------------------------------------------------
-------------------------------------------------------
✔ ComboKey YOK
✔ ComboKey YOK
✔ Sadece model / renk / renk2 bazı nda gruplanı r
✔ Sadece model / renk / renk2 bazı nda gruplanı r
======================================================= */
======================================================= */
if ( raw . bedenMap && Object . keys ( raw . bedenMap ) . length ) {
if ( raw . bedenMap && Object . keys ( raw . bedenMap ) . length ) {
const model = ( raw . model || raw . ItemCode || '' ) . trim ( )
const model = ( raw . model || raw . ItemCode || '' ) . trim ( )
const renk = ( raw . renk || raw . ColorCode || '' ) . trim ( )
const renk = ( raw . renk || raw . ColorCode || '' ) . trim ( )
const renk2 = ( raw . renk2 || raw . ItemDim2Code || '' ) . trim ( )
const renk2 = ( raw . renk2 || raw . ItemDim2Code || '' ) . trim ( )
// ◠BEDEN YOK → bu SADECE ü st seviye grup anahtarı
// ❗ BEDEN YOK → bu SADECE ü st seviye grup anahtarı
const modelKey = ` ${ model } || ${ renk } || ${ renk2 } `
const modelKey = ` ${ model } || ${ renk } || ${ renk2 } `
const grpKey = raw . grpKey || 'tak'
const grpKey = raw . grpKey || 'tak'
@@ -2225,17 +2225,17 @@ export const useOrderEntryStore = defineStore('orderentry', {
/* =======================================================
/* =======================================================
2ï¸âƒ£ BACKEND / LEGACY SATIR (FIXED)
2️⃣ BACKEND / LEGACY SATIR (FIXED)
-------------------------------------------------------
-------------------------------------------------------
✔ ComboKey YOK
✔ ComboKey YOK
✔ Sadece model / renk / renk2 bazlı gruplanı r
✔ Sadece model / renk / renk2 bazlı gruplanı r
✔ BEDEN sadece bedenMap + lineIdMap iç in kullanılı r
✔ BEDEN sadece bedenMap + lineIdMap iç in kullanı lı r
======================================================= */
======================================================= */
const model = ( raw . Model || raw . ItemCode || '' ) . trim ( )
const model = ( raw . Model || raw . ItemCode || '' ) . trim ( )
const renk = ( raw . ColorCode || '' ) . trim ( )
const renk = ( raw . ColorCode || '' ) . trim ( )
const renk2 = ( raw . ItemDim2Code || '' ) . trim ( )
const renk2 = ( raw . ItemDim2Code || '' ) . trim ( )
// ◠BEDEN HARİÇ — ü st seviye grup anahtarı
// ❗ BEDEN HARİÇ — ü st seviye grup anahtarı
const modelKey = ` ${ model } || ${ renk } || ${ renk2 } `
const modelKey = ` ${ model } || ${ renk } || ${ renk2 } `
merged [ modelKey ] ? ? = [ ]
merged [ modelKey ] ? ? = [ ]
@@ -2265,8 +2265,8 @@ export const useOrderEntryStore = defineStore('orderentry', {
fiyat : Number ( raw . Price || 0 ) ,
fiyat : Number ( raw . Price || 0 ) ,
pb : raw . DocCurrencyCode || pbFallback ,
pb : raw . DocCurrencyCode || pbFallback ,
_ _tmpMap : { } , // beden → qty
_ _tmpMap : { } , // beden → qty
lineIdMap : { } , // beden → OrderLineID
lineIdMap : { } , // beden → OrderLineID
adet : 0 ,
adet : 0 ,
tutar : 0 ,
tutar : 0 ,
@@ -2279,7 +2279,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
/* -------------------------------------------------------
/* -------------------------------------------------------
🔑 BEDEN → OrderLineID (DETERMINISTIC & SAFE)
🔑 BEDEN → OrderLineID (DETERMINISTIC & SAFE)
-------------------------------------------------------- */
-------------------------------------------------------- */
const rawLineId =
const rawLineId =
raw . OrderLineID ||
raw . OrderLineID ||
@@ -2299,7 +2299,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
/* =======================================================
/* =======================================================
3ï¸âƒ£ FINAL — grpKey KESİ N + AKSBİ R FIX
3️⃣ FINAL — grpKey KESİ N + AKSBİ R FIX
======================================================= */
======================================================= */
const out = [ ]
const out = [ ]
@@ -2312,7 +2312,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
const bedenList = Object . keys ( row . _ _tmpMap )
const bedenList = Object . keys ( row . _ _tmpMap )
// 🔒 TEK VE KESİ N KARAR
// 🔒 TEK VE KESİ N KARAR
const grpKey = detectBedenGroup (
const grpKey = detectBedenGroup (
bedenList ,
bedenList ,
row . urunAnaGrubu ,
row . urunAnaGrubu ,
@@ -2340,9 +2340,9 @@ export const useOrderEntryStore = defineStore('orderentry', {
row . tutar = Number ( ( row . adet * Number ( row . fiyat || 0 ) ) . toFixed ( 2 ) )
row . tutar = Number ( ( row . adet * Number ( row . fiyat || 0 ) ) . toFixed ( 2 ) )
/* ===================================================
/* ===================================================
🔒 AKSBİR — BOŠLUK BEDEN GERÇ EK ADETİ ALIR
🔒 AKSBİR — BOŞ LUK BEDEN GERÇ EK ADETİ ALIR
◠STD’ ye dö nme YOK
❗ STD’ ye dö nme YOK
â— 0 yazma YOK
❗ 0 yazma YOK
=================================================== */
=================================================== */
if ( grpKey === 'aksbir' ) {
if ( grpKey === 'aksbir' ) {
row . bedenMap [ grpKey ] ? ? = { }
row . bedenMap [ grpKey ] ? ? = { }
@@ -2355,7 +2355,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
console . log (
console . log (
` 📦 normalizeOrderLines (v9 + lineIdMap) → ${ out . length } satı r `
` 📦 normalizeOrderLines (v9 + lineIdMap) → ${ out . length } satı r `
)
)
return out
return out
@@ -2365,12 +2365,12 @@ export const useOrderEntryStore = defineStore('orderentry', {
/**
/**
* ===========================================================
* ===========================================================
* loadProductSizes — FINAL v4.2 (EDITOR SAFE)
* loadProductSizes — FINAL v4.2 (EDITOR SAFE)
* -----------------------------------------------------------
* -----------------------------------------------------------
* ✔ grpKey SADECE form.grpKey
* ✔ grpKey SADECE form.grpKey
* ✔ schemaMap TEK OTORİ TE
* ✔ schemaMap TEK OTORİ TE
* ✔ edit modda BEDEN LABEL DOKUNULMAZ
* ✔ edit modda BEDEN LABEL DOKUNULMAZ
* ✔ ' ' (boş beden) korunur
* ✔ ' ' (boş beden) korunur
* ===========================================================
* ===========================================================
*/
*/
async loadProductSizes ( form , forceRefresh = false , $q = null ) {
async loadProductSizes ( form , forceRefresh = false , $q = null ) {
@@ -2385,7 +2385,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
try {
try {
const grpKey = form . grpKey
const grpKey = form . grpKey
if ( ! grpKey ) {
if ( ! grpKey ) {
console . warn ( '⛔ loadProductSizes iptal → grpKey yok' )
console . warn ( '⛔ loadProductSizes iptal → grpKey yok' )
return
return
}
}
@@ -2394,18 +2394,18 @@ export const useOrderEntryStore = defineStore('orderentry', {
const cacheKey = ` ${ form . model } _ ${ colorKey } _ ${ color2Key } _ ${ grpKey } `
const cacheKey = ` ${ form . model } _ ${ colorKey } _ ${ color2Key } _ ${ grpKey } `
/* =======================================================
/* =======================================================
â™»ï¸ CACHE (LABEL DOKUNMADAN)
♻️ CACHE (LABEL DOKUNMADAN)
======================================================= */
======================================================= */
if ( ! forceRefresh && sizeCache . value ? . [ cacheKey ] ) {
if ( ! forceRefresh && sizeCache . value ? . [ cacheKey ] ) {
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 }
console . log ( ` â™»ï¸ loadProductSizes CACHE → ${ grpKey } ` )
console . log ( ` ♻️ loadProductSizes CACHE → ${ grpKey } ` )
return
return
}
}
/* =======================================================
/* =======================================================
📡 API
📡 API
======================================================= */
======================================================= */
const params = { code : form . model }
const params = { code : form . model }
if ( form . renk ) params . color = form . renk
if ( form . renk ) params . color = form . renk
@@ -2421,7 +2421,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
/* =======================================================
/* =======================================================
📦 STOK MAP (' ' KORUNUR)
📦 STOK MAP (' ' KORUNUR)
======================================================= */
======================================================= */
const apiStockMap = { }
const apiStockMap = { }
for ( const x of data ) {
for ( const x of data ) {
@@ -2443,7 +2443,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
)
)
/* =======================================================
/* =======================================================
💾 CACHE
💾 CACHE
======================================================= */
======================================================= */
sizeCache . value [ cacheKey ] = {
sizeCache . value [ cacheKey ] = {
labels : [ ... form . bedenLabels ] ,
labels : [ ... form . bedenLabels ] ,
@@ -2451,14 +2451,14 @@ export const useOrderEntryStore = defineStore('orderentry', {
stockMap : { ... stockMap . value }
stockMap : { ... stockMap . value }
}
}
console . log ( ` ✅ loadProductSizes FINAL v4.2 → ${ grpKey } ` )
console . log ( ` ✅ loadProductSizes FINAL v4.2 → ${ grpKey } ` )
} catch ( err ) {
} catch ( err ) {
console . error ( '⌠loadProductSizes hata:' , err )
console . error ( '❌ loadProductSizes hata:' , err )
$q ? . notify ? . ( { type : 'negative' , message : 'Beden / stok alı namadı ' } )
$q ? . notify ? . ( { type : 'negative' , message : 'Beden / stok alı namadı ' } )
} finally {
} finally {
store . _uiBusy = prevBusy
store . _uiBusy = prevBusy
store . preventPersist = prevPrevent
store . preventPersist = prevPrevent
console . log ( '🧩 Editor beden hydrate' , {
console . log ( '🧩 Editor beden hydrate' , {
grpKey : form . grpKey ,
grpKey : form . grpKey ,
labels : form . bedenLabels ,
labels : form . bedenLabels ,
values : form . bedenler
values : form . bedenler
@@ -2473,24 +2473,24 @@ export const useOrderEntryStore = defineStore('orderentry', {
,
,
// =======================================================
// =======================================================
// 🔸 TOPLAM HESAPLAMA (store iç i) — X3 SAFE
// 🔸 TOPLAM HESAPLAMA (store iç i) — X3 SAFE
// -------------------------------------------------------
// -------------------------------------------------------
// ✔ f.adet / f.tutar hesaplanı r
// ✔ f.adet / f.tutar hesaplanı r
// ✔ store.totalAmount ASLA set edilmez
// ✔ store.totalAmount ASLA set edilmez
// ✔ gerç ek toplam → header.TotalAmount
// ✔ gerç ek toplam → header.TotalAmount
// =======================================================
// =======================================================
updateTotals ( f ) {
updateTotals ( f ) {
// 1ï¸âƒ£ Satı r adet
// 1️⃣ Satı r adet
f . adet = ( f . bedenler || [ ] ) . reduce (
f . adet = ( f . bedenler || [ ] ) . reduce (
( a , b ) => a + Number ( b || 0 ) ,
( a , b ) => a + Number ( b || 0 ) ,
0
0
)
)
// 2ï¸âƒ£ Satı r tutar
// 2️⃣ Satı r tutar
const fiyat = Number ( f . fiyat ) || 0
const fiyat = Number ( f . fiyat ) || 0
f . tutar = Number ( ( f . adet * fiyat ) . toFixed ( 2 ) )
f . tutar = Number ( ( f . adet * fiyat ) . toFixed ( 2 ) )
// 3ï¸âƒ£ Header toplam (tek gerç ek state)
// 3️⃣ Header toplam (tek gerç ek state)
if ( this . header ) {
if ( this . header ) {
const total = ( this . summaryRows || [ ] ) . reduce (
const total = ( this . summaryRows || [ ] ) . reduce (
( sum , r ) => sum + Number ( r ? . tutar || 0 ) ,
( sum , r ) => sum + Number ( r ? . tutar || 0 ) ,
@@ -2505,7 +2505,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
,
,
// =======================================================
// =======================================================
// 🔸 GRUP ANAHTARI TESPİTİ
// 🔸 GRUP ANAHTARI TESPİTİ
// =======================================================
// =======================================================
activeGroupKeyForRow ( row ) {
activeGroupKeyForRow ( row ) {
const g = ( row ? . urunAnaGrubu || '' ) . toUpperCase ( )
const g = ( row ? . urunAnaGrubu || '' ) . toUpperCase ( )
@@ -2517,27 +2517,27 @@ export const useOrderEntryStore = defineStore('orderentry', {
return 'tak'
return 'tak'
} ,
} ,
/* =======================================================
/* =======================================================
🔹 MODE YÖ NETİMİ — new / edit arası geçiş
🔹 MODE YÖ NETİMİ — new / edit arası geçiş
======================================================= */
======================================================= */
setMode ( mode ) {
setMode ( mode ) {
if ( ! [ 'new' , 'edit' , 'view' ] . includes ( mode ) ) {
if ( ! [ 'new' , 'edit' , 'view' ] . includes ( mode ) ) {
console . warn ( 'âš ï¸ Geç ersiz mode:' , mode )
console . warn ( '⚠️ Geç ersiz mode:' , mode )
return
return
}
}
this . mode = mode
this . mode = mode
console . log ( ` 🧠Order mode set edildi → ${ mode } ` )
console . log ( ` 🧭 Order mode set edildi → ${ mode } ` )
}
}
,
,
/* ===========================================================
/* ===========================================================
🟦 submitAllReal (v12.1c — FINAL / CLEAN + PRE-VALIDATE)
🟦 submitAllReal (v12.1c — FINAL / CLEAN + PRE-VALIDATE)
-----------------------------------------------------------
-----------------------------------------------------------
✔ NEW → INSERT, EDIT → UPDATE (tek karar noktası )
✔ NEW → INSERT, EDIT → UPDATE (tek karar noktası )
✔ Controlled submit → route guard SUSAR
✔ Controlled submit → route guard SUSAR
✔ Snapshot temizliğ i route ö ncesi
✔ Snapshot temizliğ i route ö ncesi
✔ Kaydet → edit replace → backend reload
✔ Kaydet → edit replace → backend reload
✔ Listeye giderken guard popup 1 kez bypass
✔ Listeye giderken guard popup 1 kez bypass
✔ ✅ PRE-VALIDATE → prItemVariant olmayan kombinasyonlar kaydı DURDURUR
✔ ✅ PRE-VALIDATE → prItemVariant olmayan kombinasyonlar kaydı DURDURUR
=========================================================== */
=========================================================== */
async submitAllReal ( $q , router , form , summaryRows , productCache ) {
async submitAllReal ( $q , router , form , summaryRows , productCache ) {
let serverOrderId = null
let serverOrderId = null
@@ -2546,17 +2546,17 @@ export const useOrderEntryStore = defineStore('orderentry', {
try {
try {
this . loading = true
this . loading = true
// 🔒 Kontrollü submit → route leave guard susar
// 🔒 Kontrollü submit → route leave guard susar
this . isControlledSubmit = true
this . isControlledSubmit = true
const isNew = this . mode === 'new'
const isNew = this . mode === 'new'
const { header , lines } = this . buildFinalOrderJson ( )
const { header , lines } = this . buildFinalOrderJson ( )
// =======================================================
// =======================================================
// 🧾 DEBUG — FRONTEND → BACKEND Gİ DEN PAYLOAD
// 🧾 DEBUG — FRONTEND → BACKEND Gİ DEN PAYLOAD
// =======================================================
// =======================================================
console . groupCollapsed (
console . groupCollapsed (
` %c📤 ORDER PAYLOAD ( ${ this . mode } ) ` ,
` %c📤 ORDER PAYLOAD ( ${ this . mode } ) ` ,
'color:#c9a873;font-weight:bold'
'color:#c9a873;font-weight:bold'
)
)
@@ -2579,21 +2579,21 @@ export const useOrderEntryStore = defineStore('orderentry', {
console . groupEnd ( )
console . groupEnd ( )
// =======================================================
// =======================================================
// 🧾 DEBUG (opsiyonel helper)
// 🧾 DEBUG (opsiyonel helper)
// =======================================================
// =======================================================
this . debugOrderPayload ? . ( header , lines , 'PRE-VALIDATE' )
this . debugOrderPayload ? . ( header , lines , 'PRE-VALIDATE' )
// =======================================================
// =======================================================
// 🧩 DUMMY CURRENCY PAYLOAD (model geniş letmeden)
// 🧩 DUMMY CURRENCY PAYLOAD (model geniş letmeden)
// - trOrderLineCurrency iç in gerekli alanları satı ra basar
// - trOrderLineCurrency iç in gerekli alanları satı ra basar
// - ö rnek satı rdaki gibi: PriceVI/AmountVI = KDV dahil, Price/Amount = KDV hariç
// - ö rnek satı rdaki gibi: PriceVI/AmountVI = KDV dahil, Price/Amount = KDV hariç
// =======================================================
// =======================================================
const r2 = ( n ) => Number ( ( Number ( n ) || 0 ) . toFixed ( 2 ) )
const r2 = ( n ) => Number ( ( Number ( n ) || 0 ) . toFixed ( 2 ) )
const r4 = ( n ) => Number ( ( Number ( n ) || 0 ) . toFixed ( 4 ) )
const r4 = ( n ) => Number ( ( Number ( n ) || 0 ) . toFixed ( 4 ) )
for ( const ln of lines ) {
for ( const ln of lines ) {
const qty = Number ( ln ? . Qty1 || 0 )
const qty = Number ( ln ? . Qty1 || 0 )
const unitBase = Number ( ln ? . Price || 0 ) // KDV hariç birim
const unitBase = Number ( ln ? . Price || 0 ) // KDV hariç birim
const vatRate = Number ( ln ? . VatRate || 0 )
const vatRate = Number ( ln ? . VatRate || 0 )
const exRate = Number ( ln ? . PriceExchangeRate || header ? . ExchangeRate || 1 ) || 1
const exRate = Number ( ln ? . PriceExchangeRate || header ? . ExchangeRate || 1 ) || 1
@@ -2604,7 +2604,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
const docCurrency = String ( ln ? . DocCurrencyCode || header ? . DocCurrencyCode || 'TRY' ) . trim ( ) || 'TRY'
const docCurrency = String ( ln ? . DocCurrencyCode || header ? . DocCurrencyCode || 'TRY' ) . trim ( ) || 'TRY'
// Backend model alanları
// Backend model alanları
ln . RelationCurrencyCode = docCurrency
ln . RelationCurrencyCode = docCurrency
ln . DocPrice = unitWithVat
ln . DocPrice = unitWithVat
ln . DocAmount = net
ln . DocAmount = net
@@ -2618,7 +2618,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
ln . VatDeducation = 0
ln . VatDeducation = 0
ln . NetAmount = net
ln . NetAmount = net
// SQL kolonu isimleriyle dummy alias (decoder ignore etse de payload'da görünü r)
// SQL kolonu isimleriyle dummy alias (decoder ignore etse de payload'da görünü r)
ln . CurrencyCode = docCurrency
ln . CurrencyCode = docCurrency
ln . ExchangeRate = exRate
ln . ExchangeRate = exRate
ln . PriceVI = unitWithVat
ln . PriceVI = unitWithVat
@@ -2630,25 +2630,25 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
// =======================================================
// =======================================================
// 🧪 PRE-VALIDATE — prItemVariant ö n kontrol
// 🧪 PRE-VALIDATE — prItemVariant ö n kontrol
// - invalid varsa CREATE/UPDATE Ç ALIŠMAZ
// - invalid varsa CREATE/UPDATE Ç ALIŞ MAZ
// =======================================================
// =======================================================
const v = await api . post ( '/order/validate' , { header , lines } )
const v = await api . post ( '/order/validate' , { header , lines } )
const invalid = v ? . data ? . invalid || [ ]
const invalid = v ? . data ? . invalid || [ ]
if ( invalid . length > 0 ) {
if ( invalid . length > 0 ) {
await this . showInvalidVariantDialog ? . ( $q , invalid )
await this . showInvalidVariantDialog ? . ( $q , invalid )
return // ⌠create / update Ç ALIŠMAZ
return // ❌ create / update Ç ALIŞ MAZ
}
}
console . log ( '📤 submitAllReal payload' , {
console . log ( '📤 submitAllReal payload' , {
mode : this . mode ,
mode : this . mode ,
lines : lines . length ,
lines : lines . length ,
deletes : lines . filter ( l => l . _deleteSignal ) . length
deletes : lines . filter ( l => l . _deleteSignal ) . length
} )
} )
/* =======================================================
/* =======================================================
🚀 API CALL — TEK NOKTA
🚀 API CALL — TEK NOKTA
======================================================= */
======================================================= */
const resp = await api . post (
const resp = await api . post (
isNew ? '/order/create' : '/order/update' ,
isNew ? '/order/create' : '/order/update' ,
@@ -2669,11 +2669,11 @@ export const useOrderEntryStore = defineStore('orderentry', {
header ? . OrderNumber
header ? . OrderNumber
if ( ! serverOrderId ) {
if ( ! serverOrderId ) {
throw new Error ( 'OrderHeaderID backend’ den dö nmedi' )
throw new Error ( 'OrderHeaderID backend’ den dö nmedi' )
}
}
/* =======================================================
/* =======================================================
🔠MODE SWITCH → EDIT
🔁 MODE SWITCH → EDIT
======================================================= */
======================================================= */
this . setMode ( 'edit' )
this . setMode ( 'edit' )
@@ -2685,25 +2685,25 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
/* =======================================================
/* =======================================================
🧹 KRİTİ K: Snapshot + Dirty temizliğ i
🧹 KRİTİ K: Snapshot + Dirty temizliğ i
◠ROUTE değiş meden Ö NCE
❗ ROUTE değiş meden Ö NCE
======================================================= */
======================================================= */
this . updateHeaderTotals ? . ( )
this . updateHeaderTotals ? . ( )
this . markAsSaved ? . ( )
this . markAsSaved ? . ( )
/* =======================================================
/* =======================================================
🧹 KRİTİ K: NEW → EDIT geçiş inde TÜ M SNAPSHOT TEMİ ZLENİ R
🧹 KRİTİ K: NEW → EDIT geçiş inde TÜ M SNAPSHOT TEMİ ZLENİ R
======================================================= */
======================================================= */
this . clearAllOrderSnapshots ( )
this . clearAllOrderSnapshots ( )
$q . notify ( {
$q . notify ( {
type : 'positive' ,
type : 'positive' ,
message : ` SipariÅŸ kaydedildi: ${ serverOrderNo || '' } ` . trim ( )
message : ` Sipariş kaydedildi: ${ serverOrderNo || '' } ` . trim ( )
} )
} )
/* =======================================================
/* =======================================================
🔀 ROUTE REPLACE (EDIT MODE)
🔀 ROUTE REPLACE (EDIT MODE)
- aynı sayfa → param değiş ti
- aynı sayfa → param değiş ti
- guard 1 kez bypass
- guard 1 kez bypass
======================================================= */
======================================================= */
this . allowRouteLeaveOnce = true
this . allowRouteLeaveOnce = true
@@ -2715,7 +2715,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
} )
} )
/* =======================================================
/* =======================================================
🔄 BACKEND RELOAD (TEK GERÇ EK KAYNAK)
🔄 BACKEND RELOAD (TEK GERÇ EK KAYNAK)
======================================================= */
======================================================= */
await this . openExistingForEdit ( serverOrderId , {
await this . openExistingForEdit ( serverOrderId , {
$q ,
$q ,
@@ -2725,21 +2725,21 @@ export const useOrderEntryStore = defineStore('orderentry', {
} )
} )
/* =======================================================
/* =======================================================
â“ USER NEXT STEP
❓ USER NEXT STEP
======================================================= */
======================================================= */
const choice = await new Promise ( resolve => {
const choice = await new Promise ( resolve => {
$q . dialog ( {
$q . dialog ( {
title : 'SipariÅŸ Kaydedildi' ,
title : 'Sipariş Kaydedildi' ,
options : {
options : {
type : 'radio' ,
type : 'radio' ,
model : 'continue' ,
model : 'continue' ,
items : [
items : [
{ label : 'âœï¸ Dü zenlemeye Devam' , value : 'continue' } ,
{ label : '✏️ Dü zenlemeye Devam' , value : 'continue' } ,
{ label : '🖨 Yazdı r' , value : 'print' } ,
{ label : '🖨 Yazdı r' , value : 'print' } ,
{ label : '📋 Listeye Dö n' , value : 'list' }
{ label : '📋 Listeye Dö n' , value : 'list' }
]
]
} ,
} ,
ok : { label : 'Seç ' } ,
ok : { label : 'Seç ' } ,
cancel : { label : 'Kapat' }
cancel : { label : 'Kapat' }
} )
} )
. onOk ( v => resolve ( v ) )
. onOk ( v => resolve ( v ) )
@@ -2747,7 +2747,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
} )
} )
/* =======================================================
/* =======================================================
🧠USER ROUTING
🧭 USER ROUTING
======================================================= */
======================================================= */
if ( choice === 'print' ) {
if ( choice === 'print' ) {
const id = this . header ? . OrderHeaderID || serverOrderId
const id = this . header ? . OrderHeaderID || serverOrderId
@@ -2755,12 +2755,12 @@ export const useOrderEntryStore = defineStore('orderentry', {
try {
try {
await this . downloadOrderPdf ( id )
await this . downloadOrderPdf ( id )
} catch ( pdfErr ) {
} catch ( pdfErr ) {
console . error ( 'âš ï¸ PDF açı lamadı , kayı t baÅŸarılı :' , pdfErr )
console . error ( '⚠️ PDF açı lamadı , kayı t başarı lı :' , pdfErr )
$q . notify ( {
$q . notify ( {
type : 'warning' ,
type : 'warning' ,
message :
message :
pdfErr ? . message ||
pdfErr ? . message ||
'Sipariş kaydedildi fakat PDF açı lamadı .'
'Sipariş kaydedildi fakat PDF açı lamadı .'
} )
} )
}
}
}
}
@@ -2773,10 +2773,10 @@ export const useOrderEntryStore = defineStore('orderentry', {
return
return
}
}
// continue → sayfada kal (hiç bir ş ey yapma)
// continue → sayfada kal (hiç bir ş ey yapma)
} catch ( err ) {
} catch ( err ) {
console . error ( '⌠submitAllReal:' , err )
console . error ( '❌ submitAllReal:' , err )
$q . notify ( {
$q . notify ( {
type : 'negative' ,
type : 'negative' ,
@@ -2784,11 +2784,11 @@ export const useOrderEntryStore = defineStore('orderentry', {
err ? . response ? . data ? . detail ||
err ? . response ? . data ? . detail ||
err ? . response ? . data ? . message ||
err ? . response ? . data ? . message ||
err ? . message ||
err ? . message ||
'Kayı t sı rası nda hata'
'Kayı t sı rası nda hata'
} )
} )
} finally {
} finally {
// 🔓 Guard’ lar normale dönsü n
// 🔓 Guard’ lar normale dönsü n
this . isControlledSubmit = false
this . isControlledSubmit = false
this . loading = false
this . loading = false
}
}
@@ -2797,28 +2797,28 @@ export const useOrderEntryStore = defineStore('orderentry', {
,
,
/* =======================================================
/* =======================================================
🧪 SUBMIT ALL TEST
🧪 SUBMIT ALL TEST
======================================================= */
======================================================= */
async submitAllTest ( $q = null ) {
async submitAllTest ( $q = null ) {
try {
try {
const { header , lines } = this . buildFinalOrderJson ( )
const { header , lines } = this . buildFinalOrderJson ( )
console . log ( '🧾 TEST HEADER' , Object . keys ( header ) . length , 'alan' )
console . log ( '🧾 TEST HEADER' , Object . keys ( header ) . length , 'alan' )
console . log ( JSON . stringify ( header , null , 2 ) )
console . log ( JSON . stringify ( header , null , 2 ) )
console . log ( '🧾 TEST LINES' , lines . length , 'satı r' )
console . log ( '🧾 TEST LINES' , lines . length , 'satı r' )
console . log ( JSON . stringify ( lines , null , 2 ) )
console . log ( JSON . stringify ( lines , null , 2 ) )
$q ? . notify ? . ( {
$q ? . notify ? . ( {
type : 'info' ,
type : 'info' ,
message : ` Header ( ${ Object . keys ( header ) . length } ) + Lines ( ${ lines . length } ) gö sterildi ` ,
message : ` Header ( ${ Object . keys ( header ) . length } ) + Lines ( ${ lines . length } ) gö sterildi ` ,
position : 'top'
position : 'top'
} )
} )
} catch ( err ) {
} catch ( err ) {
console . error ( '⌠submitAllTest hata:' , err )
console . error ( '❌ submitAllTest hata:' , err )
$q ? . notify ? . ( {
$q ? . notify ? . ( {
type : 'negative' ,
type : 'negative' ,
message : 'Gö sterimde hata oluş tu ⌠' ,
message : 'Gö sterimde hata oluş tu ❌ ' ,
position : 'top'
position : 'top'
} )
} )
}
}
@@ -2826,15 +2826,15 @@ export const useOrderEntryStore = defineStore('orderentry', {
/* =======================================================
/* =======================================================
🧹 KAYIT SONRASI TEMİZLİ K
🧹 KAYIT SONRASI TEMİZLİ K
======================================================= */
======================================================= */
afterSubmit ( opts = {
afterSubmit ( opts = {
keepLocalStorage : true ,
keepLocalStorage : true ,
backendPayload : null ,
backendPayload : null ,
resetMode : true // 🔑 yeni
resetMode : true // 🔑 yeni
} ) {
} ) {
try {
try {
console . log ( '🧹 afterSubmit baş latıldı ' , opts )
console . log ( '🧹 afterSubmit baş latı ldı ' , opts )
if ( opts ? . backendPayload ? . header ? . OrderHeaderID ) {
if ( opts ? . backendPayload ? . header ? . OrderHeaderID ) {
this . mergeAndPersistBackendOrder (
this . mergeAndPersistBackendOrder (
@@ -2855,14 +2855,14 @@ export const useOrderEntryStore = defineStore('orderentry', {
this . editingKey = null
this . editingKey = null
this . currentOrderId = null
this . currentOrderId = null
// 🔠MODE RESET OPSİ YONEL
// 🔐 MODE RESET OPSİ YONEL
if ( opts . resetMode === true ) {
if ( opts . resetMode === true ) {
this . mode = 'new'
this . mode = 'new'
}
}
console . log ( '✅ afterSubmit tamamlandı .' )
console . log ( '✅ afterSubmit tamamlandı .' )
} catch ( err ) {
} catch ( err ) {
console . error ( '⌠afterSubmit hata:' , err )
console . error ( '❌ afterSubmit hata:' , err )
}
}
}
}
@@ -2870,14 +2870,14 @@ export const useOrderEntryStore = defineStore('orderentry', {
/* ===========================================================
/* ===========================================================
🟦 BUILD FINAL ORDER JSON — SAFE v26.1 (FINAL)
🟦 BUILD FINAL ORDER JSON — SAFE v26.1 (FINAL)
-----------------------------------------------------------
-----------------------------------------------------------
✔ ComboKey TEK OTORİ TE → buildComboKey (bedenKey ile)
✔ ComboKey TEK OTORİ TE → buildComboKey (bedenKey ile)
✔ UI/Map placeholder: '_' (bedenKey)
✔ UI/Map placeholder: '_' (bedenKey)
✔ DB/payload: '' (bedenPayload) → "_" ASLA Gİ TMEZ
✔ DB/payload: '' (bedenPayload) → "_" ASLA Gİ TMEZ
✔ payload iç inde aynı ComboKey TEK satı r
✔ payload iç inde aynı ComboKey TEK satı r
✔ backend duplicate guard %100 uyumlu (ComboKey stabil)
✔ backend duplicate guard %100 uyumlu (ComboKey stabil)
✔ Final assert: payload’ da "_" yakalanı rsa patlatı r
✔ Final assert: payload’ da "_" yakalanı rsa patlatı r
=========================================================== */
=========================================================== */
buildFinalOrderJson ( ) {
buildFinalOrderJson ( ) {
const auth = useAuthStore ( )
const auth = useAuthStore ( )
@@ -2894,7 +2894,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
const formatTimeOnly = v => dayjs ( v ) . format ( 'HH:mm:ss' )
const formatTimeOnly = v => dayjs ( v ) . format ( 'HH:mm:ss' )
const formatDateTime = v => ( v ? dayjs ( v ) . format ( 'YYYY-MM-DD HH:mm:ss' ) : null )
const formatDateTime = v => ( v ? dayjs ( v ) . format ( 'YYYY-MM-DD HH:mm:ss' ) : null )
// ✅ Payload beden normalize: "_" / "-" / "" => ''
// ✅ Payload beden normalize: "_" / "-" / "" => ''
const normBeden = ( v ) => {
const normBeden = ( v ) => {
const s = safeStr ( v )
const s = safeStr ( v )
if ( s === '' || s === '_' || s === '-' ) return '' // payload empty
if ( s === '' || s === '_' || s === '-' ) return '' // payload empty
@@ -2949,16 +2949,16 @@ export const useOrderEntryStore = defineStore('orderentry', {
}
}
/* =======================================================
/* =======================================================
LINES — COMBOKEY AGGREGATE (TEK MAP)
LINES — COMBOKEY AGGREGATE (TEK MAP)
======================================================= */
======================================================= */
const lines = [ ]
const lines = [ ]
const lineByCombo = new Map ( ) // 🔒 KEY = ComboKey
const lineByCombo = new Map ( ) // 🔒 KEY = ComboKey
const pushOrMerge = ( row , ctx ) => {
const pushOrMerge = ( row , ctx ) => {
const {
const {
grpKey ,
grpKey ,
bedenKey , // ✅ sadece ComboKey / Map iç in ('_' olabilir)
bedenKey , // ✅ sadece ComboKey / Map iç in ('_' olabilir)
bedenPayload , // ✅ DB iç in ('' / 'S' / 'M' ...)
bedenPayload , // ✅ DB iç in ('' / 'S' / 'M' ...)
qty ,
qty ,
orderLineId ,
orderLineId ,
isDeleteSignal
isDeleteSignal
@@ -2966,7 +2966,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
if ( qty <= 0 && ! isDeleteSignal ) return
if ( qty <= 0 && ! isDeleteSignal ) return
// ComboKey stabil kalsı n diye bedenKey kullan
// ComboKey stabil kalsı n diye bedenKey kullan
const comboKey = buildComboKey ( row , bedenKey )
const comboKey = buildComboKey ( row , bedenKey )
const makeLine = ( ) => ( {
const makeLine = ( ) => ( {
@@ -2980,7 +2980,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
ItemCode : safeStr ( row . model ) ,
ItemCode : safeStr ( row . model ) ,
ColorCode : safeStr ( row . renk ) ,
ColorCode : safeStr ( row . renk ) ,
// ✅ PAYLOAD: "_" ASLA YOK
// ✅ PAYLOAD: "_" ASLA YOK
ItemDim1Code : bedenPayload ,
ItemDim1Code : bedenPayload ,
ItemDim2Code : safeStr ( row . renk2 ) ,
ItemDim2Code : safeStr ( row . renk2 ) ,
@@ -3091,7 +3091,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
const hasAnyBeden =
const hasAnyBeden =
map && typeof map === 'object' && Object . keys ( map ) . length > 0
map && typeof map === 'object' && Object . keys ( map ) . length > 0
/* 🔹 BEDENSİ Z / AKSBİ R */
/* 🔹 BEDENSİ Z / AKSBİ R */
if ( ! hasAnyBeden ) {
if ( ! hasAnyBeden ) {
const allowBlankPayload =
const allowBlankPayload =
grpKey === 'aksbir' || row . _deleteSignal === true
grpKey === 'aksbir' || row . _deleteSignal === true
@@ -3101,9 +3101,9 @@ export const useOrderEntryStore = defineStore('orderentry', {
const qty = toNum ( row . qty ? ? row . Qty1 ? ? row . miktar ? ? 0 )
const qty = toNum ( row . qty ? ? row . Qty1 ? ? row . miktar ? ? 0 )
// ✅ ComboKey stabil: bedenKey = '_'
// ✅ ComboKey stabil: bedenKey = '_'
const bedenKey = '_'
const bedenKey = '_'
// ✅ Payload: boş string
// ✅ Payload: boş string
const bedenPayload = ''
const bedenPayload = ''
let orderLineId = ''
let orderLineId = ''
@@ -3127,7 +3127,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
continue
continue
}
}
/* 🔹 BEDENLİ */
/* 🔹 BEDENLİ */
for ( const [ bedenRaw , qtyRaw ] of Object . entries ( map ) ) {
for ( const [ bedenRaw , qtyRaw ] of Object . entries ( map ) ) {
const isBlankBeden = safeStr ( bedenRaw ) === ''
const isBlankBeden = safeStr ( bedenRaw ) === ''
if (
if (
@@ -3140,14 +3140,14 @@ export const useOrderEntryStore = defineStore('orderentry', {
const qty = toNum ( qtyRaw )
const qty = toNum ( qtyRaw )
// ✅ payload beden: '' / 'S' / 'M' ...
// ✅ payload beden: '' / 'S' / 'M' ...
const bedenPayload = normBeden ( bedenRaw )
const bedenPayload = normBeden ( bedenRaw )
// ✅ combokey beden: boş sa '_' ile stabil kalsı n
// ✅ combokey beden: boş sa '_' ile stabil kalsı n
const bedenKey = bedenPayload || '_'
const bedenKey = bedenPayload || '_'
let orderLineId = ''
let orderLineId = ''
if ( this . mode === 'edit' ) {
if ( this . mode === 'edit' ) {
// lineIdMap anahtarı sizde hangi bedenle tutuluyorsa ikisini de dene
// lineIdMap anahtarı sizde hangi bedenle tutuluyorsa ikisini de dene
orderLineId =
orderLineId =
safeStr ( lineIdMap ? . [ bedenKey ] ) ||
safeStr ( lineIdMap ? . [ bedenKey ] ) ||
safeStr ( lineIdMap ? . [ bedenPayload ] ) ||
safeStr ( lineIdMap ? . [ bedenPayload ] ) ||
@@ -3174,18 +3174,18 @@ export const useOrderEntryStore = defineStore('orderentry', {
lines . forEach ( ( ln , i ) => { ln . SortOrder = i + 1 } )
lines . forEach ( ( ln , i ) => { ln . SortOrder = i + 1 } )
/* =======================================================
/* =======================================================
ASSERT — payload’ da "_" OLAMAZ
ASSERT — payload’ da "_" OLAMAZ
======================================================= */
======================================================= */
if ( lines . some ( l => ( l . ItemDim1Code || '' ) === '_' ) ) {
if ( lines . some ( l => ( l . ItemDim1Code || '' ) === '_' ) ) {
console . error ( '⌠Payload’ da "_" yakalandı ' , lines . filter ( l => l . ItemDim1Code === '_' ) )
console . error ( '❌ Payload’ da "_" yakalandı ' , lines . filter ( l => l . ItemDim1Code === '_' ) )
throw new Error ( 'Payload ItemDim1Code "_" olamaz' )
throw new Error ( 'Payload ItemDim1Code "_" olamaz' )
}
}
/* =======================================================
/* =======================================================
🔠DEBUG — BUILD FINAL ORDER JSON OUTPUT
🔍 DEBUG — BUILD FINAL ORDER JSON OUTPUT
======================================================= */
======================================================= */
console . groupCollapsed ( '%c📦 BUILD FINAL ORDER JSON' , 'color:#c9a873;font-weight:bold' )
console . groupCollapsed ( '%c📦 BUILD FINAL ORDER JSON' , 'color:#c9a873;font-weight:bold' )
console . log ( '🧾 HEADER:' , header )
console . log ( '🧾 HEADER:' , header )
console . table (
console . table (
lines . map ( ( l , i ) => ( {
lines . map ( ( l , i ) => ( {
@@ -3214,7 +3214,7 @@ export const useOrderEntryStore = defineStore('orderentry', {
, /* ===========================================================
, /* ===========================================================
✅ STORE ACTIONS — FIXED HELPERS
✅ STORE ACTIONS — FIXED HELPERS
- setRowErrorByClientKey
- setRowErrorByClientKey
- clearRowErrorByClientKey
- clearRowErrorByClientKey
- applyTerminToRowsIfEmpty
- applyTerminToRowsIfEmpty
@@ -3248,14 +3248,14 @@ export const useOrderEntryStore = defineStore('orderentry', {
if ( ! dateStr ) return
if ( ! dateStr ) return
if ( ! Array . isArray ( this . summaryRows ) ) return
if ( ! Array . isArray ( this . summaryRows ) ) return
// ◠reassign YOK — patch/mutate
// ❗ reassign YOK — patch/mutate
for ( const r of this . summaryRows ) {
for ( const r of this . summaryRows ) {
if ( ! r ? . terminTarihi || r . terminTarihi === '' ) {
if ( ! r ? . terminTarihi || r . terminTarihi === '' ) {
r . terminTarihi = dateStr
r . terminTarihi = dateStr
}
}
}
}
// opsiyonel ama genelde doÄŸ ru:
// opsiyonel ama genelde doğ ru:
this . persistLocalStorage ? . ( )
this . persistLocalStorage ? . ( )
}
}
@@ -3454,9 +3454,9 @@ export function toSummaryRowFromForm(form) {
/* ===========================================================
/* ===========================================================
🔹 TOPLAM HESAPLAMA (EXPORT)
🔹 TOPLAM HESAPLAMA (EXPORT)
-----------------------------------------------------------
-----------------------------------------------------------
Hem store iç inde hem de component tarafı nda kullanı labilir.
Hem store iç inde hem de component tarafı nda kullanı labilir.
=========================================================== */
=========================================================== */
export function updateTotals ( f ) {
export function updateTotals ( f ) {
f . adet = ( f . bedenler || [ ] ) . reduce ( ( a , b ) => a + Number ( b || 0 ) , 0 )
f . adet = ( f . bedenler || [ ] ) . reduce ( ( a , b ) => a + Number ( b || 0 ) , 0 )
@@ -3466,11 +3466,11 @@ export function updateTotals(f) {
}
}
/* ===========================================================
/* ===========================================================
🔹 EXPORT SET — Tek Merkezli Dış a Aktarı mlar
🔹 EXPORT SET — Tek Merkezli Dış a Aktarı mlar
=========================================================== */
=========================================================== */
/**
/**
* 🧩 Shared Reactive Refs
* 🧩 Shared Reactive Refs
* -----------------------------------------------------------
* -----------------------------------------------------------
* import { sharedOrderEntryRefs } from 'src/stores/orderentryStore'
* import { sharedOrderEntryRefs } from 'src/stores/orderentryStore'
* const { stockMap, bedenStock, sizeCache } = sharedOrderEntryRefs
* const { stockMap, bedenStock, sizeCache } = sharedOrderEntryRefs