maliyet dağıtımı

This commit is contained in:
ctengiz
2024-04-25 12:14:48 +03:00
parent 06f834e8c9
commit b9ed81beb7
2 changed files with 335 additions and 46 deletions

View File

@@ -107,6 +107,7 @@ const tmpl = reactive({
alanlar: [],
kriterler: {},
dagitim: {}
})
onMounted(() => {
@@ -226,12 +227,54 @@ const doProcess = function () {
}
}
const hesapKodBul = function (row, fieldName) {
// Hesap kodunu bulalım
let hesapKod = ''
Object.keys(tmpl.kriterler).forEach(k => {
const kriter = tmpl.kriterler[k]
let kriterVal = ''
if (kriter.colNro >= 0) {
// sabit kriter alanı
kriterVal = row[kriter.colNro]
} else {
const tmpValues = []
tmpl.kriterler[k].combinedFieldsNro.forEach(cf => {
let tmpKriterVal = row[cf]
if ((tmpKriterVal === null) || (tmpKriterVal === undefined)) {
tmpKriterVal = ''
}
tmpValues.push(tmpKriterVal)
})
kriterVal = tmpValues.join(' ').trim()
}
const map = kriter.mappings[kriterVal]
if ((map !== undefined) && (map !== null)) {
const tmpHesapKod = map[fieldName]
if (tmpHesapKod) {
hesapKod = tmpHesapKod
}
} else {
console.log(kriter)
}
})
return hesapKod
}
const processXLS = function () {
const sheet = workbook.Sheets[ld.bordroSheet]
const rawData = utils.sheet_to_json(sheet, { header: 1 })
const bordro = []
const dagitimKeys = Object.keys(tmpl.dagitim)
rawData.forEach((row, ndx) => {
if (ndx <= tmpl.baslikSatiri - 1 + tmpl.baslikSatirAdedi) {
@@ -261,48 +304,38 @@ const processXLS = function () {
// veri alanlarını verelim
tmpl.alanlar.filter(a => {return a.colType === 'veri'}).forEach(veri => {
// Hesap kodunu bulalım
let hesapKod = ''
Object.keys(tmpl.kriterler).forEach(k => {
const kriter = tmpl.kriterler[k]
let kriterVal = ''
let dagitimYapildi = false
if (dagitimKeys.length > 0) {
dagitimKeys.forEach(bazAlan => {
const degerler = Object.keys(tmpl.dagitim[bazAlan].kural)
degerler.forEach(deger => {
if (deger === row[tmpl.dagitim[bazAlan].bazAlanColNro]) {
dagitimYapildi = true
tmpl.dagitim[bazAlan].kural[deger].forEach(oran => {
//row'ın bir kopyasını oluşturalım çünkü hesap kodunu bu yeni row'a göre bulacağız
const tmpRow = [...row]
tmpRow[tmpl.dagitim[bazAlan].hedefAlanColNro] = oran.deger
bordroRow['Hesap'] = hesapKodBul(tmpRow, veri.fieldName)
bordroRow['Masraf Açıklama'] = veri.fieldName
bordroRow['Tutar'] = row[veri.colNro] * (oran.oran / 100)
bordroRow['B/A'] = veri.ba
if (kriter.colNro >= 0) {
// sabit kriter alanı
kriterVal = row[kriter.colNro]
} else {
const tmpValues = []
tmpl.kriterler[k].combinedFieldsNro.forEach(cf => {
let tmpKriterVal = row[cf]
if ((tmpKriterVal === null) || (tmpKriterVal === undefined)) {
tmpKriterVal = ''
}
tmpValues.push(tmpKriterVal)
bordro.push({ ...bordroRow })
})
kriterVal = tmpValues.join(' ').trim()
}
const map = kriter.mappings[kriterVal]
if ((map !== undefined) && (map !== null)) {
const tmpHesapKod = map[veri.fieldName]
if (tmpHesapKod) {
hesapKod = tmpHesapKod
}
} else {
console.log(kriter)
}
})
})
}
bordroRow['Hesap'] = hesapKod
if (!dagitimYapildi) {
bordroRow['Hesap'] = hesapKodBul(row, veri.fieldName)
bordroRow['Masraf Açıklama'] = veri.fieldName
bordroRow['Tutar'] = row[veri.colNro]
bordroRow['B/A'] = veri.ba
bordro.push({ ...bordroRow })
}
})
}
}

View File

@@ -185,6 +185,73 @@
</q-card-section>
<q-card-section v-if="ld.showFields">
<div class="row q-col-gutter-md q-mb-md">
<!--
<div class="col-auto">
<q-btn label="Kriterleri Doldur"
outline
color="pcolor1"
no-caps
@click="fillCriteria"
/>
</div>
-->
<div class="col text-h6 text-pcolor1">
Dağıtım Tanımları
</div>
</div>
<q-markup-table>
<thead>
<tr>
<td>
<q-btn icon="add"
outline
color="positive"
no-caps
size="sm"
@click="ld.showDagitimDlg = true"
/>
</td>
<td>Dağıtım Alanı</td>
<td>Dağıtım Kuralı</td>
</tr>
</thead>
<tbody>
<template v-for="(kv, kk) in tmpl.dagitim" :key="kk">
<template v-for="(khv, khk) in kv.kural" :key="khk">
<tr>
<td>
<q-btn icon="delete"
flat
outline
size="sm"
color="negative"
@click="delDagitim(kk, khk)"
/>
</td>
<td>
{{kk}} : {{khk}}
</td>
<td>
{{kv.hedefAlan}}
<br/>
<template v-for="oran in khv" :key="oran.deger">
%{{oran.oran}} --> {{oran.deger}}
<br/>
</template>
</td>
</tr>
</template>
</template>
</tbody>
</q-markup-table>
</q-card-section>
<q-card-section v-if="ld.showFields">
<div class="row q-col-gutter-md q-mb-md">
<div class="col-auto">
@@ -273,12 +340,111 @@
</q-markup-table>
</q-expansion-item>
</q-list>
</q-card-section>
</q-card>
</q-page>
<q-dialog
v-model="ld.showDagitimDlg"
persistent
>
<q-card style="width: 700px; max-width: 80vw;">
<q-card-section>
<div class="row q-col-gutter-md items-center">
<q-select
class="col-5"
v-model="ld.dagitim.bazAlan"
:options="fieldOptionsLabel"
option-label="fieldName"
option-value="colNro"
label="Dağıtım Bazı"
/>
<q-select
class="col-5"
v-model="ld.dagitim.hedefAlan"
:options="fieldOptionsLabel"
map-options
emit-value
label="Dağıtım Hedefi"
/>
<div class="col-2">
<q-btn
label="Kural Ekle"
outline
no-caps
@click="addDagitimKural"
/>
</div>
</div>
<div v-for="(kv, ndx) in ld.dagitim.kural" :key="ndx"
class="row q-col-gutter-md">
<div class="col-5">
<q-input
class="col-5"
label="Baz Değer"
v-model="kv.baz"
dense
>
<template v-slot:after>
<q-btn
label="Oran Ekle"
outline
size="sm"
no-caps
@click="addDagitimKuralOran(ndx)"
/>
</template>
</q-input>
</div>
<div class="col-5">
<div v-for="(hd,hndx) in kv.hedef" :key="hndx"
class="row q-col-gutter-sm"
>
<q-input
class="col"
label="Hedef Değer"
v-model="hd.deger"
dense
/>
<q-input
class="col"
label="Oran"
v-model.number="hd.oran"
type="number"
dense
/>
</div>
</div>
</div>
</q-card-section>
<q-card-actions>
<q-btn
color="positive"
flat label="Tamam"
v-close-popup
no-caps
@click="addDagitim"
/>
<q-btn
color="negative"
flat label="İptal" v-close-popup no-caps
@click="cancelDagitim"
/>
</q-card-actions>
</q-card>
</q-dialog>
</template>
<script setup>
@@ -304,6 +470,15 @@ const ld = reactive({
showFields: false,
combinedFields: [],
showDagitimDlg: false,
dagitim: {
bazAlan: '',
hedefAlan: '',
kural: [
//{baz: xxx, hedef: [{deger: yyy, oran: zzz}]}
],
},
})
const tmpl = reactive({
@@ -318,6 +493,19 @@ const tmpl = reactive({
alanlar: [],
kriterler: {},
dagitim: {
/*
'bazAlan': {
bazAlanColNro: 1
hedefAlanColNro: 2
hedefAlan: '',
kural: {
'bazDeger': [{oran: 20, deger: aaaa}}
}
}
*/
},
})
let workbook = null
@@ -339,6 +527,33 @@ const valFielOptions = computed(() => {
return opts
})
const fieldOptions = computed(() => {
const ls = tmpl.alanlar.filter(f => {return f.colNro >= 0})
const opts = []
ls.forEach(f => {
opts.push({ colNro: f.colNro, fieldName: f.fieldName })
})
return opts
})
const fieldOptionsLabel = computed(() => {
const ls = tmpl.alanlar.filter(f => {return f.colNro >= 0})
const opts = []
ls.forEach(f => {
opts.push(f.fieldName )
})
return opts
})
const getFieldColNumber = function (fieldName) {
const tmpIndex = tmpl.alanlar.findIndex(f => {return f.fieldName === fieldName})
if (tmpIndex >= 0) {
return tmpl.alanlar[tmpIndex].colNro
} else {
return -1
}
}
const getCompanyList = function () {
api.get('/sy/companies').then(res => {
if (res.data.Success) {
@@ -582,14 +797,6 @@ const delMapping = function (k, valField) {
})
}
const fieldOptions = computed(() => {
const ls = tmpl.alanlar.filter(f => {return f.colNro >= 0})
const opts = []
ls.forEach(f => {
opts.push({ colNro: f.colNro, fieldName: f.fieldName })
})
return opts
})
const addCombinedField = function () {
ld.isDirty = true
@@ -622,6 +829,55 @@ const delCombinedField = function (ndx) {
tmpl.alanlar.splice(ndx, 1)
}
const addDagitimKural = function () {
ld.dagitim.kural.push({
baz: '', hedef: [],
})
}
const addDagitimKuralOran = function (ndx) {
ld.dagitim.kural[ndx].hedef.push({ deger: null, oran: 0 })
}
const addDagitim = function () {
ld.isDirty = true
const hedefAlan = toRaw(ld.dagitim.hedefAlan)
const bazAlan = toRaw(ld.dagitim.bazAlan)
tmpl.dagitim[bazAlan] = {
bazAlanColNro: getFieldColNumber(bazAlan),
hedefAlanColNro: getFieldColNumber(hedefAlan),
hedefAlan: hedefAlan,
kural: {}
}
ld.dagitim.kural.forEach(k => {
const bazDeger = toRaw(k.baz)
tmpl.dagitim[bazAlan].kural[bazDeger] = []
k.hedef.forEach(h => {
tmpl.dagitim[bazAlan].kural[bazDeger].push({oran: h.oran, deger: h.deger})
})
})
cancelDagitim()
}
const cancelDagitim = function () {
ld.dagitim.bazAlan = ''
ld.dagitim.hedefAlan = ''
ld.dagitim.kural.splice(0)
}
const delDagitim = function (bazAlan, bazDeger) {
ld.isDirty = true
delete tmpl.dagitim[bazAlan].kural[bazDeger]
if (Object.keys(tmpl.dagitim[bazAlan].kural).length === 0) {
delete tmpl.dagitim[bazAlan]
}
}
</script>