[update] struk klo 1 item

This commit is contained in:
dhilanradya 2025-09-19 17:04:21 +07:00
parent 89cc69d789
commit 6d1cba0f2a
2 changed files with 72 additions and 32 deletions

View File

@ -64,18 +64,23 @@
</thead> </thead>
<tbody> <tbody>
<tr v-for="(item, index) in pesananMinimal" :key="index" class="text-center"> <!-- Item rows dengan dynamic height -->
<tr v-for="(item, index) in props.pesanan" :key="index"
class="text-center"
:style="getRowStyle()">
<td class="border-r border-D"> <td class="border-r border-D">
<span v-if="item.harga_deal">1</span> <span v-if="item.harga_deal">1</span>
</td> </td>
<td class="flex items-center gap-2 p-2 border-r border-D"> <td class="flex items-center gap-2 p-2 border-r border-D" :style="getRowStyle()">
<template v-if="item.produk?.foto?.[0]?.url"> <template v-if="item.produk?.foto?.[0]?.url">
<img :src="item.produk.foto[0].url" class="w-12 h-12 object-cover" /> <img :src="item.produk.foto[0].url"
:class="getImageClass()"
class="object-cover" />
</template> </template>
<template v-else> <template v-else>
<div class="w-12 h-12"></div> <div :class="getImageClass()"></div>
</template> </template>
{{ item.produk?.nama || '' }} <span :class="getTextClass()">{{ item.produk?.nama || '' }}</span>
</td> </td>
<td class="border-r border-D">{{ item.produk.nama ? (item.nampan?.nama || 'Brankas') : '' }}</td> <td class="border-r border-D">{{ item.produk.nama ? (item.nampan?.nama || 'Brankas') : '' }}</td>
<td class="border-r border-D"> <td class="border-r border-D">
@ -240,6 +245,32 @@ const grandTotal = computed(() => {
return props.total + (ongkosBikin.value || 0) return props.total + (ongkosBikin.value || 0)
}) })
// Fungsi untuk menentukan style row berdasarkan jumlah item
const getRowStyle = () => {
if (props.pesanan.length === 1) {
return { height: '126px' } // 2x lipat dari tinggi normal (48px)
}
return { height: '63px' } // Tinggi normal
}
// Fungsi untuk menentukan class gambar berdasarkan jumlah item
const getImageClass = () => {
if (props.pesanan.length === 1) {
return 'w-25 h-25' // 2x lipat dari ukuran normal (w-10 h-10)
}
return 'w-12 h-12' // Ukuran normal
}
// Fungsi untuk menentukan class text berdasarkan jumlah item
const getTextClass = () => {
if (props.pesanan.length === 1) {
return 'text-lg font-medium' // Text lebih besar untuk single item
}
return 'text-sm' // Text normal
}
const getCurrentDate = () => { const getCurrentDate = () => {
const days = ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'] const days = ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu']
const months = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'] const months = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12']
@ -354,14 +385,6 @@ onMounted(() => {
} }
}) })
const pesananMinimal = computed(() => {
const arr = [...props.pesanan]
while (arr.length < 2) {
arr.push({ produk: {}, harga_deal: 0, posisi: '' })
}
return arr
})
function formatInput(e) { function formatInput(e) {
let value = e.target.value.replace(/\D/g, ""); let value = e.target.value.replace(/\D/g, "");
ongkosBikin.value = value ? parseInt(value, 10) : null; ongkosBikin.value = value ? parseInt(value, 10) : null;

View File

@ -2,7 +2,7 @@
<div v-if="isOpen" <div v-if="isOpen"
class="text-D pt-serif-regular-italic fixed inset-0 bg-black/75 flex items-center justify-center z-[9999]"> class="text-D pt-serif-regular-italic fixed inset-0 bg-black/75 flex items-center justify-center z-[9999]">
<!-- Tambahkan class "print-area" agar bisa difokuskan saat print --> <!-- print-area untuk fokus saat print -->
<div class="print-area bg-white w-[1224px] h-[528px] rounded-md shadow-lg relative overflow-hidden"> <div class="print-area bg-white w-[1224px] h-[528px] rounded-md shadow-lg relative overflow-hidden">
<div class="bg-yellow-500 h-8 w-full"> <div class="bg-yellow-500 h-8 w-full">
<div class="bg-D h-6 w-full"></div> <div class="bg-D h-6 w-full"></div>
@ -68,23 +68,23 @@
</thead> </thead>
<tbody> <tbody>
<tr v-for="(item, index) in itemsWithMinimal" :key="index" class="text-center"> <tr v-for="(item, index) in itemsWithMinimal" :key="index" class="text-center" :style="getRowStyle()">
<td class="border-r border-D"> <td class="border-r border-D">
<span v-if="item.harga_deal && item.harga_deal > 0">1</span> <span v-if="item.harga_deal && item.harga_deal > 0">1</span>
</td> </td>
<td class="flex items-center gap-2 p-2 border-r border-D"> <td class="flex items-center gap-2 p-2 border-r border-D" :style="getRowStyle()">
<template v-if="item.produk?.foto?.[0]?.url"> <template v-if="item.produk?.foto?.[0]?.url">
<img :src="item.produk.foto[0].url" class="w-12 h-12 object-cover rounded" /> <img :src="item.produk.foto[0].url" :class="getImageClass()" class="object-cover rounded" />
</template> </template>
<template v-else-if="item.produk?.nama"> <template v-else-if="item.produk?.nama">
<div class="w-12 h-12 bg-gray-200 rounded flex items-center justify-center"> <div :class="getImageClass() + ' bg-gray-200 rounded flex items-center justify-center'">
<span class="text-xs text-gray-500">IMG</span> <span class="text-xs text-gray-500">IMG</span>
</div> </div>
</template> </template>
<template v-else> <template v-else>
<div class="w-12 h-12"></div> <div :class="getImageClass()"></div>
</template> </template>
<span class="text-left">{{ item.produk?.nama || '' }}</span> <span :class="getTextClass()">{{ item.produk?.nama || '' }}</span>
</td> </td>
<td class="border-r border-D"> <td class="border-r border-D">
<span v-if="item.produk?.nama">{{ item.posisi_asal || 'Brankas' }}</span> <span v-if="item.produk?.nama">{{ item.posisi_asal || 'Brankas' }}</span>
@ -111,8 +111,7 @@
<p class="font-semibold">PERHATIAN</p> <p class="font-semibold">PERHATIAN</p>
<ol class="list-decimal ml-4 text-xs space-y-1"> <ol class="list-decimal ml-4 text-xs space-y-1">
<li>Berat barang telah ditimbang dan disaksikan oleh pembeli.</li> <li>Berat barang telah ditimbang dan disaksikan oleh pembeli.</li>
<li>Barang yang dikembalikan menurut harga pasaran dan dipotong ongkos bikin, barang rusak <li>Barang yang dikembalikan menurut harga pasaran dan dipotong ongkos bikin, barang rusak lain harga.</li>
lain harga.</li>
<li>Barang yang sudah dibeli berarti sudah diperiksa dan disetujui.</li> <li>Barang yang sudah dibeli berarti sudah diperiksa dan disetujui.</li>
<li class="text-red-500">Surat ini harap dibawa pada saat menjual kembali.</li> <li class="text-red-500">Surat ini harap dibawa pada saat menjual kembali.</li>
</ol> </ol>
@ -137,9 +136,9 @@
</div> </div>
<div class="flex p-1 items-center w-40 bg-B rounded-sm"> <div class="flex p-1 items-center w-40 bg-B rounded-sm">
<p>Rp</p> <p>Rp</p>
<p class="px-2 pl-0 text-left text-sm w-full"> <p class="px-2 pl-0 text-left text-sm w-full">
{{ (transaksi.ongkos_bikin || 0).toLocaleString() }},- {{ (transaksi.ongkos_bikin || 0).toLocaleString() }},-
</p> </p>
</div> </div>
</div> </div>
@ -200,7 +199,7 @@ const emit = defineEmits(['close'])
const formatDate = (dateString) => { const formatDate = (dateString) => {
if (!dateString) return '-' if (!dateString) return '-'
const days = ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'] const days = ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu']
const months = ['01','02','03','04','05','06','07','08','09','10','11','12'] const months = ['01','02','03','04','05','06','07','08','09','10','11','12']
const date = new Date(dateString) const date = new Date(dateString)
const dayName = days[date.getDay()] const dayName = days[date.getDay()]
@ -216,12 +215,31 @@ const itemsWithMinimal = computed(() => {
props.transaksi.item_transaksi || props.transaksi.item_transaksi ||
[] []
const arr = [...items] const arr = [...items]
while (arr.length < 2) { // biar minimal ada 1 row terlihat
arr.push({ produk: {}, harga_deal: 0, posisi_asal: '' }) if (arr.length === 0) arr.push({ produk: {}, harga_deal: 0, posisi_asal: '' })
}
return arr return arr
}) })
// === Tambahan style/helper sama dengan strukoverlay ===
const getRowStyle = () => {
if (itemsWithMinimal.value.length === 1) {
return { height: '126px' }
}
return { height: '63px' }
}
const getImageClass = () => {
if (itemsWithMinimal.value.length === 1) {
return 'w-25 h-25'
}
return 'w-12 h-12'
}
const getTextClass = () => {
if (itemsWithMinimal.value.length === 1) {
return 'text-lg font-medium'
}
return 'text-sm'
}
const handlePrint = () => { const handlePrint = () => {
window.print() window.print()
} }
@ -252,12 +270,11 @@ const formatNumber = (number) => {
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
transform: scale(0.5); /* perkecil 2x lipat */ transform: scale(0.5);
transform-origin: top left; /* supaya mengecil dari pojok kiri atas */ transform-origin: top left;
} }
.no-print { .no-print {
display: none !important; display: none !important;
} }
} }
</style> </style>