ilk
This commit is contained in:
653
ui/src/stores/deneme3
Normal file
653
ui/src/stores/deneme3
Normal file
@@ -0,0 +1,653 @@
|
||||
// src/stores/orderentryStore.js
|
||||
import { defineStore } from 'pinia'
|
||||
import axios from 'axios'
|
||||
import qs from 'qs'
|
||||
import { useAuthStore } from 'src/stores/authStore'
|
||||
import dayjs from 'src/boot/dayjs'
|
||||
import { ref, watch } from 'vue'
|
||||
|
||||
/* ==========================================================
|
||||
Reaktif shared referanslar (bazı UI yardımcıları)
|
||||
========================================================== */
|
||||
const stockMap = ref({}) // { "48": 12, "50": 7, ... }
|
||||
const bedenStock = ref([]) // [{beden:'48', stok:12}, ...]
|
||||
const sizeCache = ref({}) // beden/stok cache (component tarafı çağırıyor)
|
||||
|
||||
/* ==========================================================
|
||||
STORE
|
||||
========================================================== */
|
||||
export const useOrderentryStore = defineStore('orderentry', {
|
||||
state: () => ({
|
||||
/* 🔹 Ana durumlar */
|
||||
orders: [], // grid kaynak array’i (summaryRows ile senkron)
|
||||
loading: false,
|
||||
selected: null, // UI’de seçili satır
|
||||
error: null,
|
||||
|
||||
/* 🔹 Cari */
|
||||
customers: [],
|
||||
selectedCustomer: null,
|
||||
|
||||
/* 🔹 Ürün zinciri */
|
||||
products: [],
|
||||
colors: [],
|
||||
secondColors: [],
|
||||
inventory: [],
|
||||
|
||||
selectedProduct: null,
|
||||
selectedColor: null,
|
||||
selectedColor2: null,
|
||||
|
||||
/* 🔹 Transaction & Storage */
|
||||
activeTransactionId: null,
|
||||
persistKey: 'bss_orderentry_data', // ♻️ kalıcı depolama key’i
|
||||
lastSnapshotKey: 'bss_orderentry_snapshot', // son-kaydedilen-sipariş
|
||||
|
||||
/* 🔹 Düzenleme durumu */
|
||||
editingIndex: -1,
|
||||
currentOrderId: null, // edit modunda header ID
|
||||
header: {}, // backend header modeli
|
||||
mode: 'new' // 'new' | 'edit'
|
||||
}),
|
||||
|
||||
getters: {
|
||||
/* 🔹 Toplam adet */
|
||||
totalQty(state) {
|
||||
return state.orders.reduce((sum, r) => sum + (Number(r.adet) || 0), 0)
|
||||
},
|
||||
/* 🔹 Toplam tutar (string fix2) */
|
||||
totalAmount(state) {
|
||||
const n = state.orders.reduce((s, r) => s + (Number(r.tutar) || 0), 0)
|
||||
return isNaN(n) ? '0.00' : n.toFixed(2)
|
||||
},
|
||||
/* 🔹 Müşteri bazlı gruplanmış (opsiyonel) */
|
||||
groupedByCustomer(state) {
|
||||
const out = {}
|
||||
for (const row of state.orders) {
|
||||
const k = row.musteri || '—'
|
||||
if (!out[k]) out[k] = []
|
||||
out[k].push(row)
|
||||
}
|
||||
return out
|
||||
},
|
||||
/* 🔹 2. renk var mı? */
|
||||
hasSecondColor(state) {
|
||||
return Array.isArray(state.secondColors) && state.secondColors.length > 0
|
||||
},
|
||||
/* 🔹 Envanter toplamı */
|
||||
totalInventoryQty(state) {
|
||||
return state.inventory.reduce((s, r) => s + (Number(r.kullanilabilir) || 0), 0)
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
/* ==========================================================
|
||||
STORAGE — Kalıcı kayıt yardımcıları
|
||||
========================================================== */
|
||||
saveToStorage() {
|
||||
try {
|
||||
const payload = {
|
||||
orders: this.orders,
|
||||
header: this.header,
|
||||
currentOrderId: this.currentOrderId,
|
||||
selectedCustomer: this.selectedCustomer,
|
||||
activeTransactionId: this.activeTransactionId,
|
||||
mode: this.mode,
|
||||
savedAt: dayjs().toISOString()
|
||||
}
|
||||
localStorage.setItem(this.persistKey, JSON.stringify(payload))
|
||||
} catch (err) {
|
||||
console.warn('⚠️ localStorage kaydı başarısız:', err)
|
||||
}
|
||||
},
|
||||
|
||||
/* Kayıt sonrası görüntülenecek "snapshot".
|
||||
UI’yi temizlesen bile sayfa yenilenince bu snapshot geri yüklenebilir. */
|
||||
saveSnapshot(tag = 'post-submit') {
|
||||
try {
|
||||
const snap = {
|
||||
tag,
|
||||
orders: this.orders,
|
||||
header: this.header,
|
||||
currentOrderId: this.currentOrderId,
|
||||
selectedCustomer: this.selectedCustomer,
|
||||
mode: this.mode,
|
||||
savedAt: dayjs().toISOString()
|
||||
}
|
||||
localStorage.setItem(this.lastSnapshotKey, JSON.stringify(snap))
|
||||
} catch (e) {
|
||||
console.warn('⚠️ saveSnapshot hatası:', e)
|
||||
}
|
||||
},
|
||||
|
||||
loadFromStorage() {
|
||||
try {
|
||||
const raw = localStorage.getItem(this.persistKey)
|
||||
if (!raw) return
|
||||
const data = JSON.parse(raw)
|
||||
if (Array.isArray(data.orders)) this.orders = data.orders
|
||||
this.header = data.header || {}
|
||||
this.currentOrderId = data.currentOrderId || null
|
||||
this.selectedCustomer = data.selectedCustomer || null
|
||||
this.activeTransactionId = data.activeTransactionId || null
|
||||
this.mode = data.mode || 'new'
|
||||
console.log(`♻️ Storage yüklendi • mode:${this.mode} • rows:${this.orders.length}`)
|
||||
} catch (err) {
|
||||
console.warn('⚠️ localStorage okuma hatası:', err)
|
||||
}
|
||||
},
|
||||
|
||||
loadSnapshot() {
|
||||
try {
|
||||
const raw = localStorage.getItem(this.lastSnapshotKey)
|
||||
if (!raw) return null
|
||||
return JSON.parse(raw)
|
||||
} catch (e) {
|
||||
console.warn('⚠️ loadSnapshot hatası:', e)
|
||||
return null
|
||||
}
|
||||
},
|
||||
|
||||
clearStorage() {
|
||||
localStorage.removeItem(this.persistKey)
|
||||
// snapshot’ı silmiyoruz → kullanıcı isterse elle siler
|
||||
},
|
||||
/* ==========================================================
|
||||
TRANSACTION STATE
|
||||
========================================================== */
|
||||
setTransaction(id) {
|
||||
this.activeTransactionId = id
|
||||
this.saveToStorage()
|
||||
},
|
||||
|
||||
async initTransaction() {
|
||||
if (this.activeTransactionId) {
|
||||
console.log('🔹 Aktif transaction:', this.activeTransactionId)
|
||||
return this.activeTransactionId
|
||||
}
|
||||
try {
|
||||
const dummyId = Math.floor(100000 + Math.random() * 900000)
|
||||
this.activeTransactionId = dummyId
|
||||
this.saveToStorage()
|
||||
console.log('🧩 Dummy Transaction başlatıldı:', dummyId)
|
||||
return dummyId
|
||||
} catch (err) {
|
||||
console.error('❌ Dummy transaction başlatılamadı:', err)
|
||||
return null
|
||||
}
|
||||
},
|
||||
|
||||
clearTransaction() {
|
||||
this.activeTransactionId = null
|
||||
this.saveToStorage()
|
||||
},
|
||||
|
||||
/* Orders’ı otomatik kaydeden watcher (component’ten çağrılır) */
|
||||
watchOrders() {
|
||||
watch(
|
||||
() => this.orders,
|
||||
() => {
|
||||
// her değişimde full storage yaz
|
||||
this.saveToStorage()
|
||||
},
|
||||
{ deep: true }
|
||||
)
|
||||
},
|
||||
/* ==========================================================
|
||||
CRUD — Frontend grid’i ile senkron temel aksiyonlar
|
||||
========================================================== */
|
||||
|
||||
addRow(row) {
|
||||
if (!row) return
|
||||
this.orders.push({ ...row })
|
||||
this.saveToStorage()
|
||||
},
|
||||
|
||||
updateRow(idOrIndex, patch) {
|
||||
if (idOrIndex == null) return
|
||||
let idx = -1
|
||||
if (typeof idOrIndex === 'number') {
|
||||
idx = idOrIndex
|
||||
} else {
|
||||
// id ile bul
|
||||
idx = this.orders.findIndex(r => r.id === idOrIndex)
|
||||
}
|
||||
if (idx >= 0 && this.orders[idx]) {
|
||||
this.orders[idx] = { ...this.orders[idx], ...patch }
|
||||
this.saveToStorage()
|
||||
}
|
||||
},
|
||||
|
||||
removeRow(idOrIndex) {
|
||||
let idx = -1
|
||||
if (typeof idOrIndex === 'number') {
|
||||
idx = idOrIndex
|
||||
} else {
|
||||
idx = this.orders.findIndex(r => r.id === idOrIndex)
|
||||
}
|
||||
if (idx >= 0) {
|
||||
this.orders.splice(idx, 1)
|
||||
this.saveToStorage()
|
||||
}
|
||||
},
|
||||
/* ==========================================================
|
||||
PRICE / LIMIT — Minimum fiyat sorgusu (model + PB)
|
||||
Beklenen response: { price, priceTRY, rateToTRY }
|
||||
========================================================== */
|
||||
async fetchMinPrice(modelCode, pb) {
|
||||
if (!modelCode || !pb) return null
|
||||
try {
|
||||
const baseURL = 'http://localhost:8080'
|
||||
const res = await axios.get(`${baseURL}/api/min-price`, {
|
||||
params: { code: modelCode, pb }
|
||||
})
|
||||
const d = res?.data || null
|
||||
if (!d) return null
|
||||
|
||||
// normalize
|
||||
return {
|
||||
price: Number(d.price ?? d.Price ?? 0),
|
||||
priceTRY: Number(d.priceTRY ?? d.PriceTRY ?? d.price_try ?? 0),
|
||||
rateToTRY: Number(d.rateToTRY ?? d.RateToTRY ?? d.rate ?? 1)
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn('⚠️ fetchMinPrice hata:', e)
|
||||
return null
|
||||
}
|
||||
},
|
||||
/* ==========================================================
|
||||
LOAD (EDIT MODE) — Sunucudan Siparişi Açma
|
||||
========================================================== */
|
||||
async openById(id) {
|
||||
if (!id) return
|
||||
this.loading = true
|
||||
try {
|
||||
const auth = useAuthStore()
|
||||
const res = await axios.get(`http://localhost:8080/api/order/get/${id}`, {
|
||||
headers: { Authorization: `Bearer ${auth.token}` }
|
||||
})
|
||||
const data = res.data || {}
|
||||
|
||||
// 🔹 sql.Null* flatten helper
|
||||
const flat = (v) => {
|
||||
if (v === null || v === undefined) return null
|
||||
if (typeof v === 'object' && 'Valid' in v) {
|
||||
return v.Valid
|
||||
? v.String ?? v.Float64 ?? v.Int32 ?? v.Time ?? null
|
||||
: null
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
🧾 HEADER MAPPING (73 kolon)
|
||||
============================================================ */
|
||||
const h = data.header || {}
|
||||
const header = {
|
||||
// Görünen alanlar
|
||||
OrderHeaderID: flat(h.OrderHeaderID) || '',
|
||||
OrderNumber: flat(h.OrderNumber) || '',
|
||||
OrderDate: flat(h.OrderDate)
|
||||
? String(flat(h.OrderDate)).substring(0, 10)
|
||||
: '',
|
||||
AverageDueDate: flat(h.AverageDueDate)
|
||||
? String(flat(h.AverageDueDate)).substring(0, 10)
|
||||
: '',
|
||||
Description: flat(h.Description) || '',
|
||||
CurrAccCode: flat(h.CurrAccCode) || '',
|
||||
DocCurrencyCode: flat(h.DocCurrencyCode) || 'TRY',
|
||||
|
||||
// Arka plan alanlar (backend roundtrip)
|
||||
OrderTypeCode: flat(h.OrderTypeCode) || 1,
|
||||
ProcessCode: flat(h.ProcessCode) || 'WS',
|
||||
IsCancelOrder: flat(h.IsCancelOrder) || 0,
|
||||
OrderTime: flat(h.OrderTime) || '',
|
||||
DocumentNumber: flat(h.DocumentNumber) || '',
|
||||
PaymentTerm: flat(h.PaymentTerm) || '',
|
||||
InternalDescription: flat(h.InternalDescription) || '',
|
||||
CurrAccTypeCode: flat(h.CurrAccTypeCode) || '',
|
||||
SubCurrAccID: flat(h.SubCurrAccID) || '',
|
||||
ContactID: flat(h.ContactID) || '',
|
||||
ShipmentMethodCode: flat(h.ShipmentMethodCode) || '',
|
||||
ShippingPostalAddressID: flat(h.ShippingPostalAddressID) || '',
|
||||
BillingPostalAddressID: flat(h.BillingPostalAddressID) || '',
|
||||
GuarantorContactID: flat(h.GuarantorContactID) || '',
|
||||
GuarantorContactID2: flat(h.GuarantorContactID2) || '',
|
||||
RoundsmanCode: flat(h.RoundsmanCode) || '',
|
||||
DeliveryCompanyCode: flat(h.DeliveryCompanyCode) || '',
|
||||
TaxTypeCode: flat(h.TaxTypeCode) || '',
|
||||
WithHoldingTaxTypeCode: flat(h.WithHoldingTaxTypeCode) || '',
|
||||
DOVCode: flat(h.DOVCode) || '',
|
||||
TaxExemptionCode: flat(h.TaxExemptionCode) || 0,
|
||||
CompanyCode: flat(h.CompanyCode) || 1,
|
||||
OfficeCode: flat(h.OfficeCode) || '101',
|
||||
StoreTypeCode: flat(h.StoreTypeCode) || 5,
|
||||
StoreCode: flat(h.StoreCode) || 0,
|
||||
POSTerminalID: flat(h.POSTerminalID) || 0,
|
||||
WarehouseCode: flat(h.WarehouseCode) || '1-0-12',
|
||||
ToWarehouseCode: flat(h.ToWarehouseCode) || '',
|
||||
OrdererCompanyCode: flat(h.OrdererCompanyCode) || 1,
|
||||
OrdererOfficeCode: flat(h.OrdererOfficeCode) || '101',
|
||||
OrdererStoreCode: flat(h.OrdererStoreCode) || '',
|
||||
GLTypeCode: flat(h.GLTypeCode) || '',
|
||||
LocalCurrencyCode: flat(h.LocalCurrencyCode) || 'TRY',
|
||||
ExchangeRate: flat(h.ExchangeRate) || 1,
|
||||
DiscountReasonCode: flat(h.DiscountReasonCode) || 0,
|
||||
SurplusOrderQtyToleranceRate: flat(h.SurplusOrderQtyToleranceRate) || 0,
|
||||
IncotermCode1: flat(h.IncotermCode1) || '',
|
||||
IncotermCode2: flat(h.IncotermCode2) || '',
|
||||
PaymentMethodCode: flat(h.PaymentMethodCode) || '',
|
||||
IsInclutedVat: flat(h.IsInclutedVat) || 0,
|
||||
IsCreditSale: flat(h.IsCreditSale) || 1,
|
||||
IsCreditableConfirmed: flat(h.IsCreditableConfirmed) || 1,
|
||||
CreditableConfirmedUser: flat(h.CreditableConfirmedUser) || '',
|
||||
CreditableConfirmedDate: flat(h.CreditableConfirmedDate) || '',
|
||||
ApplicationCode: flat(h.ApplicationCode) || 'Order',
|
||||
ApplicationID: flat(h.ApplicationID) || '',
|
||||
CreatedUserName: flat(h.CreatedUserName) || '',
|
||||
CreatedDate: flat(h.CreatedDate) || '',
|
||||
LastUpdatedUserName: flat(h.LastUpdatedUserName) || '',
|
||||
LastUpdatedDate: flat(h.LastUpdatedDate) || '',
|
||||
IsProposalBased: flat(h.IsProposalBased) || 0
|
||||
}
|
||||
|
||||
this.header = header
|
||||
this.currentOrderId = header.OrderHeaderID || id
|
||||
this.mode = 'edit'
|
||||
|
||||
// 🔹 Cari görünümü (QSelect)
|
||||
this.selectedCustomer = {
|
||||
value: header.CurrAccCode || '',
|
||||
label: `${header.CurrAccCode || ''} - ${flat(h.CurrAccDescription) || ''}`
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
📦 LINES MAPPING (57 kolon)
|
||||
============================================================ */
|
||||
this.orders = (data.lines || []).map((l, idx) => ({
|
||||
// Görünen alanlar
|
||||
id: flat(l.OrderLineID) || `row-${idx + 1}`,
|
||||
model: flat(l.ItemCode),
|
||||
renk: flat(l.ColorCode),
|
||||
renk2: flat(l.ItemDim2Code),
|
||||
fiyat: Number(flat(l.Price) || 0),
|
||||
pb: flat(l.DocCurrencyCode) || flat(l.PriceCurrencyCode) || 'USD',
|
||||
adet: Number(flat(l.Qty1) || 0),
|
||||
tutar: Number(flat(l.Price) || 0) * Number(flat(l.Qty1) || 0),
|
||||
aciklama: flat(l.LineDescription) || '',
|
||||
terminTarihi: flat(l.DeliveryDate)
|
||||
? String(flat(l.DeliveryDate)).substring(0, 10)
|
||||
: '',
|
||||
urunAnaGrubu: flat(l.ProductGroup) || '',
|
||||
urunAltGrubu: flat(l.ProductSubGroup) || '',
|
||||
grpKey: l.grpKey || 'tak',
|
||||
bedenMap: l.BedenMap || {},
|
||||
|
||||
// Backend roundtrip alanları
|
||||
SortOrder: flat(l.SortOrder) || 0,
|
||||
ItemTypeCode: flat(l.ItemTypeCode) || 1,
|
||||
ItemDim1Code: flat(l.ItemDim1Code) || '',
|
||||
ItemDim3Code: flat(l.ItemDim3Code) || '',
|
||||
Qty2: flat(l.Qty2) || 0,
|
||||
CancelQty1: flat(l.CancelQty1) || 0,
|
||||
CancelQty2: flat(l.CancelQty2) || 0,
|
||||
CancelDate: flat(l.CancelDate) || null,
|
||||
OrderCancelReasonCode: flat(l.OrderCancelReasonCode) || '',
|
||||
ClosedDate: flat(l.ClosedDate) || null,
|
||||
IsClosed: flat(l.IsClosed) || false,
|
||||
VatRate: flat(l.VatRate) || 10,
|
||||
PCTRate: flat(l.PCTRate) || 0,
|
||||
PriceCurrencyCode: flat(l.PriceCurrencyCode) || 'TRY',
|
||||
PriceExchangeRate: flat(l.PriceExchangeRate) || header.ExchangeRate || 1,
|
||||
CreatedUserName: flat(l.CreatedUserName) || '',
|
||||
CreatedDate: flat(l.CreatedDate) || '',
|
||||
LastUpdatedUserName: flat(l.LastUpdatedUserName) || '',
|
||||
LastUpdatedDate: flat(l.LastUpdatedDate) || '',
|
||||
SurplusOrderQtyToleranceRate:
|
||||
flat(l.SurplusOrderQtyToleranceRate) || 0
|
||||
}))
|
||||
|
||||
/* ============================================================
|
||||
💾 LOCAL STORAGE
|
||||
============================================================ */
|
||||
localStorage.setItem(
|
||||
`bssapp:order:last:${id}`,
|
||||
JSON.stringify({ header, lines: this.orders })
|
||||
)
|
||||
|
||||
console.log(`📦 Sipariş (${id}) yüklendi • rows:${this.orders.length}`)
|
||||
} catch (err) {
|
||||
console.error('❌ openById hatası:', err)
|
||||
this.error = err.message
|
||||
} finally {
|
||||
this.loading = false
|
||||
}
|
||||
}
|
||||
,
|
||||
/* ==========================================================
|
||||
NEW TEMPLATE — Yeni sipariş başlatma
|
||||
========================================================== */
|
||||
newOrderTemplate() {
|
||||
const today = dayjs().format('YYYY-MM-DD')
|
||||
const due = dayjs().add(30, 'day').format('YYYY-MM-DD')
|
||||
|
||||
this.header = {
|
||||
OrderHeaderID: '',
|
||||
OrderTypeCode: 1,
|
||||
ProcessCode: 'WS',
|
||||
OrderNumber: '',
|
||||
OrderDate: today,
|
||||
AverageDueDate: due,
|
||||
Description: '',
|
||||
CurrAccCode: '',
|
||||
CurrAccDescription: '',
|
||||
DocCurrencyCode: 'USD',
|
||||
LocalCurrencyCode: 'TRY',
|
||||
ExchangeRate: 1,
|
||||
CompanyCode: 1,
|
||||
OfficeCode: '101',
|
||||
StoreTypeCode: 5,
|
||||
WarehouseCode: '1-0-12',
|
||||
IsCreditSale: true,
|
||||
CreatedUserName: '',
|
||||
CreatedDate: today,
|
||||
LastUpdatedUserName: '',
|
||||
LastUpdatedDate: today
|
||||
}
|
||||
|
||||
this.orders = []
|
||||
this.currentOrderId = null
|
||||
this.activeTransactionId = null
|
||||
this.selectedCustomer = null
|
||||
this.mode = 'new'
|
||||
this.error = null
|
||||
|
||||
// Temiz bir başlangıcı storage’a yaz
|
||||
this.saveToStorage()
|
||||
console.log('🧾 Yeni sipariş template yüklendi.')
|
||||
},
|
||||
/* ==========================================================
|
||||
SUBMIT — Create/Update (SQL tablo INSERT/UPDATE)
|
||||
➜ Kayıt sonrası: transaction kapanır AMA snapshot tutulur.
|
||||
========================================================== */
|
||||
async submitAll() {
|
||||
const auth = useAuthStore()
|
||||
const baseURL = 'http://localhost:8080'
|
||||
|
||||
const toNullable = (v, type = 'string') => {
|
||||
if (v === null || v === undefined || v === '') {
|
||||
if (type === 'number') return { Float64: 0, Valid: false }
|
||||
if (type === 'time') return { Time: null, Valid: false }
|
||||
return { String: '', Valid: false }
|
||||
}
|
||||
if (type === 'number') return { Float64: Number(v), Valid: true }
|
||||
if (type === 'time') return { Time: v, Valid: true }
|
||||
return { String: String(v), Valid: true }
|
||||
}
|
||||
|
||||
try {
|
||||
this.loading = true
|
||||
|
||||
// Header payload (backend’in beklediği Null* formatıyla)
|
||||
const h = this.header || {}
|
||||
const headerPayload = {
|
||||
OrderHeaderID: h.OrderHeaderID || this.currentOrderId || '',
|
||||
OrderTypeCode: toNullable(1, 'number'),
|
||||
ProcessCode: toNullable('WS'),
|
||||
OrderNumber: toNullable(h.OrderNumber),
|
||||
OrderDate: toNullable(h.OrderDate || dayjs().format('YYYY-MM-DD'), 'time'),
|
||||
AverageDueDate: toNullable(h.AverageDueDate || dayjs().add(30, 'day').format('YYYY-MM-DD'), 'time'),
|
||||
Description: toNullable(h.Description || ''),
|
||||
CurrAccCode: toNullable(h.CurrAccCode || this.selectedCustomer?.value || ''),
|
||||
CurrAccDescription: toNullable(h.CurrAccDescription || this.selectedCustomer?.label || ''),
|
||||
DocCurrencyCode: toNullable(h.DocCurrencyCode || 'USD'),
|
||||
LocalCurrencyCode: toNullable(h.LocalCurrencyCode || 'TRY'),
|
||||
ExchangeRate: toNullable(h.ExchangeRate || 1, 'number'),
|
||||
CompanyCode: toNullable(1, 'number'),
|
||||
OfficeCode: toNullable('101'),
|
||||
StoreTypeCode: toNullable(5, 'number'),
|
||||
WarehouseCode: toNullable(h.WarehouseCode || '1-0-12'),
|
||||
IsCreditSale: true,
|
||||
CreatedUserName: toNullable(auth.user?.Username || 'admin'),
|
||||
CreatedDate: toNullable(h.CreatedDate || dayjs().format('YYYY-MM-DD'), 'time'),
|
||||
LastUpdatedUserName: toNullable(auth.user?.Username || 'admin'),
|
||||
LastUpdatedDate: toNullable(dayjs().format('YYYY-MM-DD HH:mm:ss'), 'time')
|
||||
}
|
||||
|
||||
// Lines payload
|
||||
const linesPayload = this.orders.map((l, idx) => ({
|
||||
OrderLineID: l.id || '',
|
||||
SortOrder: idx + 1,
|
||||
ItemTypeCode: toNullable(1, 'number'),
|
||||
ItemCode: toNullable(l.model),
|
||||
ColorCode: toNullable(l.renk),
|
||||
ItemDim1Code: toNullable(Object.keys(l.bedenMap?.[l.grpKey] || {})[0] || ''),
|
||||
ItemDim2Code: toNullable(l.renk2),
|
||||
Qty1: toNullable(Number(l.adet || 0), 'number'),
|
||||
Price: toNullable(Number(l.fiyat || 0), 'number'),
|
||||
DocCurrencyCode: toNullable(l.pb || 'USD'),
|
||||
VatRate: toNullable(10, 'number'),
|
||||
PCTRate: toNullable(0, 'number'),
|
||||
DeliveryDate: toNullable(l.terminTarihi || null, 'time'),
|
||||
LineDescription: toNullable(l.aciklama || ''),
|
||||
IsClosed: false,
|
||||
CreatedUserName: toNullable(auth.user?.Username || 'admin'),
|
||||
CreatedDate: toNullable(dayjs().format('YYYY-MM-DD HH:mm:ss'), 'time'),
|
||||
LastUpdatedUserName: toNullable(auth.user?.Username || 'admin'),
|
||||
LastUpdatedDate: toNullable(dayjs().format('YYYY-MM-DD HH:mm:ss'), 'time')
|
||||
}))
|
||||
|
||||
// Final payload
|
||||
const payload = {
|
||||
header: headerPayload,
|
||||
lines: linesPayload,
|
||||
user: auth.user?.Username || 'admin'
|
||||
}
|
||||
|
||||
let res
|
||||
if (this.currentOrderId) {
|
||||
// UPDATE
|
||||
res = await axios.post(`${baseURL}/api/order/update`, payload, {
|
||||
headers: { Authorization: `Bearer ${auth.token}` }
|
||||
})
|
||||
console.log('✅ UPDATE ok:', res.data)
|
||||
} else {
|
||||
// CREATE
|
||||
res = await axios.post(`${baseURL}/api/order/create`, payload, {
|
||||
headers: { Authorization: `Bearer ${auth.token}` }
|
||||
})
|
||||
console.log('✅ CREATE ok:', res.data)
|
||||
if (res.data?.orderID) {
|
||||
this.currentOrderId = res.data.orderID
|
||||
this.header.OrderHeaderID = res.data.orderID
|
||||
this.mode = 'edit'
|
||||
}
|
||||
}
|
||||
|
||||
// 🟩 Kayıt sonrası: snapshot’ı al ve storage’a da yaz
|
||||
this.saveSnapshot('post-submit')
|
||||
this.saveToStorage()
|
||||
|
||||
// 🧹 Transaction’ı kapat (UI temizliği ayrı fonksiyonda)
|
||||
this.clearTransaction()
|
||||
this.afterSubmit({ keepLocalStorage: true }) // 👈 önemli
|
||||
|
||||
} catch (err) {
|
||||
console.error('❌ submitAll hatası:', err)
|
||||
this.error = err.message
|
||||
throw err
|
||||
} finally {
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
/* ==========================================================
|
||||
AFTER SUBMIT — UI temizliği (snapshot kalır!)
|
||||
keepLocalStorage=true → persistKey SİLİNMEZ
|
||||
========================================================== */
|
||||
afterSubmit(opts = { keepLocalStorage: true }) {
|
||||
try {
|
||||
// Snapshot zaten kaydedildi; istenirse persistKey’i bırak
|
||||
if (!opts?.keepLocalStorage) {
|
||||
localStorage.removeItem(this.persistKey)
|
||||
} else {
|
||||
// son hal zaten saveToStorage ile yazıldı — dokunma
|
||||
}
|
||||
|
||||
// UI temizliği (hafızada formu boşaltalım)
|
||||
// Ama edit’e dönmek istersen, snapshot/loadFromStorage ile geri getirirsin.
|
||||
this.orders = []
|
||||
// header’ı hafızadan temizliyoruz ama snapshot yerinde.
|
||||
this.header = {}
|
||||
this.selectedCustomer = null
|
||||
this.editingIndex = -1
|
||||
// currentOrderId’yi istersen koruyabilirsin; biz editte geri yüklüyoruz.
|
||||
// burada null’lıyoruz:
|
||||
this.currentOrderId = null
|
||||
this.mode = 'new'
|
||||
this.loading = false
|
||||
this.error = null
|
||||
|
||||
console.log('🧹 afterSubmit: UI temizlendi, snapshot storage’da.')
|
||||
} catch (err) {
|
||||
console.warn('⚠️ afterSubmit temizleme hatası:', err)
|
||||
}
|
||||
},
|
||||
|
||||
/* ==========================================================
|
||||
MANUAL UPDATE — mevcut header/lines yapılarına göre
|
||||
(İsteğe bağlı kullanılır)
|
||||
========================================================== */
|
||||
async updateOrder() {
|
||||
if (!this.currentOrderId) {
|
||||
console.warn('⚠️ currentOrderId yok, update yapılamaz.')
|
||||
return
|
||||
}
|
||||
try {
|
||||
const auth = useAuthStore()
|
||||
const payload = {
|
||||
header: this.header,
|
||||
lines: this.orders,
|
||||
username: auth.user?.Username || 'admin'
|
||||
}
|
||||
const res = await axios.post(
|
||||
'http://localhost:8080/api/order/update',
|
||||
payload,
|
||||
{ headers: { Authorization: `Bearer ${auth.token}` } }
|
||||
)
|
||||
console.log('✅ Güncelleme tamamlandı:', res.data)
|
||||
|
||||
// kayıt sonrası snapshot + persist
|
||||
this.saveSnapshot('manual-update')
|
||||
this.saveToStorage()
|
||||
} catch (err) {
|
||||
console.error('❌ updateOrder hatası:', err)
|
||||
this.error = err.message
|
||||
}
|
||||
}
|
||||
} // actions
|
||||
}) // defineStore
|
||||
// (opsiyonel) Bu referanslara component tarafından erişmek istersen:
|
||||
export const sharedOrderEntryRefs = {
|
||||
stockMap,
|
||||
bedenStock,
|
||||
sizeCache
|
||||
}
|
||||
Reference in New Issue
Block a user