File: /home/mobilech/alliancelaptoptraining.com.np/repair/app/Http/Controllers/api/v1/OrderController.php
<?php
namespace App\Http\Controllers\api\v1;
use App\CPU\CartManager;
use App\CPU\Convert;
use App\CPU\Helpers;
use App\CPU\OrderManager;
use App\Http\Controllers\Controller;
use App\Model\Admin;
use App\Model\Cart;
use App\Model\Order;
use App\Model\OrderDetail;
use App\Model\Seller;
use App\Model\ShippingAddress;
use App\Traits\CommonTrait;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Validator;
use function App\CPU\translate;
use App\Model\RefundRequest;
use App\CPU\ImageManager;
use App\Model\DeliveryMan;
use App\CPU\CustomerManager;
class OrderController extends Controller
{
use CommonTrait;
public function track_order(Request $request)
{
$validator = Validator::make($request->all(), [
'order_id' => 'required'
]);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
}
return response()->json(OrderManager::track_order($request['order_id']), 200);
}
public function order_cancel(Request $request)
{
$validator = Validator::make($request->all(), [
'order_id' => 'required'
]);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
}
$order = Order::where(['id' => $request->order_id])->first();
if ($order['payment_method'] == 'cash_on_delivery' && $order['order_status'] == 'pending') {
OrderManager::stock_update_on_order_status_change($order, 'canceled');
Order::where(['id' => $request->order_id])->update([
'order_status' => 'canceled'
]);
return response()->json(translate('order_canceled_successfully'), 200);
}
return response()->json(translate('status_not_changable_now'), 302);
}
public function place_order(Request $request)
{
$cart_group_ids = CartManager::get_cart_group_ids($request);
$carts = Cart::whereIn('cart_group_id', $cart_group_ids)->get();
$physical_product = false;
foreach($carts as $cart){
if($cart->product_type == 'physical'){
$physical_product = true;
}
}
if($physical_product) {
$zip_restrict_status = Helpers::get_business_settings('delivery_zip_code_area_restriction');
$country_restrict_status = Helpers::get_business_settings('delivery_country_restriction');
if ($request->has('billing_address_id')) {
$shipping_address = ShippingAddress::where(['customer_id' => $request->user()->id, 'id' => $request->input('billing_address_id')])->first();
if (!$shipping_address) {
return response()->json(['message' => translate('address_not_found')], 200);
}
elseif ($country_restrict_status && !self::delivery_country_exist_check($shipping_address->country)) {
return response()->json(['message' => translate('Delivery_unavailable_for_this_country')], 403);
} elseif ($zip_restrict_status && !self::delivery_zipcode_exist_check($shipping_address->zip)) {
return response()->json(['message' => translate('Delivery_unavailable_for_this_zip_code_area')], 403);
}
}
}
$unique_id = $request->user()->id . '-' . rand(000001, 999999) . '-' . time();
$order_ids = [];
foreach ($cart_group_ids as $group_id) {
$data = [
'payment_method' => 'cash_on_delivery',
'order_status' => 'pending',
'payment_status' => 'unpaid',
'transaction_ref' => '',
'order_group_id' => $unique_id,
'cart_group_id' => $group_id,
'request' => $request,
];
$order_id = OrderManager::generate_order($data);
$order = Order::find($order_id);
$order->billing_address = ($request['billing_address_id'] != null) ? $request['billing_address_id'] : $order['billing_address'];
$order->billing_address_data = ($request['billing_address_id'] != null) ? ShippingAddress::find($request['billing_address_id']) : $order['billing_address_data'];
$order->order_note = ($request['order_note'] != null) ? $request['order_note'] : $order['order_note'];
$order->save();
array_push($order_ids, $order_id);
}
CartManager::cart_clean($request);
return response()->json(translate('order_placed_successfully'), 200);
}
public function place_order_by_offline_payment(Request $request)
{
$cart_group_ids = CartManager::get_cart_group_ids($request);
$carts = Cart::whereIn('cart_group_id', $cart_group_ids)->get();
$physical_product = false;
foreach($carts as $cart){
if($cart->product_type == 'physical'){
$physical_product = true;
}
}
if($physical_product) {
$zip_restrict_status = Helpers::get_business_settings('delivery_zip_code_area_restriction');
$country_restrict_status = Helpers::get_business_settings('delivery_country_restriction');
if ($request->has('billing_address_id')) {
$shipping_address = ShippingAddress::where(['customer_id' => $request->user()->id, 'id' => $request->input('billing_address_id')])->first();
if (!$shipping_address) {
return response()->json(['message' => translate('address_not_found')], 200);
}
elseif ($country_restrict_status && !self::delivery_country_exist_check($shipping_address->country)) {
return response()->json(['message' => translate('Delivery_unavailable_for_this_country')], 403);
} elseif ($zip_restrict_status && !self::delivery_zipcode_exist_check($shipping_address->zip)) {
return response()->json(['message' => translate('Delivery_unavailable_for_this_zip_code_area')], 403);
}
}
}
$unique_id = $request->user()->id . '-' . rand(000001, 999999) . '-' . time();
$order_ids = [];
foreach ($cart_group_ids as $group_id) {
$data = [
'payment_method' => 'offline_payment',
'order_status' => 'pending',
'payment_status' => 'unpaid',
'transaction_ref' => $request->transaction_ref,
'payment_by' => $request->payment_by,
'payment_note' => $request->payment_note,
'order_group_id' => $unique_id,
'cart_group_id' => $group_id,
'request' => $request,
];
$order_id = OrderManager::generate_order($data);
$order = Order::find($order_id);
$order->billing_address = ($request['billing_address_id'] != null) ? $request['billing_address_id'] : $order['billing_address'];
$order->billing_address_data = ($request['billing_address_id'] != null) ? ShippingAddress::find($request['billing_address_id']) : $order['billing_address_data'];
$order->order_note = ($request['order_note'] != null) ? $request['order_note'] : $order['order_note'];
$order->save();
array_push($order_ids, $order_id);
}
CartManager::cart_clean($request);
return response()->json(translate('order_placed_successfully'), 200);
}
public function place_order_by_wallet(Request $request)
{
$cart_group_ids = CartManager::get_cart_group_ids($request);
$carts = Cart::whereIn('cart_group_id', $cart_group_ids)->get();
$cartTotal = 0;
foreach($cart_group_ids as $cart_group_id){
$cartTotal += CartManager::cart_grand_total($cart_group_id);
}
$user = Helpers::get_customer($request);
if( $cartTotal > $user->wallet_balance)
{
return response()->json('inefficient balance in your wallet to pay for this order', 403);
}else{
$physical_product = false;
foreach($carts as $cart){
if($cart->product_type == 'physical'){
$physical_product = true;
}
}
if($physical_product) {
$zip_restrict_status = Helpers::get_business_settings('delivery_zip_code_area_restriction');
$country_restrict_status = Helpers::get_business_settings('delivery_country_restriction');
if ($request->has('billing_address_id')) {
$shipping_address = ShippingAddress::where(['customer_id' => $request->user()->id, 'id' => $request->input('billing_address_id')])->first();
if (!$shipping_address) {
return response()->json(['message' => translate('address_not_found')], 200);
}
elseif ($country_restrict_status && !self::delivery_country_exist_check($shipping_address->country)) {
return response()->json(['message' => translate('Delivery_unavailable_for_this_country')], 403);
} elseif ($zip_restrict_status && !self::delivery_zipcode_exist_check($shipping_address->zip)) {
return response()->json(['message' => translate('Delivery_unavailable_for_this_zip_code_area')], 403);
}
}
}
$unique_id = $request->user()->id . '-' . rand(000001, 999999) . '-' . time();
$order_ids = [];
foreach ($cart_group_ids as $group_id) {
$data = [
'payment_method' => 'pay_by_wallet',
'order_status' => 'confirmed',
'payment_status' => 'paid',
'transaction_ref' => '',
'order_group_id' => $unique_id,
'cart_group_id' => $group_id,
'request' => $request,
];
$order_id = OrderManager::generate_order($data);
$order = Order::find($order_id);
$order->billing_address = ($request['billing_address_id'] != null) ? $request['billing_address_id'] : $order['billing_address'];
$order->billing_address_data = ($request['billing_address_id'] != null) ? ShippingAddress::find($request['billing_address_id']) : $order['billing_address_data'];
$order->order_note = ($request['order_note'] != null) ? $request['order_note'] : $order['order_note'];
$order->save();
array_push($order_ids, $order_id);
}
CustomerManager::create_wallet_transaction($user->id, Convert::default($cartTotal), 'order_place','order payment');
CartManager::cart_clean($request);
return response()->json(translate('order_placed_successfully'), 200);
}
}
public function refund_request(Request $request)
{
$order_details = OrderDetail::find($request->order_details_id);
$user = $request->user();
$loyalty_point_status = Helpers::get_business_settings('loyalty_point_status');
if($loyalty_point_status == 1)
{
$loyalty_point = CustomerManager::count_loyalty_point_for_amount($request->order_details_id);
if($user->loyalty_point < $loyalty_point)
{
return response()->json(['message'=>translate('you have not sufficient loyalty point to refund this order!!')], 202);
}
}
if($order_details->delivery_status == 'delivered')
{
$order = Order::find($order_details->order_id);
$total_product_price = 0;
$refund_amount = 0;
$data = [];
foreach ($order->details as $key => $or_d) {
$total_product_price += ($or_d->qty*$or_d->price) + $or_d->tax - $or_d->discount;
}
$subtotal = ($order_details->price * $order_details->qty) - $order_details->discount + $order_details->tax;
$coupon_discount = ($order->discount_amount*$subtotal)/$total_product_price;
$refund_amount = $subtotal - $coupon_discount;
$data['product_price'] = $order_details->price;
$data['quntity'] = $order_details->qty;
$data['product_total_discount'] = $order_details->discount;
$data['product_total_tax'] = $order_details->tax;
$data['subtotal'] = $subtotal;
$data['coupon_discount'] = $coupon_discount;
$data['refund_amount'] = $refund_amount;
$refund_day_limit = Helpers::get_business_settings('refund_day_limit');
$order_details_date = $order_details->created_at;
$current = \Carbon\Carbon::now();
$length = $order_details_date->diffInDays($current);
$expired = false;
$already_requested = false;
if($order_details->refund_request != 0)
{
$already_requested = true;
}
if($length > $refund_day_limit )
{
$expired = true;
}
return response()->json(['already_requested'=>$already_requested,'expired'=>$expired,'refund'=>$data], 200);
}else{
return response()->json(['message'=>translate('You_can_request_for_refund_after_order_delivered')], 200);
}
}
public function store_refund(Request $request)
{
$order_details = OrderDetail::find($request->order_details_id);
$user = $request->user();
$loyalty_point_status = Helpers::get_business_settings('loyalty_point_status');
if($loyalty_point_status == 1)
{
$loyalty_point = CustomerManager::count_loyalty_point_for_amount($request->order_details_id);
if($user->loyalty_point < $loyalty_point)
{
return response()->json(translate('you have not sufficient loyalty point to refund this order!!'), 200);
}
}
if($order_details->refund_request == 0){
$validator = Validator::make($request->all(), [
'order_details_id' => 'required',
'amount' => 'required',
'refund_reason' => 'required'
]);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
}
$refund_request = new RefundRequest;
$refund_request->order_details_id = $request->order_details_id;
$refund_request->customer_id = $request->user()->id;
$refund_request->status = 'pending';
$refund_request->amount = $request->amount;
$refund_request->product_id = $order_details->product_id;
$refund_request->order_id = $order_details->order_id;
$refund_request->refund_reason = $request->refund_reason;
if ($request->file('images')) {
foreach ($request->file('images') as $img) {
$product_images[] = ImageManager::upload('refund/', 'png', $img);
}
$refund_request->images = json_encode($product_images);
}
$refund_request->save();
$order_details->refund_request = 1;
$order_details->save();
return response()->json(translate('refunded_request_updated_successfully!!'), 200);
}else{
return response()->json(translate('already_applied_for_refund_request!!'), 302);
}
}
public function refund_details(Request $request)
{
$order_details = OrderDetail::find($request->id);
$refund = RefundRequest::where('customer_id',$request->user()->id)
->where('order_details_id',$order_details->id )->get();
$refund = $refund->map(function($query){
$query['images'] = json_decode($query['images']);
return $query;
});
$order = Order::find($order_details->order_id);
$total_product_price = 0;
$refund_amount = 0;
$data = [];
foreach ($order->details as $key => $or_d) {
$total_product_price += ($or_d->qty*$or_d->price) + $or_d->tax - $or_d->discount;
}
$subtotal = ($order_details->price * $order_details->qty) - $order_details->discount + $order_details->tax;
$coupon_discount = ($order->discount_amount*$subtotal)/$total_product_price;
$refund_amount = $subtotal - $coupon_discount;
$data['product_price'] = $order_details->price;
$data['quntity'] = $order_details->qty;
$data['product_total_discount'] = $order_details->discount;
$data['product_total_tax'] = $order_details->tax;
$data['subtotal'] = $subtotal;
$data['coupon_discount'] = $coupon_discount;
$data['refund_amount'] = $refund_amount;
$data['refund_request']=$refund;
return response()->json($data, 200);
}
public function digital_product_download(Request $request, $id)
{
$order_data = OrderDetail::with('order.customer')->find($id);
$customer_id = $request->user()->id;
if($order_data->order->customer->id != $customer_id){
return response()->json(['message'=>translate('Invalid customer')], 202);
}
if( $order_data->product->digital_product_type == 'ready_product' && $order_data->product->digital_file_ready) {
$file_path = storage_path('app/public/product/digital-product/' .$order_data->product->digital_file_ready);
}else{
$file_path = storage_path('app/public/product/digital-product/' . $order_data->digital_file_after_sell);
}
return \response()->download($file_path);
}
}