164 lines
4.2 KiB
JavaScript
164 lines
4.2 KiB
JavaScript
// src/stores/statementheaderStore.js
|
||
import { defineStore } from 'pinia'
|
||
import api from 'src/services/api'
|
||
import qs from 'qs'
|
||
import dayjs from 'src/boot/dayjs'
|
||
|
||
export const useStatementheaderStore = defineStore('statementheader', {
|
||
state: () => ({
|
||
headers: [], // Ana tablo verileri
|
||
details: {}, // Alt tablolar (belge bazlı)
|
||
loading: false, // Yükleme durumu
|
||
groupOpen: {} // Para birimi bazlı aç/kapa durumu
|
||
}),
|
||
|
||
getters: {
|
||
// 🔹 Benzersiz para birimleri listesi
|
||
currencies(state) {
|
||
const set = new Set()
|
||
for (const r of state.headers) {
|
||
set.add(r.para_birimi || '—')
|
||
}
|
||
return Array.from(set).sort()
|
||
},
|
||
|
||
// 🔹 Her para birimi için toplam borç / alacak / bakiye
|
||
totalsByCurrency(state) {
|
||
const out = {}
|
||
|
||
for (const r of state.headers) {
|
||
const k = r.para_birimi || '—'
|
||
if (!out[k]) {
|
||
out[k] = { borc: 0, alacak: 0, bakiye: 0, count: 0 }
|
||
}
|
||
|
||
out[k].borc += Number(r.borc) || 0
|
||
out[k].alacak += Number(r.alacak) || 0
|
||
out[k].bakiye += Number(r.bakiye) || 0
|
||
out[k].count += 1
|
||
}
|
||
|
||
return out
|
||
},
|
||
|
||
// 🔹 QTable için satırlar (group + data)
|
||
groupedRows: (state) => {
|
||
const grouped = {}
|
||
|
||
for (const row of state.headers) {
|
||
const k = row.para_birimi || '—'
|
||
if (!grouped[k]) grouped[k] = []
|
||
grouped[k].push(row)
|
||
}
|
||
|
||
const output = []
|
||
|
||
for (const [currency, rows] of Object.entries(grouped)) {
|
||
if (!rows.length) continue
|
||
|
||
// 📅 Tarihe göre sırala
|
||
const sorted = [...rows].sort(
|
||
(a, b) => new Date(a.belge_tarihi) - new Date(b.belge_tarihi)
|
||
)
|
||
|
||
const lastRow = sorted.at(-1)
|
||
const lastBalance =
|
||
lastRow && lastRow.bakiye != null
|
||
? Number(lastRow.bakiye)
|
||
: 0
|
||
|
||
// 🔹 Grup satırı
|
||
output.push({
|
||
_type: 'group',
|
||
para_birimi: currency,
|
||
sonBakiye: lastBalance
|
||
})
|
||
|
||
// 🔹 Alt satırlar
|
||
if (state.groupOpen[currency] !== false) {
|
||
sorted.forEach(r => {
|
||
output.push({ ...r, _type: 'data' })
|
||
})
|
||
}
|
||
}
|
||
|
||
return output
|
||
}
|
||
},
|
||
|
||
actions: {
|
||
/* ==========================================================
|
||
🔄 ANA STATEMENT LİSTESİ
|
||
========================================================== */
|
||
async loadStatements(params = {}) {
|
||
this.loading = true
|
||
|
||
try {
|
||
const { data } = await api.get(
|
||
'/statements',
|
||
{
|
||
params,
|
||
paramsSerializer: p =>
|
||
qs.stringify(p, { arrayFormat: 'repeat' })
|
||
}
|
||
)
|
||
|
||
this.headers = Array.isArray(data) ? data : []
|
||
|
||
|
||
// 🔹 Yeni gelen para birimleri default açık
|
||
for (const k of this.currencies) {
|
||
if (!(k in this.groupOpen)) {
|
||
this.groupOpen[k] = true
|
||
}
|
||
}
|
||
} catch (err) {
|
||
console.error('❌ Statements yüklenemedi:', err)
|
||
this.headers = []
|
||
} finally {
|
||
this.loading = false
|
||
}
|
||
},
|
||
|
||
/* ==========================================================
|
||
📄 BELGE DETAYLARI
|
||
========================================================== */
|
||
async loadDetails(belgeNo) {
|
||
if (!belgeNo || this.details[belgeNo]) return
|
||
|
||
try {
|
||
const { data } = await api.get(
|
||
`/statements/${belgeNo}/details`
|
||
)
|
||
|
||
this.details[belgeNo] = Array.isArray(data) ? data : []
|
||
|
||
|
||
} catch (err) {
|
||
console.error('❌ Details yüklenemedi:', err)
|
||
this.details[belgeNo] = []
|
||
}
|
||
},
|
||
|
||
/* ==========================================================
|
||
🔘 GRUP AÇ / KAPA
|
||
========================================================== */
|
||
toggleGroup(currency) {
|
||
const key = currency || '—'
|
||
this.groupOpen[key] = !this.groupOpen[key]
|
||
},
|
||
|
||
openAllGroups() {
|
||
for (const k of this.currencies) {
|
||
this.groupOpen[k] = true
|
||
}
|
||
},
|
||
|
||
closeAllGroups() {
|
||
for (const k of this.currencies) {
|
||
this.groupOpen[k] = false
|
||
}
|
||
}
|
||
}
|
||
})
|