diff --git a/app/Http/Controllers/StrukController.php b/app/Http/Controllers/StrukController.php
new file mode 100644
index 0000000..e1173a2
--- /dev/null
+++ b/app/Http/Controllers/StrukController.php
@@ -0,0 +1,51 @@
+find($id);
+
+ if (!$data) {
+ return response()->json(['error'=>'Transaksi tidak ditemukan'], 404);
+ }
+
+ // Debug: Let's see what data structure we have
+ // dd([
+ // 'transaksi' => $data->toArray(),
+ // 'item_count' => $data->itemTransaksi->count(),
+ // 'has_sales' => $data->sales ? true : false,
+ // ]);
+
+ // After debugging, uncomment this:
+
+ $pdf = Pdf::loadView('exports.struk', $data->toArray())
+ ->setPaper([0, 0, 1224 * 0.75, 528 * 0.75], 'landscape')
+ ->setOptions([
+ 'isHtml5ParserEnabled' => true,
+ 'isRemoteEnabled' => true,
+ 'defaultFont' => 'DejaVu Sans'
+ ]);
+
+ $filename = 'Struk_' . $data->kode_transaksi . '.pdf';
+ return $pdf->download($filename);
+
+
+ } catch (\Exception $e) {
+ return response()->json([
+ 'error' => 'Debug Error',
+ 'message' => $e->getMessage(),
+ 'line' => $e->getLine(),
+ 'file' => $e->getFile()
+ ], 500);
+ }
+ }
+}
\ No newline at end of file
diff --git a/resources/js/components/BrankasList.vue b/resources/js/components/BrankasList.vue
index 032ceec..ffda540 100644
--- a/resources/js/components/BrankasList.vue
+++ b/resources/js/components/BrankasList.vue
@@ -204,7 +204,7 @@ const cancelText = ref("Batal");
// QR Code generator
const qrCodeUrl = computed(() => {
if (selectedItem.value) {
- const data = `ITM-${selectedItem.value.id}-${selectedItem.value.produk.nama.replace(/\s/g, "")}`;
+ const data = selectedItem.value.kode_item;
return `https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=${encodeURIComponent(data)}`;
}
return "";
diff --git a/resources/js/components/DetailPerProduk.vue b/resources/js/components/DetailPerProduk.vue
index 922e1c1..a567a9b 100644
--- a/resources/js/components/DetailPerProduk.vue
+++ b/resources/js/components/DetailPerProduk.vue
@@ -341,7 +341,7 @@ const fetchData = async (page = 1) => {
let queryParams = `tanggal=${tanggalDipilih.value}&page=${page}`;
if (salesDipilih.value != 0 ) queryParams += `&sales_id=${salesDipilih.value}`;
- if (nampanDipilih.value != 0) queryParams += `&produk_id=${produkDipilih.value}`;
+ if (nampanDipilih.value != 0) queryParams += `&nampan_id=${nampanDipilih.value}`;
if (namaPembeli.value) queryParams += `&nama_pembeli=${encodeURIComponent(namaPembeli.value)}`;
try {
diff --git a/resources/js/components/NavigationComponent.vue b/resources/js/components/NavigationComponent.vue
index e5d8a8f..4f3f89a 100644
--- a/resources/js/components/NavigationComponent.vue
+++ b/resources/js/components/NavigationComponent.vue
@@ -13,9 +13,9 @@ const baseItems = [
{
label: "Manajemen Produk",
subItems: [
- { label: "Brankas", route: "/brankas" },
- { label: "Nampan", route: "/nampan" },
{ label: "Produk", route: "/produk" },
+ { label: "Nampan", route: "/nampan" },
+ { label: "Brankas", route: "/brankas" },
{ label: "Kategori", route: "/kategori" },
{ label: "Sales", route: "/sales" },
]
diff --git a/resources/js/components/TrayList.vue b/resources/js/components/TrayList.vue
index 330921d..14404e5 100644
--- a/resources/js/components/TrayList.vue
+++ b/resources/js/components/TrayList.vue
@@ -54,15 +54,15 @@
class="flex justify-between items-center border border-C rounded-lg p-2 cursor-pointer hover:bg-gray-50"
@click="openMovePopup(item)">
-
-
{{ item.produk.nama }}
+
{{ item.produk?.nama }}
{{ item.kode_item }}
- {{ item.produk.berat }}g
+ {{ item.produk?.berat }}g
@@ -171,7 +171,7 @@ const selectedTrayId = ref("");
// QR Code generator
const qrCodeUrl = computed(() => {
if (selectedItem.value) {
- const data = `ITM-${selectedItem.value.id}-${selectedItem.value.produk.nama.replace(/\s/g, "")}`;
+ const data = selectedItem.value.kode_item;
return `https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=${encodeURIComponent(data)}`;
}
return "";
@@ -296,7 +296,7 @@ const saveMove = async () => {
// Hitung total berat
const totalWeight = (tray) => {
if (!tray.items) return 0;
- const total = tray.items.reduce((sum, item) => sum + (item.produk.berat || 0), 0);
+ const total = tray.items.reduce((sum, item) => sum + (item.produk?.berat || 0), 0);
return total.toFixed(2);
};
diff --git a/resources/views/exports/struk.blade.php b/resources/views/exports/struk.blade.php
new file mode 100644
index 0000000..37053ee
--- /dev/null
+++ b/resources/views/exports/struk.blade.php
@@ -0,0 +1,542 @@
+
+
+
+
+
+ Struk Transaksi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Tanggal :
+
+ @if(isset($created_at))
+ @php
+ $date = \Carbon\Carbon::parse($created_at);
+ $days = ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'];
+ $dayName = $days[$date->dayOfWeek];
+ $formattedDate = $dayName . '/' . $date->format('d-m-Y');
+ @endphp
+ {{ $formattedDate }}
+ @else
+ N/A
+ @endif
+
+
+
Nama :
+
{{ $nama_pembeli ?? 'N/A' }}
+
+
Alamat :
+
{{ $alamat ?? 'N/A' }}
+
+
No.Hp :
+
{{ $no_hp ?? 'N/A' }}
+
+
+
+
+
+
+
+
+ | Jml |
+ Item |
+ Posisi |
+ Berat |
+ Kadar |
+ Harga |
+
+
+
+ @if(isset($item_transaksi) && count($item_transaksi) > 0)
+ @foreach($item_transaksi as $item)
+
+ |
+ @if(isset($item['harga_deal']) && $item['harga_deal'])
+ 1
+ @endif
+ |
+
+
+ @if(isset($item['produk']['foto'][0]['url']))
+ 
+ @else
+
+ @endif
+ {{ $item['produk']['nama'] ?? '' }}
+
+ |
+
+ @if(isset($item['produk']['nama']) && $item['produk']['nama'])
+ {{ $item['nampan']['nama'] ?? 'Brankas' }}
+ @endif
+ |
+
+ @if(isset($item['produk']['berat']) && $item['produk']['berat'])
+ {{ $item['produk']['berat'] }}g
+ @endif
+ |
+
+ @if(isset($item['produk']['kadar']) && $item['produk']['kadar'])
+ {{ $item['produk']['kadar'] }}k
+ @endif
+ |
+
+ @if(isset($item['harga_deal']) && $item['harga_deal'])
+ Rp{{ number_format($item['harga_deal'], 0, ',', '.') }}
+ @endif
+ |
+
+ @endforeach
+ @endif
+
+ {{-- Add empty rows to ensure minimum 2 rows --}}
+ @for($i = (isset($item_transaksi) ? count($item_transaksi) : 0); $i < 2; $i++)
+
+ |
+
+
+ |
+ |
+ |
+ |
+ |
+
+ @endfor
+
+
+
+
+
+
+
+
PERHATIAN
+
+ - Berat barang telah ditimbang dan disaksikan oleh pembeli.
+ - Barang yang dikembalikan menurut harga pasaran dan dipotong ongkos bikin, barang rusak lain harga.
+ - Barang yang sudah dibeli berarti sudah diperiksa dan disetujui.
+ - Surat ini harap dibawa pada saat menjual kembali.
+
+
+
+
+
+
Hormat Kami
+
{{ $sales['nama'] ?? 'N/A' }}
+
+
+
+
+
+
+
+
+
Ongkos bikin
+
diluar harga jual
+
+
+
Rp
+
{{ number_format($ongkos_bikin ?? 0, 0, ',', '.') }}
+
+
+
+
+
+
Total Harga
+
+
Rp
+
+ {{ number_format($total_harga ?? 0, 0, ',', '.') }},-
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/routes/web.php b/routes/web.php
index 1dcd6ea..3f09d4e 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -10,6 +10,7 @@ use App\Http\Controllers\SalesController;
use App\Http\Controllers\UserController;
use App\Http\Controllers\TransaksiController;
use App\Http\Controllers\LaporanController;
+use App\Http\Controllers\StrukController;
use Illuminate\Support\Facades\Route;
@@ -63,6 +64,8 @@ Route::prefix('api')->group(function () {
Route::get('kategori', [KategoriController::class, 'index']);
Route::get('kategori/{id}', [KategoriController::class, 'show']);
Route::get('brankas', [ItemController::class, 'brankasItem']);
+
+ Route::get('/cetak-struk/{id}', [StrukController::class, 'cetak']);
});
});