Step 01: Adding routes for emailing order inside auth middleware in web.php inside routes folder
Route::group(['middleware'=> [ 'auth']], function() { Route::get( '/orders/email/{order}', [\App\Http\Controllers\OrderController::class, 'email'] )->name('order.email'); // added route for email Route::get('/orders/export_to_pdf/{order}', [\App\Http\Controllers\OrderController::class,'export_pdf'])->name('export_pdf'); Route::resource('orders', \App\Http\Controllers\OrderController::class); Route::get( '/order_items/show_addi_req/{item}', [\App\Http\Controllers\OrderItemController::class, 'show_addi_req'] ); Route::post( '/order_items/save_req/{item}', [\App\Http\Controllers\OrderItemController::class, 'save_req'] ); Route::post('/order_items/cal_cost', [\App\Http\Controllers\OrderItemController::class, 'calculateOrderPrice'])->name('calCost'); Route::resource('order_items', \App\Http\Controllers\OrderItemController::class); Route::group(['middleware'=> ['is_admin']], function() { Route::resource('users', \App\Http\Controllers\UserController::class); Route::post('/products/save_order/{product}', [\App\Http\Controllers\ProductController::class, 'saveOrder'])->name('products.save_order'); Route::post('/profiles/save_order/{profile}', [\App\Http\Controllers\ProfileController::class, 'saveOrder'])->name('profiles.save_order'); Route::post('/frame_widths/save_order/{frame_width}', [\App\Http\Controllers\FrameWidthController::class, 'saveOrder'])->name('frame_widths.save_order'); Route::resource('products', \App\Http\Controllers\ProductController::class); Route::resource('profiles', \App\Http\Controllers\ProfileController::class); Route::resource('frame_widths', \App\Http\Controllers\FrameWidthController::class); }); });
Step 02: Adding email() method in OrderController.php using Mail facade
// at the top use Illuminate\Support\Facades\Mail; public function email( Order $order ) { $order->load('order_items'); // eager loading order_items along with order data $data = ['order' => $order]; Mail::send( 'orders.email_invoice', $data, function ( $message ) use ( $order ) { $toEmails = ['mahfoozur.rahman.bd@gmail.com']; $message->to( $toEmails ); $message->subject( "A new order with purchase order number #".$order->id." has been submitted!" ); $message->from( 'tushersuvro@gmail.com', 'Admin Testing Email' ); } ); $order->status = 1; $order->save(); return redirect()->route( 'order_items.index' , 'order_id='.$order->id )->with( 'success', 'Mail has been sent' );; }
Above, one thing to mention is when an email is sent for an order the status order of that order is being changed from 0 to 1.
Step 03: Creating email_invoice.blade.php inside resources/orders folder for invoice html generation with order data
@php $messageBody = "Order details for the Following Company and JOB/PO Number are shown below. You can check more by visiting the following link"; //$messageBody .= "Order Item #: " . $orderItem->id . "
"; $messageBody .= "Company Name: "
. $order->company_name . ""; $messageBody .= "Phone Number: "
. $order->phone_number . ""; $messageBody .= "Email: "
. $order->email . ""; $messageBody .= "Job / PO Number: "
. $order->job_number . ""; $messageBody .= "
)."/order_items?order_id=".$order->id."'>Click here to see order details"; $messageBody .= "Order Item Details are given below,
"; $messageBody .= "
"; foreach ( $order->order_items as $orderItem ) { $messageBody .= "Material: "
. $orderItem->product->name . '- $' . $orderItem->cost . " / sf "; $messageBody .= "Profiler: "
. $orderItem->profile->name . ""; $messageBody .= "Width: "
. $orderItem->width . ""; $messageBody .= "Height: "
. $orderItem->height . ""; $messageBody .= "Total Square Feet: "
. $orderItem->total_square_feet . ""; $messageBody .= "Quantity: "
. $orderItem->quantity . ""; $messageBody .= "Total Cost : $"
. $orderItem->cost . ""; $messageBody .= "Additional Request : "
. $orderItem->additional_request ?? 'NIL' . ""; $messageBody .= "
"; } @endphp {!! $messageBody !!}
Step 04: Changing .env for setting up app url and smptp mail configuration for sending email ( mailtrap is used here for email testing )
// app url APP_URL=https://simple-pos.mahfoozurrahman.com // mailtrap for testing email MAIL_MAILER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=587 MAIL_USERNAME=your_mailtrap_username MAIL_PASSWORD=your_mailtrap_password MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=mahfoozur.rahman.bd@gmail.com MAIL_FROM_NAME="${APP_NAME}"