added kashkool

This commit is contained in:
2026-06-11 22:08:47 +03:30
parent 779a67a23e
commit 2d177ad581
24 changed files with 1575 additions and 3 deletions
@@ -0,0 +1,85 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Category;
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException;
class CategoryController extends Controller
{
public function index(Request $request)
{
$query = Category::query();
if ($request->has('active')) {
$query->where('active', (int) $request->active);
}
if ($request->filled('search')) {
$query->where('name', 'like', '%' . $request->search . '%');
}
$categories = $query
->orderBy('id', 'asc')
->get();
return response()->json($categories);
}
public function store(Request $request)
{
$name = trim((string) $request->input('name'));
if ($name === '') {
throw new UnprocessableEntityHttpException('نام دسته‌بندی الزامی است');
}
if (Category::where('name', $name)->exists()) {
throw new UnprocessableEntityHttpException('این دسته‌بندی قبلا ثبت شده است');
}
$category = Category::create([
'name' => $name,
'active' => $request->has('active') ? (int) $request->active : 1,
]);
return response()->json($category);
}
public function clientIndex(Request $request)
{
$query = Category::query()
->where('active', 1);
if ($request->filled('search')) {
$query->where('name', 'like', '%' . $request->search . '%');
}
$categories = $query
->orderBy('id', 'asc')
->get();
return response()->json($categories);
}
public function changeActive($id, $active)
{
$active = (int) $active;
if (! in_array($active, [0, 1], true)) {
throw new UnprocessableEntityHttpException('وضعیت active نامعتبر است');
}
$category = Category::findOrFail($id);
$category->active = $active;
$category->save();
return response()->json([
'message' => $active ? 'دسته‌بندی فعال شد' : 'دسته‌بندی غیرفعال شد',
'data' => $category,
]);
}
}
@@ -12,12 +12,17 @@ use App\Models\Withdraw;
use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException;
use Rooyesh\Wallet\interfaces\TransactionInterface;
use Rooyesh\Wallet\interfaces\WalletInterface;
use App\Services\ConfigService;
class GiftCardController extends Controller
{
public function redeem(Request $request)
{
if (app(ConfigService::class)->isStore()) {
return $this->storeRedeem($request);
}
$user = auth()->user();
$count = $request->count;
$amount = $request->amount;
@@ -170,6 +175,203 @@ class GiftCardController extends Controller
]);
}
public function useDiscount(Request $request)
{
if (! app(ConfigService::class)->isStore()) {
return response()->json(['message' => 'این قابلیت فقط برای فروشگاه فعال است'], 403);
}
$result = $this->applyDiscount((string) $request->input('code'), auth('customer')->id());
if (! empty($result['message'])) {
return response()->json(['message' => $result['message']], 400);
}
return response()->json(['amount' => $result['amount']]);
}
public function validateDiscount(Request $request)
{
if (! app(ConfigService::class)->isStore()) {
return response()->json(['message' => 'این قابلیت فقط برای فروشگاه فعال است'], 403);
}
$giftcode = $this->verifyDiscount((string) $request->input('code'));
if (! empty($giftcode['message'])) {
return response()->json(['message' => $giftcode['message']], 400);
}
return response()->json(['giftcard' => $giftcode], 200);
}
private function storeRedeem(Request $request)
{
$user = auth()->user();
$count = $request->count;
$amount = $request->amount;
if (! $user) {
throw new UnprocessableEntityHttpException('auth failed!');
}
if ((! is_numeric($count) || $count < 0) || (! is_numeric($amount) || $amount <= 0)) {
return response()->json(['message' => 'تعداد کد را چک کنید!'], 400);
}
if (isset($request->code) && GiftCardCodes::where('code', $request->code)->where('unit', $request->unit)->exists()) {
return response()->json(['message' => 'کد تکراری میباشد!'], 400);
}
$codes = [];
$unitAmount = $request->unit == 3 ? $amount / 100 : $amount;
if ($request->use_once) {
$gift = GiftCard::create([
'use_once' => $request->use_once ? 1 : 0,
'count' => $count,
'amount' => $unitAmount,
'name' => $request->name,
'total' => $request->unit == 3 ? null : $count * $amount,
'sts' => 1,
'unit' => $request->unit,
'expiry_date' => $request->expiry_date,
'created_at' => now(),
'updated_at' => now(),
'description' => $request->description,
]);
for ($i = 0; $i < $count; $i++) {
do {
$unique_code = strtoupper(bin2hex(random_bytes(4)));
} while (GiftCardCodes::where('code', $unique_code)->exists());
$codes[] = [
'giftcard_id' => $gift->id,
'use_once' => $request->use_once ? 1 : 0,
'code' => $unique_code,
'sts' => 1,
'unit' => $request->unit,
'amount' => $unitAmount,
'expiry_date' => $request->expiry_date,
'created_at' => now(),
];
}
GiftCardCodes::insert($codes);
} else {
do {
$unique_code = strtoupper(bin2hex(random_bytes(4)));
} while (GiftCardCodes::where('code', $unique_code)->exists());
$gift = GiftCard::create([
'use_once' => $request->use_once ? 1 : 0,
'count' => $count,
'unique_code' => ! empty($request->code) ? $request->code : $unique_code,
'amount' => $unitAmount,
'name' => $request->name,
'total' => $request->unit == 3 ? null : $count * $amount,
'sts' => 1,
'unit' => $request->unit,
'expiry_date' => $request->expiry_date,
'created_at' => now(),
'updated_at' => now(),
'description' => $request->description,
]);
GiftCardCodes::insert([
'giftcard_id' => $gift->id,
'use_once' => $request->use_once ? 1 : 0,
'code' => ! empty($request->code) ? $request->code : $unique_code,
'sts' => 1,
'unit' => $request->unit,
'amount' => $unitAmount,
'expiry_date' => $request->expiry_date,
'created_at' => now(),
]);
}
return response()->json([
'order' => $gift,
'codes' => $gift->giftcardcodes,
'total' => $count * $amount,
]);
}
private function applyDiscount(string $code, $customerId): array
{
$giftcode = $this->verifyDiscount($code);
if (! empty($giftcode['message'])) {
return ['message' => $giftcode['message']];
}
$giftcode = GiftCardCodes::where('code', $code)->first();
$gift = GiftCard::find($giftcode->giftcard_id);
$idsArray = json_decode($giftcode->assigned_to, true);
if (! is_array($idsArray)) {
$idsArray = [];
}
$idsArray[] = $customerId;
if ($gift->use_once == 1) {
$giftcode->sts = 2;
}
$giftcode->assigned_to = json_encode($idsArray);
$giftcode->save();
$gift->used_count += 1;
if ($gift->used_count + 1 > $gift->count) {
$gift->sts = 2;
}
$gift->save();
return ['amount' => $giftcode->amount];
}
private function verifyDiscount(string $code)
{
$giftcode = GiftCardCodes::where('code', $code)->first();
if (! $giftcode) {
return ['message' => 'کد تخفیف یافت نشد!'];
}
$gift = GiftCard::find($giftcode->giftcard_id);
$customer_id = auth('customer')->id();
if ($gift->unit !== 3 || $giftcode->unit !== 3) {
return ['message' => 'کد تخفیف صحیح نمیباشد!'];
}
if ($gift->use_once === 0) {
$stored_ids = json_decode($giftcode->assigned_to, true);
if (is_array($stored_ids) && in_array($customer_id, $stored_ids)) {
return ['message' => 'شما قبلا از تخفیف خود استفاده کرده اید!'];
}
} elseif ($gift->use_once === 1) {
if (GiftCardCodes::where('giftcard_id', $gift->id)->where('assigned_to', '['.auth('customer')->id().']')->exists()) {
return ['message' => 'شما قبلا از تخفیف خود استفاده کرده اید!'];
}
}
if ($gift->expiry_date <= now() || $gift->sts === 3) {
$gift->sts = 3;
$giftcode->sts = 3;
$giftcode->save();
$gift->save();
return ['message' => 'کد تخفیف منقضی شده است!'];
}
if ($giftcode->sts === 2) {
return ['message' => 'کد تخفیف قبلا استفاده شده است!'];
}
if ($gift->used_count + 1 > $gift->count) {
return ['message' => 'تعداد استفاده کد تخفیف به پایان رسیده است!'];
}
return $giftcode;
}
public function table(Request $request)
{
$user = auth()->user();
@@ -180,6 +180,26 @@ class ProductController extends SuperController
return response()->json($products);
}
public function ProductById($id)
{
$this->getPrice();
$this->auto_close_open();
$product = Product::with(['file'])
->where('id', $id)
->first();
if ($product) {
$product->similar = Product::with(['file'])
->where('group_type', $product->group_type)
->where('id', '!=', $id)
->get();
} else {
return response()->json(false);
}
return response()->json($product);
}
public function getPrice()
{
app(\App\Services\ProductPriceSyncService::class)->syncAll(true);