270 lines
9.6 KiB
PHP
Executable File
270 lines
9.6 KiB
PHP
Executable File
<?php
|
|
|
|
namespace App\Http\Controllers\API;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\Api\Checkout\CheckoutRequest;
|
|
use App\Http\Resources\OrderPaginationResource;
|
|
use App\Http\Resources\OrderShowResource;
|
|
use App\Http\Resources\ProductResource;
|
|
use App\Http\Resources\StatusResource;
|
|
use App\Models\City;
|
|
use App\Models\Currency;
|
|
use App\Models\DeliveryPrice;
|
|
use App\Models\Order;
|
|
use App\Models\Power;
|
|
use App\Models\Product;
|
|
use App\Models\Setting;
|
|
use App\Services\API\OrderService;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use App\Services\API\ProductService;
|
|
use App\Services\BotService;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class OrderController extends Controller
|
|
{
|
|
public function checkout(CheckoutRequest $request)
|
|
{
|
|
$currency = Currency::getCurrency()->dollar;
|
|
DB::beginTransaction();
|
|
try {
|
|
$data = $request->validated();
|
|
$orderService = new OrderService($data);
|
|
$row = $orderService->createOrder($data);
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
return response()->json([
|
|
'message' => $e->getMessage()
|
|
], 403);
|
|
}
|
|
DB::commit();
|
|
|
|
$url = null;
|
|
|
|
if (!in_array($row->order->payment_type, ['cash', 'bank'])) {
|
|
if ($row->order->payment_type == 'click') {
|
|
$merchant_id = env("CLICK_MERCHANT_ID");
|
|
$service_id = env("CLICK_SERVICE_ID");
|
|
$url = "https://my.click.uz/services/pay?service_id={$service_id}&merchant_id={$merchant_id}&amount={$row->billing->amount}&transaction_param={$row->billing->id}";
|
|
} else {
|
|
$amount = $row->billing->amount * 100;
|
|
$payme_url = "https://checkout.paycom.uz/" . base64_encode("m=66faa5c44f9ee150b7ff81cf;ac.key={$row->billing->id};a={$amount}");
|
|
$url = $payme_url; //route('payment.merchant', [$row->order->payment_type, $row->billing->id, $row->billing->amount]);
|
|
}
|
|
}
|
|
|
|
$order = Order::find($row->order->id);
|
|
$contract = $order->contracts()->latest()->first();
|
|
$products = $order->products()
|
|
->with(['product' => function ($query) {
|
|
$query->select('id', 'name', 'price'); // Faqat kerakli ustunlarni tanlash
|
|
}])
|
|
->get()
|
|
->map(function ($orderProduct) use ($currency) {
|
|
return [
|
|
'name' => "📦 " . $orderProduct->product->name['uz'],
|
|
'price' => ceiling($orderProduct->price * $currency, 100),
|
|
'count' => $orderProduct->count,
|
|
];
|
|
});
|
|
|
|
// set lang
|
|
app()->setLocale('uz');
|
|
|
|
$group_id = Setting::query()->first()->group_id;
|
|
$user = Auth::user();
|
|
$service = new BotService();
|
|
$service->sendMessage([
|
|
"group_id" => $group_id,
|
|
"order_id" => $row->order->id,
|
|
"order_url" => route("dashboard.orders.view", ["order" => $row->order->id]),
|
|
'client_type' => trans('admin.contract-templates.' . $row->order->client_type),
|
|
'delivery_type' => trans('admin.orders.type_delivery.' . $row->order->delivery_type),
|
|
"products" => $products,
|
|
"client" => $user->first_name . " " . $user->last_name,
|
|
"phone" => $user->phone,
|
|
'time' => now(),
|
|
'summa' => ceiling($order->price_total * $currency, 100),
|
|
]);
|
|
|
|
if ($row->order->client_type == 'physical') {
|
|
$client = $row->order->full_name;
|
|
} else {
|
|
$client = $row->order->legalInfo->company_name;
|
|
}
|
|
|
|
// download contract from s3
|
|
// $path = $contract->path; // S3 file path
|
|
// $localDirectory = storage_path('downloads');
|
|
// $localPath = storage_path('downloads/' . basename($contract->path));
|
|
|
|
// // Ensure 'downloads' directory exists
|
|
// if (!is_dir($localDirectory)) {
|
|
// mkdir($localDirectory, 0755, true);
|
|
// }
|
|
|
|
// // Retrieve the file from S3 and save locally
|
|
// $content = Storage::disk('s3')->get($path);
|
|
// file_put_contents($localPath, $content);
|
|
|
|
// $this->sendFileWithData($group_id, $row, $client, $localPath);
|
|
|
|
return response()->json([
|
|
'data' => [
|
|
"id" => $row->order->id,
|
|
"payment_status" => new StatusResource($order->getPaymentStatus),
|
|
// "billing_id" => !in_array($row->order->payment_type, ['cash', 'bank']) ? $row->billing->id : null,
|
|
"payment_type" => $row->order->payment_type,
|
|
"pay_url" => $url,
|
|
// "pay_url" => !in_array($row->order->payment_type, ['cash', 'bank']) ? "https://checkout.payme.uz" : null,
|
|
"contract_url" => $contract?->getPath() ?? null
|
|
]
|
|
], 201);
|
|
}
|
|
|
|
public function preview(Request $request)
|
|
{
|
|
$currency = Currency::latest()->first();
|
|
// add currency to cache
|
|
cache()->put('currency', $currency, now()->addMinutes(60));
|
|
|
|
$products = $this->getProducts($request);
|
|
|
|
$countCollection = collect($request->products);
|
|
$is_install = false;
|
|
|
|
foreach ($products as $product) {
|
|
// Find the corresponding count for the current product
|
|
if ((new ProductService($product))->isInstall()) {
|
|
$is_install = true; // Set the flag to true if any product is installed
|
|
}
|
|
$countItem = $countCollection->firstWhere('id', $product->id);
|
|
|
|
if ($countItem) {
|
|
// Update the product's count attribute (assuming you have a 'count' attribute in your Product model)
|
|
$product->count = $countItem['count'];
|
|
}
|
|
}
|
|
|
|
$power = Power::where('power', '>=', $products->sum('power'))->first();
|
|
if (empty($power)) {
|
|
$power_id = 0;
|
|
} else {
|
|
$power_id = $power->id;
|
|
}
|
|
|
|
// delivery price
|
|
if (!empty($request->city_id)) {
|
|
$city = City::where('id', $request->city_id)->first();
|
|
$delivery_price = DeliveryPrice::where('power_id', $power_id)->where('region_id', $city->region_id)->first();
|
|
} else {
|
|
$delivery_price = 0;
|
|
}
|
|
|
|
// installation price
|
|
$settings = Setting::query()->first();
|
|
$power = $products->sum('power') / 1000;
|
|
|
|
if ($request->type == 'ready_solutions') {
|
|
$installation_price = $power * ($settings->master_price / $currency->dollar);
|
|
} else {
|
|
$installation_price = 0;
|
|
}
|
|
|
|
// product price
|
|
$product_price = collect($products)->sum(function ($product) {
|
|
$count = collect(request()->products)->firstWhere('id', $product->id)['count'] ?? 0;
|
|
|
|
return $product->finalPrice * $count;
|
|
});
|
|
|
|
if (!empty($delivery_price)) {
|
|
$delivery_price = $delivery_price->price;
|
|
} else {
|
|
$delivery_price = 0;
|
|
}
|
|
|
|
$total = $product_price + ($delivery_price / $currency->dollar) + $installation_price;
|
|
return response()->json([
|
|
'data' => [
|
|
"is_install" => $is_install,
|
|
'products' => ProductResource::collection($products),
|
|
'delivery_price' => ceiling($delivery_price, 100),
|
|
'installation_price' => ceiling($installation_price * $currency->dollar, 100),
|
|
'total_price' => ceiling($total * $currency->dollar, 100),
|
|
'product_price' => ceiling($product_price * $currency->dollar, 100),
|
|
]
|
|
]);
|
|
}
|
|
|
|
private function getProducts(Request $request)
|
|
{
|
|
$products_cart = collect($request->only('products'))->flatten(1);
|
|
$product_ids = $products_cart->pluck('id');
|
|
$products = Product::whereIn('id', $product_ids)->get();
|
|
|
|
$products = $products->map(function ($product) use ($products_cart) {
|
|
$product->power = $product->power * $products_cart->filter(function ($cart) use ($product) {
|
|
return $cart['id'] == $product->id;
|
|
})->value('count');
|
|
return $product;
|
|
});
|
|
|
|
return $products;
|
|
}
|
|
|
|
|
|
public function list(Request $request)
|
|
{
|
|
$user = getAuthUser();
|
|
$orders = $user->orders()->orderBy('id', 'desc')->with('getCurrency')->paginate($request->limit ?? 10);
|
|
|
|
$currency = Currency::latest()->first();
|
|
// add currency to cache
|
|
cache()->put('currency', $currency, now()->addMinutes(60));
|
|
|
|
return (new OrderPaginationResource($orders))->response();
|
|
}
|
|
|
|
public function show($order_id)
|
|
{
|
|
$user = getAuthUser();
|
|
$order = $user->orders()->findOrFail($order_id);
|
|
|
|
$currency = $order->getCurrency;
|
|
// add currency to cache
|
|
cache()->put('currency', $currency, now()->addMinutes(60));
|
|
|
|
// chech if user has this order
|
|
if (!$order) {
|
|
return response()->json([
|
|
'message' => 'Order not found'
|
|
], 404);
|
|
}
|
|
|
|
return new OrderShowResource($order);
|
|
}
|
|
|
|
public function checkPaymentStatus($order_id)
|
|
{
|
|
// check if this order belongs to the user
|
|
$user = request()->user();
|
|
|
|
$order = $user->orders()->find($order_id);
|
|
|
|
// chech if user has this order
|
|
if (!$order) {
|
|
return response()->json([
|
|
'message' => 'Order not found'
|
|
], 404);
|
|
}
|
|
|
|
return response()->json([
|
|
'data' => [
|
|
'payment_status' => $order->payment_status //new StatusResource($order->getPaymentStatus),
|
|
]
|
|
]);
|
|
}
|
|
}
|