fix handle error and add note for shippings receive approve and reject mutations

This commit is contained in:
2025-06-13 14:19:12 +07:00
parent b2bfd666a7
commit 2f5eff9e63
28 changed files with 13055 additions and 154 deletions

View File

@@ -45,21 +45,11 @@ class MutationsController extends Controller
return $row->requestedBy->name ?? '-';
})
->addColumn('status', function($row) {
$statusColor = $row->status_color;
$statusLabel = $row->status_label;
$status = $row->status instanceof MutationStatus ? $row->status : MutationStatus::from($row->status);
$textColorClass = $status->textColorClass();
$label = $status->label();
$textColorClass = match($statusColor) {
'success' => 'text-success',
'warning' => 'text-warning',
'danger' => 'text-danger',
'info' => 'text-info',
'primary' => 'text-primary',
'brand' => 'text-primary',
'secondary' => 'text-muted',
default => 'text-dark'
};
return "<span class=\"font-weight-bold {$textColorClass}\">{$statusLabel}</span>";
return "<span class=\"font-weight-bold {$textColorClass}\">{$label}</span>";
})
->addColumn('total_items', function($row) {
return number_format($row->total_items, 0);
@@ -91,6 +81,7 @@ class MutationsController extends Controller
$request->validate([
'from_dealer_id' => 'required|exists:dealers,id',
'to_dealer_id' => 'required|exists:dealers,id|different:from_dealer_id',
'shipping_notes' => 'nullable|string',
'products' => 'required|array|min:1',
'products.*.product_id' => 'required|exists:products,id',
'products.*.quantity_requested' => 'required|numeric|min:0.01'
@@ -102,8 +93,9 @@ class MutationsController extends Controller
$mutation = Mutation::create([
'from_dealer_id' => $request->from_dealer_id,
'to_dealer_id' => $request->to_dealer_id,
'status' => 'sent',
'requested_by' => auth()->id()
'status' => MutationStatus::SENT,
'requested_by' => auth()->id(),
'shipping_notes' => $request->shipping_notes
]);
// Buat mutation details
@@ -134,7 +126,16 @@ class MutationsController extends Controller
public function show(Mutation $mutation)
{
$mutation->load(['fromDealer', 'toDealer', 'requestedBy.role', 'approvedBy.role', 'receivedBy.role', 'mutationDetails.product']);
$mutation->load([
'fromDealer',
'toDealer',
'requestedBy.role',
'approvedBy.role',
'receivedBy.role',
'rejectedBy.role',
'cancelledBy.role',
'mutationDetails.product'
]);
return view('warehouse_management.mutations.show', compact('mutation'));
}
@@ -142,7 +143,7 @@ class MutationsController extends Controller
public function receive(Request $request, Mutation $mutation)
{
$request->validate([
'notes' => 'nullable|string',
'reception_notes' => 'nullable|string',
'products' => 'required|array',
'products.*.quantity_approved' => 'required|numeric|min:0',
'products.*.notes' => 'nullable|string'
@@ -154,11 +155,6 @@ class MutationsController extends Controller
DB::beginTransaction();
try {
// Update mutation notes jika ada
if ($request->notes) {
$mutation->update(['notes' => $request->notes]);
}
// Update product details dengan quantity_approved dan notes
if ($request->products) {
foreach ($request->products as $detailId => $productData) {
@@ -182,8 +178,8 @@ class MutationsController extends Controller
}
}
// Receive mutation
$mutation->receive(auth()->id());
// Receive mutation with reception notes
$mutation->receive(auth()->id(), $request->reception_notes);
DB::commit();
return redirect()->route('mutations.index')
@@ -198,7 +194,7 @@ class MutationsController extends Controller
public function approve(Request $request, Mutation $mutation)
{
$request->validate([
'notes' => 'nullable|string'
'approval_notes' => 'nullable|string'
]);
if (!$mutation->canBeApproved()) {
@@ -207,7 +203,7 @@ class MutationsController extends Controller
try {
// Approve mutation (quantity_approved sudah diisi saat receive)
$mutation->approve(auth()->id(), $request->notes);
$mutation->approve(auth()->id(), $request->approval_notes);
return redirect()->route('mutations.index')
->with('success', 'Mutasi berhasil disetujui');
@@ -255,14 +251,18 @@ class MutationsController extends Controller
}
}
public function cancel(Mutation $mutation)
public function cancel(Request $request, Mutation $mutation)
{
$request->validate([
'cancellation_reason' => 'nullable|string'
]);
if (!$mutation->canBeCancelled()) {
return back()->withErrors(['error' => 'Mutasi tidak dapat dibatalkan dalam status saat ini']);
}
try {
$mutation->update(['status' => MutationStatus::CANCELLED]);
$mutation->cancel(auth()->id(), $request->cancellation_reason);
return redirect()->route('mutations.index')
->with('success', 'Mutasi berhasil dibatalkan');
@@ -349,6 +349,8 @@ class MutationsController extends Controller
'requestedBy.role',
'approvedBy.role',
'receivedBy.role',
'rejectedBy.role',
'cancelledBy.role',
'mutationDetails.product'
]);

View File

@@ -2,6 +2,7 @@
namespace App\Http\Controllers\WarehouseManagement;
use App\Enums\OpnameStatus;
use App\Http\Controllers\Controller;
use App\Models\Dealer;
use App\Models\Menu;
@@ -39,30 +40,16 @@ class OpnamesController extends Controller
return Carbon::parse($row->created_at)->format('d M Y H:i');
})
->editColumn('status', function ($row) {
$statusColor = [
'draft' => 'warning',
'pending' => 'info',
'approved' => 'success',
'rejected' => 'danger'
][$row->status] ?? 'secondary';
$status = $row->status instanceof OpnameStatus ? $row->status : OpnameStatus::from($row->status);
$textColorClass = $status->textColorClass();
$label = $status->label();
$textColorClass = match($statusColor) {
'success' => 'text-success',
'warning' => 'text-warning',
'danger' => 'text-danger',
'info' => 'text-info',
'primary' => 'text-primary',
'brand' => 'text-primary',
'secondary' => 'text-muted',
default => 'text-dark'
};
return "<span class=\"font-weight-bold {$textColorClass}\">" . ucfirst($row->status) . "</span>";
return "<span class=\"font-weight-bold {$textColorClass}\">{$label}</span>";
})
->addColumn('action', function ($row) use ($menu) {
$btn = '<div class="d-flex">';
$btn .= '<a href="'.route('opnames.show', $row->id).'" class="btn btn-secondary btn-sm">Detail</a>';
$btn .= '<a href="'.route('opnames.show', $row->id).'" class="btn btn-primary btn-sm">Detail</a>';
$btn .= '</div>';
@@ -253,7 +240,7 @@ class OpnamesController extends Controller
'opname_date' => $opnameDate,
'user_id' => $userId,
'note' => $note,
'status' => 'approved', // Set status langsung approved
'status' => OpnameStatus::APPROVED, // Set status langsung approved
'approved_by' => $userId, // Set current user sebagai approver
'approved_at' => now() // Set waktu approval
]);