Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -968,7 +968,7 @@ VALUES (
|
|||||||
|
|
||||||
nullableBool(header.IsSalesViaInternet, false),
|
nullableBool(header.IsSalesViaInternet, false),
|
||||||
nullableBool(header.IsSuspended, false),
|
nullableBool(header.IsSuspended, false),
|
||||||
nullableBool(header.IsCompleted, false),
|
nullableBool(header.IsCompleted, true),
|
||||||
nullableBool(header.IsPrinted, false),
|
nullableBool(header.IsPrinted, false),
|
||||||
|
|
||||||
nullableBool(header.IsLocked, false),
|
nullableBool(header.IsLocked, false),
|
||||||
|
|||||||
@@ -3,18 +3,27 @@ package queries
|
|||||||
const GetProductColors = `
|
const GetProductColors = `
|
||||||
DECLARE @ProductCode VARCHAR(30) = @p1;
|
DECLARE @ProductCode VARCHAR(30) = @p1;
|
||||||
|
|
||||||
|
WITH NormalizedColors AS (
|
||||||
|
SELECT
|
||||||
|
p.ProductCode,
|
||||||
|
CASE
|
||||||
|
WHEN ISNULL(v.ColorCode, '') = '000' THEN '001'
|
||||||
|
ELSE ISNULL(v.ColorCode, '')
|
||||||
|
END AS ColorCode
|
||||||
|
FROM ProductFilterWithDescription('TR') AS p
|
||||||
|
INNER JOIN prItemVariant AS v WITH(NOLOCK)
|
||||||
|
ON v.ItemCode = p.ProductCode
|
||||||
|
WHERE
|
||||||
|
p.ProductCode = @ProductCode
|
||||||
|
AND ISNULL(v.ColorCode, '') <> ''
|
||||||
|
)
|
||||||
SELECT DISTINCT
|
SELECT DISTINCT
|
||||||
p.ProductCode,
|
n.ProductCode,
|
||||||
v.ColorCode,
|
n.ColorCode,
|
||||||
ISNULL(cd.ColorDescription, '') AS ColorDescription
|
ISNULL(cd.ColorDescription, CASE WHEN n.ColorCode = '001' THEN 'SIYAH' ELSE '' END) AS ColorDescription
|
||||||
FROM ProductFilterWithDescription('TR') AS p
|
FROM NormalizedColors AS n
|
||||||
INNER JOIN prItemVariant AS v WITH(NOLOCK)
|
|
||||||
ON v.ItemCode = p.ProductCode
|
|
||||||
LEFT JOIN cdColorDesc AS cd WITH(NOLOCK)
|
LEFT JOIN cdColorDesc AS cd WITH(NOLOCK)
|
||||||
ON cd.ColorCode = v.ColorCode
|
ON cd.ColorCode = n.ColorCode
|
||||||
AND cd.LangCode = 'TR'
|
AND cd.LangCode = 'TR'
|
||||||
WHERE
|
ORDER BY n.ColorCode;
|
||||||
p.ProductCode = @ProductCode
|
|
||||||
AND ISNULL(v.ColorCode, '') <> ''
|
|
||||||
ORDER BY v.ColorCode;
|
|
||||||
`
|
`
|
||||||
|
|||||||
@@ -1,24 +1,40 @@
|
|||||||
package queries
|
package queries
|
||||||
|
|
||||||
const GetProductSecondColors = `
|
const GetProductSecondColors = `
|
||||||
|
WITH NormalizedVariants AS (
|
||||||
|
SELECT
|
||||||
|
Product.ProductCode,
|
||||||
|
CASE
|
||||||
|
WHEN ISNULL(prItemVariant.ColorCode, '') = '000' THEN '001'
|
||||||
|
ELSE ISNULL(prItemVariant.ColorCode, '')
|
||||||
|
END AS ColorCode,
|
||||||
|
CASE
|
||||||
|
WHEN ISNULL(prItemVariant.ItemDim2Code, '') = '000' THEN '001'
|
||||||
|
ELSE ISNULL(prItemVariant.ItemDim2Code, '')
|
||||||
|
END AS ItemDim2Code
|
||||||
|
FROM prItemVariant WITH(NOLOCK)
|
||||||
|
INNER JOIN ProductFilterWithDescription('TR') AS Product
|
||||||
|
ON prItemVariant.ItemCode = Product.ProductCode
|
||||||
|
WHERE Product.ProductCode = @ProductCode
|
||||||
|
)
|
||||||
SELECT
|
SELECT
|
||||||
Product.ProductCode,
|
Variant.ProductCode,
|
||||||
ISNULL(prItemVariant.ColorCode, '') AS ColorCode,
|
Variant.ColorCode,
|
||||||
ISNULL(prItemVariant.ItemDim2Code, '') AS ItemDim2Code,
|
Variant.ItemDim2Code,
|
||||||
ISNULL(ColorDesc.ColorDescription, '') AS ColorDescription
|
ISNULL(ColorDesc.ColorDescription, CASE WHEN Variant.ItemDim2Code = '001' THEN 'SIYAH' ELSE '' END) AS ColorDescription
|
||||||
FROM prItemVariant WITH(NOLOCK)
|
FROM NormalizedVariants AS Variant
|
||||||
INNER JOIN ProductFilterWithDescription('TR') AS Product
|
|
||||||
ON prItemVariant.ItemCode = Product.ProductCode
|
|
||||||
LEFT JOIN cdColorDesc AS ColorDesc WITH(NOLOCK)
|
LEFT JOIN cdColorDesc AS ColorDesc WITH(NOLOCK)
|
||||||
ON ColorDesc.ColorCode = prItemVariant.ItemDim2Code
|
ON ColorDesc.ColorCode = Variant.ItemDim2Code
|
||||||
AND ColorDesc.LangCode = 'TR'
|
AND ColorDesc.LangCode = 'TR'
|
||||||
WHERE Product.ProductCode = @ProductCode
|
WHERE Variant.ColorCode = CASE
|
||||||
AND prItemVariant.ColorCode = @ColorCode
|
WHEN ISNULL(@ColorCode, '') = '000' THEN '001'
|
||||||
AND ISNULL(prItemVariant.ItemDim2Code, '') <> ''
|
ELSE ISNULL(@ColorCode, '')
|
||||||
|
END
|
||||||
|
AND Variant.ItemDim2Code <> ''
|
||||||
GROUP BY
|
GROUP BY
|
||||||
Product.ProductCode,
|
Variant.ProductCode,
|
||||||
prItemVariant.ItemDim2Code,
|
Variant.ItemDim2Code,
|
||||||
prItemVariant.ColorCode,
|
Variant.ColorCode,
|
||||||
ColorDesc.ColorDescription
|
ColorDesc.ColorDescription
|
||||||
ORDER BY ItemDim2Code
|
ORDER BY Variant.ItemDim2Code
|
||||||
`
|
`
|
||||||
|
|||||||
@@ -2928,8 +2928,8 @@ async function onColorChange(colorCode) {
|
|||||||
const data = res?.data || []
|
const data = res?.data || []
|
||||||
if (Array.isArray(data) && data.length > 0) {
|
if (Array.isArray(data) && data.length > 0) {
|
||||||
renkOptions2.value = data.map(x => ({
|
renkOptions2.value = data.map(x => ({
|
||||||
label: x.item_dim2_code,
|
label: `${x.item_dim2_code || x.ItemDim2Code || ''} - ${x.color_description || x.ColorDescription || ''}`.trim(),
|
||||||
value: x.item_dim2_code
|
value: x.item_dim2_code || x.ItemDim2Code || ''
|
||||||
}))
|
}))
|
||||||
console.log('🎨 2. renk listesi yüklendi:', renkOptions2.value.length)
|
console.log('🎨 2. renk listesi yüklendi:', renkOptions2.value.length)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -108,44 +108,46 @@
|
|||||||
|
|
||||||
<template #body-cell-NewItemCode="props">
|
<template #body-cell-NewItemCode="props">
|
||||||
<q-td :props="props">
|
<q-td :props="props">
|
||||||
|
<q-select
|
||||||
|
v-model="props.row.NewItemEntryMode"
|
||||||
|
dense
|
||||||
|
filled
|
||||||
|
emit-value
|
||||||
|
map-options
|
||||||
|
:options="newItemEntryModeOptions"
|
||||||
|
label="Kod Giris Tipi"
|
||||||
|
@update:model-value="val => onNewItemEntryModeChange(props.row, val)"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<q-select
|
||||||
|
v-if="props.row.NewItemEntryMode === 'selected'"
|
||||||
|
class="q-mt-xs"
|
||||||
|
v-model="props.row.NewItemCode"
|
||||||
|
dense
|
||||||
|
filled
|
||||||
|
use-input
|
||||||
|
emit-value
|
||||||
|
map-options
|
||||||
|
option-label="label"
|
||||||
|
option-value="value"
|
||||||
|
:options="productCodeSelectOptions"
|
||||||
|
label="Eski Kod Sec"
|
||||||
|
@update:model-value="val => onSelectProduct(props.row, val)"
|
||||||
|
/>
|
||||||
|
|
||||||
<q-input
|
<q-input
|
||||||
|
v-else-if="props.row.NewItemEntryMode === 'typed'"
|
||||||
|
class="q-mt-xs"
|
||||||
v-model="props.row.NewItemCode"
|
v-model="props.row.NewItemCode"
|
||||||
dense
|
dense
|
||||||
filled
|
filled
|
||||||
maxlength="13"
|
maxlength="13"
|
||||||
label="Yeni Urun"
|
placeholder="X999-XX99999"
|
||||||
|
label="Yeni Kod Ekle"
|
||||||
:class="newItemInputClass(props.row)"
|
:class="newItemInputClass(props.row)"
|
||||||
@update:model-value="val => onNewItemChange(props.row, val, 'typed')"
|
@update:model-value="val => onNewItemChange(props.row, val, 'typed')"
|
||||||
>
|
/>
|
||||||
<template #append>
|
|
||||||
<q-icon name="arrow_drop_down" class="cursor-pointer" />
|
|
||||||
</template>
|
|
||||||
<q-menu
|
|
||||||
anchor="bottom left"
|
|
||||||
self="top left"
|
|
||||||
fit
|
|
||||||
>
|
|
||||||
<div class="q-pa-sm" style="min-width:260px">
|
|
||||||
<q-input
|
|
||||||
v-model="productSearch"
|
|
||||||
dense
|
|
||||||
filled
|
|
||||||
debounce="200"
|
|
||||||
placeholder="Urun ara..."
|
|
||||||
/>
|
|
||||||
<q-list class="q-mt-xs" bordered separator>
|
|
||||||
<q-item
|
|
||||||
v-for="opt in filteredProducts"
|
|
||||||
:key="opt.ProductCode"
|
|
||||||
clickable
|
|
||||||
@click="onSelectProduct(props.row, opt.ProductCode)"
|
|
||||||
>
|
|
||||||
<q-item-section>{{ opt.ProductCode }}</q-item-section>
|
|
||||||
</q-item>
|
|
||||||
</q-list>
|
|
||||||
</div>
|
|
||||||
</q-menu>
|
|
||||||
</q-input>
|
|
||||||
<div v-if="props.row.NewItemMode && props.row.NewItemMode !== 'empty'" class="q-mt-xs row items-center no-wrap">
|
<div v-if="props.row.NewItemMode && props.row.NewItemMode !== 'empty'" class="q-mt-xs row items-center no-wrap">
|
||||||
<q-badge :color="newItemBadgeColor(props.row)" text-color="white">
|
<q-badge :color="newItemBadgeColor(props.row)" text-color="white">
|
||||||
{{ newItemBadgeLabel(props.row) }}
|
{{ newItemBadgeLabel(props.row) }}
|
||||||
@@ -361,8 +363,8 @@ import { normalizeSearchText } from 'src/utils/searchText'
|
|||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const $q = useQuasar()
|
const $q = useQuasar()
|
||||||
const store = useOrderProductionItemStore()
|
const store = useOrderProductionItemStore()
|
||||||
const BAGGI_CODE_PATTERN = /^[A-Z][0-9]{3}-[A-Z]{3}[0-9]{5}$/
|
const BAGGI_CODE_PATTERN = /^[A-Z][0-9]{3}-[A-Z]{2,3}[0-9]{5}$/
|
||||||
const BAGGI_CODE_ERROR = 'Girdiginiz kod BAGGI kod sistemine uyumlu degil. Format: X999-XXX99999'
|
const BAGGI_CODE_ERROR = 'Girdiginiz kod BAGGI kod sistemine uyumlu degil. Format: X999-XX99999'
|
||||||
|
|
||||||
const orderHeaderID = computed(() => String(route.params.orderHeaderID || '').trim())
|
const orderHeaderID = computed(() => String(route.params.orderHeaderID || '').trim())
|
||||||
const header = computed(() => store.header || {})
|
const header = computed(() => store.header || {})
|
||||||
@@ -377,7 +379,6 @@ const cariLabel = computed(() => {
|
|||||||
const rows = ref([])
|
const rows = ref([])
|
||||||
const descFilter = ref('')
|
const descFilter = ref('')
|
||||||
const productOptions = ref([])
|
const productOptions = ref([])
|
||||||
const productSearch = ref('')
|
|
||||||
const selectedMap = ref({})
|
const selectedMap = ref({})
|
||||||
const cdItemDialogOpen = ref(false)
|
const cdItemDialogOpen = ref(false)
|
||||||
const cdItemTargetCode = ref('')
|
const cdItemTargetCode = ref('')
|
||||||
@@ -429,14 +430,6 @@ function formatDate (val) {
|
|||||||
return text.length >= 10 ? text.slice(0, 10) : text
|
return text.length >= 10 ? text.slice(0, 10) : text
|
||||||
}
|
}
|
||||||
|
|
||||||
const filteredProducts = computed(() => {
|
|
||||||
const needle = normalizeSearchText(productSearch.value)
|
|
||||||
if (!needle) return productOptions.value.slice(0, 50)
|
|
||||||
return productOptions.value.filter(p =>
|
|
||||||
normalizeSearchText(p?.ProductCode).includes(needle)
|
|
||||||
).slice(0, 50)
|
|
||||||
})
|
|
||||||
|
|
||||||
const filteredRows = computed(() => {
|
const filteredRows = computed(() => {
|
||||||
const needle = normalizeSearchText(descFilter.value)
|
const needle = normalizeSearchText(descFilter.value)
|
||||||
if (!needle) return rows.value
|
if (!needle) return rows.value
|
||||||
@@ -449,6 +442,17 @@ const visibleRowKeys = computed(() => filteredRows.value.map(r => r.RowKey))
|
|||||||
const selectedVisibleCount = computed(() => visibleRowKeys.value.filter(k => !!selectedMap.value[k]).length)
|
const selectedVisibleCount = computed(() => visibleRowKeys.value.filter(k => !!selectedMap.value[k]).length)
|
||||||
const allSelectedVisible = computed(() => visibleRowKeys.value.length > 0 && selectedVisibleCount.value === visibleRowKeys.value.length)
|
const allSelectedVisible = computed(() => visibleRowKeys.value.length > 0 && selectedVisibleCount.value === visibleRowKeys.value.length)
|
||||||
const someSelectedVisible = computed(() => selectedVisibleCount.value > 0)
|
const someSelectedVisible = computed(() => selectedVisibleCount.value > 0)
|
||||||
|
const newItemEntryModeOptions = [
|
||||||
|
{ label: 'Eski Kod Sec', value: 'selected' },
|
||||||
|
{ label: 'Yeni Kod Ekle', value: 'typed' }
|
||||||
|
]
|
||||||
|
|
||||||
|
const productCodeSelectOptions = computed(() =>
|
||||||
|
(productOptions.value || []).map(p => {
|
||||||
|
const code = String(p?.ProductCode || '').trim().toUpperCase()
|
||||||
|
return { label: code, value: code }
|
||||||
|
}).filter(x => !!x.value)
|
||||||
|
)
|
||||||
|
|
||||||
function applyNewItemVisualState (row, source = 'typed') {
|
function applyNewItemVisualState (row, source = 'typed') {
|
||||||
const info = store.classifyItemCode(row?.NewItemCode || '')
|
const info = store.classifyItemCode(row?.NewItemCode || '')
|
||||||
@@ -485,10 +489,20 @@ function newItemHintText (row) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function onSelectProduct (row, code) {
|
function onSelectProduct (row, code) {
|
||||||
productSearch.value = ''
|
row.NewItemEntryMode = 'selected'
|
||||||
onNewItemChange(row, code, 'selected')
|
onNewItemChange(row, code, 'selected')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onNewItemEntryModeChange (row, mode) {
|
||||||
|
const next = String(mode || '').trim()
|
||||||
|
row.NewItemEntryMode = next
|
||||||
|
row.NewItemCode = ''
|
||||||
|
row.NewItemMode = 'empty'
|
||||||
|
row.NewItemSource = ''
|
||||||
|
row.NewColor = ''
|
||||||
|
row.NewDim2 = ''
|
||||||
|
}
|
||||||
|
|
||||||
function onNewItemChange (row, val, source = 'typed') {
|
function onNewItemChange (row, val, source = 'typed') {
|
||||||
const prevCode = String(row?.NewItemCode || '').trim().toUpperCase()
|
const prevCode = String(row?.NewItemCode || '').trim().toUpperCase()
|
||||||
const next = String(val || '').trim().toUpperCase()
|
const next = String(val || '').trim().toUpperCase()
|
||||||
@@ -529,7 +543,7 @@ function getColorOptions (row) {
|
|||||||
const list = store.colorOptionsByCode[code] || []
|
const list = store.colorOptionsByCode[code] || []
|
||||||
return list.map(c => ({
|
return list.map(c => ({
|
||||||
...c,
|
...c,
|
||||||
colorLabel: `${c.color_code} - ${c.color_description || ''}`.trim()
|
colorLabel: `${c.color_code || c.ColorCode || ''} - ${c.color_description || c.ColorDescription || ''}`.trim()
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -540,7 +554,8 @@ function getSecondColorOptions (row) {
|
|||||||
const list = store.secondColorOptionsByKey[key] || []
|
const list = store.secondColorOptionsByKey[key] || []
|
||||||
return list.map(c => ({
|
return list.map(c => ({
|
||||||
...c,
|
...c,
|
||||||
item_dim2_label: `${c.item_dim2_code} - ${c.color_description || ''}`.trim()
|
item_dim2_code: c.item_dim2_code || c.ItemDim2Code || '',
|
||||||
|
item_dim2_label: `${c.item_dim2_code || c.ItemDim2Code || ''} - ${c.color_description || c.ColorDescription || ''}`.trim()
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -569,12 +584,14 @@ function isValidBaggiModelCode (code) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function validateRowInput (row) {
|
function validateRowInput (row) {
|
||||||
|
const entryMode = String(row?.NewItemEntryMode || '').trim()
|
||||||
const newItemCode = String(row.NewItemCode || '').trim().toUpperCase()
|
const newItemCode = String(row.NewItemCode || '').trim().toUpperCase()
|
||||||
const newColor = normalizeShortCode(row.NewColor, 3)
|
const newColor = normalizeShortCode(row.NewColor, 3)
|
||||||
const newDim2 = normalizeShortCode(row.NewDim2, 3)
|
const newDim2 = normalizeShortCode(row.NewDim2, 3)
|
||||||
const oldColor = String(row.OldColor || '').trim()
|
const oldColor = String(row.OldColor || '').trim()
|
||||||
const oldDim2 = String(row.OldDim2 || '').trim()
|
const oldDim2 = String(row.OldDim2 || '').trim()
|
||||||
|
|
||||||
|
if (!entryMode) return 'Lutfen once kod giris tipini seciniz (Eski Kod Sec / Yeni Kod Ekle).'
|
||||||
if (!newItemCode) return 'Yeni model kodu zorunludur.'
|
if (!newItemCode) return 'Yeni model kodu zorunludur.'
|
||||||
if (!isValidBaggiModelCode(newItemCode)) {
|
if (!isValidBaggiModelCode(newItemCode)) {
|
||||||
return BAGGI_CODE_ERROR
|
return BAGGI_CODE_ERROR
|
||||||
@@ -928,14 +945,15 @@ function groupItems (items, prevRows = []) {
|
|||||||
const prevMap = new Map()
|
const prevMap = new Map()
|
||||||
for (const r of prevRows || []) {
|
for (const r of prevRows || []) {
|
||||||
if (!r?.RowKey) continue
|
if (!r?.RowKey) continue
|
||||||
prevMap.set(r.RowKey, {
|
prevMap.set(r.RowKey, {
|
||||||
NewDesc: String(r.NewDesc || '').trim(),
|
NewDesc: String(r.NewDesc || '').trim(),
|
||||||
NewItemCode: String(r.NewItemCode || '').trim().toUpperCase(),
|
NewItemCode: String(r.NewItemCode || '').trim().toUpperCase(),
|
||||||
NewColor: String(r.NewColor || '').trim().toUpperCase(),
|
NewColor: String(r.NewColor || '').trim().toUpperCase(),
|
||||||
NewDim2: String(r.NewDim2 || '').trim().toUpperCase(),
|
NewDim2: String(r.NewDim2 || '').trim().toUpperCase(),
|
||||||
NewItemMode: String(r.NewItemMode || '').trim(),
|
NewItemMode: String(r.NewItemMode || '').trim(),
|
||||||
NewItemSource: String(r.NewItemSource || '').trim()
|
NewItemSource: String(r.NewItemSource || '').trim(),
|
||||||
})
|
NewItemEntryMode: String(r.NewItemEntryMode || '').trim()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
const map = new Map()
|
const map = new Map()
|
||||||
|
|
||||||
@@ -962,6 +980,7 @@ function groupItems (items, prevRows = []) {
|
|||||||
NewDesc: prevDesc || fallbackDesc,
|
NewDesc: prevDesc || fallbackDesc,
|
||||||
NewItemMode: prev.NewItemMode || 'empty',
|
NewItemMode: prev.NewItemMode || 'empty',
|
||||||
NewItemSource: prev.NewItemSource || '',
|
NewItemSource: prev.NewItemSource || '',
|
||||||
|
NewItemEntryMode: prev.NewItemEntryMode || '',
|
||||||
IsVariantMissing: !!it.IsVariantMissing
|
IsVariantMissing: !!it.IsVariantMissing
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -986,6 +1005,9 @@ function groupItems (items, prevRows = []) {
|
|||||||
g.NewItemCode = info.normalized
|
g.NewItemCode = info.normalized
|
||||||
g.NewItemMode = info.mode
|
g.NewItemMode = info.mode
|
||||||
if (info.mode === 'empty') g.NewItemSource = ''
|
if (info.mode === 'empty') g.NewItemSource = ''
|
||||||
|
if (!g.NewItemEntryMode && g.NewItemCode) {
|
||||||
|
g.NewItemEntryMode = g.NewItemSource === 'selected' ? 'selected' : 'typed'
|
||||||
|
}
|
||||||
delete g.__sizeMap
|
delete g.__sizeMap
|
||||||
out.push(g)
|
out.push(g)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user