43 Commits

Author SHA1 Message Date
95da9eb689 dokuman silme 2025-09-02 14:22:50 +03:00
7379f4ae5e build hataları 2025-09-02 09:44:55 +03:00
847b1c1b37 Merge pull request '- İade tarihi alan key leri değiştirildi' (#11) from Teminat-İade-Seçeneği-Geliştirmesi into main
Reviewed-on: #11
2025-08-25 10:01:27 +00:00
62dbaef278 Merge pull request 'Sayfa-Resim-Silme-Özelliği' (#10) from Sayfa-Resim-Silme-Özelliği into main
Reviewed-on: #10
2025-08-25 10:00:39 +00:00
aae7512498 Merge pull request 'Üye-Doküman-Silme-Özelliği' (#9) from Üye-Doküman-Silme-Özelliği into main
Reviewed-on: #9
2025-08-25 10:00:22 +00:00
75ff9823fe Merge pull request 'Piyango-Resim-Silme-Özelliği' (#8) from Piyango-Resim-Silme-Özelliği into main
Reviewed-on: #8
2025-08-25 09:59:45 +00:00
3b9173b881 Merge pull request 'İzin-Bedel-Orani-CRUD' (#7) from İzin-Bedel-Orani-CRUD into main
Reviewed-on: #7
2025-08-25 09:57:08 +00:00
fb1ddf085a Yardım amaçlı piyangolarda 2. ilan tarihinde min değer max değerden küçük olma durumu için uyarı eklendi 2025-08-18 18:18:37 +03:00
b1274cf3ab Teminar durumu kaydet butonu görünme durumları güncellendi 2025-08-18 18:01:18 +03:00
9650194cb9 development env SOCKET_URL https -> http 2025-08-18 15:21:46 +03:00
9e6c1f3840 izin bedel hatalar düzeltildi ve onay durum logları eklendi 2025-08-15 19:02:15 +03:00
343e93c168 izin bedel oranı crud işlemleri eklendi. 2025-08-15 13:25:29 +03:00
b1c23985ff url fixed 2025-08-15 12:19:08 +03:00
a4358afa11 url fixed 2025-08-14 15:14:20 +03:00
9869edf4a6 url fixed 2025-08-14 15:06:22 +03:00
624b8fae56 url fixed 2025-08-14 15:02:20 +03:00
6c44487489 Merge pull request 'Üye/Profil-Resim-Silme-Özelliği' (#6) from Üye/Profil-Resim-Silme-Özelliği into main
Reviewed-on: #6
2025-08-14 07:10:36 +00:00
7353d957c1 url fixed 2025-08-14 10:08:17 +03:00
915aa1757e Üye dökümanları için silme butonu eklendi 2025-08-13 18:09:25 +03:00
10d95b6763 Üye/Kullanıcı profil resmi silme butonu eklendi 2025-08-13 17:29:10 +03:00
97a77a2a37 Sayfa resmi silme butonu eklendş 2025-08-13 17:17:35 +03:00
2338cf04d8 Piyango Resimleri için silme butonu eklendi. 2025-08-13 16:55:41 +03:00
de3a1f549a buil sonrası html comment taglerinin kaldırılması için config. 2025-08-13 15:51:30 +03:00
b521ad0278 FileListItem sadece resim görünümü birden fazla buton ekleme için düzenleme 2025-08-13 15:24:04 +03:00
7872259102 - İade tarihi alan key leri değiştirildi
- Save ederken sayı kaydedilmiyordu, eklendi
2025-07-30 09:52:26 +03:00
7cff75e82c Socket urlsi env dosyasında tanımlandı 2025-07-30 09:44:00 +03:00
92d0a0dde7 env test, TabPiyangoKatilimciListesi.vue 2025-07-29 16:43:26 +03:00
a4e2a922d3 Merge pull request '- Trash ikonu eklendi' (#5) from Piyango-Doküman-Silme into main
Reviewed-on: #5
2025-07-29 06:53:20 +00:00
190815193a Merge pull request '- Kapsam dışı piyango detayında bazı tablar kaldırıldı' (#4) from Kapsam-Dışı-Piyango-Tab into main
Reviewed-on: #4
2025-07-29 06:51:45 +00:00
26f843416d Merge pull request 'Teminat-İade-Seçeneği-Geliştirmesi' (#3) from Teminat-İade-Seçeneği-Geliştirmesi into main
Reviewed-on: #3
2025-07-29 06:50:48 +00:00
7adabf5abd İzin sonrası iptal durumunda cezai işlem durumu yanlışlıkla aık kalmış 2025-07-28 19:09:24 +03:00
ed8b6fd3eb - Kapsam dışı piyango detayında bazı tablar kaldırıldı
- piyango liste kapsam dışı ise çekiliş tarihi olmayacak
2025-07-28 19:07:55 +03:00
7776e24ddd - Teminat durumu zaman aşımı iade için de ek alanlar açıldı
- iadeSayı alanı eklendi
2025-07-28 18:52:04 +03:00
408724cf67 - dev ve prod için env ayarları yapıldı.
- test sunucusu iin build script eklendi
2025-07-28 17:32:25 +03:00
f4c0511afb - dev ve prod için env ayarları yapıldı.
- test sunucusu iin build script eklendi
2025-07-28 17:14:07 +03:00
7998b7bd6c Merge pull request 'Piyango Teminat iade seçeneği için alanlar eklendi.' (#2) from Teminat-İade-Seçeneği-Geliştirmesi into main
Reviewed-on: #2
2025-07-28 13:51:32 +00:00
6ff319cb1d Merge pull request '- FormDisplay size props eklendi' (#1) from piyango-Id-geliştirmesi into main
Reviewed-on: #1
2025-07-28 13:50:43 +00:00
10011eacd6 site yönetimi sadece süperadmin 2025-07-28 10:15:48 +03:00
36d646e0bf piyangoid 2025-07-25 17:51:18 +03:00
908e63b896 popup liste slider liste 2025-07-25 17:10:36 +03:00
0e130eafff piyango liste piyango id 2025-07-25 16:29:29 +03:00
f6850853b2 - FormDisplay size props eklendi
- PiyangoId alanları eklendi
2025-07-25 06:24:35 +03:00
ff0304b4d9 Piyango Teminat iade seçeneği için alanlar eklendi. 2025-07-25 05:50:27 +03:00
54 changed files with 1533 additions and 419 deletions

2
.env.development Normal file
View File

@ -0,0 +1,2 @@
VITE_API_URL=http://panelapi.cekilisevitest.gov.tr/
VITE_SOCKET_URL=http://panelapi.cekilisevitest.gov.tr/uploadHub

2
.env.localdev Normal file
View File

@ -0,0 +1,2 @@
VITE_API_URL=https://localhost:7241/
VITE_SOCKET_URL=https://localhost:7241/uploadHub

2
.env.production Normal file
View File

@ -0,0 +1,2 @@
VITE_API_URL=https://panelapi.cekilisevi.gov.tr/
VITE_SOCKET_URL=https://panelapi.cekilisevi.gov.tr/uploadHub

7
env.d.ts vendored
View File

@ -1,2 +1,9 @@
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_API_URL: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}

View File

@ -5,9 +5,12 @@
"type": "module",
"scripts": {
"dev": "vite",
"localdev": "vite",
"build": "run-p type-check \"build-only {@}\" --",
"buildtest": "run-p type-check \"build-only-test {@}\" --",
"preview": "vite preview",
"build-only": "vite build",
"build-only-test": "vite build --mode development",
"type-check": "vue-tsc --build --force"
},
"dependencies": {

View File

@ -659,7 +659,9 @@ svg {
max-width: 24px;
max-height: 24px;
}
.ico-c.ico-btn:hover{
background-color: navy;
}
/* colors */
.back-grad {
padding: 6px 8px;
@ -715,7 +717,11 @@ svg {
color: #000;
padding: 12px;
}
.back-grad-dgrey {
background-image: linear-gradient(24deg, #797979, #a1a1a1);
color: #000;
padding: 12px;
}
.back-grey {
background-color: #f1f1f1;
}

View File

@ -21,7 +21,7 @@
<div class="actions-c" v-if="editable || $slots.actionButtons">
<slot name="actionButtons"></slot>
<i
class="ico-c ico-section ico-section-header-btn ico-replace"
class="ico-c ico-section ico-btn back-grad-dgrey"
@click="OnClick"
v-if="editable">
<svg><use href="/src/assets/images/icons.svg#replace"></use></svg>
@ -38,12 +38,15 @@
</div>
<div v-else>{{ fileType.toLocaleUpperCase() }}</div>
</a>
<i
class="ico-c ico-section ico-section-header-btn ico-replace"
@click="OnClick"
v-if="editable">
<svg><use href="/src/assets/images/icons.svg#replace"></use></svg>
</i>
<div class="actions-c actions-top" v-if="editable || $slots.actionButtons">
<slot name="actionButtons"></slot>
<i
class="ico-c ico-section ico-btn back-grad-dgrey"
@click="OnClick"
v-if="editable">
<svg><use href="/src/assets/images/icons.svg#replace"></use></svg>
</i>
</div>
</div>
</template>
</template>
@ -114,4 +117,14 @@
align-items: center;
pointer-events: fill;
}
.actions-c.actions-top{
align-items: flex-start;
}
.form-item-picture.only-image{
width: 140px;
height: 140px;
}
.actions-c .ico-btn:last-child {
margin-right: 0;
}
</style>

View File

@ -14,7 +14,9 @@
</span>
<template v-if="modelText !== undefined && modelText !== ''">
<template v-if="typeof modelText === 'string'">
<span>{{ price ? globalStore.toTrLocale(modelText) : modelText }}</span>
<span :class="[size ? 'form-item-size form-item-size-' + size : '']">
{{ price ? globalStore.toTrLocale(modelText) : modelText }}
</span>
</template>
<template v-if="typeof modelText === 'object'">
<ul>
@ -25,7 +27,9 @@
</template>
</template>
<template v-else>
<span>{{ price ? globalStore.toTrLocale(localValue) : localValue }}</span>
<span :class="[size ? 'form-item-size form-item-size-' + size : '']">
{{ price ? globalStore.toTrLocale(localValue) : localValue }}
</span>
</template>
<span
class="form-item-alert"
@ -64,6 +68,7 @@
modelText?: any
invalidText?: string
price?: boolean
size?: number | string
}
const props = withDefaults(defineProps<Props>(), {
half: false,
@ -71,13 +76,23 @@
})
const localValue = ref<any>(props.modelValue)
if (props.type === 'date' && props.modelValue !== null && props.modelValue !== undefined && props.modelValue !== '')
if (
props.type === 'date' &&
props.modelValue !== null &&
props.modelValue !== undefined &&
props.modelValue !== ''
)
localValue.value = dateStore.dateFormat({
date: props.modelValue as Date,
pattern: 'dd-mm-yy'
})
if (props.type === 'datetime' && props.modelValue !== null && props.modelValue !== undefined && props.modelValue !== '')
if (
props.type === 'datetime' &&
props.modelValue !== null &&
props.modelValue !== undefined &&
props.modelValue !== ''
)
localValue.value = dateStore.dateFormat({
date: props.modelValue as Date,
pattern: 'dd-mm-yy-t'
@ -108,3 +123,14 @@
}
)
</script>
<style scoped>
.form-item-size {
font-weight: 600;
}
.form-item-size-1 {
font-size: 1.2em;
}
.form-item-size-2 {
font-size: 1.5em;
}
</style>

View File

@ -2,7 +2,7 @@ import axios from 'axios'
import { useUsersStore } from '@/stores/usersStore'
import router from '@/router'
axios.defaults.baseURL = 'https://panelapi.cekilisevi.gov.tr/'
axios.defaults.baseURL = import.meta.env.VITE_API_URL
//axios.defaults.timeout = 2000;
axios.defaults.headers['Content-Type'] = 'application/json; charset=utf-8'
import { useDataStore } from '@/stores/dataStore'

View File

@ -109,7 +109,7 @@
{
title: 'Site Yönetimi',
ico: 'sitemanagement',
show: usersStore.isPanelUser && !usersStore.isAccounting,
show: usersStore.isSuperAdmin,
sub: [
{
title: 'Yeni Sayfa',
@ -142,6 +142,10 @@
title: 'Piyango Listesi',
to: '/muhasebe/piyango-listesi'
},
{
title: 'İzin Bedel Oranı',
to: '/muhasebe/izin-bedel-orani'
},
{
title: 'Ayarlar',
to: '/muhasebe/ayarlar'

View File

@ -57,7 +57,7 @@
<panel-katilimci-document />
</template>
<template #footerButton>
<button class="button-c button-save" @click="FileUpload">Yükle</button>
<button class="button-c button-save" @click="FileUpload" :disabled="uploadProgressPanel">Yükle</button>
</template>
</panel-wrapper>
<panel-wrapper
@ -315,10 +315,11 @@
headers: { 'Content-Type': 'multipart/form-data' }
}
)
if (response.data !== 'errorfalse') {
console.log('excel response',response)
if (response !== 'errorfalse') {
// Başarı işlemi zaten onCompleted içinde yapıldı
} else {
// Hata olursa paneli kapat
uploadProgressPanel.value = false
}

View File

@ -8,6 +8,11 @@
<form-piyango-onay-kisiler />
</div>
</!--div-->
<div class="form-inner-content">
<div class="form-part">
<form-piyango-onay-durum />
</div>
</div>
<div class="form-inner-content">
<div class="form-part">
<form-piyango-onay-log />
@ -16,6 +21,7 @@
</div>
</template>
<script setup lang="ts">
import FormPiyangoOnayDurum from './form/FormPiyangoOnayDurum.vue'
import FormPiyangoOnayLog from './form/FormPiyangoOnayLog.vue'
import FormPiyangoOnay from './form/FormPiyangoOnay.vue'
import FormPiyangoOnayKisiler from './form/FormPiyangoOnayKisiler.vue'

View File

@ -10,7 +10,7 @@
</div>
<div class="form-inner-content">
<div class="form-part">
<form-piyango-onay-log />
<form-piyango-onay-durum />
</div>
</div>
</div>
@ -19,6 +19,6 @@
import { usePiyangoStore } from '../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import FormPiyangoOnayLog from './form/FormPiyangoOnayLog.vue'
import FormPiyangoOnayDurum from './form/FormPiyangoOnayDurum.vue'
import FormPiyangoUserOnayaGonder from './form/FormPiyangoUserOnayaGonder.vue'
</script>

View File

@ -22,13 +22,20 @@
v-if="
usersStore.isPanelUser ||
(!usersStore.isPanelUser &&
piyangoStore.lotteryApprove !== 0 &&
piyangoStore.lotteryApprove !== 1 &&
piyangoStore.lotteryApprove !== 2 &&
piyangoStore.lotteryApprove !== 3 &&
!piyangoTeminatStore.isNew)
" />
<panel-piyango-teminat-durumu
v-if="
!usersStore.isPanelUser &&
(piyangoStore.lotteryApprove === 3 || piyangoTeminatStore.isNew)
(piyangoStore.lotteryApprove === 0 ||
piyangoStore.lotteryApprove === 1 ||
piyangoStore.lotteryApprove === 2 ||
piyangoStore.lotteryApprove === 3 ||
piyangoTeminatStore.isNew)
" />
</template>
<template #footerButton>
@ -36,14 +43,22 @@
class="button-c button-save"
:disabled="!piyangoTeminatValidationStore.formChanged"
@click="piyangoTeminatService.SaveTeminatDurum"
v-if="piyangoTeminatStore.isNew || usersStore.isPanelUser">
v-if="
usersStore.isPanelUser ||
(!usersStore.isPanelUser &&
(piyangoStore.lotteryApprove === 0 ||
piyangoStore.lotteryApprove === 1 ||
piyangoStore.lotteryApprove === 2 ||
piyangoStore.lotteryApprove === 3)) ||
piyangoTeminatStore.isNew
">
Kaydet
</button>
</template>
</panel-wrapper>
</template>
<script setup lang="ts">
import { ref, computed,onBeforeMount } from 'vue'
import { ref, computed, onBeforeMount } from 'vue'
import PanelWrapper from '@/components/PanelWrapper.vue'
import PanelPiyangoTeminatDurumu from './panel/PanelPiyangoTeminatDurumu.vue'
@ -143,10 +158,7 @@
])
const teminatAddAction = computed(() => {
if (
!usersStore.isPanelUser
)
return NewTeminatDurum
if (!usersStore.isPanelUser) return NewTeminatDurum
else return ''
})

View File

@ -84,7 +84,7 @@
Başvuru admin tarafından kapsam dışı olarak işaretlenmiştir.
</template>
</div>
<div class="form-inner-comment alert-d" v-if="piyangoStore.lotteryApprove === 11">
<div class="form-inner-comment alert-d" v-if="piyangoStore.lotteryApprove === 13">
Kampanya için cezai işlem uygulanmıştır.
</div>
</template>

View File

@ -3,6 +3,10 @@
<lottery-states
:piyangoAmac="piyangoStore.lotteryData.amacpiyangoId"
v-if="!isPreview" />
<form-display
v-model="piyangoStore.lotteryData.piyangoId"
label="Piyango ID"
size="1" />
<template
v-if="
usersStore.isPanelUser &&

View File

@ -63,7 +63,7 @@
}
const DeleteDocument = async (id: number | string) => {
var dt = await dataStore.dataDelete('Popup/' + id)
var dt = await dataStore.dataDelete('Dokuman/' + id)
if (dt !== 'errorfalse') {
dialogStore.CloseDialog('deletedoc')

View File

@ -9,9 +9,19 @@
:data="file"
onlyPreview
:editable="false"
:filePath="file.resimYolu" />
:filePath="file.resimYolu">
<template #actionButtons v-if="usersStore.isPanelUser">
<i
class="ico-c ico-btn ico-section back-grad-alert"
@click="DeleteImagePop(file)">
<svg><use href="/src/assets/images/icons.svg#trash"></use></svg>
</i>
</template>
</file-list-item>
</template>
<div v-if="usersStore.isPanelUser && fileList.length === 0" class="form-inner-comment">
<div
v-if="usersStore.isPanelUser && fileList.length === 0"
class="form-inner-comment">
Eklenmiş resim bulunamadı.
</div>
</div>
@ -26,13 +36,43 @@
const usersStore = useUsersStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import { useDialogStore } from '@/components/global/dialogStore'
const dialogStore = useDialogStore()
const fileList = ref<Record<string,any>[]>([])
const fileList = ref<Record<string, any>[]>([])
const GetData = async () => {
let dt = await dataStore.dataGet('CekilisResim/Cekilis/' + piyangoStore.selectedLottery)
let dt = await dataStore.dataGet(
'CekilisResim/Cekilis/' + piyangoStore.selectedLottery
)
if (dt !== 'errorfalse') fileList.value.splice(0, fileList.value.length, ...dt.data)
}
const DeleteImagePop = (data: Record<string, any>) => {
dialogStore.CreateDialog({
title: 'Resim Sil',
id: 'deleteimage',
content: 'Resimi silmek istediğinize emin misiniz? Bu işlem geri alınamaz.',
closeText: 'Vazgeç',
buttons: [
{
label: 'Resmi Sil',
type: 'alert',
function: () => DeleteImage(data.id)
}
]
})
}
const DeleteImage = async (id: number | string) => {
var dt = await dataStore.dataDelete('CekilisResim/' + id)
if (dt !== 'errorfalse') {
dialogStore.CloseDialog('deleteimage')
await GetData()
}
}
onBeforeMount(async () => {
await GetData()
})

View File

@ -1,102 +0,0 @@
<template>
<div class="form-part form-title" v-if="usersStore.isPanelUser">
<div class="form-title-buttons">
<button
class="button-c button-save"
@click="piyangoTeminatService.SaveTeminatDurum"
:disabled="!piyangoTeminatValidationStore.formChanged">
Kaydet
</button>
<button
v-if="piyangoTeminatValidationStore.formChanged"
class="button-c button-cancel panel-close"
@click="piyangoTeminatStore.ResetFormData">
Vazgeç
</button>
</div>
</div>
<div :class="['form-part', piyangoTeminatValidationStore.formChanged ? 'changed' : '']"> <div
class="form-part-content"
v-if="piyangoTeminatStore.loaded">
<form-select
v-if="usersStore.isPanelUser"
label="İşlem"
:listData="piyangoDataStore.piyangoTeminatDurumlari"
listText="value"
listVal="id"
v-model="piyangoTeminatStore.piyangoTeminatFormData.state"
required
:invalidText="piyangoTeminatValidationStore.invalidTexts.state"
@change="OnKeyup" />
<form-display
v-model="piyangoTeminatStore.piyangoTeminatFormData.amount"
half
label="Tutarı" />
<form-display
v-model="piyangoTeminatStore.piyangoTeminatFormData.teminatParentTypeText"
half
label="Para Birimi" />
<form-display
label="Teminat Türü"
half
v-model="piyangoTeminatStore.piyangoTeminatFormData.teminantChildTypeText" />
<form-display
type="date"
half
v-model="piyangoTeminatStore.piyangoTeminatFormData.teminantDate"
label="Tarih" />
<form-display
v-model="piyangoTeminatStore.piyangoTeminatFormData.teminantNo"
half
label="No" />
<div class="form-item form-item-half"></div>
<form-display
v-model="piyangoTeminatStore.piyangoTeminatFormData.bankName"
half
label="Banka Adı" />
<form-display
v-model="piyangoTeminatStore.piyangoTeminatFormData.bankBranch"
half
label="Banka Şubesi" />
<!--form-display
label="İşlem"
v-model="piyangoTeminatStore.piyangoTeminatFormData.stateText" /-->
<file-list-item
title="Dosya"
:data="piyangoTeminatStore.piyangoTeminatFormData"
:editable="false"
:filePath="piyangoTeminatStore.piyangoTeminatFormData.teminantDocumentUrl"
:usePath="true"
:onlyPreview="true" />
<form-display
v-model="piyangoTeminatStore.piyangoTeminatFormData.description"
label="Açıklama" />
</div></div>
</template>
<script setup lang="ts">
import { usePiyangoTeminatStore } from '../../stores/piyangoTeminatStore'
const piyangoTeminatStore = usePiyangoTeminatStore()
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { usePiyangoDataStore } from '../../stores/piyangoDataStore'
const piyangoDataStore = usePiyangoDataStore()
import { usePiyangoTeminatValidationStore } from '../../validation/piyangoTeminatValidationStore'
const piyangoTeminatValidationStore = usePiyangoTeminatValidationStore()
import { usePiyangoTeminatService } from '../../service/piyangoTeminatService'
const piyangoTeminatService = usePiyangoTeminatService()
const OnKeyup = () => {
piyangoTeminatValidationStore.formChanged = true
}
</script>

View File

@ -23,6 +23,13 @@
<strong style="font-size: 10pt; margin-bottom: 12px">
PİYANGO İLE İLGİLİ BİLGİLER
</strong>
<br />
<br />
<strong style="font-size: 10pt; margin-bottom: 12px">
PİYANGO ID: {{ piyangoStore.lotteryData.piyangoId }}
</strong>
<br />
<br />
<table
cellspacing="0"
class="table-no-line"

View File

@ -12,6 +12,12 @@
Bahisler ve Oyunlar Dairesi Başkanlığına
</strong>
<br />
<br />
<strong style="font-size: 10pt; margin-bottom: 12px">
PİYANGO ID: {{ piyangoStore.lotteryData.piyangoId }}
</strong>
<br />
<br />
<table
cellspacing="0"
class="table-no-line"

View File

@ -31,7 +31,17 @@
</div>
<div class="form-part-content" v-if="loaded">
<lottery-states :piyangoAmac="piyangoStore.lotteryData.amacpiyangoId" />
<template
v-if="
!piyangoStore.isNew &&
piyangoStore.lotteryData.piyangoId !== undefined &&
piyangoStore.lotteryData.piyangoId !== null
">
<form-display
v-model="piyangoStore.lotteryData.piyangoId"
label="Piyango ID"
size="1" />
</template>
<form-input
modelKey="cekilisBaslik"
v-model="piyangoStore.lotteryData.baslik"
@ -602,7 +612,7 @@
let list = await dataStore.dataGet('Auth/userbyuserChildList/' + id)
childUsers.value = list.data.filter((p:Record<string,any>) => {
childUsers.value = list.data.filter((p: Record<string, any>) => {
return p.islemTipId === 4 || p.islemTipi === 'Üyelik Onaylandı'
})

View File

@ -0,0 +1,88 @@
<template>
<list-table-content
v-if="loaded"
:tableHeader="tableHeader"
formTitle="Piyango Onay Durumları"
listText="Kayıt"
:apiList="'OnayDurumu/GetSonOnayDurumlariList/' + piyangoStore.selectedLottery"
apiText="Piyango Onay Log Listesi"
page="form"
:refresh="piyangoOnayStore.refreshList" />
</template>
<script setup lang="ts">
import { ref,onBeforeMount,computed } from 'vue'
import axios from 'axios'
import { useDateStore } from '@/stores/dateStore'
const dateStore = useDateStore()
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
import { usePiyangoOnayStore } from '../../stores/piyangoOnayStore'
const piyangoOnayStore = usePiyangoOnayStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import { usePiyangoDataStore } from '../../stores/piyangoDataStore'
const piyangoDataStore = usePiyangoDataStore()
import { usePiyangoServices } from '../../service/piyangoServices'
const piyangoServices = usePiyangoServices()
const loaded = ref<boolean>(false)
const piyangoOnayDurumlari = computed<Record<string, any>[]>(() => {
return piyangoDataStore.piyangoOnayDurumlari
})
const tableHeader = ref<Record<string, any>[]>([
{
name: 'tarih',
title: 'Tarih',
compute: (v: Record<string, any>): string => {
return v.tarih === null
? ''
: dateStore.dateFormat({ pattern: 'dd-mm-yy', date: v.tarih })
},
sort: true,
filter: {
type: 'date',
range: true
}
},
{
name: 'kisiAdi',
title: 'Kişi',
sort: true,
style: { width: '20%' }
},
{
name: 'onayDurumuIslemTipiAdi',
title: 'İşlem',
sort: true,
filter: {
type: 'select',
data: piyangoOnayDurumlari,
listVal: 'id',
listText: 'tipAdi',
filterId: 'onayDurumuIslemTipiId'
}
},
{
name: 'aciklama',
title: 'Açıklama',
sort: true,
style: { width: '30%' }
},
{
dosyaUrl: 'aciklama',
title: 'Dosya',
computeHtml: (v: Record<string, any>) => {
if (v.dosyaUrl !== null && v.dosyaUrl !== undefined) {
return globalStore.TableCellDocument(v.dosyaUrl)
}
},
style: { width: '20%' }
}
])
onBeforeMount(async () => {
loaded.value = true
})
</script>

View File

@ -4,7 +4,7 @@
:tableHeader="tableHeader"
formTitle="Piyango Onay Logları"
listText="Kayıt"
:apiList="'OnayDurumu/GetSonOnayDurumlariList/' + piyangoStore.selectedLottery"
:apiList="'OnayDurumLog/Cekilis/' + piyangoStore.selectedLottery"
apiText="Piyango Onay Log Listesi"
page="form"
:refresh="piyangoOnayStore.refreshList" />
@ -47,38 +47,24 @@
}
},
{
name: 'kisiAdi',
name: 'islemYapanKullanici.email',
title: 'Kişi',
sort: true,
style: { width: '20%' }
},
{
name: 'onayDurumuIslemTipiAdi',
title: 'İşlem',
sort: true,
filter: {
type: 'select',
data: piyangoOnayDurumlari,
listVal: 'id',
listText: 'tipAdi',
filterId: 'onayDurumuIslemTipiId'
}
name: 'eskiDurum',
title: 'Eski Durum',
},
{
name: 'yeniDurum',
title: 'Yeni Durum',
},
{
name: 'aciklama',
title: 'Açıklama',
sort: true,
style: { width: '30%' }
},
{
dosyaUrl: 'aciklama',
title: 'Dosya',
computeHtml: (v: Record<string, any>) => {
if (v.dosyaUrl !== null && v.dosyaUrl !== undefined) {
return globalStore.TableCellDocument(v.dosyaUrl)
}
},
style: { width: '20%' }
}
])

View File

@ -9,7 +9,17 @@
:data="file"
@click="EditImage"
onlyPreview
:filePath="file.resimYolu" />
:filePath="file.resimYolu">
<template
#actionButtons
v-if="piyangoStore.lotteryApprove === 0 || piyangoStore.lotteryApprove === 3">
<i
class="ico-c ico-btn ico-section back-grad-alert"
@click="DeleteImagePop(file)">
<svg><use href="/src/assets/images/icons.svg#trash"></use></svg>
</i>
</template>
</file-list-item>
</template>
<div
class="form-item form-item-picture clickable"
@ -23,7 +33,9 @@
</i>
</div>
</div>
<div v-if="usersStore.isPanelUser && fileList.length === 0" class="form-inner-comment">
<div
v-if="usersStore.isPanelUser && fileList.length === 0"
class="form-inner-comment">
Eklenmiş resim bulunamadı.
</div>
</div>
@ -57,16 +69,14 @@
const usersStore = useUsersStore()
import { usePiyangoStore } from '../../stores/piyangoStore'
const piyangoStore = usePiyangoStore()
import { useDialogStore } from '@/components/global/dialogStore'
const dialogStore = useDialogStore()
const picturePanel = ref<boolean>(false)
const isUpdate = ref<boolean>(false)
const isFormValid = ref<boolean>(true)
interface IFileList {
[key: string]: any
}
const fileList = ref<IFileList[]>([] as IFileList[])
const fileList = ref<Record<string, any>[]>([])
const AddNewImage = () => {
dataStore.panelData = {
@ -82,7 +92,9 @@
}
const GetData = async () => {
let dt = await dataStore.dataGet('CekilisResim/Cekilis/' + piyangoStore.selectedLottery)
let dt = await dataStore.dataGet(
'CekilisResim/Cekilis/' + piyangoStore.selectedLottery
)
if (dt !== 'errorfalse') fileList.value.splice(0, fileList.value.length, ...dt.data)
}
@ -129,6 +141,30 @@
}
}
}
const DeleteImagePop = (data: Record<string, any>) => {
dialogStore.CreateDialog({
title: 'Resim Sil',
id: 'deleteimage',
content: 'Resimi silmek istediğinize emin misiniz? Bu işlem geri alınamaz.',
closeText: 'Vazgeç',
buttons: [
{
label: 'Resmi Sil',
type: 'alert',
function: () => DeleteImage(data.id)
}
]
})
}
const DeleteImage = async (id: number | string) => {
var dt = await dataStore.dataDelete('CekilisResim/' + id)
if (dt !== 'errorfalse') {
dialogStore.CloseDialog('deleteimage')
await GetData()
}
}
onBeforeMount(async () => {
await GetData()
})

View File

@ -1,135 +0,0 @@
<template>
<div class="form-part form-title">
<div class="form-title-buttons">
<button
class="button-c button-save"
@click="piyangoTeminatService.SaveTeminatDurum"
:disabled="!piyangoTeminatValidationStore.formChanged">
Kaydet
</button>
<button
v-if="piyangoTeminatValidationStore.formChanged"
class="button-c button-cancel panel-close"
@click="piyangoTeminatStore.ResetFormData">
Vazgeç
</button>
</div>
</div>
<div :class="['form-part', piyangoTeminatValidationStore.formChanged ? 'changed' : '']">
<div class="form-part-title">
<h4>Teminat Durumu</h4>
</div>
<div class="form-part-content" v-if="piyangoTeminatStore.loaded">
<form-input
modelKey="amount"
v-model="piyangoTeminatStore.piyangoTeminatFormData.amount"
required
half
label="Tutarı"
minlength="2"
@keyup="OnKeyup"
@keydown="validationStore.allowPrice"
:invalidText="piyangoTeminatValidationStore.invalidTexts.amount" />
<form-select
modelKey="teminatParentType"
v-model="piyangoTeminatStore.piyangoTeminatFormData.teminatParentType"
required
half
label="Para Birimi"
:invalidText="piyangoTeminatValidationStore.invalidTexts.teminatParentType"
:listData="piyangoDataStore.piyangoTeminatParaBirimleri"
listVal="id"
listText="value"
@change="OnKeyup" />
<form-select
label="Teminat Türü"
:listData="piyangoDataStore.piyangoTeminatTurleri"
listText="value"
listVal="id"
half
v-model="piyangoTeminatStore.piyangoTeminatFormData.teminantChildType"
required
:invalidText="piyangoTeminatValidationStore.invalidTexts.teminantChildType"
@change="OnKeyup" />
<form-date
type="date"
half
required
modelKey="teminantDate"
v-model="piyangoTeminatStore.piyangoTeminatFormData.teminantDate"
label="Tarih"
:invalidText="piyangoTeminatValidationStore.invalidTexts.teminantDate"
@change="OnKeyup" />
<form-input
modelKey="teminantNo"
v-model="piyangoTeminatStore.piyangoTeminatFormData.teminantNo"
required
half
label="No"
minlength="2"
:invalidText="piyangoTeminatValidationStore.invalidTexts.teminantNo"
@keyup="OnKeyup" />
<div class="form-item form-item-half"></div>
<form-input
modelKey="bankName"
v-model="piyangoTeminatStore.piyangoTeminatFormData.bankName"
required
half
label="Banka Adı"
minlength="2"
:invalidText="piyangoTeminatValidationStore.invalidTexts.bankName"
@keyup="OnKeyup" />
<form-input
modelKey="bankBranch"
v-model="piyangoTeminatStore.piyangoTeminatFormData.bankBranch"
required
half
label="Banka Şubesi"
minlength="2"
:invalidText="piyangoTeminatValidationStore.invalidTexts.bankBranch"
@keyup="OnKeyup" />
<form-display :disabled="!usersStore.isPanelUser"
label="İşlem Durumu"
v-model="piyangoTeminatStore.piyangoTeminatFormData.stateText" />
<form-file
v-model="piyangoTeminatStore.piyangoTeminatFormData.file"
elclass="panel-documents-item"
:invalidText="piyangoTeminatValidationStore.invalidTexts.file"
@change="OnKeyup" />
<form-textarea
v-model="piyangoTeminatStore.piyangoTeminatFormData.description"
:invalidText="piyangoTeminatValidationStore.invalidTexts.description"
label="Açıklama"
@keyup="OnKeyup" />
</div>
</div>
</template>
<script setup lang="ts">
import { usePiyangoDataStore } from '../../stores/piyangoDataStore'
const piyangoDataStore = usePiyangoDataStore()
import { usePiyangoServices } from '../../service/piyangoServices'
const piyangoServices = usePiyangoServices()
import { useValidationStore } from '@/stores/validationStore'
const validationStore = useValidationStore()
import { usePiyangoTeminatStore } from '../../stores/piyangoTeminatStore'
const piyangoTeminatStore = usePiyangoTeminatStore()
import { usePiyangoTeminatValidationStore } from '../../validation/piyangoTeminatValidationStore'
const piyangoTeminatValidationStore = usePiyangoTeminatValidationStore()
import { usePiyangoTeminatService } from '../../service/piyangoTeminatService'
const piyangoTeminatService = usePiyangoTeminatService()
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
const OnKeyup = () => {
piyangoTeminatValidationStore.formChanged = true
}
</script>

View File

@ -9,8 +9,41 @@
v-model="piyangoTeminatStore.piyangoTeminatFormData.state"
required
:invalidText="piyangoTeminatValidationStore.invalidTexts.state"
@change="OnKeyup"
:disabled="!usersStore.isPanelUser"/>
@change="OnKeyup"
:disabled="!usersStore.isPanelUser" />
<template
v-if="
piyangoTeminatStore.piyangoTeminatFormData.state === 2 ||
piyangoTeminatStore.piyangoTeminatFormData.state === 3
">
<form-date
type="date"
half
modelKey="refundDate"
v-model="piyangoTeminatStore.piyangoTeminatFormData.refundDate"
label="İade Tarihi"
:invalidText="piyangoTeminatValidationStore.invalidTexts.refundDate"
@change="OnKeyup" />
<form-input
modelKey="refundCount"
v-model="piyangoTeminatStore.piyangoTeminatFormData.refundCount"
half
label="Sayısı"
@keyup="OnKeyup"
:invalidText="piyangoTeminatValidationStore.invalidTexts.refundCount" />
<form-file
v-model="piyangoTeminatStore.piyangoTeminatFormData.refundDocumentUrl"
label='Klasör Arşiv'
elclass="panel-documents-item"
:invalidText="piyangoTeminatValidationStore.invalidTexts.refundDocumentUrl"
@change="OnKeyup" />
<form-input
modelKey="refundDescription"
v-model="piyangoTeminatStore.piyangoTeminatFormData.refundDescription"
label="İade Açıklama"
@keyup="OnKeyup" />
</template>
<form-display
v-model="piyangoTeminatStore.piyangoTeminatFormData.amount"
@ -51,7 +84,10 @@
label="Banka Şubesi" />
<file-list-item
v-if="piyangoTeminatStore.piyangoTeminatFormData.teminantDocumentUrl !== null && piyangoTeminatStore.piyangoTeminatFormData.teminantDocumentUrl !== undefined"
v-if="
piyangoTeminatStore.piyangoTeminatFormData.teminantDocumentUrl !== null &&
piyangoTeminatStore.piyangoTeminatFormData.teminantDocumentUrl !== undefined
"
title="Dosya"
:data="piyangoTeminatStore.piyangoTeminatFormData"
:editable="false"

View File

@ -52,6 +52,11 @@ export const usePiyangoServices = defineStore('piyangoServices', () => {
}
const GetPiyangoTeminatDurumList = async () => {
if (piyangoDataStore.piyangoTeminatDurumlari.length === 0) {
/*
1: Açık
2: İade
3: Zaman Aşımı İade
*/
let data = await dataStore.dataGet('TeminantStates/Durumlar')
piyangoDataStore.piyangoTeminatDurumlari = data
}

View File

@ -18,9 +18,12 @@ export const usePiyangoTeminatService = defineStore('piyangoTeminatService', ()
if (piyangoTeminatValidationStore.FormCheck()) {
let form: any
let dataForm = new FormData()
dataForm.append('state', piyangoTeminatStore.piyangoTeminatFormData.state)
dataForm.append('amount', globalStore.floatEnLocale(piyangoTeminatStore.piyangoTeminatFormData.amount))
dataForm.append(
'amount',
globalStore.floatEnLocale(piyangoTeminatStore.piyangoTeminatFormData.amount)
)
dataForm.append('bankName', piyangoTeminatStore.piyangoTeminatFormData.bankName)
dataForm.append('bankBranch', piyangoTeminatStore.piyangoTeminatFormData.bankBranch)
dataForm.append(
@ -43,6 +46,32 @@ export const usePiyangoTeminatService = defineStore('piyangoTeminatService', ()
'description',
piyangoTeminatStore.piyangoTeminatFormData.description
)
if (usersStore.isPanelUser) {
if (piyangoTeminatStore.piyangoTeminatFormData.state === 1) {
piyangoTeminatStore.piyangoTeminatFormData.refundDate = ''
piyangoTeminatStore.piyangoTeminatFormData.refundCount = ''
piyangoTeminatStore.piyangoTeminatFormData.refundDocumentUrl = ''
piyangoTeminatStore.piyangoTeminatFormData.refundDescription = ''
}
dataForm.append(
'refundDate',
String(piyangoTeminatStore.piyangoTeminatFormData.refundDate)
)
dataForm.append(
'refundCount',
String(piyangoTeminatStore.piyangoTeminatFormData.refundCount)
)
dataForm.append(
'refundDocumentUrl',
piyangoTeminatStore.piyangoTeminatFormData.refundDocumentUrl
)
dataForm.append(
'refundDescription',
piyangoTeminatStore.piyangoTeminatFormData.refundDescription
)
}
if (piyangoTeminatStore.isNew) {
form = await dataStore.dataPost('TeminantStates/', {
data: dataForm,
@ -61,8 +90,8 @@ export const usePiyangoTeminatService = defineStore('piyangoTeminatService', ()
}
if (form !== 'errorfalse') {
piyangoTeminatStore.isNew = false
piyangoTeminatValidationStore.formChanged = false
piyangoTeminatStore.isNew = false
piyangoTeminatValidationStore.formChanged = false
piyangoTeminatStore.refreshList = true
piyangoTeminatStore.teminatPanel = false
}
@ -80,7 +109,7 @@ export const usePiyangoTeminatService = defineStore('piyangoTeminatService', ()
if (form !== 'errorfalse') {
piyangoTeminatStore.isNew = false
await Object.assign(piyangoTeminatStore.piyangoTeminatFormData, form)
await Object.assign(piyangoTeminatStore.piyangoTeminatFormData, form)
} else {
await piyangoTeminatStore.ResetFormData()
await piyangoTeminatStore.RestoreFormData()

View File

@ -1,34 +1,34 @@
import * as signalR from "@microsoft/signalr";
import { v4 as uuidv4 } from "uuid";
import * as signalR from '@microsoft/signalr'
import { v4 as uuidv4 } from 'uuid'
let connection: signalR.HubConnection;
let connectionId = "";
let connection: signalR.HubConnection
let connectionId = ''
export const connectToHub = async () => {
connection = new signalR.HubConnectionBuilder()
.withUrl("https://panelapi.cekilisevi.gov.tr/uploadHub", {
withCredentials: false // Bu zorunlu, yoksa cookie vs gönderilmez
.withUrl(import.meta.env.VITE_SOCKET_URL, {
withCredentials: false // Bu zorunlu, yoksa cookie vs gönderilmez
}) // backend adresine göre düzenle
.withAutomaticReconnect()
.build();
.build()
await connection.start();
connectionId = connection.connectionId || uuidv4(); // SignalR id'si ya da frontend'de de guid üretilebilir
return connectionId;
};
await connection.start()
connectionId = connection.connectionId || uuidv4() // SignalR id'si ya da frontend'de de guid üretilebilir
return connectionId
}
export const onProgress = (callback: (data: any) => void) => {
connection.on("ReceiveProgress", callback);
};
connection.on('ReceiveProgress', callback)
}
export const onInsertProgress = (callback: (data: any) => void) => {
connection.on("ReceiveInsertProgress", callback);
};
connection.on('ReceiveInsertProgress', callback)
}
export const onCompleted = (callback: (data: any) => void) => {
connection.on("ReceiveCompleted", callback);
};
connection.on('ReceiveCompleted', callback)
}
export const onError = (callback: (data: any) => void) => {
connection.on("ReceiveError", callback);
};
connection.on('ReceiveError', callback)
}

View File

@ -23,7 +23,11 @@ export const usePiyangoTeminatStore = defineStore('piyangoTeminatStore', () => {
cekilisId: piyangoStore.selectedLottery,
kisiId: usersStore.userId,
description: '',
file: ''
file: '',
refundDate: '',
refundCount: '',
refundDocumentUrl: '',
refundDescription:''
})
const piyangoTeminatFormData = reactive<Record<string, any>>({})
@ -31,7 +35,7 @@ export const usePiyangoTeminatStore = defineStore('piyangoTeminatStore', () => {
const loaded = ref<boolean>(false)
const isNew = ref<boolean>(false)
const teminatPanel = ref<boolean>(false)
const selectedTeminatId = ref<number|null>(null)
const selectedTeminatId = ref<number | null>(null)
const refreshList = ref<boolean>(false)
const ResetFormData = () => {
@ -42,7 +46,7 @@ export const usePiyangoTeminatStore = defineStore('piyangoTeminatStore', () => {
loaded.value = true
}, 30)
}
const RestoreFormData = () => {
const RestoreFormData = () => {
Object.assign(piyangoTeminatFormData, piyangoTeminatSafeFormData)
}
return {

View File

@ -24,6 +24,18 @@ export const usePiyangoTeminatValidationStore = defineStore(
'state',
'Lütfen işlem tipini seçiniz.'
)
validationStore.IsFieldEmpty(
piyangoTeminatStore.piyangoTeminatFormData,
invalidTexts,
'refundDate',
'Lütfen iade tarihini seçiniz.'
)
validationStore.IsFieldEmpty(
piyangoTeminatStore.piyangoTeminatFormData,
invalidTexts,
'refundCount',
'Lütfen iade sayı no giriniz.'
)
}
validationStore.IsFieldEmpty(

View File

@ -216,7 +216,7 @@ export const usePiyangoValidationStore = defineStore('piyangoValidationStore', (
!usersStore.isPanelUser) ||
(usersStore.isPanelUser && piyangoStore.duzenleyenData.basvuruTipId !== 22)) &&
piyangoStore.lotteryData.amacpiyangoId === 2
) {
) {
if (!usersStore.isPanelUser) piyangoStore.lotteryData.amacpiyangoId = null
isFormValid.value = false
invalidTexts.amacpiyangoId =
@ -240,7 +240,7 @@ export const usePiyangoValidationStore = defineStore('piyangoValidationStore', (
if (
piyangoStore.duzenleyenData.basvuruTipId !== 22 &&
piyangoStore.lotteryData.amacpiyangoId === 2
) {
) {
if (!usersStore.isPanelUser) piyangoStore.lotteryData.amacpiyangoId = null
isFormValid.value = false
invalidTexts.amacpiyangoId =
@ -472,12 +472,16 @@ export const usePiyangoValidationStore = defineStore('piyangoValidationStore', (
date: ilanTarihi2Max.value,
pattern: 'dd-mm-yy'
})
if (ilanTarihi2 < ilan2min || ilanTarihi2 > ilan2max) {
if (ilan2min > ilan2max) {
isFormValid.value = false
invalidTexts.ilantarihi2 = `2. İlan Tarihi ${ilan2mind} - ${ilan2maxd} tarihleri arasında olmalıdır.`
invalidTexts.ilantarihi2 = `Lütfen 1. ilan tarihini daha erken bir tarih ile değiştiriniz. 2. İlan tarihi 1. ilan tarihinden en az 1 gün sonra olabilir`
} else {
delete invalidTexts.ilantarihi2
if (ilanTarihi2 < ilan2min || ilanTarihi2 > ilan2max) {
isFormValid.value = false
invalidTexts.ilantarihi2 = `2. İlan Tarihi ${ilan2mind} - ${ilan2maxd} tarihleri arasında olmalıdır.`
} else {
delete invalidTexts.ilantarihi2
}
}
}
}

View File

@ -60,13 +60,14 @@
const CreateTabs = () => {
if (
piyangoStore.lotteryApprove === 4 ||
piyangoStore.lotteryApprove === 10 ||
piyangoStore.lotteryApprove === 11 ||
piyangoStore.lotteryApprove === 12 ||
piyangoStore.lotteryApprove === 13 ||
piyangoStore.lotteryApprove === 14 ||
usersStore.isPanelUser
(piyangoStore.lotteryApprove === 4 ||
piyangoStore.lotteryApprove === 10 ||
piyangoStore.lotteryApprove === 11 ||
piyangoStore.lotteryApprove === 12 ||
piyangoStore.lotteryApprove === 13 ||
piyangoStore.lotteryApprove === 14 ||
usersStore.isPanelUser) &&
piyangoStore.lotteryPurposeId !== 3
) {
tabList.value.push(
{ text: 'Katılım Listesi', id: 'katilimcilistesi' },
@ -82,7 +83,7 @@
}
tabList.value.push({ text: 'Onay Durumu', id: 'onaydurumu' })
if (piyangoStore.lotteryApprove !== 0) {
if (piyangoStore.lotteryApprove !== 0 && piyangoStore.lotteryPurposeId !== 3) {
tabList.value.push({ text: 'Teminat Listesi', id: 'teminatlistesi' })
}
}

View File

@ -67,6 +67,14 @@
const tableHeader = computed<Record<string, any>[]>(() => {
let header: Record<string, any>[] = []
header.push({
name: 'piyangoId',
title: 'Piyango Id',
sort: true,
style: { width: '10%' }
})
if (usersStore.isAraciFirma || usersStore.isPanelUser) {
header.push({ name: 'duzenleyen', title: 'Düzenleyen' })
}
@ -101,14 +109,16 @@
type: 'date',
range: true
}
})
}
)
if (usersStore.isVakifDernek || usersStore.isPanelUser) {
header.push({
name: 'cekilisTarihi',
title: 'Çekiliş Tarihi',
compute: (v: Record<string, any>): string => {
return dateStore.dateFormat({ date: v.cekilisTarihi })
if(v.piyangoAmacId === 3) return ''
else return dateStore.dateFormat({ date: v.cekilisTarihi })
},
sort: true,
filter: {
@ -146,7 +156,7 @@
}
}
)
}
}
header.push(
{

View File

@ -0,0 +1,8 @@
<template>
<section class="section-list form-inner-content-left">
<form-izin-bedel-orani />
</section>
</template>
<script setup lang="ts">
import FormIzinBedelOrani from './form/FormIzinBedelOrani.vue'
</script>

View File

@ -0,0 +1,105 @@
<template>
<section class="section-list">
<div class="section-list-header">
<h2>İzin Bedel Oranı Listesi</h2>
<div class="section-list-header-buttons">
<button class="button-c button-add" @click="izinBedelOraniStore.NewForm()">
<i class="ico-c">
<svg width="16" height="16">
<use href="@/assets/images/icons.svg#plus"></use>
</svg>
</i>
Yeni İzin Bedel Oranı Ekle
</button>
</div>
</div>
<list-table-content
v-if="izinBedelOraniService.loaded"
:tableHeader="tableHeader"
:rowAction="EditIzinBedelOrani"
icon="draws"
title="İzin Bedel Oranları"
listText="İzin Bedel Oranı"
:apiList="'IzinBedelOrani'"
apiText="İzin Bedel Oranı Listesi" />
</section>
</template>
<script setup lang="ts">
import { ref, computed, onBeforeMount } from 'vue'
import { useIzinBedelOraniStore } from '../store/izinBedelOraniStore'
import { useIzinBedelOraniService } from '../service/izinBedelOraniService'
const izinBedelOraniStore = useIzinBedelOraniStore()
const izinBedelOraniService = useIzinBedelOraniService()
const tableHeader = ref<Record<string, any>[]>(
[
{
name: 'id',
title: 'ID',
sort: true,
style: { width: '8%' }
},
{
name: 'ad',
title: 'Ad',
sort: true,
style: { width: '20%' }
},
{
name: 'oran',
title: 'Oran (%)',
sort: true,
style: { width: '15%' },
compute: (v: Record<string, any>): string => {
return `%${v.oran}`
}
},
{
name: 'aciklama',
title: 'Açıklama',
sort: true,
style: { width: '30%' }
},
{
name: 'aktif',
title: 'Durum',
sort: true,
style: { width: '12%' },
computeHtml: (v: Record<string, any>): string => {
if (v.aktif) {
return `<span class="back-grad back-grad-ok">Aktif</span>`
} else {
return `<span class="back-grad back-grad-alert">Pasif</span>`
}
}
},
{
name: 'actions',
title: 'İşlemler',
style: { width: '15%' },
computeHtml: (v: Record<string, any>): string => {
let actions = `<button class="button-c button-edit" onclick="window.editIzinBedelOrani(${v.id})">
<i class="ico-c">
<svg width="14" height="14">
<use href="@/assets/images/icons.svg#edit"></use>
</svg>
</i>
Düzenle
</button> `
return actions
}
}
]
)
const EditIzinBedelOrani = (row: any) => {
izinBedelOraniStore.EditForm(row)
}
onBeforeMount(async () => {
await izinBedelOraniService.GetIzinBedelOraniList()
izinBedelOraniService.loaded = true
})
</script>

View File

@ -14,7 +14,7 @@
Başvuru Bedelini Muhasebeleştir
</button>
<button
@click="IzinBedeliMuhasebelestir"
@click="OpenIzinBedeliModal"
v-if="
piyangoStore.lotteryApprove === 4 &&
piyangoStore.lotteryData.amacpiyangoId !== 3 &&
@ -30,6 +30,40 @@
</div>
</div>
<piyango-bilgileri-display-content v-if="loaded" :isPreview="isPreview" />
<!-- İzin Bedeli Modal -->
<teleport to="body">
<div v-if="showIzinBedeliModal" class="modal-overlay" @click="CloseIzinBedeliModal">
<div class="modal-content" @click.stop>
<div class="modal-header">
<h3>İzin Bedeli Muhasebeleştir</h3>
<button class="modal-close" @click="CloseIzinBedeliModal">×</button>
</div>
<div class="modal-body">
<div class="form-group">
<label>Oran Seçiniz:</label>
<select @change="OnOranChange" class="form-select">
<option value="">Lütfen bir oran seçiniz</option>
<option
v-for="oran in izinBedelOranlari"
:key="oran.id"
:value="oran.id">
{{ oran.oran }}% - {{ oran.adi }}
</option>
</select>
</div>
</div>
<div class="modal-footer">
<button class="button-c button-cancel" @click="CloseIzinBedeliModal">
İptal
</button>
<button class="button-c button-save" @click="IzinBedeliMuhasebelestir">
Muhasebeleştir
</button>
</div>
</div>
</div>
</teleport>
</div>
</template>
<script setup lang="ts">
@ -57,6 +91,10 @@
const piyangoStore = usePiyangoStore()
const loaded = ref<boolean>(false)
const showIzinBedeliModal = ref<boolean>(false)
const selectedOran = ref<number | null>(null)
const izinBedelOranlari = ref<Record<string, any>[]>([])
const selectedOranId = ref<number | null>(null)
const GetData = async () => {
let data = await dataStore.dataGet(
@ -95,6 +133,13 @@
Object.assign(piyangoStore.araciUyeData, data)
}
}
const GetIzinBedelOranlari = async () => {
let data = await dataStore.dataGet('IzinBedelOrani/aktif')
if (data !== 'errorfalse') {
izinBedelOranlari.value = data
}
}
const BasvuruBedeliMuhasebelestir = async () => {
let data = await dataStore.dataGet(
'MuhasebeSettings/BasvuruBedeli/' + piyangoStore.selectedLottery
@ -111,15 +156,50 @@
}
}
const OpenIzinBedeliModal = async () => {
await GetIzinBedelOranlari()
showIzinBedeliModal.value = true
selectedOran.value = null
selectedOranId.value = null
}
const CloseIzinBedeliModal = () => {
showIzinBedeliModal.value = false
selectedOran.value = null
selectedOranId.value = null
}
const OnOranChange = (event: Event) => {
const target = event.target as HTMLSelectElement
const selectedId = parseInt(target.value)
const selectedOranData = izinBedelOranlari.value.find(item => item.id === selectedId)
if (selectedOranData) {
selectedOranId.value = selectedOranData.id
selectedOran.value = selectedOranData.oran
} else {
selectedOranId.value = null
selectedOran.value = null
}
}
const IzinBedeliMuhasebelestir = async () => {
if (selectedOranId.value === null) {
toastStore.AddToast('Lütfen bir oran seçiniz', 'error', 5000)
return
}
let data = await dataStore.dataGet(
'MuhasebeSettings/IzinBasvuruBedeli/' + piyangoStore.selectedLottery
'MuhasebeSettings/IzinBasvuruBedeli/' + piyangoStore.selectedLottery + '/' + selectedOranId.value
)
if (data !== 'errorfalse') {
toastStore.AddToast('İzin bedeli başarıyla muhasebeleştirildi. Fatura No: '+data.izinBelgeNo , 'success', 30000)
loaded.value = false
await GetData()
piyangoStore.lotteryIzinBedeliStatus = true
showIzinBedeliModal.value = false
selectedOran.value = null
selectedOranId.value = null
setTimeout(() => {
loaded.value = true
}, 30)
@ -131,3 +211,133 @@
await GetData()
})
</script>
<style scoped>
.modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
}
.modal-content {
background: white;
border-radius: 8px;
padding: 0;
max-width: 500px;
width: 90%;
max-height: 90vh;
overflow-y: auto;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 24px;
border-bottom: 1px solid #e5e7eb;
}
.modal-header h3 {
margin: 0;
font-size: 18px;
font-weight: 600;
color: #1f2937;
}
.modal-close {
background: none;
border: none;
font-size: 24px;
cursor: pointer;
color: #6b7280;
padding: 0;
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
transition: background-color 0.2s;
}
.modal-close:hover {
background-color: #f3f4f6;
}
.modal-body {
padding: 24px;
}
.form-group {
margin-bottom: 16px;
}
.form-group label {
display: block;
margin-bottom: 8px;
font-weight: 500;
color: #374151;
}
.form-select {
width: 100%;
padding: 12px;
border: 1px solid #d1d5db;
border-radius: 6px;
font-size: 14px;
background-color: white;
transition: border-color 0.2s;
}
.form-select:focus {
outline: none;
border-color: #3b82f6;
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
.modal-footer {
display: flex;
justify-content: flex-end;
gap: 12px;
padding: 20px 24px;
border-top: 1px solid #e5e7eb;
background-color: #f9fafb;
border-radius: 0 0 8px 8px;
}
.button-c {
padding: 10px 20px;
border: none;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
}
.button-cancel {
background-color: #6b7280;
color: white;
}
.button-cancel:hover {
background-color: #4b5563;
}
.button-save {
background-color: #3b82f6;
color: white;
}
.button-save:hover {
background-color: #2563eb;
}
</style>

View File

@ -0,0 +1,90 @@
<template>
<div
:class="['form-part', izinBedelOraniValidationStore.formChanged ? 'changed' : '']">
<div class="form-part-title">
<h4>{{ izinBedelOraniStore.isNew ? 'Yeni İzin Bedel Oranı' : 'İzin Bedel Oranı Düzenle' }}</h4>
<div class="form-part-title-buttons"></div>
</div>
<div class="form-part-content">
<form-input
required
half
modelKey="ad"
v-model="izinBedelOraniStore.izinBedelOraniForm.ad"
:invalidText="izinBedelOraniValidationStore.invalidTexts.ad"
label="Ad"
maxlength="100"
@keyup="OnKeyup" />
<form-input
required
half
modelKey="oran"
v-model="izinBedelOraniStore.izinBedelOraniForm.oran"
:invalidText="izinBedelOraniValidationStore.invalidTexts.oran"
label="Oran (%)"
maxlength="3"
@keydown="validationStore.allowNumbersWithKeys"
description="1-100 arasında bir rakam giriniz"
@keyup="OnKeyup" />
<form-textarea
required
modelKey="aciklama"
v-model="izinBedelOraniStore.izinBedelOraniForm.aciklama"
:invalidText="izinBedelOraniValidationStore.invalidTexts.aciklama"
label="Açıklama"
maxlength="500"
rows="4"
@keyup="OnKeyup" />
<form-checkbox
modelKey="aktif"
v-model="izinBedelOraniStore.izinBedelOraniForm.aktif"
label="Aktif"
@change="OnKeyup" />
<div
class="form-item"
v-if="izinBedelOraniStore.isNew || izinBedelOraniValidationStore.formChanged">
<button
class="button-c button-save"
@click="izinBedelOraniService.SaveIzinBedelOrani">
{{ izinBedelOraniStore.isNew ? 'Kaydet' : 'Güncelle' }}
</button>
<button
class="button-c button-cancel"
@click="CancelForm"
v-if="izinBedelOraniValidationStore.formChanged">
Vazgeç
</button>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { onBeforeMount } from 'vue'
import { useValidationStore } from '@/stores/validationStore'
const validationStore = useValidationStore()
import { useIzinBedelOraniStore } from '../../store/izinBedelOraniStore'
const izinBedelOraniStore = useIzinBedelOraniStore()
import { useIzinBedelOraniValidationStore } from '../../validation/izinBedelOraniValidationStore'
const izinBedelOraniValidationStore = useIzinBedelOraniValidationStore()
import { useIzinBedelOraniService } from '../../service/izinBedelOraniService'
const izinBedelOraniService = useIzinBedelOraniService()
const OnKeyup = () => {
izinBedelOraniValidationStore.formChanged = true
}
const CancelForm = () => {
if (izinBedelOraniStore.isNew) {
izinBedelOraniStore.isNew = false
} else {
izinBedelOraniStore.RestoreData()
izinBedelOraniValidationStore.formChanged = false
}
}
onBeforeMount(() => {
if (izinBedelOraniStore.isNew) {
izinBedelOraniStore.ResetForm()
}
})
</script>

View File

@ -6,17 +6,17 @@
<div class="form-part-title-buttons"></div>
</div>
<div class="form-part-content" v-if="muhasebeSettingsService.loaded">
<form-input
required
half
modelKey="izinBedeliOrani"
v-model="muhasebeSettingsStore.muhasebeSettingsForm.izinBedeliOrani"
:invalidText="muhasebeSettingsValidationStore.invalidTexts.izinBedeliOrani"
label="İzin Bedeli Oranı"
maxlength="3"
@keydown="validationStore.allowNumbersWithKeys"
description="1-100 arasında bir rakam giriniz"
@keyup="OnKeyup" />
<!-- <form-input-->
<!-- required-->
<!-- half-->
<!-- modelKey="izinBedeliOrani"-->
<!-- v-model="muhasebeSettingsStore.muhasebeSettingsForm.izinBedeliOrani"-->
<!-- :invalidText="muhasebeSettingsValidationStore.invalidTexts.izinBedeliOrani" -->
<!-- label="İzin Bedeli Oranı"-->
<!-- maxlength="3"-->
<!-- @keydown="validationStore.allowNumbersWithKeys"-->
<!-- description="1-100 arasında bir rakam giriniz"-->
<!-- @keyup="OnKeyup" />-->
<form-input
required
half

View File

@ -1,9 +1,11 @@
import muhasebePiyangoListesi from './muhasebe-piyango-listesi'
import muhasebePiyangoDetay from './muhasebe-piyango-detay'
import muhasebeAyarlar from './muhasebe-ayarlar'
import izinBedelOrani from './izin-bedel-orani'
export default [
muhasebePiyangoListesi,
muhasebePiyangoDetay,
muhasebeAyarlar,
izinBedelOrani,
]

View File

@ -0,0 +1,10 @@
import IzinBedelOrani from '../views/IzinBedelOrani.vue'
export default {
path: '/muhasebe/izin-bedel-orani',
name: 'IzinBedelOrani',
component: IzinBedelOrani,
meta: {
authRequired: true
}
}

View File

@ -0,0 +1,102 @@
import { defineStore } from 'pinia'
import { ref } from 'vue'
import { useDataStore } from '@/stores/dataStore'
import { useIzinBedelOraniStore } from '../store/izinBedelOraniStore'
import { useIzinBedelOraniValidationStore } from '../validation/izinBedelOraniValidationStore'
export const useIzinBedelOraniService = defineStore('izinBedelOraniService', () => {
const dataStore = useDataStore()
const izinBedelOraniStore = useIzinBedelOraniStore()
const izinBedelOraniValidationStore = useIzinBedelOraniValidationStore()
const loaded = ref<boolean>(false)
const SaveIzinBedelOrani = async (panelData: Record<string, any>, isUpdate: boolean = false) => {
if (izinBedelOraniValidationStore.FormCheck(panelData)) {
var res: any
if (!isUpdate) {
res = await dataStore.dataPost('IzinBedelOrani', {
data: {
adi: panelData.ad,
oran: panelData.oran,
aciklama: panelData.aciklama,
aktif: panelData.aktif
}
})
} else {
res = await dataStore.dataPut('IzinBedelOrani/' + panelData.id, {
data: {
id: panelData.id,
adi: panelData.ad,
oran: panelData.oran,
aciklama: panelData.aciklama,
aktif: panelData.aktif
}
})
}
if (res !== 'errorfalse') {
return true
}
}
return false
}
const DeleteIzinBedelOrani = async (id: number | string) => {
var res = await dataStore.dataDelete('IzinBedelOrani/' + id)
return res !== 'errorfalse'
}
const GetIzinBedelOraniList = async () => {
var res = await dataStore.dataGet('IzinBedelOrani')
if (res !== 'errorfalse') {
izinBedelOraniStore.izinBedelOraniList = res
return res
}
return []
}
const GetIzinBedelOraniById = async (id: number | string) => {
var res = await dataStore.dataGet('IzinBedelOrani/' + id)
if (res !== 'errorfalse') {
return res
}
return null
}
const GetAktifIzinBedelOraniList = async () => {
var res = await dataStore.dataGet('IzinBedelOrani/Aktif')
if (res !== 'errorfalse') {
izinBedelOraniStore.aktifIzinBedelOraniList = res
return res
}
return []
}
const UpdateIzinBedelOraniStatus = async (id: number | string, aktif: boolean) => {
var res = await dataStore.dataPut('IzinBedelOrani/' + id + '/Status', {
data: {
Aktif: aktif
}
})
return res !== 'errorfalse'
}
const LoadData = async () => {
await GetIzinBedelOraniList()
await GetAktifIzinBedelOraniList()
loaded.value = true
}
return {
loaded,
SaveIzinBedelOrani,
DeleteIzinBedelOrani,
GetIzinBedelOraniList,
GetIzinBedelOraniById,
GetAktifIzinBedelOraniList,
UpdateIzinBedelOraniStatus,
LoadData
}
})

View File

@ -0,0 +1,59 @@
import { defineStore } from 'pinia'
import { ref, reactive } from 'vue'
import { useUsersStore } from '@/stores/usersStore'
export const useIzinBedelOraniStore = defineStore('izinBedelOraniStore', () => {
const usersStore = useUsersStore()
const izinBedelOraniBaseForm = reactive<Record<string, any>>({
ad: '',
oran: 0,
aciklama: '',
aktif: true,
appUserId: usersStore.userId
})
const izinBedelOraniForm = reactive<Record<string, any>>({})
const izinBedelOraniSafeForm = reactive<Record<string, any>>({})
const izinBedelOraniList = ref<Record<string, any>[]>([])
const aktifIzinBedelOraniList = ref<Record<string, any>[]>([])
const isNew = ref<boolean>(false)
const izinBedelOraniLoaded = ref<boolean>(false)
const ResetForm = () => {
Object.assign(izinBedelOraniForm, izinBedelOraniBaseForm)
}
const SafeServerData = () => {
Object.assign(izinBedelOraniSafeForm, izinBedelOraniForm)
}
const RestoreData = () => {
Object.assign(izinBedelOraniForm, izinBedelOraniSafeForm)
}
const NewForm = () => {
ResetForm()
isNew.value = true
}
const EditForm = (item: Record<string, any>) => {
Object.assign(izinBedelOraniForm, item)
isNew.value = false
}
return {
izinBedelOraniBaseForm,
izinBedelOraniForm,
izinBedelOraniSafeForm,
izinBedelOraniList,
aktifIzinBedelOraniList,
isNew,
izinBedelOraniLoaded,
ResetForm,
SafeServerData,
RestoreData,
NewForm,
EditForm
}
})

View File

@ -0,0 +1,64 @@
import { defineStore } from 'pinia'
import { ref, reactive } from 'vue'
import { useValidationStore } from '@/stores/validationStore'
export const useIzinBedelOraniValidationStore = defineStore(
'izinBedelOraniValidationStore',
() => {
const validationStore = useValidationStore()
const formChanged = ref<boolean>(false)
const isFormValid = ref<boolean>(true)
const invalidTexts = reactive<Record<string, any>>({})
const FormCheck = (panelData: Record<string, any>): boolean => {
Object.assign(invalidTexts, {})
validationStore.IsFieldEmpty(
panelData,
invalidTexts,
'ad',
'Ad alanı zorunludur'
)
validationStore.IsFieldEmpty(
panelData,
invalidTexts,
'oran',
'Oran alanı zorunludur'
)
validationStore.IsFieldEmpty(
panelData,
invalidTexts,
'aciklama',
'Açıklama alanı zorunludur'
)
// Oran validation (0-100 arası)
if (panelData.oran !== undefined && panelData.oran !== '') {
const oran = parseFloat(panelData.oran)
if (isNaN(oran) || oran < 0 || oran > 100) {
invalidTexts.oran = 'Oran 0-100 arasında olmalıdır'
}
}
isFormValid.value = Object.keys(invalidTexts).length === 0
return isFormValid.value
}
const ResetValidation = () => {
Object.assign(invalidTexts, {})
formChanged.value = false
isFormValid.value = true
}
return {
formChanged,
isFormValid,
invalidTexts,
FormCheck,
ResetValidation
}
}
)

View File

@ -0,0 +1,201 @@
<template>
<AdminLayout>
<Breadcrumb currentPageText="Muhasebe / İzin Bedel Oranı" />
<section class="section-list">
<list-table-content
:tableHeader="tableHeader"
:rowAction="updateAction"
:addAction="addAction"
icon="draws"
title="İzin Bedel Oranları"
listText="İzin Bedel Oranı"
:tableData="izinBedelOraniList"
apiText="İzin Bedel Oranı Listesi"
apiList="IzinBedelOrani"
v-model:refresh="refresh"
:rowActions="rowActions"
:rowActionStyle="'width:15%;'" />
</section>
<panel-wrapper
v-if="panel"
v-model="panel"
:panel-title="isUpdate ? 'İzin Bedel Oranı Düzenle' : 'Yeni İzin Bedel Oranı Ekle'">
<template #panelContent>
<form-input
required
v-model="panelIzinBedelOrani.ad"
label="Ad"
maxlength="100" />
<form-input
required
v-model="panelIzinBedelOrani.oran"
label="Oran (%)"
maxlength="3"
@keydown="validationStore.allowNumbersWithKeys"
description="1-100 arasında bir rakam giriniz" />
<form-textarea
required
v-model="panelIzinBedelOrani.aciklama"
label="Açıklama"
maxlength="500"
rows="4" />
<form-checkbox
v-model="panelIzinBedelOrani.aktif"
label="Aktif" />
</template>
<template #footerButton>
<div class="button-c button-save" @click="save">
{{ isUpdate ? 'Güncelle' : 'Ekle' }}
</div>
</template>
</panel-wrapper>
</AdminLayout>
</template>
<script setup lang="ts">
import { ref, onBeforeMount, computed } from 'vue'
import AdminLayout from '@/layouts/AdminLayout.vue'
import PanelWrapper from '@/components/PanelWrapper.vue'
import { useIzinBedelOraniStore } from '../store/izinBedelOraniStore'
import { useIzinBedelOraniService } from '../service/izinBedelOraniService'
import { useValidationStore } from '@/stores/validationStore'
import { useDialogStore } from '@/components/global/dialogStore'
import { useDataStore } from '@/stores/dataStore'
const izinBedelOraniStore = useIzinBedelOraniStore()
const izinBedelOraniService = useIzinBedelOraniService()
const validationStore = useValidationStore()
const dialogStore = useDialogStore()
const dataStore = useDataStore()
const panel = ref<boolean>(false)
const isUpdate = ref<boolean>(false)
const refresh = ref<boolean>(false)
const panelIzinBedelOrani = ref<Record<string, any>>({})
const izinBedelOraniList = ref<Record<string, any>[]>([])
const tableHeader = ref<Record<string, any>[]>(
[
{
name: 'id',
title: 'ID',
sort: true,
style: { width: '8%' }
},
{
name: 'adi',
title: 'Ad',
sort: true,
style: { width: '20%' }
},
{
name: 'oran',
title: 'Oran (%)',
sort: true,
style: { width: '15%' },
compute: (v: Record<string, any>): string => {
return `%${v.oran}`
}
},
{
name: 'aciklama',
title: 'Açıklama',
sort: true,
style: { width: '30%' }
},
{
name: 'aktif',
title: 'Durum',
sort: true,
style: { width: '12%' },
computeHtml: (v: Record<string, any>): string => {
if (v.aktif) {
return `<span class="back-grad back-grad-ok">Aktif</span>`
} else {
return `<span class="back-grad back-grad-alert">Pasif</span>`
}
}
}
]
)
const DeleteRowPop = (data: Record<string, any>, i: number) => {
dialogStore.CreateDialog({
title: 'İzin Bedel Oranı Sil',
id: 'deleteIzinBedelOrani',
content: 'İzin bedel oranını silmek istediğinize emin misiniz?',
closeText: 'Vazgeç',
buttons: [
{
label: 'İzin Bedel Oranı Sil',
type: 'alert',
function: () => DeleteRow(data.id)
}
]
})
}
const DeleteRow = async (id: number | string) => {
var dt = await dataStore.dataDelete('IzinBedelOrani/' + id)
if (dt !== 'errorfalse') {
dialogStore.CloseDialog('deleteIzinBedelOrani')
refresh.value = true
}
}
const rowActions = ref<Record<string, any>[]>([
{
text: 'Sil',
class: 'alert',
action: DeleteRowPop
}
])
const addAction = async () => {
isUpdate.value = false
panelIzinBedelOrani.value = {
ad: '',
oran: 0,
aciklama: '',
aktif: true
}
panel.value = true
}
const updateAction = (row: any) => {
const foundItem = izinBedelOraniList.value.find((x) => x.id == row.id)
if (foundItem) {
panelIzinBedelOrani.value = {
id: foundItem.id,
ad: foundItem.adi,
oran: foundItem.oran,
aciklama: foundItem.aciklama,
aktif: foundItem.aktif
}
}
panel.value = true
isUpdate.value = true
}
const save = async () => {
const result = await izinBedelOraniService.SaveIzinBedelOrani(panelIzinBedelOrani.value, isUpdate.value)
if (result) {
panel.value = false
isUpdate.value = false
refresh.value = true
await loadIzinBedelOraniList()
}
}
const loadIzinBedelOraniList = async () => {
const data = await dataStore.dataGet('IzinBedelOrani')
if (data !== 'errorfalse') {
izinBedelOraniList.value = data
}
}
onBeforeMount(async () => {
await loadIzinBedelOraniList()
})
</script>

View File

@ -54,6 +54,12 @@
}
header.push(
{
name: 'piyangoId',
title: 'Piyango ID',
sort: true,
style: { width: '10%' }
},
{
name: 'baslik',
title: 'Başlık',

View File

@ -9,7 +9,15 @@
:data="file"
@click="ReplaceImage"
onlyPreview
:filePath="file.fileUrl" />
:filePath="file.fileUrl">
<template #actionButtons v-if="!usersStore.isPanelUser">
<i
class="ico-c ico-btn ico-section back-grad-alert"
@click="DeleteImagePop(file)">
<svg><use href="/src/assets/images/icons.svg#trash"></use></svg>
</i>
</template>
</file-list-item>
</template>
<template v-else>
<div class="form-item form-item-picture clickable" @click="picturePanel = true">
@ -43,17 +51,19 @@
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
import { useValidationStore } from '@/stores/validationStore'
const validationStore = useValidationStore()
import { useSiteManagementPageStore } from '../../stores/siteManagementPageStore'
const siteManagementPageStore = useSiteManagementPageStore()
const siteManagementPageStore = useSiteManagementPageStore()
import { useDialogStore } from '@/components/global/dialogStore'
const dialogStore = useDialogStore()
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
const picturePanel = ref<boolean>(false)
const isUpdate = ref<boolean>(false)
const file = reactive<Record<string,any>>({
const file = reactive<Record<string, any>>({
title: '',
fileUrl: ''
})
@ -108,6 +118,32 @@
}
}
}
const DeleteImagePop = (data: Record<string, any>) => {
dialogStore.CreateDialog({
title: 'Resim Sil',
id: 'deleteimage',
content: 'Resmi silmek istediğinize emin misiniz? Bu işlem geri alınamaz.',
closeText: 'Vazgeç',
buttons: [
{
label: 'Resmi Sil',
type: 'alert',
function: () => DeleteImage(data.id)
}
]
})
}
const DeleteImage = async (id: number | string) => {
var dt = await dataStore.dataDelete('DocumentPage/' + id)
if (dt !== 'errorfalse') {
dialogStore.CloseDialog('deleteimage')
await GetData()
}
}
onBeforeMount(async () => {
await GetData()
})

View File

@ -87,7 +87,7 @@
title: 'Resim Url',
computeHtml: (v: Record<string, any>) => {
if (v.resimUrl !== null && v.resimUrl !== undefined) {
return globalStore.TableCellDocument(v.resimUrl)
return `<a href="${ v.resimUrl }" target="_blank" onclick="event.stopPropagation()"><img class="table-cell-image" src="${ v.resimUrl }" /></a>`
}
}
},

View File

@ -78,7 +78,7 @@
title: 'Resim Url',
computeHtml: (v: Record<string, any>) => {
if (v.resimUrl !== null && v.resimUrl !== undefined) {
return globalStore.TableCellDocument(v.resimUrl)
return `<a href="${ v.resimUrl }" target="_blank" onclick="event.stopPropagation()"><img class="table-cell-image" src="${ v.resimUrl }" /></a>`
}
}
},

View File

@ -16,7 +16,9 @@
</div>
<div class="form-part-content" v-if="customerDocumentStore.loaded">
<template v-if="customerDocumentStore.customerDocumentsList.length > 0">
<div class="form-inner-comment waiting-d" v-if="customerDocumentStore.customerDocumentsList.length < 3">
<div
class="form-inner-comment waiting-d"
v-if="customerDocumentStore.customerDocumentsList.length < 3">
En az
<strong>Ticaret Sicil Gazetesi, Vergi Levhası, İmza Sirküleri</strong>
sisteme yüklenmiş olmalıdır.
@ -26,12 +28,26 @@
:data="file"
@click="EditDocument"
:filePath="file.filePath"
:editable="usersStore.selectedUserApproveId === 3 || usersStore.selectedUserApproveId === 0"
title="title" />
:editable="
usersStore.isPanelUser ||
(!usersStore.isPanelUser &&
(usersStore.selectedUserApproveId === 3 ||
usersStore.selectedUserApproveId === 0))
"
title="title">
<template #actionButtons v-if="usersStore.isPanelUser">
<i
class="ico-c ico-btn ico-section back-grad-alert"
@click="DeleteDocumentPop(file)">
<svg><use href="/src/assets/images/icons.svg#trash"></use></svg>
</i>
</template>
</file-list-item>
</template>
</template>
<template v-else>
<template v-if="!usersStore.isPanelUser && usersStore.selectedUserApproveId !== 5">
<template
v-if="!usersStore.isPanelUser && usersStore.selectedUserApproveId !== 5">
<div class="form-inner-comment">
<span>
Eklenmiş dosya bulunamadı. Üstteki butonu kullanarak dosya ekleyebilirsiniz.
@ -79,20 +95,21 @@
</panel-wrapper>
</template>
<script setup lang="ts">
import { ref, onBeforeMount } from 'vue'
import { onBeforeMount } from 'vue'
import PanelUserDocument from '../panel/PanelUserDocument.vue'
import PanelWrapper from '@/components/PanelWrapper.vue'
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { useCustomerDocumentStore } from '../../stores/customerDocumentStore'
const customerDocumentStore = useCustomerDocumentStore()
import { useCustomerDocumentService } from '../../service/customerDocumentService'
const customerDocumentService = useCustomerDocumentService()
import { useDialogStore } from '@/components/global/dialogStore'
const dialogStore = useDialogStore()
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
const NewDocument = () => {
customerDocumentStore.ResetForm()
@ -106,6 +123,31 @@
customerDocumentStore.documentPanel = true
}
const DeleteDocumentPop = (data: Record<string, any>) => {
dialogStore.CreateDialog({
title: 'Doküman Sil',
id: 'deletedoc',
content: 'Dokümanı silmek istediğinize emin misiniz? Bu işlem geri alınamaz.',
closeText: 'Vazgeç',
buttons: [
{
label: 'Doküman Sil',
type: 'alert',
function: () => DeleteDocument(data.id)
}
]
})
}
const DeleteDocument = async (id: number | string) => {
var dt = await dataStore.dataDelete('AppUserDocument/' + id)
if (dt !== 'errorfalse') {
dialogStore.CloseDialog('deletedoc')
await customerDocumentService.GetDocumentList()
}
}
onBeforeMount(async () => {
usersStore.SetSelectedUser()

View File

@ -1,49 +1,64 @@
<template>
<div class='form-part'>
<div class='form-part-title'>
<div class="form-part">
<div class="form-part-title">
<h4>Profil Resmi</h4>
</div>
<div class='form-part-content'>
<div class="form-part-content">
<template v-if="file.filePath !== '' && file.filePath !== null">
<file-list-item
:data='file'
@click='ReplaceImage'
:data="file"
@click="ReplaceImage"
onlyPreview
:filePath='file.filePath' />
:filePath="file.filePath">
<template
#actionButtons
v-if="
route.name === 'Profil' ||
(route.name === 'Profil' && !usersStore.isPanelUser)
">
<i
class="ico-c ico-btn ico-section back-grad-alert"
@click="DeleteImagePop(file)">
<svg><use href="/src/assets/images/icons.svg#trash"></use></svg>
</i>
</template>
</file-list-item>
</template>
<template v-else>
<template v-if="route.name === 'Profil' || (route.name === 'Profil' && !usersStore.isPanelUser)">
<div class='form-item form-item-picture clickable' @click='picturePanel = true'>
<div class='image-c'>
<i class='ico-c'>
<template
v-if="
route.name === 'Profil' ||
(route.name === 'Profil' && !usersStore.isPanelUser)
">
<div class="form-item form-item-picture clickable" @click="picturePanel = true">
<div class="image-c">
<i class="ico-c">
<svg>
<use href='@/assets/images/icons.svg#plus'></use>
<use href="@/assets/images/icons.svg#plus"></use>
</svg>
</i>
</div>
</div>
</template>
<template v-else>
<div class='form-inner-comment'>
Eklenmiş resim bulunamadı.
</div>
<div class="form-inner-comment">Eklenmiş resim bulunamadı.</div>
</template>
</template>
</div>
</div>
<panel-wrapper
v-if='picturePanel'
v-model='picturePanel'
panel-title='Profil Resmi Ekle'>
v-if="picturePanel"
v-model="picturePanel"
panel-title="Profil Resmi Ekle">
<template #panelContent>
<panel-user-picture />
</template>
<template #footerButton>
<div class='button-c button-save' @click='FileUpload'>Ekle</div>
<div class="button-c button-save" @click="FileUpload">Ekle</div>
</template>
</panel-wrapper>
</template>
<script setup lang='ts'>
<script setup lang="ts">
import { ref, reactive, onBeforeMount } from 'vue'
import PanelUserPicture from '../panel/PanelUserPicture.vue'
import PanelWrapper from '@/components/PanelWrapper.vue'
@ -52,20 +67,13 @@
const route = useRoute()
import { useDataStore } from '@/stores/dataStore'
const dataStore = useDataStore()
import { useGlobalStore } from '@/stores/globalStore'
const globalStore = useGlobalStore()
import { useValidationStore } from '@/stores/validationStore'
const validationStore = useValidationStore()
import { useUsersStore } from '@/stores/usersStore'
const usersStore = useUsersStore()
import { useCustomerStore } from '@/module/uyeler/stores/customerStore'
const customerStore = useCustomerStore()
import { useDialogStore } from '@/components/global/dialogStore'
const dialogStore = useDialogStore()
const picturePanel = ref<boolean>(false)
const isUpdate = ref<boolean>(false)
@ -82,7 +90,9 @@
}
const GetData = async () => {
let dt = await dataStore.dataGet('AppUserResim/AppUserId/' + usersStore.selectedUserId())
let dt = await dataStore.dataGet(
'AppUserResim/AppUserId/' + usersStore.selectedUserId()
)
if (dt !== 'errorfalse') {
Object.assign(file, dt)
if (usersStore.selectedUserId() === usersStore.userId)
@ -126,6 +136,32 @@
}
}
}
const DeleteImagePop = (data: Record<string, any>) => {
dialogStore.CreateDialog({
title: 'Resim Sil',
id: 'deleteimage',
content: 'Resmi silmek istediğinize emin misiniz? Bu işlem geri alınamaz.',
closeText: 'Vazgeç',
buttons: [
{
label: 'Resim Sil',
type: 'alert',
function: () => DeleteImage(data.id)
}
]
})
}
const DeleteImage = async (id: number | string) => {
var dt = await dataStore.dataDelete('AppUserResim/' + id)
if (dt !== 'errorfalse') {
dialogStore.CloseDialog('deleteimage')
await GetData()
}
}
onBeforeMount(async () => {
await GetData()
})

View File

@ -8,7 +8,7 @@ export const useDataStore = defineStore('dataStore', () => {
const globalDataStore = useGlobalDataStore()
const toastStore = useToastStore()
const siteBase = ref<string>('https://panelapi.cekilisevi.gov.tr/')
const siteBase = ref<string>(import.meta.env.VITE_API_URL)
const apiBase = ref<string>('api/')
const panelData = reactive<Record<string, any>>({})
const pageData = reactive<Record<string, any>>({})
@ -40,7 +40,7 @@ export const useDataStore = defineStore('dataStore', () => {
}
const response = await axios.get(apiBase.value + api, sendData)
//console.log('response --', api, response)
console.log('response --', api, response)
if (data.full !== undefined && data.full) {
return response
@ -49,7 +49,7 @@ export const useDataStore = defineStore('dataStore', () => {
}
} catch (error: any) {
CheckApiError(error.response.status, error.response.data)
//console.error('Hata oluştu -:', error)
console.error('Hata oluştu -:', error)
return 'errorfalse'
}
}
@ -86,7 +86,7 @@ export const useDataStore = defineStore('dataStore', () => {
} catch (error: any) {
CheckApiError(error.response.status, error.response.data)
//console.error('Hata oluştu:', error)
console.error('Hata oluştu:', error)
return Promise.resolve('errorfalse')
}
}
@ -122,7 +122,7 @@ export const useDataStore = defineStore('dataStore', () => {
} catch (error: any) {
CheckApiError(error.response.status, error.response.data)
//console.error('Hata oluştu:', error)
console.error('Hata oluştu:', error)
return Promise.resolve('errorfalse')
}
}
@ -156,24 +156,30 @@ export const useDataStore = defineStore('dataStore', () => {
}
} catch (error: any) {
CheckApiError(error.response.status, error.response.data)
//console.error('Hata oluştu:', error)
console.error('Hata oluştu:', error)
return Promise.resolve('errorfalse')
}
}
const CheckApiError = async (status: number, data: Record<string, any>) => {
if (status === 400) {
const errorKey = data['hata'] || data['errors']
const errorKey = typeof data === "string" ? data : data?.hata || data?.errors;
if (errorKey !== undefined) {
errorKey.forEach((el: string) => {
toastStore.AddToast(el, 'alert')
})
if (Array.isArray(errorKey)) {
errorKey.forEach((el: string) => {
toastStore.AddToast(el, "alert");
});
} else if (typeof errorKey === "string") {
toastStore.AddToast(errorKey, "alert");
} else {
toastStore.AddToast("Bir hata oluştu.", "alert");
}
} else {
toastStore.AddToast('Bir hata oluştu.', 'alert')
toastStore.AddToast("Bir hata oluştu.", "alert");
}
}
}
};
const GetCustomerTipList = async () => {
if (globalDataStore.customerTips.length === 0) {

View File

@ -6,10 +6,22 @@ import vueJsx from '@vitejs/plugin-vue-jsx'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue(), vueJsx()],
plugins: [
vue({
template: {
compilerOptions: {
comments: false
}
}
}),
vueJsx()
],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
},
esbuild: {
drop: process.env.NODE_ENV === 'production' ? ['console', 'debugger'] : []
}
})