128 lines
3.1 KiB
JavaScript
128 lines
3.1 KiB
JavaScript
import { defineStore } from 'pinia'
|
||
import api from 'src/services/api'
|
||
|
||
export const useOrderBulkCloseStore = defineStore('orderBulkClose', {
|
||
state: () => ({
|
||
orders: [],
|
||
selectedOrderNumbers: [],
|
||
search: '',
|
||
loading: false,
|
||
closing: false,
|
||
error: null
|
||
}),
|
||
|
||
getters: {
|
||
selectedCount (state) {
|
||
return state.selectedOrderNumbers.length
|
||
},
|
||
|
||
totalCount (state) {
|
||
return state.orders.length
|
||
}
|
||
},
|
||
|
||
actions: {
|
||
isSelected (orderNumber) {
|
||
return this.selectedOrderNumbers.includes(orderNumber)
|
||
},
|
||
|
||
setSelected (orderNumber, selected) {
|
||
if (!orderNumber) return
|
||
|
||
if (selected) {
|
||
if (!this.selectedOrderNumbers.includes(orderNumber)) {
|
||
this.selectedOrderNumbers.push(orderNumber)
|
||
}
|
||
return
|
||
}
|
||
|
||
this.selectedOrderNumbers = this.selectedOrderNumbers.filter(
|
||
(n) => n !== orderNumber
|
||
)
|
||
},
|
||
|
||
toggleSelectMany (orderNumbers, selected) {
|
||
const clean = Array.from(
|
||
new Set((orderNumbers || []).filter(Boolean))
|
||
)
|
||
|
||
if (selected) {
|
||
const current = new Set(this.selectedOrderNumbers)
|
||
clean.forEach((n) => current.add(n))
|
||
this.selectedOrderNumbers = Array.from(current)
|
||
return
|
||
}
|
||
|
||
const block = new Set(clean)
|
||
this.selectedOrderNumbers = this.selectedOrderNumbers.filter(
|
||
(n) => !block.has(n)
|
||
)
|
||
},
|
||
|
||
clearSelection () {
|
||
this.selectedOrderNumbers = []
|
||
},
|
||
|
||
async fetchOrders () {
|
||
this.loading = true
|
||
this.error = null
|
||
|
||
try {
|
||
const search = String(this.search || '').trim()
|
||
const params = {}
|
||
if (search) params.search = search
|
||
|
||
const res = await api.get('/orders/close-ready', { params })
|
||
this.orders = Array.isArray(res?.data) ? res.data : []
|
||
|
||
// new list disinda kalan secimleri temizle
|
||
const available = new Set(this.orders.map((o) => o.OrderNumber))
|
||
this.selectedOrderNumbers = this.selectedOrderNumbers.filter(
|
||
(n) => available.has(n)
|
||
)
|
||
} catch (err) {
|
||
this.orders = []
|
||
this.error =
|
||
err?.response?.data ||
|
||
err?.message ||
|
||
'Siparişler alınamadı'
|
||
} finally {
|
||
this.loading = false
|
||
}
|
||
},
|
||
|
||
async closeSelectedOrders () {
|
||
if (!this.selectedOrderNumbers.length) {
|
||
return { affected: 0 }
|
||
}
|
||
|
||
this.closing = true
|
||
this.error = null
|
||
|
||
try {
|
||
const payload = {
|
||
order_numbers: this.selectedOrderNumbers
|
||
}
|
||
|
||
const res = await api.post('/orders/bulk-close', payload)
|
||
const affected = Number(res?.data?.affected || 0)
|
||
|
||
// local optimizasyon: secilenleri listeden dus
|
||
const selected = new Set(this.selectedOrderNumbers)
|
||
this.orders = this.orders.filter((o) => !selected.has(o.OrderNumber))
|
||
this.selectedOrderNumbers = []
|
||
|
||
return { affected }
|
||
} catch (err) {
|
||
this.error =
|
||
err?.response?.data ||
|
||
err?.message ||
|
||
'Toplu kapatma başarısız'
|
||
throw err
|
||
} finally {
|
||
this.closing = false
|
||
}
|
||
}
|
||
}
|
||
})
|