Add: (User) Pesanan saya and (Petani) Manajemen Pesanan Fiture

This commit is contained in:
sayasilvi 2025-11-29 13:22:19 +07:00
parent a152a3dffc
commit 477de4932e
13 changed files with 1178 additions and 576 deletions

View File

@ -1,22 +0,0 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class CheckoutController extends Controller
{
/**
* Menampilkan halaman checkout.
* Mengecek apakah user punya item di keranjang sebelum masuk ke sini.
*/
public function index()
{
$cart = session()->get('cart');
if (!$cart || count($cart) == 0) {
return redirect()->route('shop')->with('error', 'Keranjang Anda kosong, silahkan belanja produk terlebih dahulu.');
}
return view('landing.checkout', compact('cart'));
}
}

View File

@ -3,81 +3,132 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Produk;
use App\Models\Transaksi;
use App\Models\DetailTransaksi;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class TransaksiController extends Controller
{
/**
* PROSES CHECKOUT / MENYIMPAN TRANSAKSI.
* Menggunakan DB Transaction agar data header dan detail tersimpan atomik (bersamaan).
*/
public function store(Request $request)
// --- FITUR PEMBELI ---
// Tampilkan Halaman Checkout
public function checkoutPage(Request $request)
{
$cart = session()->get('cart');
// Validasi Keranjang (Backend validation)
if (!$cart) {
return redirect()->route('shop')->with('error', 'Keranjang kosong!');
if ($request->has('produk_id')) {
$produk = Produk::with('petani')->findOrFail($request->produk_id);
return view('landing.checkout', compact('produk'));
}
// Validasi Input User
return redirect()->route('shop')->with('error', 'Silakan pilih produk yang ingin dibeli terlebih dahulu.');
}
// Proses Simpan Transaksi
public function prosesCheckout(Request $request)
{
$request->validate([
'alamat_pengiriman' => 'required|string|max:500',
'no_hp' => 'required|numeric',
'nama_lengkap' => 'required|string|max:255',
'produk_id' => 'required|exists:produks,id',
'jumlah' => 'required|integer|min:1',
'alamat_pengiriman' => 'required|string',
'metode_pembayaran' => 'required|in:cod',
]);
try {
DB::beginTransaction();
$produk = Produk::findOrFail($request->produk_id);
$subtotal = $this->hitungSubtotal($cart);
$ongkir = 10000;
$total_bayar = $subtotal + $ongkir;
if ($produk->stok < $request->jumlah) {
return back()->with('error', 'Stok produk tidak mencukupi!');
}
$total_harga = $produk->harga * $request->jumlah;
DB::transaction(function () use ($request, $produk, $total_harga) {
$transaksi = Transaksi::create([
'pembeli_id' => Auth::guard('pembeli')->id(),
'pembeli_id' => Auth::guard('pembeli')->id(),
'tanggal_transaksi' => now(),
'alamat_pengiriman' => $request->alamat_pengiriman,
'total_harga' => $total_bayar,
'status' => 'pending',
'kode_invoice' => 'INV/' . date('Ymd') . '/' . mt_rand(1000, 9999),
'catatan' => $request->catatan,
'total_harga' => $total_harga,
'status' => 'menunggu_konfirmasi',
'kode_invoice' => 'INV/' . date('Ymd') . '/' . rand(1000, 9999),
]);
foreach ($cart as $id_produk => $details) {
DetailTransaksi::create([
'transaksi_id' => $transaksi->id,
'produk_id' => $id_produk,
'jumlah' => $details['quantity'],
'harga_satuan' => $details['price'],
'subtotal' => $details['price'] * $details['quantity'],
]);
}
DetailTransaksi::create([
'transaksi_id' => $transaksi->id,
'produk_id' => $produk->id,
'jumlah' => $request->jumlah,
'harga_satuan' => $produk->harga,
'subtotal' => $total_harga,
]);
DB::commit();
// C. Kurangi Stok
$produk->decrement('stok', $request->jumlah);
});
session()->forget('cart');
return redirect()->route('home')->with('success', 'Pesanan berhasil dibuat! Kode Invoice: ' . $transaksi->kode_invoice);
} catch (\Exception $e) {
DB::rollBack();
return redirect()->back()->with('error', 'Terjadi kesalahan saat memproses transaksi: ' . $e->getMessage());
}
return redirect()->route('pesanan.saya')->with('success', 'Pesanan berhasil dibuat! Menunggu konfirmasi petani.');
}
/**
* Helper untuk menghitung subtotal belanjaan dari session.
*/
private function hitungSubtotal($cart)
// Riwayat Pesanan
public function pesananSaya()
{
$total = 0;
foreach($cart as $id => $details) {
$total += $details['price'] * $details['quantity'];
$transaksis = Transaksi::with(['details.produk.petani'])
->where('pembeli_id', Auth::guard('pembeli')->id())
->latest()
->get();
return view('landing.pesanan_saya', compact('transaksis'));
}
// --- FITUR PETANI ---
// Daftar Pesanan Masuk
public function pesananMasuk()
{
$petaniId = Auth::guard('petani')->id();
$pesanans = Transaksi::whereHas('details.produk', function ($q) use ($petaniId) {
$q->where('petani_id', $petaniId);
})
->with(['pembeli', 'details.produk'])
->latest()
->get();
return view('petani.pesanan.index', compact('pesanans'));
}
// Update Status (Terima/Tolak/Kirim)
public function updateStatus(Request $request, $id)
{
$transaksi = Transaksi::findOrFail($id);
$request->validate([
'status' => 'required|in:diproses,dikirim,selesai,batal'
]);
$transaksi->status = $request->status;
$transaksi->save();
if ($request->status == 'batal') {
foreach ($transaksi->details as $detail) {
$detail->produk->increment('stok', $detail->jumlah);
}
}
return $total;
return back()->with('success', 'Status pesanan berhasil diperbarui.');
}
// Detail Pesanan (Petani)
public function pesananDetail($id)
{
$petaniId = Auth::guard('petani')->id();
// Ambil transaksi berdasarkan ID, pastikan transaksi tersebut memiliki produk milik petani ini
$pesanan = Transaksi::whereHas('details.produk', function ($q) use ($petaniId) {
$q->where('petani_id', $petaniId);
})
->with(['pembeli', 'details.produk'])
->findOrFail($id);
return view('petani.pesanan.detail', compact('pesanan'));
}
}

View File

@ -3,133 +3,89 @@
@section('title', 'Checkout')
@section('content')
<!-- Single Page Header -->
<div class="container-fluid page-header py-5">
<h1 class="text-center text-white display-6">Checkout</h1>
<ol class="breadcrumb justify-content-center mb-0">
<li class="breadcrumb-item"><a href="{{ url('/') }}">Home</a></li>
<li class="breadcrumb-item active text-white">Checkout</li>
</ol>
</div>
<!-- Checkout Page -->
<div class="container-fluid py-5">
<div class="container py-5">
<h1 class="mb-4">Detail Penagihan</h1>
<form action="{{ route('transaksi.store') }}" method="POST">
@csrf
<div class="row g-5">
<div class="col-md-12 col-lg-6 col-xl-7">
<div class="row">
<div class="col-md-12 col-lg-6">
<div class="form-item w-100">
<label class="form-label my-3">Nama Lengkap<sup>*</sup></label>
<input type="text" class="form-control" name="nama_lengkap" value="{{ Auth::guard('pembeli')->user()->nama_lengkap ?? '' }}" required>
</div>
</div>
<div class="col-md-12 col-lg-6">
<div class="form-item w-100">
<label class="form-label my-3">Nomor HP<sup>*</sup></label>
<input type="text" class="form-control" name="no_hp" value="{{ Auth::guard('pembeli')->user()->no_hp ?? '' }}" required>
</div>
</div>
</div>
<div class="form-item">
<label class="form-label my-3">Alamat Lengkap Pengiriman<sup>*</sup></label>
<textarea name="alamat_pengiriman" class="form-control" spellcheck="false" cols="30" rows="5" placeholder="Nama Jalan, Desa, RT/RW, Kecamatan..." required>{{ Auth::guard('pembeli')->user()->alamat ?? '' }}</textarea>
</div>
<div class="form-item">
<label class="form-label my-3">Catatan Pesanan (Opsional)</label>
<textarea name="catatan" class="form-control" spellcheck="false" cols="30" rows="4" placeholder="Misal: Tolong dikirim sore hari"></textarea>
</div>
<div class="container py-5">
<div class="row">
<div class="col-md-8 mx-auto">
<div class="card border-0 shadow-sm rounded">
<div class="card-header bg-white py-3">
<h4 class="mb-0 text-primary fw-bold">Konfirmasi Pembelian</h4>
</div>
<div class="col-md-12 col-lg-6 col-xl-5">
<div class="table-responsive">
<table class="table">
<thead>
<tr>
<th scope="col">Produk</th>
<th scope="col">Nama</th>
<th scope="col">Jml</th>
<th scope="col">Total</th>
</tr>
</thead>
<tbody>
@php $total_belanja = 0; @endphp
@foreach($cart as $details)
@php $total = $details['price'] * $details['quantity']; $total_belanja += $total; @endphp
<tr>
<th scope="row">
<div class="d-flex align-items-center mt-2">
<img src="{{ $details['photo'] ? asset('storage/'.$details['photo']) : asset('template/frontend/img/vegetable-item-2.jpg') }}" class="img-fluid rounded-circle" style="width: 50px; height: 50px;" alt="">
</div>
</th>
<td class="py-5">{{ $details['name'] }}</td>
<td class="py-5">{{ $details['quantity'] }}</td>
<td class="py-5">Rp {{ number_format($total, 0, ',', '.') }}</td>
</tr>
@endforeach
<tr>
<th scope="row">
</th>
<td class="py-5"></td>
<td class="py-5">
<p class="mb-0 text-dark py-3">Subtotal</p>
</td>
<td class="py-5">
<div class="py-3 border-bottom border-top">
<p class="mb-0 text-dark">Rp {{ number_format($total_belanja, 0, ',', '.') }}</p>
</div>
</td>
</tr>
<tr>
<th scope="row">
</th>
<td class="py-5">
<p class="mb-0 text-dark py-4">Pengiriman</p>
</td>
<td colspan="3" class="py-5">
<div class="form-check text-start">
<input type="checkbox" class="form-check-input bg-primary border-0" id="Shipping-1" name="shipping" value="Shipping" checked disabled>
<label class="form-check-label" for="Shipping-1">Flat Rate: Rp 10.000</label>
</div>
</td>
</tr>
<tr>
<th scope="row">
</th>
<td class="py-5">
<p class="mb-0 text-dark text-uppercase py-3">TOTAL</p>
</td>
<td class="py-5"></td>
<td class="py-5">
<div class="py-3 border-bottom border-top">
<p class="mb-0 text-dark">Rp {{ number_format($total_belanja + 10000, 0, ',', '.') }}</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="row g-4 text-center align-items-center justify-content-center border-bottom py-3">
<div class="col-12">
<div class="form-check text-start my-3">
<input type="radio" class="form-check-input bg-primary border-0" id="Transfer-1" name="metode_pembayaran" value="transfer">
<label class="form-check-label" for="Transfer-1">Transfer Bank</label>
<div class="card-body p-4">
{{-- Form ini akan mengirim data ke TransaksiController --}}
<form action="{{ route('checkout.proses') }}" method="POST">
@csrf
<input type="hidden" name="produk_id" value="{{ $produk->id }}">
<div class="row mb-4">
<div class="col-md-4">
<img src="{{ $produk->foto_produk ? asset('storage/'.$produk->foto_produk) : asset('template/frontend/img/fruite-item-5.jpg') }}"
class="img-fluid rounded" alt="Produk">
</div>
<div class="form-check text-start my-3">
<input type="radio" class="form-check-input bg-primary border-0" id="COD-1" name="metode_pembayaran" value="cod" checked>
<label class="form-check-label" for="COD-1">Cash On Delivery (COD)</label>
<div class="col-md-8">
<h5>{{ $produk->nama_produk }}</h5>
<p class="text-muted small mb-2">Penjual: {{ $produk->petani->nama_lengkap }}</p>
<h4 class="text-success fw-bold">Rp {{ number_format($produk->harga, 0, ',', '.') }} / unit</h4>
<p class="text-secondary mt-3">{{ $produk->deskripsi }}</p>
</div>
</div>
</div>
<div class="row g-4 text-center align-items-center justify-content-center pt-4">
<button type="submit" class="btn border-secondary py-3 px-4 text-uppercase w-100 text-primary">Buat Pesanan</button>
</div>
<hr>
<div class="mb-3">
<label class="form-label fw-bold">Jumlah Pembelian</label>
<input type="number" name="jumlah" class="form-control w-25" value="1" min="1" max="{{ $produk->stok }}" id="jumlah" onchange="hitungTotal()">
<small class="text-muted">Stok tersedia: {{ $produk->stok }}</small>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Alamat Pengiriman</label>
<textarea name="alamat_pengiriman" class="form-control" rows="3" required>{{ Auth::guard('pembeli')->user()->alamat }}</textarea>
<small class="text-muted">Pastikan alamat lengkap untuk memudahkan kurir.</small>
</div>
<div class="mb-4">
<label class="form-label fw-bold">Metode Pembayaran</label>
<select name="metode_pembayaran" class="form-select">
<option value="cod" selected>Bayar di Tempat (COD)</option>
</select>
</div>
<div class="d-flex justify-content-between align-items-center bg-light p-3 rounded mb-4">
<h5 class="mb-0">Total Bayar:</h5>
<h3 class="fw-bold text-primary" id="total_bayar">Rp {{ number_format($produk->harga, 0, ',', '.') }}</h3>
</div>
<div class="d-grid gap-2">
{{-- PERBAIKAN: Gunakan button type="submit" agar form terkirim --}}
<button type="submit" class="btn btn-primary rounded-pill px-4 py-3 mb-2 font-weight-bold">
<i class="fa fa-paper-plane me-2"></i> Buat Pesanan Sekarang
</button>
<a href="{{ route('shop') }}" class="btn btn-outline-secondary py-2 rounded-pill">Batal</a>
</div>
</form>
</div>
</div>
</form>
</div>
</div>
</div>
@endsection
@section('js')
<script>
function hitungTotal() {
let harga = {{ $produk->harga }};
let jumlah = document.getElementById('jumlah').value;
// Validasi agar tidak minus
if(jumlah < 1) {
jumlah = 1;
document.getElementById('jumlah').value = 1;
}
let total = harga * jumlah;
document.getElementById('total_bayar').innerText = 'Rp ' + new Intl.NumberFormat('id-ID').format(total);
}
</script>
@endsection

View File

@ -3,128 +3,142 @@
@section('title', $produk->nama_produk)
@section('content')
<!-- Single Page Header -->
<div class="container-fluid page-header py-5">
<h1 class="text-center text-white display-6">{{ $produk->nama_produk }}</h1>
<ol class="breadcrumb justify-content-center mb-0">
<li class="breadcrumb-item"><a href="{{ url('/') }}">Home</a></li>
<li class="breadcrumb-item"><a href="{{ route('shop') }}">Belanja</a></li>
<li class="breadcrumb-item active text-white">Detail</li>
</ol>
</div>
<!-- Single Page Header -->
<div class="container-fluid page-header py-5">
<h1 class="text-center text-white display-6">{{ $produk->nama_produk }}</h1>
<ol class="breadcrumb justify-content-center mb-0">
<li class="breadcrumb-item"><a href="{{ url('/') }}">Home</a></li>
<li class="breadcrumb-item"><a href="{{ route('shop') }}">Belanja</a></li>
<li class="breadcrumb-item active text-white">Detail</li>
</ol>
</div>
<!-- Single Product Start -->
<div class="container-fluid py-5 mt-5">
<div class="container py-5">
<div class="row g-4 mb-5">
<div class="col-lg-8 col-xl-9">
<div class="row g-4">
<div class="col-lg-6">
<div class="border rounded">
<a href="#">
<img src="{{ $produk->foto_produk ? asset('storage/'.$produk->foto_produk) : asset('template/frontend/img/fruite-item-5.jpg') }}" class="img-fluid rounded" alt="Image">
</a>
<!-- Single Product Start -->
<div class="container-fluid py-5 mt-5">
<div class="container py-5">
<div class="row g-4 mb-5">
<div class="col-lg-8 col-xl-9">
<div class="row g-4">
<div class="col-lg-6">
<div class="border rounded">
<a href="#">
<img src="{{ $produk->foto_produk ? asset('storage/' . $produk->foto_produk) : asset('template/frontend/img/fruite-item-5.jpg') }}"
class="img-fluid rounded" alt="Image">
</a>
</div>
</div>
</div>
<div class="col-lg-6">
<h4 class="fw-bold mb-3">{{ $produk->nama_produk }}</h4>
<p class="mb-3">Kategori: {{ $produk->kategori ?? 'Sayuran' }}</p>
<h5 class="fw-bold mb-3">Rp {{ number_format($produk->harga, 0, ',', '.') }} / kg</h5>
<div class="d-flex mb-4">
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star"></i>
<div class="col-lg-6">
<h4 class="fw-bold mb-3">{{ $produk->nama_produk }}</h4>
<p class="mb-3">Kategori: {{ $produk->kategori ?? 'Sayuran' }}</p>
<h5 class="fw-bold mb-3">Rp {{ number_format($produk->harga, 0, ',', '.') }} / kg</h5>
<div class="d-flex mb-4">
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star"></i>
</div>
<p class="mb-4">{{ $produk->deskripsi }}</p>
{{-- Form Add to Cart --}}
<form action="{{ route('cart.add') }}" method="POST">
@csrf
<input type="hidden" name="id" value="{{ $produk->id }}">
<div class="input-group quantity mb-5" style="width: 100px;">
<div class="input-group-btn">
<button type="button" class="btn btn-sm btn-minus rounded-circle bg-light border"
onclick="this.parentNode.querySelector('input[type=number]').stepDown()">
<i class="fa fa-minus"></i>
</button>
</div>
<input type="number" name="qty"
class="form-control form-control-sm text-center border-0" value="1"
min="1">
<div class="input-group-btn">
<button type="button" class="btn btn-sm btn-plus rounded-circle bg-light border"
onclick="this.parentNode.querySelector('input[type=number]').stepUp()">
<i class="fa fa-plus"></i>
</button>
</div>
</div>
<button type="submit"
class="btn border border-secondary rounded-pill px-4 py-2 mb-4 text-primary"><i
class="fa fa-shopping-bag me-2 text-primary"></i> Masukkan Keranjang</button>
<a href="{{ route('checkout', ['produk_id' => $produk->id]) }}" class="...">
Beli Sekarang
</a>
</form>
</div>
<p class="mb-4">{{ $produk->deskripsi }}</p>
{{-- Form Add to Cart --}}
<form action="{{ route('cart.add') }}" method="POST">
@csrf
<input type="hidden" name="id" value="{{ $produk->id }}">
<div class="input-group quantity mb-5" style="width: 100px;">
<div class="input-group-btn">
<button type="button" class="btn btn-sm btn-minus rounded-circle bg-light border" onclick="this.parentNode.querySelector('input[type=number]').stepDown()">
<i class="fa fa-minus"></i>
</button>
<div class="col-lg-12">
<nav>
<div class="nav nav-tabs mb-3">
<button class="nav-link active border-white border-bottom-0" type="button"
role="tab" id="nav-about-tab" data-bs-toggle="tab" data-bs-target="#nav-about"
aria-controls="nav-about" aria-selected="true">Deskripsi</button>
<button class="nav-link border-white border-bottom-0" type="button" role="tab"
id="nav-mission-tab" data-bs-toggle="tab" data-bs-target="#nav-mission"
aria-controls="nav-mission" aria-selected="false">Info Petani</button>
</div>
<input type="number" name="qty" class="form-control form-control-sm text-center border-0" value="1" min="1">
<div class="input-group-btn">
<button type="button" class="btn btn-sm btn-plus rounded-circle bg-light border" onclick="this.parentNode.querySelector('input[type=number]').stepUp()">
<i class="fa fa-plus"></i>
</button>
</nav>
<div class="tab-content mb-5">
<div class="tab-pane active" id="nav-about" role="tabpanel" aria-labelledby="nav-about-tab">
<p>{{ $produk->deskripsi }}</p>
</div>
</div>
<button type="submit" class="btn border border-secondary rounded-pill px-4 py-2 mb-4 text-primary"><i class="fa fa-shopping-bag me-2 text-primary"></i> Masukkan Keranjang</button>
</form>
</div>
<div class="col-lg-12">
<nav>
<div class="nav nav-tabs mb-3">
<button class="nav-link active border-white border-bottom-0" type="button" role="tab"
id="nav-about-tab" data-bs-toggle="tab" data-bs-target="#nav-about"
aria-controls="nav-about" aria-selected="true">Deskripsi</button>
<button class="nav-link border-white border-bottom-0" type="button" role="tab"
id="nav-mission-tab" data-bs-toggle="tab" data-bs-target="#nav-mission"
aria-controls="nav-mission" aria-selected="false">Info Petani</button>
</div>
</nav>
<div class="tab-content mb-5">
<div class="tab-pane active" id="nav-about" role="tabpanel" aria-labelledby="nav-about-tab">
<p>{{ $produk->deskripsi }}</p>
</div>
<div class="tab-pane" id="nav-mission" role="tabpanel" aria-labelledby="nav-mission-tab">
<div class="d-flex">
<img src="{{ asset('template/frontend/img/avatar.jpg') }}" class="img-fluid rounded-circle p-3" style="width: 100px; height: 100px;" alt="">
<div class="">
<p class="mb-2" style="font-size: 14px;">Petani Lokal</p>
<div class="d-flex justify-content-between">
<h5>{{ $produk->petani->nama_lengkap ?? 'Petani Desa' }}</h5>
<div class="tab-pane" id="nav-mission" role="tabpanel" aria-labelledby="nav-mission-tab">
<div class="d-flex">
<img src="{{ asset('template/frontend/img/avatar.jpg') }}"
class="img-fluid rounded-circle p-3" style="width: 100px; height: 100px;"
alt="">
<div class="">
<p class="mb-2" style="font-size: 14px;">Petani Lokal</p>
<div class="d-flex justify-content-between">
<h5>{{ $produk->petani->nama_lengkap ?? 'Petani Desa' }}</h5>
</div>
<p>Produk ini ditanam dan dipanen langsung oleh petani lokal terverifikasi.</p>
</div>
<p>Produk ini ditanam dan dipanen langsung oleh petani lokal terverifikasi.</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Sidebar (Produk Lainnya) -->
<div class="col-lg-4 col-xl-3">
<div class="row g-4 fruite">
<div class="col-lg-12">
<div class="mb-3">
<h4>Produk Terkait</h4>
{{-- looping produk lain --}}
@foreach($produk_terkait ?? [] as $related)
<div class="d-flex align-items-center justify-content-start mt-3">
<div class="rounded me-4" style="width: 100px; height: 100px;">
<img src="{{ $related->foto_produk ? asset('storage/'.$related->foto_produk) : asset('template/frontend/img/fruite-item-5.jpg') }}" class="img-fluid rounded" alt="">
</div>
<div>
<h6 class="mb-2">{{ $related->nama_produk }}</h6>
<div class="d-flex mb-2">
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star"></i>
</div>
<div class="d-flex mb-2">
<h5 class="fw-bold me-2">Rp {{ number_format($related->harga, 0, ',', '.') }}</h5>
</div>
</div>
</div>
@endforeach
<!-- Sidebar -->
<div class="col-lg-4 col-xl-3">
<div class="row g-4 fruite">
<div class="col-lg-12">
<div class="mb-3">
<h4>Produk Terkait</h4>
@foreach ($produk_terkait ?? [] as $related)
<div class="d-flex align-items-center justify-content-start mt-3">
<div class="rounded me-4" style="width: 100px; height: 100px;">
<img src="{{ $related->foto_produk ? asset('storage/' . $related->foto_produk) : asset('template/frontend/img/fruite-item-5.jpg') }}"
class="img-fluid rounded" alt="">
</div>
<div>
<h6 class="mb-2">{{ $related->nama_produk }}</h6>
<div class="d-flex mb-2">
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star text-secondary"></i>
<i class="fa fa-star"></i>
</div>
<div class="d-flex mb-2">
<h5 class="fw-bold me-2">Rp
{{ number_format($related->harga, 0, ',', '.') }}</h5>
</div>
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection
@endsection

View File

@ -3,66 +3,168 @@
@section('title', 'Beranda')
@section('content')
<!-- Hero Section Start -->
<!-- 1. HERO SECTION START -->
<div class="container-fluid py-5 mb-5 hero-header">
<div class="container py-5">
<div class="row g-5 align-items-center">
<div class="col-md-12 col-lg-7">
<h4 class="mb-3 text-secondary">100% Organik</h4>
<h1 class="mb-5 display-3 text-primary">Sayuran Segar & Buah Desa</h1>
<h4 class="mb-3 text-secondary">100% Organik & Segar</h4>
<h1 class="mb-5 display-3 text-primary">Sayuran & Buah Desa <br>Langsung Petani</h1>
<div class="position-relative mx-auto">
<a href="{{ route('shop') }}" class="btn btn-primary border-2 border-secondary py-3 px-5 rounded-pill text-white" style="top: 0; right: 25%;">Belanja Sekarang</a>
<a href="{{ route('shop') }}" class="btn btn-primary border-2 border-secondary py-3 px-5 rounded-pill text-white" style="box-shadow: 0 4px 6px rgba(0,0,0,0.1);">
<i class="fa fa-shopping-bag me-2"></i> Belanja Sekarang
</a>
</div>
</div>
<div class="col-md-12 col-lg-5">
<div id="carouselId" class="carousel slide position-relative" data-bs-ride="carousel">
<div class="carousel-inner" role="listbox">
<div class="carousel-item active rounded">
<img src="{{ asset('template/frontend/img/hero-img-1.png') }}" class="img-fluid w-100 h-100 bg-secondary rounded" alt="First slide">
<a href="#" class="btn px-4 py-2 text-white rounded">Buah</a>
<img src="{{ asset('template/frontend/img/hero-img-1.png') }}" class="img-fluid w-100 h-100 bg-secondary rounded" alt="Buah">
<a href="#" class="btn px-4 py-2 text-white rounded">Buah-buahan</a>
</div>
<div class="carousel-item rounded">
<img src="{{ asset('template/frontend/img/hero-img-2.jpg') }}" class="img-fluid w-100 h-100 rounded" alt="Second slide">
<a href="#" class="btn px-4 py-2 text-white rounded">Sayur</a>
<img src="{{ asset('template/frontend/img/hero-img-2.jpg') }}" class="img-fluid w-100 h-100 rounded" alt="Sayur">
<a href="#" class="btn px-4 py-2 text-white rounded">Sayuran</a>
</div>
</div>
<button class="carousel-control-prev" type="button" data-bs-target="#carouselId" data-bs-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="visually-hidden">Previous</span>
</button>
<button class="carousel-control-next" type="button" data-bs-target="#carouselId" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</button>
</div>
</div>
</div>
</div>
</div>
<!-- HERO SECTION END -->
<!-- 2. LAYANAN / FEATURES START (Biar terlihat profesional) -->
<div class="container-fluid featurs py-5">
<div class="container py-5">
<div class="row g-4">
<div class="col-md-6 col-lg-3">
<div class="featurs-item text-center rounded bg-light p-4">
<div class="featurs-icon btn-square rounded-circle bg-secondary mb-5 mx-auto">
<i class="fas fa-car-side fa-3x text-white"></i>
</div>
<div class="featurs-content text-center">
<h5>Gratis Ongkir</h5>
<p class="mb-0">Gratis untuk radius desa</p>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="featurs-item text-center rounded bg-light p-4">
<div class="featurs-icon btn-square rounded-circle bg-secondary mb-5 mx-auto">
<i class="fas fa-user-shield fa-3x text-white"></i>
</div>
<div class="featurs-content text-center">
<h5>Transaksi Aman</h5>
<p class="mb-0">Pembayaran COD Terjamin</p>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="featurs-item text-center rounded bg-light p-4">
<div class="featurs-icon btn-square rounded-circle bg-secondary mb-5 mx-auto">
<i class="fas fa-exchange-alt fa-3x text-white"></i>
</div>
<div class="featurs-content text-center">
<h5>Jaminan Kualitas</h5>
<p class="mb-0">Garansi produk segar</p>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3">
<div class="featurs-item text-center rounded bg-light p-4">
<div class="featurs-icon btn-square rounded-circle bg-secondary mb-5 mx-auto">
<i class="fa fa-phone-alt fa-3x text-white"></i>
</div>
<div class="featurs-content text-center">
<h5>Support 24/7</h5>
<p class="mb-0">Hubungi kami kapan saja</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Bestseller Product Start -->
<!-- PRODUK TERBARU -->
<div class="container-fluid py-5">
<div class="container py-5">
<div class="text-center mx-auto mb-5" style="max-width: 700px;">
<h1 class="display-4">Produk Terbaru</h1>
<p>Hasil panen terbaik dari petani lokal untuk meja makan Anda.</p>
<h1 class="display-4">Produk Panen Terbaru</h1>
<p>Pilihan hasil bumi terbaik yang baru saja dipanen oleh petani lokal.</p>
</div>
<div class="row g-4">
@forelse($produks as $produk)
<div class="col-md-6 col-lg-4 col-xl-3">
<div class="rounded position-relative fruite-item border border-secondary">
<div class="fruite-img">
<img src="{{ $produk->foto_produk ? asset('storage/'.$produk->foto_produk) : asset('template/frontend/img/fruite-item-5.jpg') }}" class="img-fluid w-100 rounded-top" alt="" style="height: 200px; object-fit: cover;">
<img src="{{ $produk->foto_produk ? asset('storage/'.$produk->foto_produk) : asset('template/frontend/img/fruite-item-5.jpg') }}"
class="img-fluid w-100 rounded-top"
alt="{{ $produk->nama_produk }}"
style="height: 200px; object-fit: cover;">
</div>
<div class="text-white bg-secondary px-3 py-1 rounded position-absolute" style="top: 10px; left: 10px;">Segar</div>
<div class="p-4 border-top-0 rounded-bottom">
<h4>{{ $produk->nama_produk }}</h4>
<p>{{ Str::limit($produk->deskripsi, 50) }}</p>
<h5>{{ $produk->nama_produk }}</h5>
<p class="text-muted">{{ Str::limit($produk->deskripsi, 45) }}</p>
<div class="d-flex justify-content-between flex-lg-wrap">
<p class="text-dark fs-5 fw-bold mb-0">Rp {{ number_format($produk->harga, 0, ',', '.') }}</p>
<a href="{{ route('produk.detail', $produk->id) }}" class="btn border border-secondary rounded-pill px-3 text-primary"><i class="fa fa-shopping-bag me-2 text-primary"></i> Detail</a>
<p class="text-dark fs-5 fw-bold mb-0">Rp {{ number_format($produk->harga, 0, ',', '.') }} / kg</p>
<a href="{{ route('produk.detail', $produk->id) }}" class="btn border border-secondary rounded-pill px-3 text-primary">
<i class="fa fa-eye me-2 text-primary"></i> Detail
</a>
</div>
</div>
</div>
</div>
@empty
<div class="col-12 text-center">
<div class="alert alert-warning">Belum ada produk yang tersedia.</div>
<div class="col-12 text-center py-5">
<div class="alert alert-warning d-inline-block">
<i class="fas fa-exclamation-triangle me-2"></i> Belum ada produk yang dijual saat ini.
</div>
</div>
@endforelse
</div>
<div class="text-center mt-5">
<a href="{{ route('shop') }}" class="btn btn-primary rounded-pill py-3 px-5 text-white">Lihat Semua Produk</a>
</div>
</div>
</div>
<!-- BANNER PROMO -->
<div class="container-fluid banner bg-secondary my-5">
<div class="container py-5">
<div class="row g-4 align-items-center">
<div class="col-lg-6">
<div class="py-4">
<h1 class="display-3 text-white">Buah Segar Eksotis</h1>
<p class="fw-normal display-3 text-dark mb-4">di Toko Kami</p>
<p class="mb-4 text-dark">Dapatkan harga spesial untuk pembelian grosir langsung dari kebun petani.</p>
<a href="{{ route('shop') }}" class="banner-btn btn border-2 border-white rounded-pill text-dark py-3 px-5">BELANJA SEKARANG</a>
</div>
</div>
<div class="col-lg-6">
<div class="position-relative">
<img src="{{ asset('template/frontend/img/baner-1.png') }}" class="img-fluid w-100 rounded" alt="">
<div class="d-flex align-items-center justify-content-center bg-white rounded-circle position-absolute" style="width: 140px; height: 140px; top: 0; left: 0;">
<h1 style="font-size: 50px;">%</h1>
<div class="d-flex flex-column">
<span class="h4 mb-0">Promo</span>
<span class="h6 text-muted mb-0">Minggu Ini</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@ -0,0 +1,80 @@
@extends('layouts.frontend')
@section('title', 'Pesanan Saya')
@section('content')
<div class="container py-5">
<h2 class="mb-4 fw-bold text-primary">Riwayat Pesanan</h2>
@if(session('success'))
<div class="alert alert-success alert-dismissible fade show" role="alert">
<i class="fa fa-check-circle me-2"></i> {{ session('success') }}
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
@endif
<div class="card border-0 shadow-sm rounded">
<div class="card-body">
@if($transaksis->isEmpty())
<div class="text-center py-5">
<i class="fas fa-shopping-basket fa-4x text-muted mb-3"></i>
<p class="text-muted">Belum ada pesanan.</p>
<a href="{{ route('shop') }}" class="btn btn-primary rounded-pill">Mulai Belanja</a>
</div>
@else
<div class="table-responsive">
<table class="table table-hover align-middle">
<thead class="bg-light">
<tr>
<th>Invoice</th>
<th>Tanggal</th>
<th>Produk</th>
<th>Total</th>
<th>Status</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
@foreach($transaksis as $trx)
<tr>
<td class="fw-bold text-primary">#{{ $trx->kode_invoice }}</td>
<td>{{ \Carbon\Carbon::parse($trx->tanggal_transaksi)->format('d M Y') }}</td>
<td>
@foreach($trx->details as $detail)
<div class="d-flex align-items-center mb-1">
<img src="{{ $detail->produk->foto_produk ? asset('storage/'.$detail->produk->foto_produk) : asset('template/frontend/img/fruite-item-5.jpg') }}" width="40" class="rounded me-2">
<div>
<small class="d-block fw-bold">{{ $detail->produk->nama_produk }}</small>
<small class="text-muted">{{ $detail->jumlah }} x Rp {{ number_format($detail->harga_satuan, 0, ',', '.') }}</small>
</div>
</div>
@endforeach
</td>
<td class="fw-bold">Rp {{ number_format($trx->total_harga, 0, ',', '.') }}</td>
<td>
@if($trx->status == 'menunggu_konfirmasi')
<span class="badge bg-warning text-dark">Menunggu Konfirmasi</span>
@elseif($trx->status == 'diproses')
<span class="badge bg-info text-white">Sedang Diproses</span>
@elseif($trx->status == 'dikirim')
<span class="badge bg-primary">Sedang Dikirim</span>
@elseif($trx->status == 'selesai')
<span class="badge bg-success">Selesai</span>
@else
<span class="badge bg-danger">Dibatalkan</span>
@endif
</td>
<td>
<a href="#" class="btn btn-sm btn-outline-primary rounded-pill">Detail</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@endif
</div>
</div>
</div>
@endsection

View File

@ -3,78 +3,90 @@
@section('title', 'Belanja Sayur')
@section('content')
<!-- Breadcrumb Section -->
<section class="breadcrumb-section set-bg" data-setbg="{{ asset('template/frontend/img/breadcrumb.jpg') }}" style="background-color: #7fad39; padding: 40px 0;">
<div class="container">
<div class="row">
<div class="col-lg-12 text-center">
<div class="breadcrumb__text">
<h2 style="color: white; font-weight: 700;">Belanja Segar</h2>
<div class="breadcrumb__option">
<a href="{{ route('home') }}" style="color: white;">Home</a>
<span style="color: white;">Shop</span>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Single Page Header -->
<div class="container-fluid page-header py-5" style="background: linear-gradient(rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.3)), url('{{ asset('template/frontend/img/cart-page-header-img.jpg') }}'); background-position: center center; background-repeat: no-repeat; background-size: cover;">
<h1 class="text-center text-white display-6">Shop</h1>
<ol class="breadcrumb justify-content-center mb-0">
<li class="breadcrumb-item"><a href="{{ route('home') }}" class="text-white">Home</a></li>
<li class="breadcrumb-item active text-white">Shop</li>
</ol>
</div>
<!-- Product Section -->
<section class="product spad" style="padding-top: 50px; padding-bottom: 50px;">
<div class="container">
<div class="row">
<div class="col-lg-3 col-md-5">
<div class="sidebar">
<div class="sidebar__item">
<h4>Pencarian</h4>
<form action="{{ route('shop') }}" method="GET">
<div class="input-group mb-3">
<input type="text" name="search" class="form-control" placeholder="Cari produk..." value="{{ request('search') }}">
<button class="btn btn-success" type="submit"><i class="fa fa-search"></i></button>
</div>
</form>
</div>
</div>
</div>
<div class="col-lg-9 col-md-7">
<div class="row">
@forelse($produks as $produk)
<div class="col-lg-4 col-md-6 col-sm-6">
<div class="product__item">
<div class="product__item__pic set-bg"
style="background-image: url('{{ $produk->foto_produk ? asset('storage/'.$produk->foto_produk) : 'https://via.placeholder.com/300' }}');
height: 270px; background-size: cover; background-position: center; margin-bottom: 20px;">
<ul class="product__item__pic__hover" style="list-style: none; text-align: center;">
<li style="display: inline-block; margin-right: 10px;">
<a href="{{ route('produk.detail', $produk->id) }}" class="btn btn-light rounded-circle"><i class="fa fa-eye"></i></a>
</li>
<li style="display: inline-block;">
<a href="#" class="btn btn-success rounded-circle"><i class="fa fa-shopping-cart"></i></a>
</li>
</ul>
</div>
<div class="product__item__text" style="text-align: center;">
<h6><a href="{{ route('produk.detail', $produk->id) }}" style="color: #252525; font-weight: 700; text-decoration: none;">{{ $produk->nama_produk }}</a></h6>
<h5 style="color: #252525; font-weight: 700;">Rp {{ number_format($produk->harga, 0, ',', '.') }}</h5>
<!-- Fruits Shop-->
<div class="container-fluid fruite py-5">
<div class="container py-5">
<h1 class="mb-4">Toko Sayur & Buah Segar</h1>
<div class="row g-4">
<div class="col-lg-12">
<div class="row g-4">
<!-- SIDEBAR PENCARIAN -->
<div class="col-xl-3">
<div class="input-group w-100 mx-auto d-flex mb-4">
<form action="{{ route('shop') }}" method="GET" class="w-100 d-flex shadow-sm rounded">
<input type="search" name="search" class="form-control p-3 border-0" placeholder="Cari produk..." value="{{ request('search') }}" aria-describedby="search-icon-1" style="border-radius: 10px 0 0 10px;">
<button type="submit" id="search-icon-1" class="input-group-text p-3 border-0 bg-light" style="border-radius: 0 10px 10px 0;"><i class="fa fa-search"></i></button>
</form>
</div>
<div class="row g-4">
<div class="col-lg-12">
<div class="mb-3">
<h4>Kategori</h4>
<ul class="list-unstyled fruite-categorie">
<li>
<div class="d-flex justify-content-between fruite-name">
<a href="{{ route('shop') }}"><i class="fas fa-apple-alt me-2"></i>Semua Produk</a>
<span>({{ $produks->total() }})</span>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
@empty
<div class="col-12 text-center">
<div class="alert alert-warning">Produk tidak ditemukan.</div>
</div>
@endforelse
</div>
<!-- Pagination -->
<div class="row">
<div class="col-12 d-flex justify-content-center">
{{ $produks->links() }}
<!-- GRID PRODUK -->
<div class="col-lg-9">
<div class="row g-4 justify-content-center">
@forelse($produks as $produk)
<div class="col-md-6 col-lg-6 col-xl-4">
<div class="rounded position-relative fruite-item border border-secondary h-100">
<div class="fruite-img">
<img src="{{ $produk->foto_produk ? asset('storage/'.$produk->foto_produk) : asset('template/frontend/img/fruite-item-5.jpg') }}" class="img-fluid w-100 rounded-top" alt="{{ $produk->nama_produk }}" style="height: 200px; object-fit: cover;">
</div>
<div class="text-white bg-secondary px-3 py-1 rounded position-absolute" style="top: 10px; left: 10px;">Segar</div>
<div class="p-4 border-top-0 rounded-bottom">
<h4>{{ $produk->nama_produk }}</h4>
<p>{{ Str::limit($produk->deskripsi, 50) }}</p>
<div class="d-flex justify-content-between flex-lg-wrap">
<p class="text-dark fs-5 fw-bold mb-0">Rp {{ number_format($produk->harga, 0, ',', '.') }} / kg</p>
<a href="{{ route('produk.detail', $produk->id) }}" class="btn border border-secondary rounded-pill px-3 text-primary"><i class="fa fa-eye me-2 text-primary"></i> Detail</a>
</div>
</div>
</div>
</div>
@empty
<div class="col-12 text-center">
<div class="alert alert-warning py-5">
<i class="fas fa-search fa-3x mb-3 text-warning"></i>
<h4>Produk tidak ditemukan</h4>
<p>Coba kata kunci lain atau kembali lagi nanti.</p>
<a href="{{ route('shop') }}" class="btn btn-outline-primary rounded-pill mt-3">Reset Pencarian</a>
</div>
</div>
@endforelse
<!-- PAGINATION -->
<div class="col-12">
<div class="d-flex justify-content-center mt-5">
{{ $produks->links() }}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
@endsection

View File

@ -6,12 +6,13 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@yield('title') - TaniDesa</title>
<link rel="shortcut icon" href="https://cdn.jsdelivr.net/gh/zuramai/mazer@docs/demo/assets/compiled/svg/favicon.svg" type="image/x-icon">
<link rel="shortcut icon" href="https://cdn.jsdelivr.net/gh/zuramai/mazer@docs/demo/assets/compiled/svg/favicon.svg"
type="image/x-icon">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/zuramai/mazer@docs/demo/assets/compiled/css/app.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/zuramai/mazer@docs/demo/assets/compiled/css/app-dark.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/zuramai/mazer@docs/demo/assets/compiled/css/iconly.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
@yield('css')
@ -19,7 +20,7 @@
<body>
<script src="https://cdn.jsdelivr.net/gh/zuramai/mazer@docs/demo/assets/static/js/initTheme.js"></script>
<div id="app">
<!-- START SIDEBAR -->
<div id="sidebar">
@ -29,30 +30,52 @@
<div class="logo">
<a href="#">TaniDesa</a>
</div>
<!-- Toggle Dark Mode -->
<div class="theme-toggle d-flex gap-2 align-items-center mt-2">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--system-uicons" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 21 21"><g fill="none" fill-rule="evenodd" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><path d="M10.5 14.5c2.219 0 4-1.763 4-3.982a4.003 4.003 0 0 0-4-4.018c-2.219 0-4 1.781-4 4c0 2.219 1.781 4 4 4zM4.136 4.136L5.55 5.55m9.9 9.9l1.414 1.414M1.5 10.5h2m14 0h2M4.135 16.863L5.55 15.45m9.899-9.9l1.414-1.415M10.5 19.5v-2m0-14v-2" opacity=".3"></path><g transform="translate(-210 -1)"><path d="M220.5 2.5v2m6.5.5l-1.5 1.5"></path><circle cx="220.5" cy="11.5" r="4"></circle><path d="m214 5l1.5 1.5m5 14v-2m6.5-.5l-1.5-1.5M214 18l1.5-1.5m-4-5h2m14 0h2"></path></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
aria-hidden="true" role="img" class="iconify iconify--system-uicons" width="20"
height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 21 21">
<g fill="none" fill-rule="evenodd" stroke="currentColor" stroke-linecap="round"
stroke-linejoin="round">
<path
d="M10.5 14.5c2.219 0 4-1.763 4-3.982a4.003 4.003 0 0 0-4-4.018c-2.219 0-4 1.781-4 4c0 2.219 1.781 4 4 4zM4.136 4.136L5.55 5.55m9.9 9.9l1.414 1.414M1.5 10.5h2m14 0h2M4.135 16.863L5.55 15.45m9.899-9.9l1.414-1.415M10.5 19.5v-2m0-14v-2"
opacity=".3"></path>
<g transform="translate(-210 -1)">
<path d="M220.5 2.5v2m6.5.5l-1.5 1.5"></path>
<circle cx="220.5" cy="11.5" r="4"></circle>
<path d="m214 5l1.5 1.5m5 14v-2m6.5-.5l-1.5-1.5M214 18l1.5-1.5m-4-5h2m14 0h2">
</path>
</g>
</g>
</svg>
<div class="form-check form-switch fs-6">
<input class="form-check-input me-0" type="checkbox" id="toggle-dark" >
<input class="form-check-input me-0" type="checkbox" id="toggle-dark">
<label class="form-check-label"></label>
</div>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--mdi" width="20" height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" d="m17.75 4.09l-2.53 1.94l.91 3.06l-2.63-1.81l-2.63 1.81l.91-3.06l-2.53-1.94L12.44 4l1.06-3l1.06 3l3.19.09m3.5 6.91l-1.64 1.25l.59 1.98l-1.7-1.17l-1.7 1.17l.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95l2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85c-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14c.4-.4.82-.76 1.27-1.08c.75-.53 1.93.36 1.85 1.19c-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82c-2.81 3.14-2.7 7.96.31 10.98c3.02 3.01 7.84 3.12 10.98.31Z"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
aria-hidden="true" role="img" class="iconify iconify--mdi" width="20"
height="20" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24">
<path fill="currentColor"
d="m17.75 4.09l-2.53 1.94l.91 3.06l-2.63-1.81l-2.63 1.81l.91-3.06l-2.53-1.94L12.44 4l1.06-3l1.06 3l3.19.09m3.5 6.91l-1.64 1.25l.59 1.98l-1.7-1.17l-1.7 1.17l.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95l2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85c-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14c.4-.4.82-.76 1.27-1.08c.75-.53 1.93.36 1.85 1.19c-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82c-2.81 3.14-2.7 7.96.31 10.98c3.02 3.01 7.84 3.12 10.98.31Z">
</path>
</svg>
</div>
<div class="sidebar-toggler x">
<a href="#" class="sidebar-hide d-xl-none d-block"><i class="bi bi-x bi-middle"></i></a>
<a href="#" class="sidebar-hide d-xl-none d-block"><i
class="bi bi-x bi-middle"></i></a>
</div>
</div>
</div>
<!-- MENU SIDEBAR -->
<div class="sidebar-menu">
<ul class="menu">
<li class="sidebar-title">Menu Utama</li>
{{-- Menu Dashboard Admin --}}
@if(Auth::guard('admin')->check())
@if (Auth::guard('admin')->check())
<li class="sidebar-item {{ request()->is('admin/dashboard') ? 'active' : '' }}">
<a href="{{ route('admin.dashboard') }}" class='sidebar-link'>
<i class="bi bi-grid-fill"></i>
@ -68,7 +91,7 @@
@endif
{{-- Menu Dashboard Petani --}}
@if(Auth::guard('petani')->check())
@if (Auth::guard('petani')->check())
<li class="sidebar-item {{ request()->is('petani/dashboard') ? 'active' : '' }}">
<a href="{{ route('petani.dashboard') }}" class='sidebar-link'>
<i class="bi bi-grid-fill"></i>
@ -82,14 +105,23 @@
<span>Kelola Produk</span>
</a>
</li>
{{-- Manajemen Pesanan Masuk --}}
<li class="sidebar-item {{ request()->is('petani/pesanan*') ? 'active' : '' }}">
<a href="{{ route('petani.pesanan.index') }}" class='sidebar-link'>
<i class="bi bi-receipt"></i>
<span>Pesanan Masuk</span>
</a>
</li>
@endif
<li class="sidebar-title">Akun</li>
<li class="sidebar-item">
<form action="{{ route('logout') }}" method="POST">
@csrf
<button type="submit" class='sidebar-link border-0 bg-transparent text-danger w-100 text-start'>
<button type="submit"
class='sidebar-link border-0 bg-transparent text-danger w-100 text-start'>
<i class="bi bi-box-arrow-left"></i>
<span>Logout</span>
</button>
@ -127,11 +159,13 @@
</div>
</div>
<!-- JS MAZER (Via CDN) -->
<script src="https://cdn.jsdelivr.net/gh/zuramai/mazer@docs/demo/assets/static/js/components/dark.js"></script>
<script src="https://cdn.jsdelivr.net/gh/zuramai/mazer@docs/demo/assets/extensions/perfect-scrollbar/perfect-scrollbar.min.js"></script>
<script
src="https://cdn.jsdelivr.net/gh/zuramai/mazer@docs/demo/assets/extensions/perfect-scrollbar/perfect-scrollbar.min.js">
</script>
<script src="https://cdn.jsdelivr.net/gh/zuramai/mazer@docs/demo/assets/compiled/js/app.js"></script>
@yield('js')
</body>
</html>
</html>

View File

@ -1,160 +1,234 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>@yield('title') - TaniDesa</title>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<!-- Google Web Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600&family=Raleway:wght@600;800&display=swap" rel="stylesheet">
<head>
<meta charset="utf-8">
<title>@yield('title') - TaniDesa</title>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<!-- Icon Font Stylesheet -->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css"/>
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.4.1/font/bootstrap-icons.css" rel="stylesheet">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600&family=Raleway:wght@600;800&display=swap"
rel="stylesheet">
<link href="{{ asset('template/frontend/lib/lightbox/css/lightbox.min.css') }}" rel="stylesheet">
<link href="{{ asset('template/frontend/lib/owlcarousel/assets/owl.carousel.min.css') }}" rel="stylesheet">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css" />
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.4.1/font/bootstrap-icons.css" rel="stylesheet">
<link href="{{ asset('template/frontend/lib/lightbox/css/lightbox.min.css') }}" rel="stylesheet">
<link href="{{ asset('template/frontend/lib/owlcarousel/assets/owl.carousel.min.css') }}" rel="stylesheet">
<!-- Customized Bootstrap Stylesheet -->
<link href="{{ asset('template/frontend/css/bootstrap.min.css') }}" rel="stylesheet">
<link href="{{ asset('template/frontend/css/bootstrap.min.css') }}" rel="stylesheet">
<link href="{{ asset('template/frontend/css/style.css') }}" rel="stylesheet">
<!-- Template Stylesheet -->
<link href="{{ asset('template/frontend/css/style.css') }}" rel="stylesheet">
@yield('css')
</head>
@yield('css')
</head>
<body>
<body>
<!-- Navbar start -->
<div class="container-fluid fixed-top">
<div class="container topbar bg-primary d-none d-lg-block">
<div class="d-flex justify-content-between">
<div class="top-info ps-2">
<small class="me-3"><i class="fas fa-map-marker-alt me-2 text-secondary"></i> <a href="#" class="text-white">Desa Sukamaju, Indonesia</a></small>
<small class="me-3"><i class="fas fa-envelope me-2 text-secondary"></i><a href="#" class="text-white">info@tanidesa.com</a></small>
</div>
<!-- Spinner -->
<div id="spinner"
class="show w-100 vh-100 bg-white position-fixed translate-middle top-50 start-50 d-flex align-items-center justify-content-center">
<div class="spinner-grow text-primary" role="status"></div>
</div>
<!-- Navbar -->
<div class="container-fluid fixed-top">
<div class="container topbar bg-primary d-none d-lg-block">
<div class="d-flex justify-content-between">
<div class="top-info ps-2">
<small class="me-3"><i class="fas fa-map-marker-alt me-2 text-secondary"></i> <a href="#"
class="text-white">Desa Sukamaju, Indonesia</a></small>
<small class="me-3"><i class="fas fa-envelope me-2 text-secondary"></i><a href="#"
class="text-white">info@tanidesa.com</a></small>
</div>
<div class="top-link pe-2">
<a href="#" class="text-white"><small class="text-white mx-2">Kebijakan Privasi</small>/</a>
<a href="#" class="text-white"><small class="text-white mx-2">Syarat & Ketentuan</small></a>
</div>
</div>
<div class="container px-0">
<nav class="navbar navbar-light bg-white navbar-expand-xl">
<a href="{{ url('/') }}" class="navbar-brand"><h1 class="text-primary display-6">TaniDesa</h1></a>
<button class="navbar-toggler py-2 px-3" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse">
<span class="fa fa-bars text-primary"></span>
</button>
<div class="collapse navbar-collapse bg-white" id="navbarCollapse">
<div class="navbar-nav mx-auto">
<a href="{{ url('/') }}" class="nav-item nav-link {{ request()->is('/') ? 'active' : '' }}">Home</a>
<a href="{{ route('shop') }}" class="nav-item nav-link {{ request()->is('shop*') ? 'active' : '' }}">Belanja</a>
<a href="#" class="nav-item nav-link">Kontak</a>
</div>
<div class="d-flex m-3 me-0">
<!-- Tombol Search -->
<button class="btn-search btn border border-secondary btn-md-square rounded-circle bg-white me-4" data-bs-toggle="modal" data-bs-target="#searchModal"><i class="fas fa-search text-primary"></i></button>
<a href="{{ route('cart') }}" class="position-relative me-4 my-auto">
<i class="fa fa-shopping-bag fa-2x"></i>
<span class="position-absolute bg-secondary rounded-circle d-flex align-items-center justify-content-center text-dark px-1" style="top: -5px; left: 15px; height: 20px; min-width: 20px;">
{{ session('cart') ? count(session('cart')) : 0 }}
</span>
</a>
</div>
<div class="container px-0">
<nav class="navbar navbar-light bg-white navbar-expand-xl">
<a href="{{ url('/') }}" class="navbar-brand">
<h1 class="text-primary display-6">TaniDesa</h1>
</a>
<button class="navbar-toggler py-2 px-3" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarCollapse">
<span class="fa fa-bars text-primary"></span>
</button>
<div class="collapse navbar-collapse bg-white" id="navbarCollapse">
<div class="navbar-nav mx-auto">
<a href="{{ url('/') }}"
class="nav-item nav-link {{ request()->is('/') ? 'active' : '' }}">Home</a>
<a href="{{ route('shop') }}"
class="nav-item nav-link {{ request()->is('shop*') ? 'active' : '' }}">Belanja</a>
<a href="#" class="nav-item nav-link">Kontak</a>
</div>
<!-- Login / User -->
@if(Auth::guard('pembeli')->check())
<div class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle my-auto" data-bs-toggle="dropdown">
<i class="fas fa-user fa-2x"></i> {{ Auth::guard('pembeli')->user()->nama_lengkap }}
</a>
<div class="dropdown-menu m-0 bg-secondary rounded-0">
<a href="#" class="dropdown-item">Profil</a>
<a href="#" class="dropdown-item">Riwayat Pesanan</a>
<form action="{{ route('logout') }}" method="POST">
@csrf
<button type="submit" class="dropdown-item">Logout</button>
</form>
</div>
</div>
@else
<a href="{{ route('login') }}" class="my-auto">
<i class="fas fa-user fa-2x"></i> Login
<div class="d-flex m-3 me-0 align-items-center">
<!-- Search bar -->
<form action="{{ route('shop') }}" method="GET" class="d-flex me-4">
<div class="input-group">
<input type="search" name="search" class="form-control border border-secondary"
placeholder="Cari..." aria-label="Search" value="{{ request('search') }}">
<button class="btn btn-outline-secondary" type="submit">
<i class="fas fa-search text-primary"></i>
</button>
</div>
</form>
<!-- Cart -->
<a href="#" class="position-relative me-4 my-auto">
<i class="fa fa-shopping-bag fa-2x"></i>
<span
class="position-absolute bg-secondary rounded-circle d-flex align-items-center justify-content-center text-dark px-1"
style="top: -5px; left: 15px; height: 20px; min-width: 20px;">0</span>
</a>
<!-- User Account -->
@if (Auth::guard('pembeli')->check())
<div class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle my-auto" data-bs-toggle="dropdown">
<i class="fas fa-user fa-2x"></i>
<span
class="d-none d-xl-inline ms-1">{{ Auth::guard('pembeli')->user()->nama_lengkap }}</span>
</a>
@endif
<div class="dropdown-menu m-0 bg-secondary rounded-0">
<!-- Menu Profil -->
<a href="#" class="dropdown-item">Profil Saya</a>
<!-- Menu Pesanan Saya -->
<a href="{{ route('pesanan.saya') }}" class="dropdown-item">Pesanan Saya</a>
<!-- Form Logout -->
<form action="{{ route('logout') }}" method="POST">
@csrf
<button type="submit" class="dropdown-item">Logout</button>
</form>
</div>
</div>
@else
<a href="{{ route('login') }}" class="my-auto">
<i class="fas fa-user fa-2x"></i> Login
</a>
@endif
</div>
</div>
</nav>
</div>
</div>
<!-- Main Content -->
<div style="margin-top: 150px;">
@yield('content')
</div>
<!-- Footer -->
<div class="container-fluid bg-dark text-white-50 footer pt-5 mt-5">
<div class="container py-5">
<div class="pb-4 mb-4" style="border-bottom: 1px solid rgba(226, 175, 24, 0.5) ;">
<div class="row g-4">
<div class="col-lg-3">
<a href="#">
<h1 class="text-primary mb-0">TaniDesa</h1>
<p class="text-secondary mb-0">Segar & Organik</p>
</a>
</div>
<div class="col-lg-6">
<div class="position-relative mx-auto">
<input class="form-control border-0 w-100 py-3 px-4 rounded-pill" type="text"
placeholder="Email Anda">
<button type="submit"
class="btn btn-primary border-0 border-secondary py-3 px-4 position-absolute rounded-pill text-white"
style="top: 0; right: 0;">Langganan</button>
</div>
</div>
</nav>
</div>
</div>
<!-- Modal Search Start -->
<div class="modal fade" id="searchModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog modal-fullscreen">
<div class="modal-content rounded-0">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Cari Produk</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
<div class="col-lg-3">
<div class="d-flex justify-content-end pt-3">
<a class="btn btn-outline-secondary me-2 btn-md-square rounded-circle" href=""><i
class="fab fa-twitter"></i></a>
<a class="btn btn-outline-secondary me-2 btn-md-square rounded-circle" href=""><i
class="fab fa-facebook-f"></i></a>
<a class="btn btn-outline-secondary me-2 btn-md-square rounded-circle" href=""><i
class="fab fa-youtube"></i></a>
<a class="btn btn-outline-secondary btn-md-square rounded-circle" href=""><i
class="fab fa-linkedin-in"></i></a>
</div>
</div>
<div class="modal-body d-flex align-items-center">
<div class="input-group w-75 mx-auto d-flex">
<form action="{{ route('shop') }}" method="GET" class="w-100 d-flex">
<input type="search" name="search" class="form-control p-3" placeholder="Mau cari sayur apa?" aria-describedby="search-icon-1">
<button type="submit" id="search-icon-1" class="input-group-text p-3"><i class="fa fa-search"></i></button>
</form>
</div>
</div>
<div class="row g-5">
<div class="col-lg-3 col-md-6">
<div class="footer-item">
<h4 class="text-light mb-3">Tentang Kami</h4>
<p class="mb-4">TaniDesa adalah platform yang menghubungkan petani lokal langsung dengan
Anda. Kami menjamin kesegaran dan harga yang adil bagi petani.</p>
</div>
</div>
<div class="col-lg-3 col-md-6">
<div class="d-flex flex-column text-start footer-item">
<h4 class="text-light mb-3">Informasi Toko</h4>
<a class="btn-link" href="">Tentang Kami</a>
<a class="btn-link" href="">Hubungi Kami</a>
<a class="btn-link" href="">Kebijakan Privasi</a>
<a class="btn-link" href="">Syarat & Ketentuan</a>
</div>
</div>
<div class="col-lg-3 col-md-6">
<div class="d-flex flex-column text-start footer-item">
<h4 class="text-light mb-3">Akun</h4>
<a class="btn-link" href="#">Profil Saya</a>
<a class="btn-link" href="#">Keranjang Belanja</a>
<a class="btn-link" href="#">Riwayat Pesanan</a>
</div>
</div>
<div class="col-lg-3 col-md-6">
<div class="footer-item">
<h4 class="text-light mb-3">Kontak</h4>
<p>Alamat: Desa Sukamaju, Indonesia</p>
<p>Email: info@tanidesa.com</p>
<p>Telepon: +62 812 3456 7890</p>
<div class="payment-methods">
<i class="fab fa-cc-visa fa-2x text-light me-2"></i>
<i class="fab fa-cc-mastercard fa-2x text-light me-2"></i>
<i class="fas fa-money-bill-wave fa-2x text-light"></i>
</div>
</div>
</div>
</div>
</div>
<!-- CONTENT -->
<div>
<div class="container pt-4">
@if(session('success'))
<div class="alert alert-success alert-dismissible fade show" role="alert">
<i class="fa fa-check-circle me-2"></i> {{ session('success') }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
<div class="container-fluid copyright bg-dark py-4">
<div class="container">
<div class="row">
<div class="col-md-6 text-center text-md-start mb-3 mb-md-0">
<span class="text-light"><a href="#"><i
class="fas fa-copyright text-light me-2"></i>TaniDesa</a>, All right
reserved.</span>
</div>
@endif
@if(session('error'))
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<i class="fa fa-exclamation-circle me-2"></i> {{ session('error') }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
</div>
@yield('content')
</div>
<!-- Footer Start -->
<div class="container-fluid bg-dark text-white-50 footer pt-5 mt-5">
<div class="container py-5">
<div class="row g-5">
<div class="col-lg-3 col-md-6">
<div class="footer-item">
<h4 class="text-light mb-3">TaniDesa</h4>
<p class="mb-4">Platform jual beli hasil pertanian langsung dari petani desa.</p>
</div>
<div class="col-md-6 text-center text-md-end">
<span class="text-light">Designed By <a href="https://htmlcodex.com" class="text-white">HTML
Codex</a> Distributed By <a href="https://themewagon.com"
class="text-white">ThemeWagon</a></span>
</div>
</div>
</div>
</div>
</div>
<!-- JavaScript Libraries -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="{{ asset('template/frontend/lib/easing/easing.min.js') }}"></script>
<script src="{{ asset('template/frontend/lib/waypoints/waypoints.min.js') }}"></script>
<script src="{{ asset('template/frontend/lib/lightbox/js/lightbox.min.js') }}"></script>
<script src="{{ asset('template/frontend/lib/owlcarousel/owl.carousel.min.js') }}"></script>
<!-- Back to Top -->
<a href="#" class="btn btn-primary border-3 border-primary rounded-circle back-to-top"><i
class="fa fa-arrow-up"></i></a>
<script src="{{ asset('template/frontend/js/main.js') }}"></script>
@yield('js')
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/js/bootstrap.bundle.min.js"></script>
</html>
<script src="{{ asset('template/frontend/lib/easing/easing.min.js') }}"></script>
<script src="{{ asset('template/frontend/lib/waypoints/waypoints.min.js') }}"></script>
<script src="{{ asset('template/frontend/lib/lightbox/js/lightbox.min.js') }}"></script>
<script src="{{ asset('template/frontend/lib/owlcarousel/owl.carousel.min.js') }}"></script>
<script src="{{ asset('template/frontend/js/main.js') }}"></script>
@yield('js')
</body>
</html>

View File

@ -4,46 +4,71 @@
@section('page-title', 'Panel Petani')
@section('content')
<div class="page-heading">
<h3>Statistik Toko</h3>
</div>
<div class="page-content">
<section class="row">
<div class="col-12 col-lg-12">
{{-- Kartu Selamat Datang --}}
<div class="card">
<div class="card-header">
<h4>Halo, {{ Auth::guard('petani')->user()->nama_lengkap }}!</h4>
</div>
<div class="card-body">
<div class="alert alert-success">
<i class="bi bi-check-circle"></i> Akun Anda <strong>AKTIF</strong>. Silakan mulai berjualan.
</div>
<p>Gunakan menu <strong>"Kelola Produk"</strong> di samping untuk menambah sayur/buah dagangan Anda.</p>
</div>
</div>
<div class="page-heading">
<h3>Statistik Toko</h3>
</div>
<div class="page-content">
<section class="row">
<div class="col-12 col-lg-12">
{{-- Statistik Sederhana --}}
<div class="row">
<div class="col-6 col-lg-3 col-md-6">
<div class="card">
<div class="card-body px-3 py-4-5">
<div class="row">
<div class="col-md-4">
<div class="stats-icon purple">
<i class="iconly-boldShow"></i>
{{-- Baris Statistik --}}
<div class="row">
<!-- Statistik Produk -->
<div class="col-6 col-lg-3 col-md-6">
<div class="card">
<div class="card-body px-3 py-4-5">
<div class="row">
<div class="col-md-4">
<div class="stats-icon purple mb-2">
{{-- Ikon Produk --}}
<i class="bi bi-box-seam-fill text-white"></i>
</div>
</div>
<div class="col-md-8">
<h6 class="text-muted font-semibold">Produk Aktif</h6>
<h6 class="font-extrabold mb-0">
{{ \App\Models\Produk::where('petani_id', Auth::guard('petani')->id())->count() }}
</h6>
</div>
</div>
<div class="col-md-8">
<h6 class="text-muted font-semibold">Produk Aktif</h6>
<h6 class="font-extrabold mb-0">{{ \App\Models\Produk::where('petani_id', Auth::guard('petani')->id())->count() }}</h6>
</div>
</div>
</div>
<!-- Statistik Pesanan -->
<div class="col-6 col-lg-3 col-md-6">
<div class="card">
<div class="card-body px-3 py-4-5">
<div class="row">
<div class="col-md-4">
<div class="stats-icon blue mb-2">
<i class="bi bi-cart-check-fill text-white"></i>
</div>
</div>
<div class="col-md-8">
<h6 class="text-muted font-semibold">Pesanan Masuk</h6>
{{-- LOGIKA HITUNG PESANAN --}}
@php
$jumlahPesanan = \App\Models\Transaksi::whereHas(
'details.produk',
function ($q) {
$q->where('petani_id', Auth::guard('petani')->id());
},
)
->where('status', '!=', 'selesai')
->count();
@endphp
<h6 class="font-extrabold mb-0">{{ $jumlahPesanan }}</h6>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
@endsection
</section>
</div>
@endsection

View File

@ -0,0 +1,174 @@
@extends('layouts.admin')
@section('title', 'Detail Pesanan')
@section('page-title', 'Detail Pesanan #' . $pesanan->kode_invoice)
@section('content')
<div class="row">
<div class="col-md-8">
<div class="card">
<div class="card-header">
<h4>Informasi Pesanan</h4>
</div>
<div class="card-body">
<table class="table table-borderless">
<tr>
<th width="30%">Nomor Invoice</th>
<td>: <span class="text-primary font-bold">#{{ $pesanan->kode_invoice }}</span></td>
</tr>
<tr>
<th>Tanggal Pesanan</th>
<td>: {{ \Carbon\Carbon::parse($pesanan->tanggal_transaksi)->format('d F Y H:i') }}</td>
</tr>
<tr>
<th>Status</th>
<td>:
@if($pesanan->status == 'menunggu_konfirmasi')
<span class="badge bg-warning">Perlu Konfirmasi</span>
@elseif($pesanan->status == 'diproses')
<span class="badge bg-info">Diproses</span>
@elseif($pesanan->status == 'dikirim')
<span class="badge bg-primary">Dikirim</span>
@elseif($pesanan->status == 'selesai')
<span class="badge bg-success">Selesai</span>
@else
<span class="badge bg-danger">Batal</span>
@endif
</td>
</tr>
</table>
<hr>
<h5>Daftar Produk</h5>
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>Produk</th>
<th class="text-center">Jumlah</th>
<th class="text-end">Harga Satuan</th>
<th class="text-end">Subtotal</th>
</tr>
</thead>
<tbody>
@foreach($pesanan->details as $detail)
@if($detail->produk->petani_id == Auth::guard('petani')->id())
<tr>
<td>
<div class="d-flex align-items-center">
<img src="{{ $detail->produk->foto_produk ? asset('storage/'.$detail->produk->foto_produk) : asset('template/frontend/img/fruite-item-5.jpg') }}"
alt="{{ $detail->produk->nama_produk }}"
class="rounded me-2"
style="width: 50px; height: 50px; object-fit: cover;">
<div>
<h6 class="mb-0">{{ $detail->produk->nama_produk }}</h6>
</div>
</div>
</td>
<td class="text-center">{{ $detail->jumlah }}</td>
<td class="text-end">Rp {{ number_format($detail->harga_satuan, 0, ',', '.') }}</td>
<td class="text-end fw-bold">Rp {{ number_format($detail->subtotal, 0, ',', '.') }}</td>
</tr>
@endif
@endforeach
</tbody>
<tfoot>
<tr>
<td colspan="3" class="text-end fw-bold">Total Pendapatan:</td>
<td class="text-end fw-bold text-success">
@php
$totalPetani = $pesanan->details->filter(function($detail) {
return $detail->produk->petani_id == Auth::guard('petani')->id();
})->sum('subtotal');
@endphp
Rp {{ number_format($totalPetani, 0, ',', '.') }}
</td>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card">
<div class="card-header">
<h4>Informasi Pembeli</h4>
</div>
<div class="card-body">
<div class="d-flex align-items-center mb-3">
<div class="avatar avatar-lg me-3">
<img src="{{ asset('template/admin/static/images/faces/2.jpg') }}" alt="Pembeli">
</div>
<div>
<h5 class="mb-0">{{ $pesanan->pembeli->nama_lengkap }}</h5>
<small class="text-muted">{{ $pesanan->pembeli->username }}</small>
</div>
</div>
<hr>
<p><strong><i class="bi bi-telephone me-2"></i> No. HP / WA:</strong><br>
<a href="https://wa.me/{{ $pesanan->pembeli->no_hp }}" target="_blank" class="text-success">{{ $pesanan->pembeli->no_hp }}</a></p>
<p><strong><i class="bi bi-geo-alt me-2"></i> Alamat Pengiriman:</strong><br>
{{ $pesanan->alamat_pengiriman }}</p>
</div>
</div>
<div class="card">
<div class="card-header">
<h4>Aksi Pesanan</h4>
</div>
<div class="card-body">
@if($pesanan->status == 'menunggu_konfirmasi')
<p class="text-muted mb-3">Pesanan baru masuk. Silakan terima jika stok tersedia atau tolak jika tidak bisa dipenuhi.</p>
<div class="d-grid gap-2">
<form action="{{ route('petani.pesanan.update', $pesanan->id) }}" method="POST">
@csrf @method('PATCH')
<input type="hidden" name="status" value="diproses">
<button class="btn btn-success w-100" onclick="return confirm('Terima pesanan ini?')">
<i class="bi bi-check-circle me-2"></i> Terima Pesanan
</button>
</form>
<form action="{{ route('petani.pesanan.update', $pesanan->id) }}" method="POST">
@csrf @method('PATCH')
<input type="hidden" name="status" value="batal">
<button class="btn btn-danger w-100" onclick="return confirm('Tolak pesanan ini?')">
<i class="bi bi-x-circle me-2"></i> Tolak Pesanan
</button>
</form>
</div>
@elseif($pesanan->status == 'diproses')
<p class="text-muted mb-3">Pesanan sedang diproses. Jika barang sudah dikirim atau siap diambil, update statusnya.</p>
<form action="{{ route('petani.pesanan.update', $pesanan->id) }}" method="POST">
@csrf @method('PATCH')
<input type="hidden" name="status" value="dikirim">
<button class="btn btn-primary w-100">
<i class="bi bi-truck me-2"></i> Kirim Barang
</button>
</form>
@elseif($pesanan->status == 'dikirim')
<div class="alert alert-info">
<i class="bi bi-info-circle me-2"></i> Barang sedang dalam pengiriman. Menunggu konfirmasi selesai dari pembeli atau sistem.
</div>
@elseif($pesanan->status == 'selesai')
<div class="alert alert-success">
<i class="bi bi-check-circle-fill me-2"></i> Pesanan Selesai.
</div>
@elseif($pesanan->status == 'batal')
<div class="alert alert-danger">
<i class="bi bi-x-circle-fill me-2"></i> Pesanan Dibatalkan.
</div>
@endif
<div class="mt-3 text-center">
<a href="{{ route('petani.pesanan.index') }}" class="btn btn-link text-secondary">Kembali ke Daftar</a>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@ -0,0 +1,96 @@
@extends('layouts.admin')
@section('title', 'Pesanan Masuk')
@section('page-title', 'Daftar Pesanan Masuk')
@section('content')
<div class="card">
<div class="card-header">
<h4>Kelola Pesanan</h4>
</div>
<div class="card-body">
@if(session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
<div class="table-responsive">
<table class="table table-hover" id="table1">
<thead>
<tr>
<th>Invoice</th>
<th>Pembeli</th>
<th>Barang</th>
<th>Alamat</th>
<th>Total</th>
<th>Status</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
@forelse($pesanans as $pesanan)
<tr>
<td class="text-primary font-bold">#{{ $pesanan->kode_invoice }}</td>
<td>
{{ $pesanan->pembeli->nama_lengkap }}<br>
<small class="text-muted">{{ $pesanan->pembeli->no_hp }}</small>
</td>
<td>
<ul class="list-unstyled mb-0">
@foreach($pesanan->details as $detail)
<li>- {{ $detail->produk->nama_produk }} ({{ $detail->jumlah }})</li>
@endforeach
</ul>
</td>
<td><small>{{ Str::limit($pesanan->alamat_pengiriman, 30) }}</small></td>
<td class="font-bold">Rp {{ number_format($pesanan->total_harga, 0, ',', '.') }}</td>
<td>
@if($pesanan->status == 'menunggu_konfirmasi')
<span class="badge bg-warning">Perlu Konfirmasi</span>
@elseif($pesanan->status == 'diproses')
<span class="badge bg-info">Diproses</span>
@elseif($pesanan->status == 'dikirim')
<span class="badge bg-primary">Dikirim</span>
@elseif($pesanan->status == 'selesai')
<span class="badge bg-success">Selesai</span>
@else
<span class="badge bg-danger">Batal</span>
@endif
</td>
<td>
<div class="d-flex gap-2">
<a href="{{ route('petani.pesanan.detail', $pesanan->id) }}" class="btn btn-sm btn-info text-white" title="Lihat Detail">
<i class="bi bi-eye"></i> Detail
</a>
{{-- Tombol Aksi Status --}}
@if($pesanan->status == 'menunggu_konfirmasi')
<form action="{{ route('petani.pesanan.update', $pesanan->id) }}" method="POST" class="d-inline">
@csrf @method('PATCH')
<input type="hidden" name="status" value="diproses">
<button class="btn btn-sm btn-success" title="Terima Pesanan"><i class="bi bi-check-lg"></i></button>
</form>
<form action="{{ route('petani.pesanan.update', $pesanan->id) }}" method="POST" class="d-inline">
@csrf @method('PATCH')
<input type="hidden" name="status" value="batal">
<button class="btn btn-sm btn-danger" title="Tolak Pesanan" onclick="return confirm('Tolak pesanan ini?')"><i class="bi bi-x-lg"></i></button>
</form>
@elseif($pesanan->status == 'diproses')
<form action="{{ route('petani.pesanan.update', $pesanan->id) }}" method="POST">
@csrf @method('PATCH')
<input type="hidden" name="status" value="dikirim">
<button class="btn btn-sm btn-primary" title="Kirim Barang"><i class="bi bi-truck"></i> Kirim</button>
</form>
@endif
</div>
</td>
</tr>
@empty
<tr>
<td colspan="7" class="text-center">Belum ada pesanan masuk.</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
@endsection

View File

@ -4,7 +4,6 @@
use App\Http\Controllers\AuthController;
use App\Http\Controllers\AdminController;
use App\Http\Controllers\CartController;
use App\Http\Controllers\CheckoutController;
use App\Http\Controllers\LandingController;
use App\Http\Controllers\Petani\ProdukController;
use App\Http\Controllers\TransaksiController;
@ -20,13 +19,13 @@
Route::get('/shop', [LandingController::class, 'shop'])->name('shop');
Route::get('/produk/{id}', [LandingController::class, 'detail'])->name('produk.detail');
// Cart (Bisa akses session cart tanpa login)
// --- CART ROUTES ---
Route::get('/cart', [CartController::class, 'index'])->name('cart');
Route::post('/cart/add', [CartController::class, 'addToCart'])->name('cart.add');
Route::delete('/cart/remove', [CartController::class, 'remove'])->name('cart.remove');
// --- AUTHENTICATION ROUTES (Hanya untuk Guest/Belum Login) ---
// --- AUTH ROUTES (Guest Only) ---
Route::middleware('guest')->group(function () {
Route::get('/login', [AuthController::class, 'showLoginForm'])->name('login');
Route::post('/login-proses', [AuthController::class, 'loginProcess'])->name('login.proses');
@ -35,17 +34,20 @@
Route::post('/register-proses', [AuthController::class, 'registerProcess'])->name('register.proses');
});
// Logout (Bisa diakses oleh user yang login)
// Logout
Route::post('/logout', [AuthController::class, 'logout'])->name('logout');
// --- AREA PEMBELI (Wajib Login sebagai Pembeli) ---
// --- PEMBELI AREA (Wajib Login) ---
Route::middleware(['auth:pembeli'])->group(function () {
// Menampilkan Halaman Checkout
Route::get('/checkout', [CheckoutController::class, 'index'])->name('checkout');
// Menampilkan halaman checkout dari cart atau beli langsung
Route::get('/checkout', [TransaksiController::class, 'checkoutPage'])->name('checkout');
// Memproses Data Checkout (Simpan ke Database)
Route::post('/transaksi', [TransaksiController::class, 'store'])->name('transaksi.store');
// Proses Simpan Transaksi
Route::post('/checkout/process', [TransaksiController::class, 'prosesCheckout'])->name('checkout.proses');
// Riwayat Pesanan
Route::get('/pesanan-saya', [TransaksiController::class, 'pesananSaya'])->name('pesanan.saya');
});
@ -70,7 +72,11 @@
return view('petani.dashboard');
})->name('petani.dashboard');
// Resource Controller untuk Produk Petani
Route::resource('petani/produk', ProdukController::class)
->names('petani.produk');
// CRUD Produk Petani
Route::resource('petani/produk', ProdukController::class)->names('petani.produk');
// Manajemen Pesanan Masuk (Petani)
Route::get('/petani/pesanan', [TransaksiController::class, 'pesananMasuk'])->name('petani.pesanan.index');
Route::patch('/petani/pesanan/{id}', [TransaksiController::class, 'updateStatus'])->name('petani.pesanan.update');
Route::get('/petani/pesanan/{id}', [TransaksiController::class, 'pesananDetail'])->name('petani.pesanan.detail');
});