alfa release
This commit is contained in:
11
scripts/base_db_install.sh
Normal file
11
scripts/base_db_install.sh
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
apt update && apt upgrade
|
||||||
|
dpkg-reconfigure locales
|
||||||
|
dpkg-reconfigure tzdata
|
||||||
|
|
||||||
|
sudo apt install -y postgresql-common
|
||||||
|
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
|
||||||
|
apt -y install postgresql-16 mc rsync curl
|
||||||
|
|
||||||
|
cd /tmp && sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'tesnos.+ed';"
|
||||||
65
scripts/base_svc_install.sh
Normal file
65
scripts/base_svc_install.sh
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
APP=bordro-esleme
|
||||||
|
|
||||||
|
apt update && apt upgrade
|
||||||
|
apt -y install mc rsync curl nginx
|
||||||
|
dpkg-reconfigure tzdata
|
||||||
|
|
||||||
|
useradd --system --shell=/usr/sbin/nologin ${APP}
|
||||||
|
|
||||||
|
mkdir -p /opt/${APP}/sqls
|
||||||
|
mkdir -p /opt/${APP}/migrate
|
||||||
|
mkdir -p /opt/${APP}/ui
|
||||||
|
mkdir -p /opt/${APP}/files
|
||||||
|
|
||||||
|
echo "Creating application service"
|
||||||
|
read -d '' sservice << EOF
|
||||||
|
[Unit]
|
||||||
|
Description=${APP}
|
||||||
|
After=syslog.target
|
||||||
|
After=network.target
|
||||||
|
#Requires=postgresql.service
|
||||||
|
#Requires=memcached.service
|
||||||
|
#Requires=redis.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
# Modify these two values and uncomment them if you have
|
||||||
|
# repos with lots of files and get an HTTP error 500 because
|
||||||
|
# of that
|
||||||
|
###
|
||||||
|
LimitMEMLOCK=infinity
|
||||||
|
LimitNOFILE=1048576
|
||||||
|
|
||||||
|
RestartSec=2s
|
||||||
|
Type=simple
|
||||||
|
User=${APP}
|
||||||
|
Group=${APP}
|
||||||
|
WorkingDirectory=/opt/${APP}/
|
||||||
|
ExecStart=/opt/${APP}/${APP}
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
Environment=AUTHSERVER=http://127.0.0.1:40200 SQLSDIR=./sqls DBHOST=10.0.0.2 DBNAME=bordroesleme DBPASS=tesnos.+ed
|
||||||
|
|
||||||
|
# enable to bind to a port below 1024 uncomment
|
||||||
|
###
|
||||||
|
#CapabilityBoundingSet=CAP_NET_BIND_SERVICE
|
||||||
|
#AmbientCapabilities=CAP_NET_BIND_SERVICE
|
||||||
|
|
||||||
|
# Prevent writes to /usr, /boot, and /etc
|
||||||
|
ProtectSystem=full
|
||||||
|
|
||||||
|
# Prevent accessing /home, /root and /run/user
|
||||||
|
ProtectHome=true
|
||||||
|
|
||||||
|
# Execute pre and post scripts as root, otherwise it does it as User=
|
||||||
|
PermissionsStartOnly=true
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
echo "$sservice" > /etc/systemd/system/${APP}.service
|
||||||
|
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable ${APP}
|
||||||
|
|
||||||
@@ -60,7 +60,7 @@ func companyCreate(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = data.DbCreate(r.Context(), true, tc.UsrID())
|
err = data.DbCreate(r.Context(), tc.ClientID(), true, tc.UsrID())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
mhttp.InternalServerError(w, err)
|
mhttp.InternalServerError(w, err)
|
||||||
return
|
return
|
||||||
|
|||||||
44
svc/api/atmpl.go
Normal file
44
svc/api/atmpl.go
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"git.makki.io/makki/libgo/cmn"
|
||||||
|
"git.makki.io/makki/libgo/dbu"
|
||||||
|
"git.makki.io/makki/libgo/mhttp"
|
||||||
|
"github.com/go-chi/chi/v5"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func tmplPost(w http.ResponseWriter, r *http.Request) {
|
||||||
|
companyID := cmn.StrToInt64(chi.URLParam(r, "companyID"))
|
||||||
|
var body json.RawMessage
|
||||||
|
|
||||||
|
err := cmn.BodyToJsonReq(r, &body)
|
||||||
|
if err != nil {
|
||||||
|
mhttp.InternalServerError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
sq := "update company set tmpl = $2 where id = $1"
|
||||||
|
_, err = dbu.DB.Exec(r.Context(), sq, companyID, body)
|
||||||
|
if err != nil {
|
||||||
|
mhttp.InternalServerError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
mhttp.ResponseSuccess(w, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func tmplGet(w http.ResponseWriter, r *http.Request) {
|
||||||
|
companyID := cmn.StrToInt64(chi.URLParam(r, "companyID"))
|
||||||
|
var body json.RawMessage
|
||||||
|
|
||||||
|
sq := "select tmpl from company where id = $1"
|
||||||
|
err := dbu.DB.QueryRow(r.Context(), sq, companyID).Scan(&body)
|
||||||
|
if err != nil {
|
||||||
|
mhttp.InternalServerError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
mhttp.ResponseSuccess(w, body)
|
||||||
|
}
|
||||||
@@ -71,6 +71,10 @@ func HttpHandler(re enums.TRunEnv) http.Handler {
|
|||||||
r.Put("/company", companyUpdate)
|
r.Put("/company", companyUpdate)
|
||||||
r.Post("/company", companyCreate)
|
r.Post("/company", companyCreate)
|
||||||
r.Delete("/company/{id:[0-9]+}", companyDelete)
|
r.Delete("/company/{id:[0-9]+}", companyDelete)
|
||||||
|
|
||||||
|
r.Post("/tmpl/{companyID:[0-9]+}", tmplPost)
|
||||||
|
r.Get("/tmpl/{companyID:[0-9]+}", tmplGet)
|
||||||
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,9 @@ func DbDelete(ctx context.Context, id int64, log bool, usrID *int64) error {
|
|||||||
return tx.Commit(ctx)
|
return tx.Commit(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Company) DbCreate(ctx context.Context, log bool, usrID *int64) error {
|
func (m *Company) DbCreate(ctx context.Context, clID int64, log bool, usrID *int64) error {
|
||||||
|
m.Clid = clID
|
||||||
|
|
||||||
rp, err := dbu.NewRepoWithFile(ctx, "company", nil)
|
rp, err := dbu.NewRepoWithFile(ctx, "company", nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -21,7 +21,8 @@
|
|||||||
"quasar": "^2.8.0",
|
"quasar": "^2.8.0",
|
||||||
"vue": "^3.4.18",
|
"vue": "^3.4.18",
|
||||||
"vue-i18n": "^9.9.0",
|
"vue-i18n": "^9.9.0",
|
||||||
"vue-router": "^4.0.12"
|
"vue-router": "^4.0.12",
|
||||||
|
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@quasar/app-vite": "^1.8.0",
|
"@quasar/app-vite": "^1.8.0",
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ module.exports = configure(function (ctx) {
|
|||||||
// publicPath: '/',
|
// publicPath: '/',
|
||||||
// analyze: true,
|
// analyze: true,
|
||||||
env: {
|
env: {
|
||||||
|
showLangSelect: false,
|
||||||
apiAddr: (() => {
|
apiAddr: (() => {
|
||||||
if (process.env.CUSTOM_API) {
|
if (process.env.CUSTOM_API) {
|
||||||
return process.env.CUSTOM_API
|
return process.env.CUSTOM_API
|
||||||
|
|||||||
@@ -4,6 +4,13 @@ const prjI18n = {
|
|||||||
menu: {
|
menu: {
|
||||||
app: 'Uygulamalar'
|
app: 'Uygulamalar'
|
||||||
},
|
},
|
||||||
|
Company: {
|
||||||
|
Code: 'Şirket Kod',
|
||||||
|
Title: 'Şirket Ad',
|
||||||
|
IsActive: 'Kullanımda',
|
||||||
|
Notes: 'Açıklamalar',
|
||||||
|
Tmpl: 'Eşleme Şablonu'
|
||||||
|
},
|
||||||
Usr: {},
|
Usr: {},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
</q-item-label>
|
</q-item-label>
|
||||||
|
|
||||||
<template v-for="m in ld.menu" :key="m.grantKey">
|
<template v-for="m in ld.menu" :key="m.grantKey">
|
||||||
<q-item :to="m.to" v-if="!m.children">
|
<q-item :to="m.to" v-if="!m.children" active-class="text-pcolor1">
|
||||||
<q-item-section avatar v-if="m.icon">
|
<q-item-section avatar v-if="m.icon">
|
||||||
<q-icon :name="m.icon"/>
|
<q-icon :name="m.icon"/>
|
||||||
</q-item-section>
|
</q-item-section>
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
:icon="m.icon"
|
:icon="m.icon"
|
||||||
:label="m.label"
|
:label="m.label"
|
||||||
>
|
>
|
||||||
<q-item v-for="c in m.children" :key="c.grantKey" :to="c.to" exact :inset-level=".5">
|
<q-item v-for="c in m.children" :key="c.grantKey" :to="c.to" exact :inset-level=".5" active-class="text-pcolor1">
|
||||||
<q-item-section avatar v-if="c.icon">
|
<q-item-section avatar v-if="c.icon">
|
||||||
<q-icon :name="c.icon"/>
|
<q-icon :name="c.icon"/>
|
||||||
</q-item-section>
|
</q-item-section>
|
||||||
|
|||||||
@@ -10,9 +10,24 @@ const tmenu = [
|
|||||||
to: '/company'
|
to: '/company'
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
label: 'Şablon Tasarımı',
|
||||||
|
icon: 'business',
|
||||||
|
grantKey: 'Tmpl',
|
||||||
|
to: '/tmpl'
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
label:'menu.masterData',
|
label: 'Bordro Eşleme',
|
||||||
|
icon: 'business',
|
||||||
|
grantKey: 'Map',
|
||||||
|
to: '/map'
|
||||||
|
},
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
{
|
||||||
|
label:'Hesap Planı',
|
||||||
icon: 'mdi-database-edit',
|
icon: 'mdi-database-edit',
|
||||||
grantKey: 'Data',
|
grantKey: 'Data',
|
||||||
to: null,
|
to: null,
|
||||||
@@ -84,6 +99,8 @@ const tmenu = [
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
|
*/
|
||||||
]
|
]
|
||||||
|
|
||||||
export const menu = function () {
|
export const menu = function () {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<q-page padding>
|
<q-page padding>
|
||||||
<m-edit-header
|
<m-edit-header
|
||||||
title="Company Kayıtları"
|
title="Şirket Kaydı"
|
||||||
:id="model.ID"
|
:id="model.ID"
|
||||||
:show-save-cancel="true"
|
:show-save-cancel="true"
|
||||||
@save="save"
|
@save="save"
|
||||||
@@ -13,47 +13,46 @@
|
|||||||
<div class="row q-col-gutter-md">
|
<div class="row q-col-gutter-md">
|
||||||
|
|
||||||
|
|
||||||
<q-input class="col-xs-12 col-sm-6 col-md-4 col-lg-3 col-xl"
|
<q-input class="col-xs-12 col-sm-4"
|
||||||
v-model="model.Code"
|
v-model="model.Code"
|
||||||
:label="t('Company.Code')"
|
:label="t('Company.Code')"
|
||||||
bottom-slots
|
bottom-slots
|
||||||
:rules="[]"
|
:rules="[rules.required]"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<q-input class="col-xs-12 col-sm-6 col-md-4 col-lg-3 col-xl"
|
<q-input class="col-xs-12 col-sm-6"
|
||||||
v-model="model.Title"
|
v-model="model.Title"
|
||||||
:label="t('Company.Title')"
|
:label="t('Company.Title')"
|
||||||
bottom-slots
|
bottom-slots
|
||||||
:rules="[]"
|
:rules="[]"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<q-input class="col-xs-12 col-sm-6 col-md-4 col-lg-3 col-xl"
|
<q-checkbox class="col-xs-12 col-sm-2"
|
||||||
v-model="model.IsActive"
|
v-model="model.IsActive"
|
||||||
:label="t('Company.IsActive')"
|
:label="model._colOptions.IsActive.label"
|
||||||
bottom-slots
|
bottom-slots
|
||||||
:rules="[]"
|
:rules="[]"
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<q-input class="col-xs-12 col-sm-6 col-md-4 col-lg-3 col-xl"
|
<div class="row q-col-gutter-md">
|
||||||
|
<q-input class="col"
|
||||||
v-model="model.Notes"
|
v-model="model.Notes"
|
||||||
:label="t('Company.Notes')"
|
:label="t('Company.Notes')"
|
||||||
bottom-slots
|
bottom-slots
|
||||||
:rules="[]"
|
:rules="[]"
|
||||||
|
autogrow
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<q-input class="col-xs-12 col-sm-6 col-md-4 col-lg-3 col-xl"
|
|
||||||
v-model="model.Tmpl"
|
|
||||||
:label="t('Company.Tmpl')"
|
|
||||||
bottom-slots
|
|
||||||
:rules="[]"
|
|
||||||
/>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
</q-card-section>
|
||||||
|
|
||||||
|
<q-card-section>
|
||||||
|
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
</q-card>
|
</q-card>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</q-form>
|
</q-form>
|
||||||
|
|
||||||
</q-page>
|
</q-page>
|
||||||
@@ -66,6 +65,7 @@ import { useLoginStore } from 'stores/login'
|
|||||||
import Company from 'src/model/company'
|
import Company from 'src/model/company'
|
||||||
import { rules } from 'src/libjs/lib/validation'
|
import { rules } from 'src/libjs/lib/validation'
|
||||||
import { i18n } from 'boot/i18n'
|
import { i18n } from 'boot/i18n'
|
||||||
|
|
||||||
const t = i18n.global.t
|
const t = i18n.global.t
|
||||||
|
|
||||||
const frmMain = ref(null)
|
const frmMain = ref(null)
|
||||||
@@ -76,8 +76,7 @@ const router = useRouter()
|
|||||||
const store = useLoginStore()
|
const store = useLoginStore()
|
||||||
const model = reactive(new Company(endPoint.value))
|
const model = reactive(new Company(endPoint.value))
|
||||||
|
|
||||||
const ld = reactive({
|
const ld = reactive({})
|
||||||
})
|
|
||||||
|
|
||||||
onBeforeMount(() => {
|
onBeforeMount(() => {
|
||||||
if (route.params.id) {
|
if (route.params.id) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<q-page padding>
|
<q-page padding>
|
||||||
<m-edit-header title="Company Kayıtları"/>
|
<m-edit-header title="Şirket Tanımları"/>
|
||||||
<m-list
|
<m-list
|
||||||
:url="ld.endPoint"
|
:url="ld.endPoint"
|
||||||
:model="model"
|
:model="model"
|
||||||
|
|||||||
247
ui/src/pages/map.vue
Normal file
247
ui/src/pages/map.vue
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
<template>
|
||||||
|
<q-page padding>
|
||||||
|
<m-edit-header title="Bordro Eşleme"/>
|
||||||
|
|
||||||
|
<q-card>
|
||||||
|
<q-card-section>
|
||||||
|
<q-select v-model="ld.companyID"
|
||||||
|
map-options
|
||||||
|
emit-value
|
||||||
|
:label="t('selectCompany')"
|
||||||
|
:options="ld.companies"
|
||||||
|
option-value="ID"
|
||||||
|
option-label="Title"
|
||||||
|
dense
|
||||||
|
options-dense
|
||||||
|
outlined
|
||||||
|
bg-color="white"
|
||||||
|
@update:model-value="load"
|
||||||
|
>
|
||||||
|
<template v-slot:after>
|
||||||
|
<q-btn
|
||||||
|
flat
|
||||||
|
icon="business"
|
||||||
|
dense
|
||||||
|
size="sm"
|
||||||
|
color="white"
|
||||||
|
to="/company/new"
|
||||||
|
>
|
||||||
|
<q-tooltip>{{ t('createCompany') }}</q-tooltip>
|
||||||
|
</q-btn>
|
||||||
|
</template>
|
||||||
|
</q-select>
|
||||||
|
</q-card-section>
|
||||||
|
|
||||||
|
<q-card-section v-if="ld.companyID && ld.canProcess">
|
||||||
|
<div class="row q-gutter-y-sm q-col-gutter-md">
|
||||||
|
<q-file
|
||||||
|
dense
|
||||||
|
class="col-12"
|
||||||
|
v-model="ld.xlsFileName"
|
||||||
|
label="Bordro Dosyası"
|
||||||
|
clearable
|
||||||
|
>
|
||||||
|
<template v-slot:after>
|
||||||
|
<q-btn
|
||||||
|
outline
|
||||||
|
color="pcolor1"
|
||||||
|
label="Bordro Fişi Oluştur"
|
||||||
|
no-caps
|
||||||
|
@click="loadFile"
|
||||||
|
:disable="!ld.xlsFileName"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</q-file>
|
||||||
|
</div>
|
||||||
|
</q-card-section>
|
||||||
|
</q-card>
|
||||||
|
</q-page>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { computed, onMounted, reactive, toRaw } from 'vue'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
import { api } from 'boot/axios'
|
||||||
|
import { catchAxiosError, showAxiosError } from 'src/libjs/lib/axios'
|
||||||
|
import MEditHeader from 'src/libjs/comp/MEditHeader.vue'
|
||||||
|
import { read, utils, writeFile } from 'xlsx'
|
||||||
|
import { useQuasar } from 'quasar'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
const $q = useQuasar()
|
||||||
|
|
||||||
|
const ld = reactive({
|
||||||
|
companyID: null,
|
||||||
|
companies: [],
|
||||||
|
xlsFileName: null,
|
||||||
|
selectedVal: '',
|
||||||
|
alreadySelectedValFields: {},
|
||||||
|
|
||||||
|
canProcess: false,
|
||||||
|
})
|
||||||
|
|
||||||
|
const tmpl = reactive({
|
||||||
|
rawData: null,
|
||||||
|
sheets: [],
|
||||||
|
bordroSheet: '',
|
||||||
|
|
||||||
|
baslikSatiri: 7,
|
||||||
|
baslikSatirAdedi: 2,
|
||||||
|
|
||||||
|
kontrolKolonu: -1,
|
||||||
|
|
||||||
|
alanlar: [],
|
||||||
|
kriterler: {},
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
getCompanyList()
|
||||||
|
})
|
||||||
|
|
||||||
|
const getCompanyList = function () {
|
||||||
|
api.get('/sy/companies').then(res => {
|
||||||
|
if (res.data.Success) {
|
||||||
|
ld.companies = res.data.Data || []
|
||||||
|
} else {
|
||||||
|
showAxiosError(res)
|
||||||
|
}
|
||||||
|
}).catch(err => {
|
||||||
|
catchAxiosError(err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const load = function () {
|
||||||
|
Object.keys(ld.alreadySelectedValFields).forEach(k => {
|
||||||
|
delete ld.alreadySelectedValFields[k]
|
||||||
|
})
|
||||||
|
|
||||||
|
Object.keys(tmpl.kriterler).forEach(k => {
|
||||||
|
delete tmpl.kriterler[k]
|
||||||
|
})
|
||||||
|
tmpl.sheets.splice(0)
|
||||||
|
tmpl.alanlar.splice(0)
|
||||||
|
tmpl.bordroSheet = ''
|
||||||
|
|
||||||
|
$q.loading.show()
|
||||||
|
api.get(`/tmpl/${ld.companyID}`).then(res => {
|
||||||
|
if (res.data.Success) {
|
||||||
|
if (res.data.Data === null) {
|
||||||
|
ld.canProcess = false
|
||||||
|
$q.dialog({
|
||||||
|
title: 'Hata',
|
||||||
|
message: 'Şirket için tanımlı şablon yok'
|
||||||
|
}).onOk(() => {
|
||||||
|
// console.log('OK')
|
||||||
|
}).onCancel(() => {
|
||||||
|
// console.log('Cancel')
|
||||||
|
}).onDismiss(() => {
|
||||||
|
// console.log('I am triggered on both OK and Cancel')
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ld.canProcess = true
|
||||||
|
|
||||||
|
Object.keys(res.data.Data).forEach(k => {
|
||||||
|
tmpl[k] = res.data.Data[k]
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (k !== 'alanlar') {
|
||||||
|
tmpl[k] = res.data.Data[k]
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
})
|
||||||
|
//tmpl.rawData = new Uint8Array(res.data.Data.rawData)
|
||||||
|
//workbook = read(tmpl.rawData)
|
||||||
|
|
||||||
|
Object.keys(tmpl.kriterler).forEach(k => {
|
||||||
|
tmpl.kriterler[k].valFields.forEach(f => {
|
||||||
|
ld.alreadySelectedValFields[f] = 'x'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
} else {
|
||||||
|
showAxiosError()
|
||||||
|
}
|
||||||
|
}).catch(err => {
|
||||||
|
catchAxiosError(err)
|
||||||
|
}).finally(() => {
|
||||||
|
$q.loading.hide()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadFile = function () {
|
||||||
|
const reader = new FileReader()
|
||||||
|
/*
|
||||||
|
reader.addEventListener('load', (event) => {
|
||||||
|
console.log(event.target.result)
|
||||||
|
});
|
||||||
|
reader.readAsDataURL(ld.xlsFile);
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
$q.loading.show()
|
||||||
|
reader.onload = function (e) {
|
||||||
|
const uin = new Uint8Array(e.target.result)
|
||||||
|
readXLS(uin)
|
||||||
|
$q.loading.hide()
|
||||||
|
}
|
||||||
|
|
||||||
|
reader.readAsArrayBuffer(ld.xlsFileName)
|
||||||
|
}
|
||||||
|
|
||||||
|
const readXLS = function (inb) {
|
||||||
|
const workbook = read(inb)
|
||||||
|
const sheet = workbook.Sheets[workbook.SheetNames[0]]
|
||||||
|
const rawData = utils.sheet_to_json(sheet, { header: 1 })
|
||||||
|
|
||||||
|
const bordro = []
|
||||||
|
|
||||||
|
rawData.forEach((row, ndx) => {
|
||||||
|
if (ndx <= tmpl.baslikSatiri - 1 + tmpl.baslikSatirAdedi) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
const kval = row[tmpl.kontrolKolonu]
|
||||||
|
if ((kval !== null) && (kval !== undefined) && (kval !== '')) {
|
||||||
|
|
||||||
|
const bordroRow = {}
|
||||||
|
|
||||||
|
// sabit alanları verelim
|
||||||
|
tmpl.alanlar.filter(a=>{return a.showInSlip}).forEach(a=>{
|
||||||
|
bordroRow[a.fieldName] = row[a.colNro]
|
||||||
|
})
|
||||||
|
|
||||||
|
// 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]
|
||||||
|
const kriterVal = row[kriter.colNro]
|
||||||
|
const map = kriter.mappings[kriterVal]
|
||||||
|
const tmpHesapKod = map[veri.fieldName]
|
||||||
|
if (tmpHesapKod) {
|
||||||
|
hesapKod = tmpHesapKod
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
bordroRow['Hesap'] = hesapKod
|
||||||
|
bordroRow['Tutar'] = row[veri.colNro]
|
||||||
|
bordroRow['B/A'] = veri.ba
|
||||||
|
|
||||||
|
bordro.push({...bordroRow})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const newSheet = utils.json_to_sheet(bordro)
|
||||||
|
const newWB = utils.book_new()
|
||||||
|
utils.book_append_sheet(newWB, newSheet, "veri")
|
||||||
|
writeFile(newWB, "bordro.xlsx", { compression: true })
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
520
ui/src/pages/tmpl.vue
Normal file
520
ui/src/pages/tmpl.vue
Normal file
@@ -0,0 +1,520 @@
|
|||||||
|
<template>
|
||||||
|
<q-page padding>
|
||||||
|
<m-edit-header
|
||||||
|
title="Şablon Tasarımı"
|
||||||
|
:show-save-cancel="ld.isDirty"
|
||||||
|
@save="save"
|
||||||
|
@cancel="cancel"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<q-card>
|
||||||
|
<q-card-section>
|
||||||
|
<q-select v-model="ld.companyID"
|
||||||
|
map-options
|
||||||
|
emit-value
|
||||||
|
:label="t('selectCompany')"
|
||||||
|
:options="ld.companies"
|
||||||
|
option-value="ID"
|
||||||
|
option-label="Title"
|
||||||
|
dense
|
||||||
|
options-dense
|
||||||
|
outlined
|
||||||
|
bg-color="white"
|
||||||
|
@update:model-value="load"
|
||||||
|
>
|
||||||
|
<template v-slot:after>
|
||||||
|
<q-btn
|
||||||
|
flat
|
||||||
|
icon="business"
|
||||||
|
dense
|
||||||
|
size="sm"
|
||||||
|
color="white"
|
||||||
|
to="/company/new"
|
||||||
|
>
|
||||||
|
<q-tooltip>{{ t('createCompany') }}</q-tooltip>
|
||||||
|
</q-btn>
|
||||||
|
</template>
|
||||||
|
</q-select>
|
||||||
|
</q-card-section>
|
||||||
|
|
||||||
|
<q-card-section v-if="ld.companyID" class="">
|
||||||
|
<div class="row q-gutter-y-sm q-col-gutter-md">
|
||||||
|
<q-file
|
||||||
|
dense
|
||||||
|
class="col-12"
|
||||||
|
v-model="ld.xlsFileName"
|
||||||
|
@update:model-value="loadFile"
|
||||||
|
label="Bordro Dosyası"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<q-select
|
||||||
|
class="col-3"
|
||||||
|
v-model="tmpl.bordroSheet"
|
||||||
|
:options="tmpl.sheets"
|
||||||
|
label="Bordro Sayfası"
|
||||||
|
dense
|
||||||
|
/>
|
||||||
|
<q-input
|
||||||
|
class="col-3"
|
||||||
|
dense
|
||||||
|
v-model.number="tmpl.baslikSatiri"
|
||||||
|
label="Başlık Satır No"
|
||||||
|
/>
|
||||||
|
<q-input
|
||||||
|
class="col-3"
|
||||||
|
dense
|
||||||
|
v-model.number="tmpl.baslikSatirAdedi"
|
||||||
|
label="Başlık Satır Adedi"
|
||||||
|
/>
|
||||||
|
<div class="col-3 flex justify-center">
|
||||||
|
<q-btn label="Dosya Analizi"
|
||||||
|
no-caps
|
||||||
|
@click="processXLS"
|
||||||
|
:disable="tmpl.bordroSheet === ''"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</q-card-section>
|
||||||
|
|
||||||
|
<q-card-section v-if="ld.showFields">
|
||||||
|
<q-list bordered class="rounded-borders">
|
||||||
|
|
||||||
|
<q-expansion-item
|
||||||
|
expand-separator
|
||||||
|
label="Alan Tanımları"
|
||||||
|
switch-toggle-side
|
||||||
|
header-class="text-h6 text-pcolor1"
|
||||||
|
default-opened
|
||||||
|
>
|
||||||
|
<q-markup-table flat bordered>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Kolon No</th>
|
||||||
|
<th>Alan</th>
|
||||||
|
<th>Kontrol</th>
|
||||||
|
<th>Fişte Göster</th>
|
||||||
|
<th>Tip</th>
|
||||||
|
<th>B/A</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr v-for="r in tmpl.alanlar" :key="r.fieldName">
|
||||||
|
<td class="text-center" style="width: 70px;">{{ r.colNro }}</td>
|
||||||
|
<td>{{ r.fieldName }}</td>
|
||||||
|
<td class="text-center" style="width: 70px;">
|
||||||
|
<q-radio
|
||||||
|
v-model.number="tmpl.kontrolKolonu"
|
||||||
|
:val="r.colNro"
|
||||||
|
@update:model-value="ld.isDirty = true"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td class="text-center" style="width: 70px;">
|
||||||
|
<q-checkbox
|
||||||
|
v-model="r.showInSlip"
|
||||||
|
@update:model-value="ld.isDirty = true"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<q-select
|
||||||
|
dense
|
||||||
|
v-model="r.colType" :options="['', 'kriter', 'veri']"
|
||||||
|
@update:model-value="ld.isDirty = true"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<q-select
|
||||||
|
dense
|
||||||
|
v-model="r.ba" :options="['B', 'A']"
|
||||||
|
v-if="r.colType === 'veri'"
|
||||||
|
@update:model-value="ld.isDirty = true"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</q-markup-table>
|
||||||
|
|
||||||
|
</q-expansion-item>
|
||||||
|
</q-list>
|
||||||
|
|
||||||
|
</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">
|
||||||
|
Kriter Hesap Atamaları
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<q-list bordered class="rounded-borders">
|
||||||
|
<q-expansion-item
|
||||||
|
v-for="(v, k) in tmpl.kriterler" :key="k"
|
||||||
|
expand-separator
|
||||||
|
:label="k"
|
||||||
|
switch-toggle-side
|
||||||
|
>
|
||||||
|
<q-markup-table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td class="text-weight-bolder">
|
||||||
|
Değer
|
||||||
|
<q-btn
|
||||||
|
flat
|
||||||
|
icon="add"
|
||||||
|
dense
|
||||||
|
color="positive"
|
||||||
|
/>
|
||||||
|
<q-popup-edit
|
||||||
|
v-model="ld.selectedVal"
|
||||||
|
buttons
|
||||||
|
v-slot="scope"
|
||||||
|
@update:modelValue="addMapping(k)"
|
||||||
|
>
|
||||||
|
<q-select
|
||||||
|
v-model="scope.value"
|
||||||
|
:options="valFielOptions"
|
||||||
|
dense
|
||||||
|
autofocus
|
||||||
|
counter
|
||||||
|
@keyup.enter="scope.set"/>
|
||||||
|
</q-popup-edit>
|
||||||
|
</td>
|
||||||
|
<td v-for="f in v.valFields" :key="f">
|
||||||
|
{{ f }}
|
||||||
|
<q-btn
|
||||||
|
flat
|
||||||
|
icon="delete"
|
||||||
|
dense
|
||||||
|
color="negative"
|
||||||
|
@click="delMapping(k, f)"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr v-for="(kv, kk) in v.mappings" :key="kk">
|
||||||
|
<td>{{ kk }}</td>
|
||||||
|
<td v-for="f in v.valFields" :key="f">
|
||||||
|
<q-input
|
||||||
|
v-model="kv[f]"
|
||||||
|
dense
|
||||||
|
@update:modelValue="ld.isDirty=true"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<td>
|
||||||
|
<q-input
|
||||||
|
v-model="kv.code01"
|
||||||
|
dense
|
||||||
|
@update:modelValue="ld.isDirty=true"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</q-markup-table>
|
||||||
|
</q-expansion-item>
|
||||||
|
</q-list>
|
||||||
|
|
||||||
|
</q-card-section>
|
||||||
|
|
||||||
|
</q-card>
|
||||||
|
</q-page>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { computed, onMounted, reactive, toRaw } from 'vue'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
import { api } from 'boot/axios'
|
||||||
|
import { catchAxiosError, showAxiosError } from 'src/libjs/lib/axios'
|
||||||
|
import MEditHeader from 'src/libjs/comp/MEditHeader.vue'
|
||||||
|
import { read, utils } from 'xlsx'
|
||||||
|
import { useQuasar } from 'quasar'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
const $q = useQuasar()
|
||||||
|
|
||||||
|
const ld = reactive({
|
||||||
|
companyID: null,
|
||||||
|
companies: [],
|
||||||
|
isDirty: false,
|
||||||
|
xlsFileName: null,
|
||||||
|
selectedVal: '',
|
||||||
|
alreadySelectedValFields: {},
|
||||||
|
|
||||||
|
showFields: false,
|
||||||
|
})
|
||||||
|
|
||||||
|
const tmpl = reactive({
|
||||||
|
rawData: null,
|
||||||
|
sheets: [],
|
||||||
|
bordroSheet: '',
|
||||||
|
|
||||||
|
baslikSatiri: 7,
|
||||||
|
baslikSatirAdedi: 2,
|
||||||
|
|
||||||
|
kontrolKolonu: -1,
|
||||||
|
|
||||||
|
alanlar: [],
|
||||||
|
kriterler: {},
|
||||||
|
})
|
||||||
|
|
||||||
|
let workbook = null
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
getCompanyList()
|
||||||
|
})
|
||||||
|
|
||||||
|
const valFielOptions = computed(() => {
|
||||||
|
const ls = tmpl.alanlar.filter(f => {return f.colType === 'veri'})
|
||||||
|
const opts = []
|
||||||
|
ls.forEach(f => {
|
||||||
|
|
||||||
|
if (!ld.alreadySelectedValFields.hasOwnProperty(f.fieldName)) {
|
||||||
|
opts.push(f.fieldName)
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
return opts
|
||||||
|
})
|
||||||
|
|
||||||
|
const getCompanyList = function () {
|
||||||
|
api.get('/sy/companies').then(res => {
|
||||||
|
if (res.data.Success) {
|
||||||
|
ld.companies = res.data.Data || []
|
||||||
|
} else {
|
||||||
|
showAxiosError(res)
|
||||||
|
}
|
||||||
|
}).catch(err => {
|
||||||
|
catchAxiosError(err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const save = function () {
|
||||||
|
$q.loading.show()
|
||||||
|
api.post(`/tmpl/${ld.companyID}`, toRaw(tmpl)).then(res => {
|
||||||
|
if (res.data.Success) {
|
||||||
|
ld.isDirty = false
|
||||||
|
} else {
|
||||||
|
showAxiosError()
|
||||||
|
}
|
||||||
|
}).catch(err => {
|
||||||
|
catchAxiosError(err)
|
||||||
|
}).finally(() => {
|
||||||
|
$q.loading.hide()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const load = function () {
|
||||||
|
Object.keys(ld.alreadySelectedValFields).forEach(k => {
|
||||||
|
delete ld.alreadySelectedValFields[k]
|
||||||
|
})
|
||||||
|
|
||||||
|
Object.keys(tmpl.kriterler).forEach(k => {
|
||||||
|
delete tmpl.kriterler[k]
|
||||||
|
})
|
||||||
|
tmpl.sheets.splice(0)
|
||||||
|
tmpl.alanlar.splice(0)
|
||||||
|
tmpl.bordroSheet = ''
|
||||||
|
|
||||||
|
$q.loading.show()
|
||||||
|
api.get(`/tmpl/${ld.companyID}`).then(res => {
|
||||||
|
if (res.data.Success) {
|
||||||
|
if (res.data.Data === null) {
|
||||||
|
ld.showFields = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ld.isDirty = false
|
||||||
|
ld.showFields = true
|
||||||
|
|
||||||
|
Object.keys(res.data.Data).forEach(k => {
|
||||||
|
tmpl[k] = res.data.Data[k]
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (k !== 'alanlar') {
|
||||||
|
tmpl[k] = res.data.Data[k]
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
})
|
||||||
|
//tmpl.rawData = new Uint8Array(res.data.Data.rawData)
|
||||||
|
//workbook = read(tmpl.rawData)
|
||||||
|
|
||||||
|
Object.keys(tmpl.kriterler).forEach(k => {
|
||||||
|
tmpl.kriterler[k].valFields.forEach(f => {
|
||||||
|
ld.alreadySelectedValFields[f] = 'x'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
} else {
|
||||||
|
showAxiosError()
|
||||||
|
}
|
||||||
|
}).catch(err => {
|
||||||
|
catchAxiosError(err)
|
||||||
|
}).finally(() => {
|
||||||
|
$q.loading.hide()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadFile = function () {
|
||||||
|
const reader = new FileReader()
|
||||||
|
/*
|
||||||
|
reader.addEventListener('load', (event) => {
|
||||||
|
console.log(event.target.result)
|
||||||
|
});
|
||||||
|
reader.readAsDataURL(ld.xlsFile);
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
reader.onload = function (e) {
|
||||||
|
const uin = new Uint8Array(e.target.result)
|
||||||
|
readXLS(uin)
|
||||||
|
}
|
||||||
|
|
||||||
|
reader.readAsArrayBuffer(ld.xlsFileName)
|
||||||
|
}
|
||||||
|
|
||||||
|
const readXLS = function (inb) {
|
||||||
|
tmpl.sheets.splice(0)
|
||||||
|
tmpl.bordroSheet = ''
|
||||||
|
|
||||||
|
workbook = read(inb)
|
||||||
|
tmpl.sheets.push(...workbook.SheetNames)
|
||||||
|
}
|
||||||
|
|
||||||
|
const processXLS = function () {
|
||||||
|
const sheet = workbook.Sheets[tmpl.bordroSheet]
|
||||||
|
tmpl.rawData = utils.sheet_to_json(sheet, { header: 1 })
|
||||||
|
|
||||||
|
tmpl.alanlar.splice(0)
|
||||||
|
|
||||||
|
let lastCol = -1
|
||||||
|
tmpl.rawData[tmpl.baslikSatiri - 1].forEach((val, ndx) => {
|
||||||
|
|
||||||
|
//başlık olmayan kolonlar
|
||||||
|
if (ndx - lastCol > 1) {
|
||||||
|
for (let j = 1; j < ndx - lastCol; j++) {
|
||||||
|
tmpl.alanlar.push({
|
||||||
|
colNro: lastCol + 1,
|
||||||
|
fieldName: `Kolon ${lastCol + 2}`,
|
||||||
|
colType: '',
|
||||||
|
ba: 'B',
|
||||||
|
showInSlip: false,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let name = val
|
||||||
|
|
||||||
|
for (let j = 1; j < tmpl.baslikSatirAdedi; j++) {
|
||||||
|
let addiVal = tmpl.rawData[tmpl.baslikSatiri - 1 + j][ndx]
|
||||||
|
if (!addiVal) {
|
||||||
|
addiVal = ''
|
||||||
|
}
|
||||||
|
name = name + ' ' + addiVal
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpl.alanlar.push({
|
||||||
|
colNro: ndx,
|
||||||
|
fieldName: name,
|
||||||
|
showInSlip: false,
|
||||||
|
colType: '',
|
||||||
|
ba: 'B',
|
||||||
|
})
|
||||||
|
|
||||||
|
lastCol = ndx
|
||||||
|
})
|
||||||
|
|
||||||
|
ld.showFields = true
|
||||||
|
}
|
||||||
|
|
||||||
|
const fillCriteria = function () {
|
||||||
|
ld.isDirty = true
|
||||||
|
// kriterleri temizleyelim
|
||||||
|
Object.keys(ld.alreadySelectedValFields).forEach(k => {
|
||||||
|
delete ld.alreadySelectedValFields[k]
|
||||||
|
})
|
||||||
|
tmpl.kriterler = {}
|
||||||
|
|
||||||
|
// kriter alanlarını bulup boş kriter nesnelerini oluşturalım
|
||||||
|
const kriterCols = []
|
||||||
|
tmpl.alanlar.filter(f => {return f.colType === 'kriter'}).forEach(f => {
|
||||||
|
tmpl.kriterler[f.fieldName] = {
|
||||||
|
colNro: f.colNro,
|
||||||
|
|
||||||
|
valFields: [],
|
||||||
|
/*
|
||||||
|
[
|
||||||
|
{fieldName: 'xxx', colNro: 3}
|
||||||
|
{fieldName: 'yyy', colNro: 4}
|
||||||
|
]
|
||||||
|
*/
|
||||||
|
|
||||||
|
mappings: {},
|
||||||
|
/*
|
||||||
|
mapping['kriter1'] = {xxx: 770.01.001, yyy: 770.01.002}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
kriterCols.push(f.fieldName)
|
||||||
|
})
|
||||||
|
|
||||||
|
tmpl.rawData.forEach((row, ndx) => {
|
||||||
|
if (ndx <= tmpl.baslikSatiri - 1 + tmpl.baslikSatirAdedi) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
const kval = row[tmpl.kontrolKolonu]
|
||||||
|
if ((kval !== null) && (kval !== undefined) && (kval !== '')) {
|
||||||
|
Object.keys(tmpl.kriterler).forEach(k => {
|
||||||
|
const kriterVal = row[tmpl.kriterler[k].colNro]
|
||||||
|
if ((kriterVal !== null) && (kriterVal !== undefined) && (kriterVal !== '')) {
|
||||||
|
tmpl.kriterler[k].mappings[kriterVal] = {}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const addMapping = function (k) {
|
||||||
|
ld.isDirty = true
|
||||||
|
ld.alreadySelectedValFields[ld.selectedVal] = ''
|
||||||
|
tmpl.kriterler[k].valFields.push(ld.selectedVal)
|
||||||
|
Object.keys(tmpl.kriterler[k].mappings).forEach(vk => {
|
||||||
|
tmpl.kriterler[k].mappings[vk][ld.selectedVal] = ''
|
||||||
|
})
|
||||||
|
ld.selectedVal = ''
|
||||||
|
}
|
||||||
|
|
||||||
|
const delMapping = function (k, valField) {
|
||||||
|
ld.isDirty = true
|
||||||
|
delete ld.alreadySelectedValFields[valField]
|
||||||
|
|
||||||
|
const index = tmpl.kriterler[k].valFields.indexOf(valField)
|
||||||
|
if (index !== -1) {
|
||||||
|
tmpl.kriterler[k].valFields.splice(index, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.keys(tmpl.kriterler[k].mappings).forEach(vk => {
|
||||||
|
delete tmpl.kriterler[k].mappings[vk][ld.selectedVal]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -14,6 +14,11 @@ const routes = [
|
|||||||
{ path: '/company/edit/:id', component: () => import('pages/company.vue') },
|
{ path: '/company/edit/:id', component: () => import('pages/company.vue') },
|
||||||
{ path: '/company/new', component: () => import('pages/company.vue') },
|
{ path: '/company/new', component: () => import('pages/company.vue') },
|
||||||
// { path: '/company/:id', component: () => import('pages/companyView.vue') },
|
// { path: '/company/:id', component: () => import('pages/companyView.vue') },
|
||||||
|
|
||||||
|
{ path: '/tmpl', component: () => import('pages/tmpl.vue') },
|
||||||
|
{ path: '/map', component: () => import('pages/map.vue') },
|
||||||
|
|
||||||
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -3213,6 +3213,10 @@ wrappy@1:
|
|||||||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||||
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
|
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
|
||||||
|
|
||||||
|
"xlsx@https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz":
|
||||||
|
version "0.20.2"
|
||||||
|
resolved "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz#0f64eeed3f1a46e64724620c3553f2dbd3cd2d7d"
|
||||||
|
|
||||||
xml-name-validator@^4.0.0:
|
xml-name-validator@^4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"
|
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"
|
||||||
|
|||||||
Reference in New Issue
Block a user