Compare commits

...

2 Commits

Author SHA1 Message Date
ctengiz
a28576960e kriter değeri ekleme, hesap kodu kopyalama, excel okuma, kriter güncelleme 2024-04-29 17:21:02 +03:00
ctengiz
a661c06639 maliyet dağıtım fix 2024-04-25 13:51:46 +03:00
2 changed files with 242 additions and 67 deletions

View File

@@ -321,6 +321,11 @@ const processXLS = function () {
bordroRow['Tutar'] = row[veri.colNro] * (oran.oran / 100) bordroRow['Tutar'] = row[veri.colNro] * (oran.oran / 100)
bordroRow['B/A'] = veri.ba bordroRow['B/A'] = veri.ba
const hedefAlan = tmpl.dagitim[bazAlan].hedefAlan
if (bordroRow[hedefAlan]) {
bordroRow[hedefAlan] = oran.deger
}
bordro.push({ ...bordroRow }) bordro.push({ ...bordroRow })
}) })
} }

View File

@@ -233,13 +233,13 @@
/> />
</td> </td>
<td> <td>
{{kk}} : {{khk}} {{ kk }} : {{ khk }}
</td> </td>
<td> <td>
{{kv.hedefAlan}} {{ kv.hedefAlan }}
<br/> <br/>
<template v-for="oran in khv" :key="oran.deger"> <template v-for="oran in khv" :key="oran.deger">
%{{oran.oran}} --> {{oran.deger}} %{{ oran.oran }} --> {{ oran.deger }}
<br/> <br/>
</template> </template>
</td> </td>
@@ -279,27 +279,54 @@
<thead> <thead>
<tr> <tr>
<td class="text-weight-bolder"> <td class="text-weight-bolder">
<q-btn icon="add" flat dense>
<q-tooltip>Kriter değeri ekle</q-tooltip>
<q-popup-edit
v-model="ld.mappingVal"
buttons
v-slot="scope"
anchor="top left"
persistent
@update:modelValue="addMappingKey(k)"
>
<q-input
v-model="scope.value"
dense
autofocus
@keyup.enter="scope.set"/>
</q-popup-edit>
</q-btn>
Değer Değer
<q-btn <q-btn
flat flat
icon="add" icon="mdi-table-column-plus-after"
dense dense
color="positive" color="positive"
/>
<q-popup-edit
v-model="ld.selectedVal"
buttons
v-slot="scope"
@update:modelValue="addMapping(k)"
> >
<q-select <q-tooltip>Veri alanı ekle</q-tooltip>
v-model="scope.value" <q-popup-edit
:options="valFielOptions" v-model="ld.selectedVal"
dense buttons
autofocus v-slot="scope"
counter @update:modelValue="addMapping(k)"
@keyup.enter="scope.set"/> >
</q-popup-edit> <q-select
v-model="scope.value"
:options="valFielOptions"
dense
autofocus
counter
@keyup.enter="scope.set"/>
</q-popup-edit>
</q-btn>
<q-btn flat icon="content_copy" dense
@click="copyMappingKeys(k)"
>
<q-tooltip>Kriter değerlerini koopyala</q-tooltip>
</q-btn>
</td> </td>
<td v-for="f in v.valFields" :key="f"> <td v-for="f in v.valFields" :key="f">
{{ f }} {{ f }}
@@ -310,6 +337,25 @@
color="negative" color="negative"
@click="delMapping(k, f)" @click="delMapping(k, f)"
/> />
<q-btn flat icon="south" dense>
<q-tooltip>Girilen değeri tüm satırlara kopyala</q-tooltip>
<q-popup-edit
v-model="ld.mappingVal"
buttons
v-slot="scope"
anchor="top left"
persistent
@update:modelValue="fillMappings(k, f)"
>
<q-input
v-model="scope.value"
dense
autofocus
@keyup.enter="scope.set"/>
</q-popup-edit>
</q-btn>
</td> </td>
</tr> </tr>
</thead> </thead>
@@ -321,6 +367,9 @@
v-model="kv[f]" v-model="kv[f]"
dense dense
@update:modelValue="ld.isDirty=true" @update:modelValue="ld.isDirty=true"
:label="f"
stack-label
label-color="primary"
/> />
</td> </td>
@@ -451,10 +500,10 @@
import { computed, onMounted, reactive, toRaw } from 'vue' import { computed, onMounted, reactive, toRaw } from 'vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { api } from 'boot/axios' import { api } from 'boot/axios'
import { catchAxiosError, showAxiosError } from 'src/libjs/lib/axios' import { catchAxiosError, showAxiosError, showError, showSuccess } from 'src/libjs/lib/axios'
import MEditHeader from 'src/libjs/comp/MEditHeader.vue' import MEditHeader from 'src/libjs/comp/MEditHeader.vue'
import { read, utils } from 'xlsx' import { read, utils } from 'xlsx'
import { useQuasar } from 'quasar' import { copyToClipboard, useQuasar } from 'quasar'
const { t } = useI18n() const { t } = useI18n()
const $q = useQuasar() const $q = useQuasar()
@@ -479,6 +528,8 @@ const ld = reactive({
//{baz: xxx, hedef: [{deger: yyy, oran: zzz}]} //{baz: xxx, hedef: [{deger: yyy, oran: zzz}]}
], ],
}, },
mappingVal: '',
}) })
const tmpl = reactive({ const tmpl = reactive({
@@ -540,7 +591,7 @@ const fieldOptionsLabel = computed(() => {
const ls = tmpl.alanlar.filter(f => {return f.colNro >= 0}) const ls = tmpl.alanlar.filter(f => {return f.colNro >= 0})
const opts = [] const opts = []
ls.forEach(f => { ls.forEach(f => {
opts.push(f.fieldName ) opts.push(f.fieldName)
}) })
return opts return opts
}) })
@@ -549,8 +600,8 @@ const getFieldColNumber = function (fieldName) {
const tmpIndex = tmpl.alanlar.findIndex(f => {return f.fieldName === fieldName}) const tmpIndex = tmpl.alanlar.findIndex(f => {return f.fieldName === fieldName})
if (tmpIndex >= 0) { if (tmpIndex >= 0) {
return tmpl.alanlar[tmpIndex].colNro return tmpl.alanlar[tmpIndex].colNro
} else { } else {
return -1 return -1
} }
} }
@@ -656,87 +707,157 @@ const processXLS = function () {
const sheet = workbook.Sheets[tmpl.bordroSheet] const sheet = workbook.Sheets[tmpl.bordroSheet]
tmpl.rawData = utils.sheet_to_json(sheet, { header: 1 }) tmpl.rawData = utils.sheet_to_json(sheet, { header: 1 })
/*
tmpl.alanlar.splice(0) tmpl.alanlar.splice(0)
*/
const fieldNames = []
let lastCol = -1 let lastCol = -1
tmpl.rawData[tmpl.baslikSatiri - 1].forEach((val, ndx) => { tmpl.rawData[tmpl.baslikSatiri - 1].forEach((val, ndx) => {
//başlık olmayan kolonlar //başlık olmayan kolonlar
if (ndx - lastCol > 1) { if (ndx - lastCol > 1) {
for (let j = 1; j < ndx - lastCol; j++) { const msg = 'Başlıksız kolonlar var. Dosya işlenemez'
tmpl.alanlar.push({ showError(msg)
colNro: lastCol + 1, throw msg
fieldName: `Kolon ${lastCol + 2}`,
colType: '',
ba: 'B',
showInSlip: false,
combinedFields: [],
combinedFieldsNro: [],
formula: '',
})
}
} }
let name = val let name = val
for (let j = 1; j < tmpl.baslikSatirAdedi; j++) { for (let j = 1; j < tmpl.baslikSatirAdedi; j++) {
let addiVal = tmpl.rawData[tmpl.baslikSatiri - 1 + j][ndx] let addiVal = tmpl.rawData[tmpl.baslikSatiri - 1 + j][ndx]
if (!addiVal) { if (addiVal) {
addiVal = '' name = name + ' ' + addiVal
} }
name = name + ' ' + addiVal
} }
name = name.trim()
fieldNames.push(name)
tmpl.alanlar.push({ const alanIndex = tmpl.alanlar.findIndex(f => {return f.fieldName === name})
colNro: ndx, if (alanIndex < 0) {
fieldName: name.trim(), tmpl.alanlar.push({
colType: '', colNro: ndx,
ba: 'B', fieldName: name,
showInSlip: false, colType: '',
combinedFields: [], ba: 'B',
combinedFieldsNro: [], showInSlip: false,
formula: '', combinedFields: [],
}) combinedFieldsNro: [],
formula: '',
})
} else {
if (tmpl.alanlar[alanIndex].colNro !== ndx) {
const oldColNro = tmpl.alanlar[alanIndex].colNro
tmpl.alanlar[alanIndex].colNro = ndx
//kriter kolon no'ları güncelleyelim
Object.keys(tmpl.kriterler).forEach(kr => {
if (tmpl.kriterler[kr].colNro === oldColNro) {
tmpl.kriterler[kr].colNro = ndx
}
for (let j = 0; j < tmpl.kriterler[kr].combinedFieldsNro.length; j++) {
if (tmpl.kriterler[kr].combinedFieldsNro[j] === oldColNro) {
tmpl.kriterler[kr].combinedFieldsNro[j] = ndx
}
}
})
// Dağtım kolon no'ları güncelleyelim
Object.keys(tmpl.dagitim).forEach(dk => {
if (tmpl.dagitim[dk].bazAlanColNro === oldColNro) {
tmpl.dagitim[dk].bazAlanColNro = ndx
}
if (tmpl.dagitim[dk].hedefAlanColNro === oldColNro) {
tmpl.dagitim[dk].hedefAlanColNro = ndx
}
})
// Birleşik kriterleri güncelleyelim
tmpl.alanlar.forEach(af => {
if (af.colNro < 0) {
for (let j = 0; j < af.combinedFieldsNro.length; j++) {
if (af.combinedFieldsNro[j] === oldColNro) {
af.combinedFieldsNro[j] = ndx
}
}
}
})
}
}
lastCol = ndx lastCol = ndx
}) })
// Sıralayalım
tmpl.alanlar.sort((a, b) => {
if (a.colNro < b.colNro) {
return -1
} else {
return 1
}
})
// excelden silinen alanları uçuralım
tmpl.alanlar.forEach((v, n) => {
const tmpIndex = fieldNames.findIndex(el => {return v.fieldName === el})
if (tmpIndex < 0) {
console.log(v.fieldName)
tmpl.alanlar.splice(n, 1)
}
})
ld.showFields = true ld.showFields = true
} }
const fillCriteria = function () { const fillCriteria = function () {
ld.isDirty = true ld.isDirty = true
// kriterleri temizleyelim // kriterleri temizleyelim
/*
Object.keys(ld.alreadySelectedValFields).forEach(k => { Object.keys(ld.alreadySelectedValFields).forEach(k => {
delete ld.alreadySelectedValFields[k] delete ld.alreadySelectedValFields[k]
}) })
tmpl.kriterler = {} tmpl.kriterler = {}
*/
// kriter alanlarını bulup boş kriter nesnelerini oluşturalım // kriter alanlarını bulup boş kriter nesnelerini oluşturalım
const kriterCols = [] const kriterCols = []
tmpl.alanlar.filter(f => {return f.colType === 'kriter'}).forEach(f => { tmpl.alanlar.filter(f => {return f.colType === 'kriter'}).forEach(f => {
tmpl.kriterler[f.fieldName] = { if (!tmpl.kriterler.hasOwnProperty(f.fieldName)) {
colNro: f.colNro, tmpl.kriterler[f.fieldName] = {
colNro: f.colNro,
combinedFields: [...(f.combinedFields || [])], combinedFields: [...(f.combinedFields || [])],
combinedFieldsNro: [...(f.combinedFieldsNro || [])], combinedFieldsNro: [...(f.combinedFieldsNro || [])],
valFields: [], valFields: [],
/* /*
[ [
{fieldName: 'xxx', colNro: 3} {fieldName: 'xxx', colNro: 3}
{fieldName: 'yyy', colNro: 4} {fieldName: 'yyy', colNro: 4}
] ]
*/ */
mappings: {}, mappings: {},
/* /*
mapping['kriter1'] = {xxx: 770.01.001, yyy: 770.01.002} mapping['kriter1'] = {xxx: 770.01.001, yyy: 770.01.002}
*/ */
}
} }
kriterCols.push(f.fieldName) kriterCols.push(f.fieldName)
}) })
// kriter olmayan kolonları silelim
Object.keys(tmpl.kriterler).forEach(k => {
if (kriterCols.indexOf(k) < 0) {
delete tmpl.kriterler[k]
}
})
tmpl.rawData.forEach((row, ndx) => { tmpl.rawData.forEach((row, ndx) => {
if (ndx <= tmpl.baslikSatiri - 1 + tmpl.baslikSatirAdedi) { if (ndx <= tmpl.baslikSatiri - 1 + tmpl.baslikSatirAdedi) {
@@ -764,9 +885,15 @@ const fillCriteria = function () {
} }
if ((kriterVal !== null) && (kriterVal !== undefined) && (kriterVal !== '')) { if ((kriterVal !== null) && (kriterVal !== undefined) && (kriterVal !== '')) {
tmpl.kriterler[k].mappings[kriterVal] = {}
}
if (!tmpl.kriterler[k].mappings.hasOwnProperty(kriterVal)) {
tmpl.kriterler[k].mappings[kriterVal] = {}
tmpl.kriterler[k].valFields.forEach(f => {
tmpl.kriterler[k].mappings[ld.mappingVal][f] = ''
})
}
}
}) })
} }
} }
@@ -797,6 +924,49 @@ const delMapping = function (k, valField) {
}) })
} }
const fillMappings = function (k, valField) {
ld.isDirty = true
Object.keys(tmpl.kriterler[k].mappings).forEach(vk => {
tmpl.kriterler[k].mappings[vk][valField] = ld.mappingVal
})
ld.mappingVal = ''
}
const addMappingKey = function (k) {
ld.isDirty = true
tmpl.kriterler[k].mappings[ld.mappingVal] = {}
tmpl.kriterler[k].valFields.forEach(f => {
tmpl.kriterler[k].mappings[ld.mappingVal][f] = ''
})
ld.mappingVal = ''
}
const copyMappingKeys = function (k) {
let text = ''
Object.keys(tmpl.kriterler[k].mappings).forEach(vk => {
text += vk + '\n'
})
copyToClipboard(text).then(() => {
showSuccess('Kriter değerleri kopyalandı')
}).catch(() => {
alert('kopyalamada hata')
})
}
const fillMappingsFromExcel = function (k, valField) {
ld.isDirty = true
Object.keys(tmpl.kriterler[k].mappings).forEach(vk => {
tmpl.kriterler[k].mappings[vk][valField] = ld.mappingVal
})
ld.mappingVal = ''
}
const addCombinedField = function () { const addCombinedField = function () {
ld.isDirty = true ld.isDirty = true
@@ -849,7 +1019,7 @@ const addDagitim = function () {
bazAlanColNro: getFieldColNumber(bazAlan), bazAlanColNro: getFieldColNumber(bazAlan),
hedefAlanColNro: getFieldColNumber(hedefAlan), hedefAlanColNro: getFieldColNumber(hedefAlan),
hedefAlan: hedefAlan, hedefAlan: hedefAlan,
kural: {} kural: {},
} }
ld.dagitim.kural.forEach(k => { ld.dagitim.kural.forEach(k => {
@@ -857,7 +1027,7 @@ const addDagitim = function () {
tmpl.dagitim[bazAlan].kural[bazDeger] = [] tmpl.dagitim[bazAlan].kural[bazDeger] = []
k.hedef.forEach(h => { k.hedef.forEach(h => {
tmpl.dagitim[bazAlan].kural[bazDeger].push({oran: h.oran, deger: h.deger}) tmpl.dagitim[bazAlan].kural[bazDeger].push({ oran: h.oran, deger: h.deger })
}) })
}) })