Hello!
I am creating a custom function in the shop where after the customer makes a payment, the invoice is sent immediately. I added this function in ‘Shop/onepagecontroller’.
// i took this from InvoiceController.php in the store function.
public function sendInvoice(int $orderId)
{
try {
$order = $this->orderRepository->findOrFail($orderId);
if (! $order->canInvoice()) {
session()->flash('error', trans('admin::app.sales.invoices.create.creation-error'));
return redirect()->back();
}
$items = $this->prepareInvoiceData($order);
$request = new \Illuminate\Http\Request($items);
$data = $request->validate([
'invoice.items' => 'required|array',
'invoice.items.*' => 'required|numeric|min:0',
]);
if (! $this->invoiceRepository->haveProductToInvoice($data)) {
session()->flash('error', trans('admin::app.sales.invoices.create.product-error'));
return redirect()->back();
}
if (! $this->invoiceRepository->isValidQuantity($data)) {
session()->flash('error', trans('admin::app.sales.invoices.create.invalid-qty'));
return redirect()->back();
}
$this->invoiceRepository->create(array_merge($data, [
'order_id' => $orderId,
]));
session()->flash('success', 'Invoice berhasil dibuat');
} catch (\Throwable $th) {
\Log::error('Send Invoice Error', [
'order_id' => $orderId,
'message' => $th->getMessage(),
'trace' => $th->getTraceAsString(),
]);
session()->flash('error', 'Terjadi kesalahan saat membuat invoice');
return redirect()->back();
}
}
// I took this from GenerateInvoice.php
protected function prepareInvoiceData($order)
{
$invoiceData = ['order_id' => $order->id];
foreach ($order->items as $item) {
$invoiceData['invoice']['items'][$item->id] = $item->qty_to_invoice;
}
return $invoiceData;
}
However, it always returns an error with the message “invoice creation is not allowed.” I hope someone can help me solve this problem.