This commit is contained in:
2026-02-11 17:46:22 +03:00
commit eacfacb13b
266 changed files with 51337 additions and 0 deletions

View File

@@ -0,0 +1,272 @@
<template>
<q-page
v-if="canReadOrder"
class="order-gateway flex flex-center column"
>
<div class="text-h5 text-primary q-mb-xl">
🧾 Sipariş Modülü
</div>
<!-- 🟡 TASLAK -->
<div
v-if="hasDraft && canUpdateOrder"
class="draft-card q-pa-lg rounded-borders shadow-2 bg-white"
>
<div class="text-subtitle1 text-bold text-negative">
📌 Devam Eden Taslak Bulundu
</div>
<div class="q-mt-sm">
<div v-if="draftNumber">
<b>No:</b> {{ draftNumber }}
</div>
<div v-else class="text-grey-7">
Numara alınamadı
</div>
</div>
<q-btn
class="q-mt-md"
color="primary"
icon="login"
label="TASLAĞA DEVAM ET"
:disable="!canUpdateOrder"
@click="continueDraft"
/>
</div>
<!-- 🔘 BUTTONS -->
<div class="row q-gutter-lg q-mt-xl">
<!-- NEW ORDER -->
<q-btn
v-if="canWriteOrder"
color="primary"
icon="add_circle"
label="YENİ SİPARİŞ OLUŞTUR"
@click="confirmNewOrder"
/>
<!-- ORDER LIST -->
<q-btn
v-if="canReadOrder"
color="secondary"
icon="folder_open"
label="MEVCUT SİPARİŞİ AÇ"
@click="goOrderList"
/>
</div>
<!-- YETKİ YOKSA -->
<div
v-if="!canReadOrder"
class="text-negative text-subtitle1 q-mt-xl"
>
Bu modüle erişim yetkiniz yok.
</div>
</q-page>
</template>
<script setup>
import { computed } from 'vue'
import { useRouter } from 'vue-router'
import { useQuasar } from 'quasar'
import { useOrderEntryStore } from 'src/stores/orderentryStore'
import { usePermission } from 'src/composables/usePermission'
const { canRead, canWrite, canUpdate } = usePermission()
const canReadOrder = canRead('order')
const canWriteOrder = canWrite('order')
const canUpdateOrder = canUpdate('order')
const router = useRouter()
const $q = useQuasar()
const store = useOrderEntryStore()
const activeNewHeaderID = computed(() => {
try {
return localStorage.getItem(store.getLastTxnKey)
} catch {
return null
}
})
/* ===========================================================
🔍 NEW DRAFT — TEK VE DOĞRU KAYNAK
→ SADECE store.getDraftKey
=========================================================== */
const draftRaw = computed(() => {
try {
return localStorage.getItem(store.getDraftKey)
} catch {
return null
}
})
const hasDraft = computed(() => {
if (!draftRaw.value) return false
try {
const snap = JSON.parse(draftRaw.value)
return snap?.mode === 'new'
} catch {
return false
}
})
const draftNumber = computed(() => {
if (!hasDraft.value) return null
try {
return JSON.parse(draftRaw.value)?.header?.OrderNumber || null
} catch {
return null
}
})
function continueDraft () {
if (!canUpdateOrder.value) {
$q.notify({
type: 'negative',
message: 'Taslak güncelleme yetkiniz yok'
})
return
}
// 1) önce store meta
let activeId = store.getActiveNewHeaderId?.()
// 2) fallback: draft payload içinden
if (!activeId) {
try {
const raw = localStorage.getItem(store.getDraftKey)
const snap = raw ? JSON.parse(raw) : null
activeId = snap?.header?.OrderHeaderID || null
} catch {}
}
if (!activeId) {
$q.notify({ type: 'warning', message: 'Devam edecek taslak bulunamadı' })
return
}
// name resolve + path fallback
const target = {
name: 'order-entry',
params: { orderHeaderID: String(activeId) },
query: { mode: 'new', source: 'draft' }
}
// DEBUG: resolve sonucu
console.log('➡️ continueDraft resolve:', router.resolve(target))
router.push(target).catch(err => {
console.warn('❌ continueDraft push failed, fallback to path:', err)
router.push({
path: `/app/order-entry/${encodeURIComponent(String(activeId))}`,
query: { mode: 'new', source: 'draft' }
})
})
}
/* ===========================================================
📂 Mevcut Sipariş Listesi
=========================================================== */
function goOrderList () {
router.push({ name: 'order-list' })
}
/* ===========================================================
🧹 NEW Taslağı Temizle (SADECE NEW)
=========================================================== */
function clearNewDraft () {
try {
localStorage.removeItem(store.getDraftKey)
if (store.getLastTxnKey) {
localStorage.removeItem(store.getLastTxnKey)
}
} catch {}
}
/* ===========================================================
🟢 Yeni Sipariş Onayı
=========================================================== */
function confirmNewOrder () {
if (!canWriteOrder.value) {
$q.notify({
type: 'negative',
message: 'Yeni sipariş yetkiniz yok'
})
return
}
if (!hasDraft.value) {
goNewOrder()
return
}
$q.dialog({
title: 'Yeni Sipariş',
message: 'Önceki NEW taslak silinecek. Onaylıyor musun?',
ok: { label: 'Evet', color: 'negative' },
cancel: { flat: true, label: 'Hayır' },
persistent: true
}).onOk(() => {
clearNewDraft()
goNewOrder()
})
}
/* ===========================================================
🟦 Yeni Sipariş Başlat — TAM SIFIR
=========================================================== */
async function goNewOrder () {
try {
store.preventPersist = true
store.resetForNewOrder()
store.preventPersist = false
const header = await store.startNewOrder({ $q })
const newId = header?.OrderHeaderID
if (!newId) {
console.error('❌ startNewOrder OrderHeaderID üretmedi:', header)
$q.notify({ type: 'negative', message: 'OrderHeaderID üretilemedi!' })
return
}
const target = {
name: 'order-entry',
params: { orderHeaderID: String(newId) },
query: { mode: 'new', source: 'new' }
}
// DEBUG: resolve sonucu (çok kritik)
console.log('➡️ goNewOrder resolve:', router.resolve(target))
// ✅ mutlaka await + catch
await router.push(target).catch(async (err) => {
console.warn('❌ router.push failed, fallback to path:', err)
await router.push({
path: `/app/order-entry/${encodeURIComponent(String(newId))}`,
query: { mode: 'new', source: 'new' }
})
})
} catch (err) {
console.error('❌ goNewOrder hata:', err)
$q.notify({ type: 'negative', message: 'Yeni sipariş oluşturulamadı!' })
}
}
</script>