Sending an email to admin about a order with all its item

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}"

Related Posts


Building mini ecommerce in Laravel

Listing rows of users - crud

Adding user data - crud of users

Editing user data - crud of users

Deleting user data - crud of users

Listing rows of products - crud

Listing rows of profiles - crud

Listing rows of orders - crud

Listing rows of order items - crud