chore: initial commit of existing codebase
This commit is contained in:
commit
11e94889b2
292 files changed
+38586
No files matched your search
@@ -0,0 +1,129 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'New Delivery Note')
|
||||
|
||||
@section('content')
|
||||
<div class="mb-6">
|
||||
<h1 class="page-title">New Delivery Note</h1>
|
||||
<p class="page-subtitle"><a href="{{ route('sales.delivery-notes.index') }}" class="text-blue-600 hover:underline">Delivery Notes</a> / New</p>
|
||||
</div>
|
||||
|
||||
@if($errors->any())
|
||||
<div class="mb-4 px-4 py-3 bg-red-50 border border-red-200 rounded-lg text-sm text-red-700">
|
||||
<ul class="list-disc list-inside space-y-1">
|
||||
@foreach($errors->all() as $error)
|
||||
<li>{{ $error }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<form action="{{ route('sales.delivery-notes.store') }}" method="POST">
|
||||
@csrf
|
||||
|
||||
<div class="card card-body mb-4">
|
||||
<h2 class="text-base font-semibold text-gray-700 mb-4">Delivery Details</h2>
|
||||
<div class="grid grid-cols-1 gap-5 sm:grid-cols-2">
|
||||
|
||||
<div>
|
||||
<label class="form-label">Sales Order <span class="text-red-500">*</span></label>
|
||||
<select name="sales_order_id" id="so-select" required onchange="loadSOItems(this)" class="form-select">
|
||||
<option value="">-- Select Confirmed Order --</option>
|
||||
@foreach($salesOrders as $so)
|
||||
<option value="{{ $so->id }}"
|
||||
data-items="{{ json_encode($so->items) }}"
|
||||
{{ (old('sales_order_id', request('sales_order_id'))) == $so->id ? 'selected' : '' }}>
|
||||
{{ $so->order_number ?? 'SO-' . str_pad($so->id, 5, '0', STR_PAD_LEFT) }} - {{ $so->customer->name ?? '' }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="form-label">Warehouse <span class="text-red-500">*</span></label>
|
||||
<select name="warehouse_id" required class="form-select">
|
||||
<option value="">-- Select Warehouse --</option>
|
||||
@foreach($warehouses as $warehouse)
|
||||
<option value="{{ $warehouse->id }}" {{ old('warehouse_id') == $warehouse->id ? 'selected' : '' }}>
|
||||
{{ $warehouse->name }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="form-label">Delivery Date <span class="text-red-500">*</span></label>
|
||||
<input type="date" name="delivery_date" value="{{ old('delivery_date', date('Y-m-d')) }}" required class="form-input">
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="form-label">Notes</label>
|
||||
<textarea name="notes" rows="2" class="form-textarea">{{ old('notes') }}</textarea>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Items from SO -->
|
||||
<div class="card card-body mb-4">
|
||||
<h2 class="text-base font-semibold text-gray-700 mb-4">Items to Deliver</h2>
|
||||
<div class="overflow-x-auto">
|
||||
<table class="min-w-full text-sm">
|
||||
<thead>
|
||||
<tr class="border-b border-gray-200">
|
||||
<th class="pb-2 text-left font-semibold text-gray-600">Product</th>
|
||||
<th class="pb-2 text-left font-semibold text-gray-600 w-28">SO Qty</th>
|
||||
<th class="pb-2 text-left font-semibold text-gray-600 w-28">Deliver Qty</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="dn-items-body">
|
||||
<tr>
|
||||
<td colspan="3" class="py-4 text-center text-gray-400">Select a Sales Order to load items.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
<button type="submit" class="btn-primary">Create Delivery Note</button>
|
||||
<a href="{{ route('sales.delivery-notes.index') }}" class="btn-secondary">Cancel</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script>
|
||||
function loadSOItems(select) {
|
||||
var tbody = document.getElementById('dn-items-body');
|
||||
var option = select.options[select.selectedIndex];
|
||||
tbody.innerHTML = '';
|
||||
|
||||
if (!option.value) {
|
||||
tbody.innerHTML = '<tr><td colspan="3" class="py-4 text-center text-gray-400">Select a Sales Order to load items.</td></tr>';
|
||||
return;
|
||||
}
|
||||
|
||||
var items = JSON.parse(option.dataset.items || '[]');
|
||||
if (!items.length) {
|
||||
tbody.innerHTML = '<tr><td colspan="3" class="py-4 text-center text-gray-400">No items on this order.</td></tr>';
|
||||
return;
|
||||
}
|
||||
|
||||
items.forEach(function(item, idx) {
|
||||
var row = document.createElement('tr');
|
||||
row.className = 'border-b border-gray-100';
|
||||
row.innerHTML = `
|
||||
<td class="py-2 pr-2 text-gray-800">${item.item ? item.item.item_name : 'Item #' + item.item_id}
|
||||
<input type="hidden" name="items[${idx}][item_id]" value="${item.item_id}">
|
||||
</td>
|
||||
<td class="py-2 pr-2 text-gray-500">${item.quantity}</td>
|
||||
<td class="py-2 pr-2">
|
||||
<input type="number" name="items[${idx}][quantity]"
|
||||
value="${item.quantity}" min="0" step="0.01"
|
||||
max="${item.quantity}"
|
||||
class="w-full border border-gray-300 rounded px-2 py-1.5 text-sm focus:outline-none focus:ring-1 focus:ring-blue-400">
|
||||
</td>`;
|
||||
tbody.appendChild(row);
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@endsection
|
||||
@@ -0,0 +1,57 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Edit Delivery Note')
|
||||
|
||||
@section('content')
|
||||
<div class="mb-6">
|
||||
<h1 class="page-title">Edit Delivery Note</h1>
|
||||
<p class="page-subtitle"><a href="{{ route('sales.delivery-notes.index') }}" class="text-blue-600 hover:underline">Delivery Notes</a> / Edit</p>
|
||||
</div>
|
||||
|
||||
@if($errors->any())
|
||||
<div class="mb-4 px-4 py-3 bg-red-50 border border-red-200 rounded-lg text-sm text-red-700">
|
||||
<ul class="list-disc list-inside space-y-1">
|
||||
@foreach($errors->all() as $error)
|
||||
<li>{{ $error }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="card card-body max-w-2xl">
|
||||
<form action="{{ route('sales.delivery-notes.update', $deliveryNote) }}" method="POST">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
<div class="grid grid-cols-1 gap-5 sm:grid-cols-2">
|
||||
|
||||
<div>
|
||||
<label class="form-label">Warehouse <span class="text-red-500">*</span></label>
|
||||
<select name="warehouse_id" required class="form-select">
|
||||
<option value="">-- Select Warehouse --</option>
|
||||
@foreach($warehouses as $warehouse)
|
||||
<option value="{{ $warehouse->id }}" {{ old('warehouse_id', $deliveryNote->warehouse_id) == $warehouse->id ? 'selected' : '' }}>
|
||||
{{ $warehouse->name }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="form-label">Delivery Date <span class="text-red-500">*</span></label>
|
||||
<input type="date" name="delivery_date" value="{{ old('delivery_date', $deliveryNote->delivery_date ? \Carbon\Carbon::parse($deliveryNote->delivery_date)->format('Y-m-d') : '') }}" required class="form-input">
|
||||
</div>
|
||||
|
||||
<div class="sm:col-span-2">
|
||||
<label class="form-label">Notes</label>
|
||||
<textarea name="notes" rows="3" class="form-textarea">{{ old('notes', $deliveryNote->notes) }}</textarea>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="mt-6 flex items-center gap-3">
|
||||
<button type="submit" class="btn-primary">Update Delivery Note</button>
|
||||
<a href="{{ route('sales.delivery-notes.index') }}" class="btn-secondary">Cancel</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -0,0 +1,77 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Delivery Notes')
|
||||
|
||||
@section('content')
|
||||
<div class="page-header">
|
||||
<div>
|
||||
<h1 class="page-title">Delivery Notes</h1>
|
||||
<p class="page-subtitle">Manage goods dispatch to customers</p>
|
||||
</div>
|
||||
<a href="{{ route('sales.delivery-notes.create') }}" class="btn-primary">
|
||||
+ New Delivery Note
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="table-wrapper overflow-x-auto">
|
||||
<table class="table-base">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>DN #</th>
|
||||
<th>Sales Order</th>
|
||||
<th>Customer</th>
|
||||
<th>Warehouse</th>
|
||||
<th>Date</th>
|
||||
<th>Status</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse($deliveryNotes as $dn)
|
||||
<tr>
|
||||
<td class="font-mono text-gray-700">{{ $dn->dn_number ?? 'DN-' . str_pad($dn->id, 5, '0', STR_PAD_LEFT) }}</td>
|
||||
<td class="font-mono text-gray-600">{{ $dn->salesOrder->order_number ?? 'SO-' . str_pad($dn->sales_order_id, 5, '0', STR_PAD_LEFT) }}</td>
|
||||
<td class="text-gray-800">{{ $dn->salesOrder->customer->name ?? '' }}</td>
|
||||
<td class="text-gray-700">{{ $dn->warehouse->name ?? '' }}</td>
|
||||
<td class="text-gray-600">{{ $dn->delivery_date ? \Carbon\Carbon::parse($dn->delivery_date)->format('d M Y') : '' }}</td>
|
||||
<td>
|
||||
@php
|
||||
$badgeClass = match($dn->status ?? 'pending') {
|
||||
'pending' => 'badge-yellow',
|
||||
'dispatched' => 'badge-green',
|
||||
'cancelled' => 'badge-red',
|
||||
default => 'badge-gray',
|
||||
};
|
||||
@endphp
|
||||
<span class="{{ $badgeClass }}">{{ ucfirst($dn->status ?? 'pending') }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<div class="flex items-center gap-2 flex-wrap">
|
||||
@if($dn->status === 'pending')
|
||||
<form action="{{ route('sales.delivery-notes.dispatch', $dn) }}" method="POST">
|
||||
@csrf @method('PATCH')
|
||||
<button type="submit" class="btn-success btn-sm">Dispatch</button>
|
||||
</form>
|
||||
@endif
|
||||
<a href="{{ route('sales.delivery-notes.edit', $dn) }}" class="btn-secondary btn-sm">Edit</a>
|
||||
<form action="{{ route('sales.delivery-notes.destroy', $dn) }}" method="POST"
|
||||
onsubmit="confirmDelete(this,'Delete this delivery note?','This delivery note will be permanently removed.'); return false;">
|
||||
@csrf @method('DELETE')
|
||||
<button type="submit" class="btn-danger btn-sm">Delete</button>
|
||||
</form>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="7" class="px-4 py-8 text-center text-gray-400">No delivery notes found.</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@if($deliveryNotes->hasPages())
|
||||
<div class="mt-4">{{ $deliveryNotes->links() }}</div>
|
||||
@endif
|
||||
@endsection
|
||||
Reference in new issue
Block a user