diff --git a/app/Http/Controllers/Orders/MoveOrderToCustomerController.php b/app/Http/Controllers/Orders/MoveOrderToCustomerController.php new file mode 100644 index 00000000..da64c101 --- /dev/null +++ b/app/Http/Controllers/Orders/MoveOrderToCustomerController.php @@ -0,0 +1,163 @@ +query('reference'); + if (!$ref) { + return response()->json(['error' => 'reference required'], 422); + } + $order = Order::where('reference', $ref)->with('companyModule')->first(); + if (!$order) { + return response()->json(['error' => 'Order not found'], 404); + } + $cm = $order->companyModule; + return response()->json([ + 'order_id' => $order->id, + 'reference' => $order->reference, + 'from_company_module_id' => $order->company_module_id, + 'from_customer_name' => $cm->name ?? '', + 'from_customer_marking' => $cm->getMarking(), + ]); + } + + public function customers(Request $request): JsonResponse + { + $list = CompanyModule::where('type', BusinessType::IMPORTER) + ->whereHas('connections', fn ($q) => $q->whereNotNull('invitee_reference')->where('invitee_reference', '!=', '')) + ->get() + ->map(fn ($cm) => ['id' => $cm->id, 'name' => $cm->name, 'marking' => $cm->getMarking()]) + ->filter(fn ($r) => (string) $r['marking'] !== '') + ->values(); + + return response()->json($list); + } + + public function move(Request $request): JsonResponse + { + $ref = $request->input('order_reference'); + $targetId = (int) $request->input('target_company_module_id'); + if (!$ref || !$targetId) { + return response()->json(['success' => false, 'error' => 'order_reference and target_company_module_id required', 'log' => []]); + } + + $order = Order::with('companyModule')->where('reference', $ref)->first(); + if (!$order) { + return response()->json(['success' => false, 'error' => 'Order not found', 'log' => []]); + } + + $from = $order->company_module_id; + if ($from == $targetId) { + return response()->json(['success' => false, 'error' => 'Order already belongs to target customer', 'log' => []]); + } + + $target = CompanyModule::find($targetId); + if (!$target) { + return response()->json(['success' => false, 'error' => 'Target customer not found', 'log' => []]); + } + + $log = []; + $log[] = 'Changing order: company_module_id ' . $from . ' → ' . $targetId; + $log[] = 'Changing order_roles: company_module_id ' . $from . ' → ' . $targetId; + $log[] = 'Changing packing list: no update (remain linked to order)'; + + try { + DB::beginTransaction(); + + $now = now(); + DB::table('orders')->where('id', $order->id)->update(['company_module_id' => $targetId, 'updated_at' => $now]); + DB::table('order_roles') + ->where('order_id', $order->id) + ->where('role_id', OrderRoleTypes::IMPORTER) + ->update(['company_module_id' => $targetId, 'updated_at' => $now]); + + $marking = $target->getMarking() ?: (string) $targetId; + DB::table('remarks')->insert([ + 'owner_type' => Order::class, + 'owner_id' => $order->id, + 'commenter_id' => auth()->id() ?? 1, + 'content' => 'Order moved to customer (marking: ' . $marking . ') on ' . $now->toDateTimeString(), + 'type' => RemarkTypes::INTERNAL, + 'created_at' => $now, + 'updated_at' => $now, + ]); + + $transactions = $order->transactions()->get(); + $createShipInv = app(\App\Classes\Modules\Transactions\Processors\CreateShippingInvoiceTransactionDocProcessor::class); + $createSalesOrder = app(\App\Classes\Modules\Transactions\Processors\CreateSalesOrderDocProcessor::class); + $createShipEInv = app(\App\Classes\Modules\Transactions\Processors\CreateShippingEInvoiceDocProcessor::class); + $createStorageInv = app(\App\Classes\Modules\Transactions\Processors\CreateStorageInvoiceTransactionDocProcessor::class); + $createStorageEInv = app(\App\Classes\Modules\Transactions\Processors\CreateStorageEInvoiceDocProcessor::class); + + foreach ($transactions as $tx) { + if ($tx->type == TransactionType::SHIPPING_INVOICE) { + try { + $tx->documents()->where('document_type', DocumentType::SHIPPING_INVOICE)->delete(); + $createShipInv->execute($tx); + $log[] = 'Regenerating Shipping Invoice PDF: transaction #' . $tx->id; + } catch (\Throwable $e) { + $log[] = 'Regenerating Shipping Invoice PDF: transaction #' . $tx->id . ' — failed: ' . $e->getMessage(); + } + try { + $tx->documents()->where('document_type', DocumentType::SALES_ORDER)->delete(); + $createSalesOrder->execute($tx); + $log[] = 'Regenerating Sales Order PDF: transaction #' . $tx->id; + } catch (\Throwable $e) { + $log[] = 'Regenerating Sales Order PDF: transaction #' . $tx->id . ' — failed: ' . $e->getMessage(); + } + $isEInv = $tx->owner->owner->companyModule->company->e_invoice ?? 0; + if ($isEInv == 1) { + try { + $tx->documents()->where('document_type', DocumentType::SHIPPING_EINVOICE)->delete(); + $createShipEInv->execute($tx); + $log[] = 'Regenerating E-Invoice PDF: transaction #' . $tx->id; + } catch (\Throwable $e) { + $log[] = 'Regenerating E-Invoice PDF: transaction #' . $tx->id . ' — failed: ' . $e->getMessage(); + } + } + } elseif ($tx->type == TransactionType::STORAGE_INVOICE) { + try { + $tx->documents()->where('document_type', DocumentType::STORAGE_INVOICE)->delete(); + $createStorageInv->execute($tx); + $log[] = 'Regenerating Storage Invoice PDF: transaction #' . $tx->id; + } catch (\Throwable $e) { + $log[] = 'Regenerating Storage Invoice PDF: transaction #' . $tx->id . ' — failed: ' . $e->getMessage(); + } + $isEInv = $tx->owner->owner->companyModule->company->e_invoice ?? 0; + if ($isEInv == 1) { + try { + $tx->documents()->where('document_type', DocumentType::STORAGE_EINVOICE)->delete(); + $createStorageEInv->execute($tx); + $log[] = 'Regenerating Storage E-Invoice PDF: transaction #' . $tx->id; + } catch (\Throwable $e) { + $log[] = 'Regenerating Storage E-Invoice PDF: transaction #' . $tx->id . ' — failed: ' . $e->getMessage(); + } + } + } + } + + $log[] = 'Done.'; + DB::commit(); + } catch (\Throwable $e) { + DB::rollBack(); + $log[] = 'Error: ' . $e->getMessage(); + return response()->json(['success' => false, 'error' => $e->getMessage(), 'log' => $log]); + } + + return response()->json(['success' => true, 'log' => $log]); + } +} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php index 0c13b854..91878edb 100644 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -12,6 +12,6 @@ class VerifyCsrfToken extends Middleware * @var array */ protected $except = [ - // + 'move-order/api/move', ]; } diff --git a/resources/views/pages/orders/move_order.blade.php b/resources/views/pages/orders/move_order.blade.php new file mode 100644 index 00000000..2a94162c --- /dev/null +++ b/resources/views/pages/orders/move_order.blade.php @@ -0,0 +1,104 @@ +@extends('layouts.base_portal') +@section('inner_content') +