263 lines
8.1 KiB
JavaScript
263 lines
8.1 KiB
JavaScript
import { defineStore } from 'pinia'
|
|
import api from 'src/services/api'
|
|
|
|
export const useCustomerBalanceListStore = defineStore('customerBalanceList', {
|
|
state: () => ({
|
|
filters: {
|
|
selectedDate: new Date().toISOString().slice(0, 10),
|
|
cariSearch: '',
|
|
appliedCariSearch: '',
|
|
cariIlkGrup: [],
|
|
piyasa: [],
|
|
temsilci: [],
|
|
riskDurumu: [],
|
|
islemTipi: [],
|
|
ulke: []
|
|
},
|
|
rows: [],
|
|
loading: false,
|
|
error: null,
|
|
hasFetched: false,
|
|
defaultsInitialized: false
|
|
}),
|
|
|
|
getters: {
|
|
cariIlkGrupOptions: (state) => uniqueOptions(state.rows, 'cari_ilk_grup'),
|
|
piyasaOptions: (state) => uniqueOptions(state.rows, 'piyasa'),
|
|
temsilciOptions: (state) => uniqueOptions(state.rows, 'temsilci'),
|
|
riskDurumuOptions: (state) => uniqueOptions(state.rows, 'ozellik03'),
|
|
ulkeOptions: (state) => uniqueOptions(state.rows, 'ozellik05'),
|
|
|
|
filteredRows: (state) => {
|
|
return state.rows.filter((row) => {
|
|
const cariIlkGrupOk =
|
|
!state.filters.cariIlkGrup.length ||
|
|
state.filters.cariIlkGrup.includes(row.cari_ilk_grup)
|
|
|
|
const piyasaOk =
|
|
!state.filters.piyasa.length ||
|
|
state.filters.piyasa.includes(row.piyasa)
|
|
|
|
const temsilciOk =
|
|
!state.filters.temsilci.length ||
|
|
state.filters.temsilci.includes(row.temsilci)
|
|
|
|
const riskDurumuOk =
|
|
!state.filters.riskDurumu.length ||
|
|
state.filters.riskDurumu.includes(row.ozellik03)
|
|
|
|
const cariText = normalizeText([
|
|
row.ana_cari_kodu || '',
|
|
row.ana_cari_adi || '',
|
|
row.cari_kodu || '',
|
|
row.cari_detay || ''
|
|
].join(' '))
|
|
const cariSearchNeedle = normalizeText(state.filters.appliedCariSearch || '')
|
|
const cariSearchOk =
|
|
!cariSearchNeedle ||
|
|
cariText.includes(cariSearchNeedle)
|
|
|
|
const ulkeOk =
|
|
!state.filters.ulke.length ||
|
|
state.filters.ulke.includes(row.ozellik05)
|
|
|
|
const islemTipiOk =
|
|
!state.filters.islemTipi.length ||
|
|
state.filters.islemTipi.some((t) => {
|
|
const bak12 = Number(row.bakiye_1_2) || 0
|
|
const bak13 = Number(row.bakiye_1_3) || 0
|
|
const usd12 = Number(row.usd_bakiye_1_2) || 0
|
|
const try12 = Number(row.tl_bakiye_1_2) || 0
|
|
const usd13 = Number(row.usd_bakiye_1_3) || 0
|
|
const try13 = Number(row.tl_bakiye_1_3) || 0
|
|
|
|
if (t === 'prbr_1_2') return bak12 !== 0
|
|
if (t === 'prbr_1_3') return bak13 !== 0
|
|
if (t === 'usd_1_2') return usd12 !== 0
|
|
if (t === 'try_1_2') return try12 !== 0
|
|
if (t === 'usd_1_3') return usd13 !== 0
|
|
if (t === 'try_1_3') return try13 !== 0
|
|
return false
|
|
})
|
|
|
|
return cariIlkGrupOk && piyasaOk && temsilciOk && riskDurumuOk && cariSearchOk && ulkeOk && islemTipiOk
|
|
})
|
|
},
|
|
|
|
summaryRows () {
|
|
const grouped = new Map()
|
|
|
|
for (const row of this.filteredRows) {
|
|
const key = `${row.ana_cari_kodu || ''}||${row.ana_cari_adi || ''}`
|
|
const current = grouped.get(key) || {
|
|
group_key: key,
|
|
ana_cari_kodu: row.ana_cari_kodu || '',
|
|
ana_cari_adi: row.ana_cari_adi || '',
|
|
piyasa: '',
|
|
piyasa_set: new Set(),
|
|
temsilci: '',
|
|
temsilci_set: new Set(),
|
|
risk_durumu: '',
|
|
risk_set: new Set(),
|
|
bakiye_1_2_map: {},
|
|
bakiye_1_3_map: {},
|
|
usd_bakiye_1_2: 0,
|
|
tl_bakiye_1_2: 0,
|
|
usd_bakiye_1_3: 0,
|
|
tl_bakiye_1_3: 0,
|
|
kalan_fatura_ortalama_vade_tarihi: ''
|
|
}
|
|
|
|
current.usd_bakiye_1_2 += Number(row.usd_bakiye_1_2) || 0
|
|
current.tl_bakiye_1_2 += Number(row.tl_bakiye_1_2) || 0
|
|
current.usd_bakiye_1_3 += Number(row.usd_bakiye_1_3) || 0
|
|
current.tl_bakiye_1_3 += Number(row.tl_bakiye_1_3) || 0
|
|
|
|
const curr = String(row.cari_doviz || '').trim().toUpperCase() || 'N/A'
|
|
current.bakiye_1_2_map[curr] =
|
|
(Number(current.bakiye_1_2_map[curr]) || 0) + (Number(row.bakiye_1_2) || 0)
|
|
current.bakiye_1_3_map[curr] =
|
|
(Number(current.bakiye_1_3_map[curr]) || 0) + (Number(row.bakiye_1_3) || 0)
|
|
|
|
const piyasa = String(row.piyasa || '').trim()
|
|
if (piyasa) current.piyasa_set.add(piyasa)
|
|
|
|
const temsilci = String(row.temsilci || '').trim()
|
|
if (temsilci) current.temsilci_set.add(temsilci)
|
|
|
|
if (
|
|
!current.kalan_fatura_ortalama_vade_tarihi &&
|
|
row.kalan_fatura_ortalama_vade_tarihi
|
|
) {
|
|
current.kalan_fatura_ortalama_vade_tarihi = row.kalan_fatura_ortalama_vade_tarihi
|
|
}
|
|
|
|
const risk = String(row.ozellik03 || '').trim()
|
|
if (risk) current.risk_set.add(risk)
|
|
|
|
const riskValues = Array.from(current.risk_set)
|
|
current.risk_durumu =
|
|
riskValues.length <= 1
|
|
? (riskValues[0] || '-')
|
|
: riskValues.join(', ')
|
|
|
|
const piyasaValues = Array.from(current.piyasa_set)
|
|
current.piyasa =
|
|
piyasaValues.length <= 1
|
|
? (piyasaValues[0] || '-')
|
|
: piyasaValues.join(', ')
|
|
|
|
const temsilciValues = Array.from(current.temsilci_set)
|
|
current.temsilci =
|
|
temsilciValues.length <= 1
|
|
? (temsilciValues[0] || '-')
|
|
: temsilciValues.join(', ')
|
|
|
|
grouped.set(key, current)
|
|
}
|
|
|
|
return Array.from(grouped.values()).map((r) => {
|
|
const { risk_set, piyasa_set, temsilci_set, ...rest } = r
|
|
return rest
|
|
})
|
|
}
|
|
},
|
|
|
|
actions: {
|
|
async fetchCustomerBalances () {
|
|
this.loading = true
|
|
this.error = null
|
|
|
|
try {
|
|
const { data } = await api.get('/finance/customer-balances', {
|
|
params: {
|
|
selected_date: this.filters.selectedDate,
|
|
cari_search: String(this.filters.appliedCariSearch || this.filters.cariSearch || '').trim()
|
|
}
|
|
})
|
|
this.rows = Array.isArray(data) ? data : []
|
|
if (!this.defaultsInitialized) {
|
|
this.applyInitialFilterDefaults()
|
|
this.defaultsInitialized = true
|
|
}
|
|
this.hasFetched = true
|
|
} catch (err) {
|
|
this.rows = []
|
|
this.hasFetched = false
|
|
this.error =
|
|
err?.response?.data?.message ||
|
|
err?.message ||
|
|
'Cari bakiye listesi getirilemedi.'
|
|
} finally {
|
|
this.loading = false
|
|
}
|
|
},
|
|
|
|
getDetailsByGroup (groupKey) {
|
|
return this.filteredRows.filter(r =>
|
|
`${r.ana_cari_kodu || ''}||${r.ana_cari_adi || ''}` === groupKey
|
|
)
|
|
},
|
|
|
|
resetFilters () {
|
|
this.filters.cariSearch = ''
|
|
this.filters.appliedCariSearch = ''
|
|
this.filters.cariIlkGrup = []
|
|
this.filters.piyasa = []
|
|
this.filters.temsilci = []
|
|
this.filters.riskDurumu = []
|
|
this.filters.islemTipi = []
|
|
this.filters.ulke = []
|
|
this.defaultsInitialized = false
|
|
},
|
|
|
|
applyCariSearch () {
|
|
this.filters.appliedCariSearch = String(this.filters.cariSearch || '').trim()
|
|
},
|
|
|
|
selectAll (field, options) {
|
|
this.filters[field] = options.map(o => o.value)
|
|
},
|
|
|
|
clearAll (field) {
|
|
this.filters[field] = []
|
|
},
|
|
|
|
applyInitialFilterDefaults () {
|
|
const transferKey = normalizeText('transfer')
|
|
this.filters.cariIlkGrup = this.cariIlkGrupOptions
|
|
.map(o => o.value)
|
|
.filter(v => normalizeText(v) !== transferKey)
|
|
|
|
const excludedRisk = new Set([
|
|
normalizeText('avukat'),
|
|
normalizeText('orta risk'),
|
|
normalizeText('yuksek risk')
|
|
])
|
|
this.filters.riskDurumu = this.riskDurumuOptions
|
|
.map(o => o.value)
|
|
.filter(v => !excludedRisk.has(normalizeText(v)))
|
|
}
|
|
}
|
|
})
|
|
|
|
function uniqueOptions (rows, field) {
|
|
const set = new Set()
|
|
for (const r of rows) {
|
|
const v = String(r[field] || '').trim()
|
|
if (v) set.add(v)
|
|
}
|
|
|
|
return Array.from(set)
|
|
.sort((a, b) => a.localeCompare(b, 'tr'))
|
|
.map(v => ({ label: v, value: v }))
|
|
}
|
|
|
|
function normalizeText (str) {
|
|
return String(str || '')
|
|
.toLocaleLowerCase('tr-TR')
|
|
.normalize('NFD')
|
|
.replace(/[\u0300-\u036f]/g, '')
|
|
.trim()
|
|
}
|