modified liman by H

This commit is contained in:
Mobin Es-haqi 2025-08-09 11:11:33 +00:00
parent 46c75dc5cb
commit 09c37cb833
44 changed files with 1651 additions and 490 deletions

View File

@ -0,0 +1,94 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Route;
use App\Models\RouteInfo;
class SaveRoutesToDatabase extends Command
{
protected $signature = 'routes:save';
protected $description = 'Save all Laravel routes to the database';
public function handle()
{
// حذف همه رکوردهای قبلی
RouteInfo::query()->delete();
// گرفتن تمام روت‌ها
$routes = Route::getRoutes();
foreach ($routes as $route) {
$uri = $route->uri();
$methods = $route->methods();
$name = $route->getName();
// تشخیص صفحه با متد detectPage
$page = $this->detectPage($uri);
foreach ($methods as $method) {
if ($method === 'HEAD') continue; // نادیده گرفتن متد HEAD
RouteInfo::create([
'route' => $uri,
'method' => $method,
'name' => $name,
'page_name' => $page,
]);
}
}
$this->info('All routes saved to database separately by method.');
}
private function detectPage(string $uri): string
{
$uri = strtolower($uri);
if (str_contains($uri, 'admin')) {
return 'مدیریت';
}
if (str_contains($uri, 'customer')) {
return 'پنل مشتری';
}
if (str_contains($uri, 'user')) {
return 'کاربران';
}
if (str_contains($uri, 'product')) {
return 'محصولات';
}
if (str_contains($uri, 'order')) {
return 'سفارشات';
}
if (str_contains($uri, 'fin')) {
return 'مالی و حسابداری';
}
if (str_contains($uri, 'message')) {
return 'پیام‌ها';
}
if (str_contains($uri, 'package')) {
return 'پکیج‌ها';
}
if (str_contains($uri, 'role')) {
return 'نقش‌ها و دسترسی‌ها';
}
if (str_contains($uri, 'dashboard')) {
return 'داشبورد';
}
if (str_contains($uri, 'auth') || str_contains($uri, 'login') || str_contains($uri, 'sanctum')) {
return 'ورود و احراز هویت';
}
if (str_contains($uri, 'site')) {
return 'صفحات عمومی سایت';
}
if (str_contains($uri, 'webhook')) {
return 'وبهوک‌ها';
}
if (str_contains($uri, 'api/pargar')) {
return 'پرگار';
}
return 'سایر';
}
}

View File

@ -0,0 +1,26 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Customer;
use App\Models\CustomerRouteLog;
use App\Jobs\UpdateTahesabDocJob;
class UpdateActiveCustomersTahesab extends Command
{
protected $signature = 'tahesab:update-active-customers';
protected $description = 'Update Tahesab data for active customers';
public function handle()
{
$activeCustomers = Customer::whereNotNull('last_using_api')->get();
foreach ($activeCustomers as $customer) {
UpdateTahesabDocJob::dispatch($customer);
}
$this->info("Jobs dispatched for " . count($activeCustomers) . " active customers.");
}
}

View File

@ -21,9 +21,11 @@ class Kernel extends ConsoleKernel
// $schedule->command('dashboard:alertBalance')->everyFifteenMinutes();
$schedule->command('dashboard:alertBalance')->everyMinute();
$schedule->command('tahesab:update-active-customers')->everyTenMinutes();
}
/**
* Register the commands for the application.
*

View File

@ -76,7 +76,6 @@ class AdminDashboardController extends Controller
public function getBalance(Request $request)
{
// return 1;
$response = [];
$savedData=[];
@ -87,6 +86,7 @@ class AdminDashboardController extends Controller
$endDateJalali = $request->fromDate ?? Jalalian::forge($endDate)->format('Y-m-d');
$DoNewMoshtari = [100, "", $startDateJalali, $endDateJalali,];
$response['$startDateJalali'] = $startDateJalali;
// if ($this->Config('tahesab') == "send_importent") {
// try {
// $reizhesabs = Http::withoutVerifying()
@ -323,6 +323,7 @@ class AdminDashboardController extends Controller
$response["liman"]["balance_abs"]["gold"] += $OrderGoldBalanceRow->amount;
$response["liman"]["balance_abs"]["cash"] += $OrderGoldBalanceRow->total_price;
}
$response['goldBalanceOfLiman'] = -$response["liman"]["balance"]["gold"];
$response['cashBalanceOfLiman'] = -$response["liman"]["balance"]["cash"];
//kalhor
@ -332,10 +333,11 @@ class AdminDashboardController extends Controller
'OrderIndex' => 0,
'ToDate' => Jalalian::forge($endDate)->format('Y/m/d')
];
$response["kalhor"]["orders"] = Http::withHeaders(config('kalhor.headers'))
->withCookies(config('kalhor.cookies'), 'b750.ir')
->post('https://b750.ir/Deal/DealsList', $response["kalhor"]["orders"]['body'])
->json();
// $response["kalhor"]["orders"] = Http::withHeaders(config('kalhor.headers'))
// ->withCookies(config('kalhor.cookies'), 'b750.ir')
// ->post('https://b750.ir/Deal/DealsList', $response["kalhor"]["orders"]['body'])
// ->json();
$response["kalhor"]["balance"]["gold"] = 0;
$response["kalhor"]["balance"]["cash"] = 0;
$response["kalhor"]["balance_abs"]["gold"] = 0;

View File

@ -343,7 +343,7 @@ class CustomerController extends SuperController
'fname' => $customerData['Name'],
'name' => $customerData['Name'],
'gid' => $customerData['GID'],
'group_name' => $customerData['GoroupName'] ?? null,
'group_id' => $customerData['GoroupName'] ?? null,
'tahesab_id' => $customerData['Code'],
'type' => 2,
'active' => 0,

View File

@ -5,6 +5,7 @@ namespace App\Http\Controllers\Admin;
use App\DB\Te\TableEngine;
use App\Http\Controllers\Admin\OrderController as AdminOrderController;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Customer\OrderController as CustomerOrderController;
use App\Jobs\CancelJob;
use App\Models\Cnt;
use App\Models\Customer;
@ -29,6 +30,23 @@ class OrderController extends Controller
{
public function store(Request $request)
{
$admin = Auth::guard('user')->user();
if (!$admin) {
return response()->json(['error' => 'ادمین لاگین نکرده است'], 401);
}
$customerId = $request->input('customer_id');
if (!$customerId) {
return response()->json(['error' => 'شناسه مشتری ارسال نشده است'], 422);
}
$selectedUser = $customer = \App\Models\Customer::find($customerId);
if (!$customer) {
return response()->json(['error' => 'مشتری یافت نشد'], 404);
}
$customerOrderController = new CustomerOrderController();
return $customerOrderController->store($request,$selectedUser);
$data = $request->all();
// $request = new Request([
@ -229,6 +247,14 @@ class OrderController extends Controller
$token = env('TOKEN_750_KALHOR');
$data = $request->all();
$order = Order::with(['product.price'])->findOrFail($data['order_id']);
// return $order->product_json['customersetting'];
// return $order->product_json;
$dateOnly = substr($order['pay_at'], 0, 10); // "2024-08-24"
$date = Jalalian::fromCarbon(\Carbon\Carbon::createFromFormat('Y-m-d', $dateOnly));
$shamsiYear = $date->getYear();
$shamsiMonth = $date->getMonth();
$shamsiDay = $date->getDay();
$directionText = ($order->direction == 1) ? 'Buy' : 'Sell';
$product = Product::findOrFail($order->product_id);
@ -260,6 +286,7 @@ class OrderController extends Controller
$trigerUrl = $this->trigerUrl();
// return [$request->all(),$order];
try {
@ -274,10 +301,7 @@ class OrderController extends Controller
} catch (\Exception $exception) {
}
$date = Jalalian::fromCarbon(\Carbon\Carbon::createFromFormat('Y-m-d', $dateOnly));
$shamsiYear = $date->getYear();
$shamsiMonth = $date->getMonth();
$shamsiDay = $date->getDay();
$orderCustomer = Customer::with(['package'])->where('id', $order->customer_id)->first();
$DoNewSanadBuySaleGOLD = [];
@ -301,84 +325,30 @@ class OrderController extends Controller
$order->payment_amount, // MablaghKol
$desInFinance, // description
];
// if (isset($order->agent_id)) {
// if ($orderAgent = Customer::with(['package'])->where('id', $order->agent_id)->first()) {
// $sub_customer = PackageProduct::where('package_id', $orderCustomer->package->id)->where('product_id', $order->product_id)->first();
// if ($order->direction == 2) {
// $agMazaneh = $order->price_in_mesghal + ($sub_customer->buy_price);
// } else {
// $agMazaneh = $order->price_in_mesghal - ($sub_customer->buy_price);
// }
// if ($order->input_mode == 'gold') {
// $agGold = (float)$order->amount;
// $agCash = $agGold * ($agMazaneh / 4.331802);
// } else {
// $agCash = $order->payment_amount;
// $agGold = $agCash / $agMazaneh * 4.331802;
// }
// $DoNewSanadBuySaleGOLD[] = [
// 1, // Sabte_Kol_Or_Movaghat_1_0 (assuming type 1 is main)
// $orderAgent->tahesab_id, // Moshtari_Code
// $order->id, // Factor_Number
// 1, // Radif_Number
// $shamsiYear, // Shamsi_Year
// $shamsiMonth, // Shamsi_Month
// $shamsiDay, // Shamsi_Day
// $agGold, // Vazn
// 750, // Ayar
// null, // Ang_Number
// null, // Name_az
// $order->direction == 1 ? 1 : 0, // IsVoroodOrKhorooj_0_1
// $agMazaneh, // Mazaneh
// 0, // MazanehIsMesghalOrGeram_0_1
// 1, // IsMotefaregheOrAbshode_0_1
// $agCash, // MablaghKol
// $order->description, // description
// ];
// $DoNewSanadBuySaleGOLD[] = [
// 1, // Sabte_Kol_Or_Movaghat_1_0 (assuming type 1 is main)
// $orderAgent->tahesab_id, // Moshtari_Code
// $order->id, // Factor_Number
// 2, // Radif_Number
// $shamsiYear, // Shamsi_Year
// $shamsiMonth, // Shamsi_Month
// $shamsiDay, // Shamsi_Day
// (float)$order->amount, // Vazn
// 750, // Ayar
// null, // Ang_Number
// null, // Name_az
// $order->direction == 1 ? 0 : 1, // IsVoroodOrKhorooj_0_1
// $order->price_in_mesghal, // Mazaneh
// 0, // MazanehIsMesghalOrGeram_0_1
// 1, // IsMotefaregheOrAbshode_0_1
// $order->payment_amount, // MablaghKol
// $order->description,// description
// ];
// }
// }
$DoNewSanadBuySaleGOLD;
$response = [];
if ($order->sts == 2){
try {
Http::withHeaders([
'Content-Type' => 'application/json',
])->post($trigerUrl.'/prc/api/trigger-update', [
'trigger' => 'get_balens',
]);
} catch (\Exception $exception) {
if ($order->sts == 2){
try {
Http::withHeaders([
'Content-Type' => 'application/json',
])->post($trigerUrl.'/prc/api/trigger-update', [
'trigger' => 'get_balens',
]);
} catch (\Exception $exception) {
}
}else{
try {
Http::withHeaders([
'Content-Type' => 'application/json',
])->post($trigerUrl.'/prc/api/trigger-update', [
'trigger' => 'reject_order',
]);
} catch (\Exception $exception) {
}
}else{
try {
Http::withHeaders([
'Content-Type' => 'application/json',
])->post($trigerUrl.'/prc/api/trigger-update', [
'trigger' => 'reject_order',
]);
} catch (\Exception $exception) {
}
}
}
}
if ($this->Config('tahesab') == "send_importent"&&
$_SERVER['HTTP_HOST'] != 'marandiigold.ir') {
if ($order->sts == 2) {
@ -424,6 +394,52 @@ if ($order->sts == 2){
return response()->json(['message' => "مشکل در اتصال به حسابداری"], 422);
}
foreach ($order->product_json['customersetting'] as $customerSetting) {
if (isset($customerSetting['agent_id'])) {
$customerSettingData['for'] =Customer::find($customerSetting['agent_id']);
$customerSettingData['profit'] = $order->amount;
$customerSettingData['customerSettingPro'] = $order->product_json;
$customerSettingData['profitM'] = ($order->product_json['unit'] == "گرم")? $order->amount/4.3318:$order->amount;
$customerSettingData['customerSetting'] = $customerSetting;
$customerSettingData['profitM'] = $customerSettingData['profitM']*$customerSetting['profit_buy'];
$randomString = substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 25)), 0, 25);
$messageForProfit = "بابت معامله {$orderCustomer['name']}، ";
$messageForProfit .= "به مقدار " ;
$messageForProfit .= ($order->input_mode == "gold") ? $order->amount:$order->price_original;
$messageForProfit .= ($order->input_mode == "gold") ? " گرم " :" ریال ";
$messageForProfit .= "در مظنه ";
$messageForProfit .= number_format($customerSettingData['customerSettingPro']['sub_agent']['rate_buy_price']);
$messageForProfit .= " سود ";
$messageForProfit .= number_format($customerSetting['profit_buy']);
//return $messageForProfit;
$mainResponce = Http::withoutVerifying()
->withHeaders(['DBName' => $this->Config('tahesab_db')])
->withToken($this->Config('tahesab_token'))
->post($this->Config('tahesab_api'), [
'DoNewSanadTalabBedehi' => [
1, // Sabte_Kol_Or_Movaghat_1_0 (assuming type 1 is main)
$customerSettingData['for']['tahesab_id'], // Moshtari_Code
$order->id, // Factor_Number
0, // Radif_Number
$shamsiYear, // Shamsi_Year
$shamsiMonth, // Shamsi_Month
$shamsiDay, // Shamsi_Day
0, // Vazn
$customerSettingData['profitM'] ,
// بابت معامله علی منتظر عدد ریال/گرم در مظنه فلان (10000)
$messageForProfit,
"پورسانت معامله", // بابت
0, // Vazn
$randomString, // Mazaneh liman
null, // MazanehIsMesghalOrGeram_0_1
null, // IsMotefaregheOrAbshode_0_1
// description
]
])->json();
// return $customerSettingData;
}
}
$order->finance_code = $mainResponce['OK'];
$order->finance_Sh_factor = $mainResponce['Sh_factor'];

View File

@ -64,7 +64,7 @@ class PriceController extends Controller
if (is_null($request->product_id)) {
$this->updateAllProductPrice($request);
$this->change_price($request);
// return $this->b750();
return $this->b750();
}
$basePackage = Package::where('is_base', true)->first();
$product = Product::with('price')->where('id', $request->product_id)->first();
@ -76,8 +76,6 @@ class PriceController extends Controller
'price_gram' => $request->price / $mesghal_convert,
'difference_provider' => 0,
'difference' => $request->diff ?? 0,
'diff_buy' => $request->diff_buy ?? 0,
'diff_sell' => $request->diff_sell ?? 0,
'difference_gram' => ($request->diff ?? 0) / $mesghal_convert,
'difference_liman' => $request->diff ?? 0,
'date_at' => now()->format('Y-m-d'),
@ -100,8 +98,10 @@ class PriceController extends Controller
// $productName = $product->name ?? 'طلای ۱۸ عیار آبشده';
// $this->b750();
$this->b750();
$this->change_price();
return response()->json(true);
}
public function change_price()

View File

@ -26,6 +26,15 @@ class UserController extends SuperController
$search = ['name', 'mobile'];
parent::__construct($model, $with, $select, $name_model, null, $search);
}
public function update(Request $request, $id)
{
$user = User::findOrFail($id);
$user->fill($request->all());
$user->is_admin = empty($request->role_id) ? 1 : 0;
$user->role_id = $request->role_id ?: null;
$user->save();
return response()->json([$user, $user->is_admin ? 'd' : 's']);
}
public function me()

View File

@ -20,28 +20,39 @@ use Rooyesh\Wallet\models\Transaction;
use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Auth;
class OrderController extends Controller
{
public function store(Request $request)
public function store(Request $request, $selectedUser = null)
{
$data = $request->all();
$response = [];
$response['message'] = 'بسته می باشد';
$response['data'] = $data;
$user = auth('customer')->user();
$isAdmin = false;
if ($user = auth('customer')->user()) {
$data['mazaneh'] = $request->mazaneh;
$isAdmin = false;
} elseif ($adminUser = auth('user')->user()) {
$data['mazaneh'] = $request->price;
$send_notif_to_customer = $request->send_notif_to_customer ?? false;
$isAdmin = true;
$user = $selectedUser;
}
$data['customer_id']=$user->id;
$products = json_decode(app(CustomerProductController::class)->list_product($user->id)->getContent(),true);
$data['customer_id'] = $user->id;
$products = json_decode(app(CustomerProductController::class)->list_product($user->id)->getContent(), true);
foreach ($products as $pro) {
if ($pro['id'] == $data['product_id']) {
$data['product']=$product = $pro;
$data['product'] = $product = $pro;
}
}
if (!$product['active']) {throw new UnprocessableEntityHttpException('در حال حاضر امکان ثبت سفارش وجود ندارد');}
if (!$product['active']) {
throw new UnprocessableEntityHttpException('در حال حاضر امکان ثبت سفارش وجود ندارد');
}
if ($request['direction'] == 1) {
@ -50,7 +61,7 @@ class OrderController extends Controller
if ($requested > $credit) {
// throw new UnprocessableEntityHttpException("اعتبار شما {$credit} گرم می‌باشد، در حالی که میزان سفارش شما {$requested} گرم است.");
}
if ($data['mazaneh'] != $data['product']['sub_agent']['rate_buy_price']){
if ($data['mazaneh'] != $data['product']['sub_agent']['rate_buy_price']) {
throw new UnprocessableEntityHttpException('تغییر در مظنه !');
}
@ -64,7 +75,7 @@ class OrderController extends Controller
if ($requested > $credit) {
// throw new UnprocessableEntityHttpException("اعتبار شما {$credit} گرم می‌باشد، در حالی که میزان سفارش شما {$requested} گرم است.");
}
if ($data['mazaneh'] != $data['product']['sub_agent']['rate_sell_price']){
if ($data['mazaneh'] != $data['product']['sub_agent']['rate_sell_price']) {
throw new UnprocessableEntityHttpException('تغییر در مظنه !');
}
if (!$product['open_sell']) {
@ -72,13 +83,10 @@ class OrderController extends Controller
}
}
$data['price_original'] = $product['price']['price'];
if ($data['direction'] == 1) {
$data['price'] = $data['product']['price']['price'] + $data['product']['price']['difference'];
}else{
} else {
$data['price'] = $data['product']['price']['price'] - $data['product']['price']['difference'];
}
@ -93,6 +101,7 @@ class OrderController extends Controller
$data['rate_difference_system'] = $data['product']['price']['difference_liman'];
$data['rate_difference_system_sell'] = $data['product']['price']['diff_sell'];
$data['rate_difference_system_buy'] = $data['product']['price']['diff_buy'];
// فقط در صورت وجود customer یا agent مقداردهی می‌شود
if (isset($data['product']['customerSettings']['customer'])) {
$data['rate_difference_first'] = $data['direction'] == 1
@ -107,7 +116,14 @@ class OrderController extends Controller
: $data['product']['customerSettings']['agent']['profit_sell'];
$data['rate_difference_second_id'] = $data['product']['customerSettings']['agent']['id'];
}
if (isset($data['product']['customerSettings'])) {
foreach ($data['product']['customerSettings'] as $keyCustomerSettings => $customerSettings) {
$data['rate_difference_first'] = $data['direction'] == 1
? $customerSettings['profit_buy']
: $customerSettings['profit_sell'];
$data['rate_difference_first_id'] = $customerSettings['id'];
}
}
// محاسبه نهایی (با چک کردن وجود متغیرها)
if ($data['direction'] == 1) {
$data['rate_price_final'] = $data['rate_price']
@ -118,11 +134,13 @@ class OrderController extends Controller
$data['rate_price_final_map'] = $data['rate_price']
. " + " . ($data['rate_difference_provider'] ?? 0)
. " + " .($data['rate_difference_system_sell'] ?? 0);
. " + " . ($data['rate_difference_system_sell'] ?? 0);
if (isset($data['rate_difference_first'])) {
$data['rate_price_final_map'] .= " + " . $data['rate_difference_first'];}
$data['rate_price_final_map'] .= " + " . $data['rate_difference_first'];
}
if (isset($data['rate_difference_second'])) {
$data['rate_price_final_map'] .= " + " . $data['rate_difference_second'];}
$data['rate_price_final_map'] .= " + " . $data['rate_difference_second'];
}
} else {
$data['rate_price_final'] = $data['rate_price']
- ($data['rate_difference_provider'] ?? 0)
@ -134,48 +152,53 @@ class OrderController extends Controller
. " - " . ($data['rate_difference_provider'] ?? 0)
. " - " . ($data['rate_difference_system_buy'] ?? 0);
if (isset($data['rate_difference_first'])) {
$data['rate_price_final_map'] .= " - " . $data['rate_difference_first'];}
$data['rate_price_final_map'] .= " - " . $data['rate_difference_first'];
}
if (isset($data['rate_difference_second'])) {
$data['rate_price_final_map'] .= " - " . $data['rate_difference_second'];}
$data['rate_price_final_map'] .= " - " . $data['rate_difference_second'];
}
}
$data['price'] = $data['rate_price_final']*$data['amount'];
$data['price'] = $data['rate_price_final'] * $data['amount'];
if ($data['product']['unit'] == 'گرم' ){
if ($data['product']['unit'] == 'گرم') {
$change_mesghal = config('change_mesghal');
$data['price_original_in_mesghal'] = $data['product']['price']['price'];
$data['price_original'] = $data['product']['price']['price']/$change_mesghal;
$data['price'] =( $data['rate_price_final']/$change_mesghal) ;
$data['price_original'] = $data['product']['price']['price'] / $change_mesghal;
$data['price'] = ($data['rate_price_final'] / $change_mesghal);
}
$data['total_price'] = $data['price']*$data['amount'];
$data['total_price'] = $data['price'] * $data['amount'];
$data['provider'] = $data['product']['reading_method'];
$data['total_price_original'] = $data['total_price']??0;
$data['payment_amount'] = $data['total_price']??0;
$data['total_fee_master'] = $data['rate_difference_first']??0+$data['rate_difference_system']??0;
$data['total_fee_agent'] = $data['rate_difference_second']??0;
$data['total_price_original'] = $data['total_price'] ?? 0;
$data['payment_amount'] = $data['total_price'] ?? 0;
$data['total_fee_master'] = $data['rate_difference_first'] ?? 0 + $data['rate_difference_system'] ?? 0;
$data['total_fee_agent'] = $data['rate_difference_second'] ?? 0;
$data['price_in_mesghal'] = $data['rate_price_final'];
//return [$data,$products];
if ($request->input_mode == 'cash') {
$cash = (int) $request->cash;
if ($request->input_mode == 'cash' or true) {
$cash = (int)$request->cash;
if (!max(
abs($cash - $data['payment_amount']),
abs($cash - $data['total_price']),
abs($cash - $data['total_price_original'])
) < 100000) {
) < 3000000) {
$data['payment_amount'] = $data['total_price'] = $data['total_price_original'] = $cash;
}
}
// return $data;
$order = Order::create($data);
$order->product_json = $product;
$order->save();
$orderLimitation = 50;
if ($_SERVER['HTTP_HOST'] == 'marandiigold.ir'){
if ($_SERVER['HTTP_HOST'] == 'marandiigold.ir') {
$orderLimitation = 100;
}
if ($_SERVER['HTTP_HOST'] == 'emexgold.com'){
if ($_SERVER['HTTP_HOST'] == 'emexgold.com') {
$orderLimitation = 200;
}
@ -225,31 +248,28 @@ class OrderController extends Controller
$adminsMessage .= "\n" . "🛒 " . $product['title'];
$adminsMessage .= "\n" . " " . $val . "@" . $mMaz . "=" . $eqalto;
// return[$data,$order];
if ($cntsForSms = Cnt::where('key', 'numberToSendMassageInOrder')->where('title_fa', 'true')->get()) {
foreach ($cntsForSms as $cntForSms) {
$this->sendMessage($cntForSms->value, $adminsMessage);
if (!$isAdmin) {
if ($cntsForSms = Cnt::where('key', 'numberToSendMassageInOrder')->where('title_fa', 'true')->get()) {
foreach ($cntsForSms as $cntForSms) {
$this->sendMessage($cntForSms->value, $adminsMessage);
}
}
}
if (!$isAdmin || ($isAdmin && $send_notif_to_customer)) {
$this->sendMessage($user->mobile, $customerMessage);
}
}
$message = auth('customer')->user()->name . " عزیز" . "\n"
. 'در تاریخ ' . verta()->format('Y/n/j H:i:s') . " سفارش شما ثبت شد. " . "\n"
. "با تشکر" . config('company');
$trigerUrl = $this->trigerUrl();
Http::withHeaders([
'Content-Type' => 'application/json',
])->post($trigerUrl.'/prc/api/trigger-update', [
])->post($trigerUrl . '/prc/api/trigger-update', [
'trigger' => 'get_order_list',
]);
$this->sendMessage($user->mobile, $customerMessage);
CancelJob::dispatch($order->id)->delay(now()->addMinutes(1))->onConnection('database');
return[$data,$order];
return[$data,$order];
return [$data, $order];
return [$data, $order];
$add_sell_price = 0;
@ -257,13 +277,11 @@ class OrderController extends Controller
$data['product'] = product::where('id', $data['product_id'])->first();
$data['price'] = $PriceMain->price;
$mesghal_convert = config('change_mesghal');
if (! $data['product']->unit == "تعداد" ){
if (!$data['product']->unit == "تعداد") {
$data['price'] = $data['price'] / $mesghal_convert;
}
$data['customer_id'] = auth('customer')->id();
$data['sts'] = 1;
$data['payment_sts'] = 1;
@ -379,6 +397,7 @@ class OrderController extends Controller
CancelJob::dispatch($order->id)->delay(now()->addMinutes(4))->onConnection('database');
return response()->json($order);
}
public function storeB(Request $request)
{
$data = $request->all();
@ -406,7 +425,7 @@ class OrderController extends Controller
$data['product'] = product::where('id', $data['product_id'])->first();
$data['price'] = $PriceMain->price;
$mesghal_convert = config('change_mesghal');
if (! $data['product']->unit == "تعداد" ){
if (!$data['product']->unit == "تعداد") {
$data['price'] = $data['price'] / $mesghal_convert;
}
$base = Package::where('is_base', true)->first();

View File

@ -46,7 +46,7 @@ class ProductController extends Controller
$productHasSetting = [];
// تنظیمات پیش فرض عمومی برای همه
//$agent=$customer;
$agent = $customer->agent_id ? CustomerModel::find($customer->agent_id) : $customer;
function setAttribute($setting,&$prises,$product,$agent,$list_product,$key){
$prises[$product->id]['buy_price'] += $setting->profit_buy;
@ -89,6 +89,7 @@ class ProductController extends Controller
}
// رفتن به ایجنت سطح بالاتر
$agent = $agent ? CustomerModel::find($agent->agent_id) : null;
} while ($agent);
//return $prises;

View File

@ -17,10 +17,9 @@ class TahesabController extends Controller
$user = auth()->user();
if (($_SERVER['HTTP_HOST'] === 'marandiigold.ir')) {
return PargarDoc::where('accountId',$user->pargar_id)->orderBy('date', 'asc')->get();
return PargarDoc::where('accountId',$user->pargar_id)->orderBy('date', 'asc')->get();
}
if ($this->Config('tahesab') !== "send_importent") {
return response()->json([
'message' => 'این بخش نیاز به اتصال به نرم افزار حسابداری شما دارد'
@ -50,6 +49,7 @@ class TahesabController extends Controller
->post($this->Config('tahesab_api'), [
'DoListAsnad' => $DoNewMoshtari
]);
$returnArray = [];
// تبدیل داده‌ها با foreach
@ -69,7 +69,6 @@ class TahesabController extends Controller
}
public function my_detail(Request $request, $offset = 0)
{
if ($this->Config('tahesab') != "send_importent" or true) {
@ -126,7 +125,7 @@ class TahesabController extends Controller
$unit = '';
foreach ($responseData as $key => $value) {
if ($key == "Code") {
if ($key == "Code" or $key == "details" ) {
continue; // Skip the "Code" key
}
// Check for specific keys and set the Farsi name
@ -171,7 +170,6 @@ class TahesabController extends Controller
}
$returnArray[] = [
"isKol" => $isKol,
"name_fa" => $name_fa,

View File

@ -94,6 +94,7 @@ class SuperController extends Controller
$cnt = Cnt::set('user_type',$data['user_type']);
$data['user_type'] = $cnt->id;
}
$this->model::findOrFail($id)->update($data);
return response()->json(true);
}

View File

@ -296,7 +296,17 @@ class DashboardAgentController extends Controller
'data' => $existing
];
}
if (empty($data['customer_id']) && empty($data['group']) && empty($data['product_id']) && CustomersSetting::where('agent_id', $data['agent_id'])
->whereNull('customer_id')
->whereNull('group')
->whereNull('product_id')
->exists()
) {
return [
'error' => true,
'message' => 'تنظیمات پیش‌فرض قبلاً ثبت شده است و نمی‌توانید دوباره آن را ثبت کنید.'
];
}
// ایجاد رکورد جدید
$createData = [
'title' => $data['title'] ?? null,

View File

@ -6,6 +6,10 @@ use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use App\Jobs\LogRouteCustomerJob;
class ValidationMiddleware
{
@ -39,6 +43,7 @@ class ValidationMiddleware
$validator = Validator::make($request->all(), config($format));
}
}
// elseif(isset($match[0])){
// $replace = preg_replace('/update_#/', $match[0], config($format));
// $validator = Validator::make($request->all(), $replace);
@ -50,6 +55,14 @@ class ValidationMiddleware
return response()->json($validator->errors(),422);
}
}
if ($customer=auth('customer')->user()){
$route = $request->method() . ' ' . $request->path();
LogRouteCustomerJob::dispatch($customer, $route);
}
return $next($request);
}
throw new BadRequestHttpException();

View File

@ -0,0 +1,70 @@
<?php
namespace App\Jobs;
use App\Models\Customer;
use App\Models\RouteInfo;
use Carbon\Carbon;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\DB;
class LogRouteCustomerJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $customer;
protected $route;
public function __construct(Customer $customer, string $route)
{
$this->customer = $customer;
$this->route = $route;
}
public function handle()
{
$now = now();
$this->customer->last_using_api = $now;
$this->customer->save();
$parts = explode(' ', $this->route);
if (count($parts) < 2) {
return;
}
$method = trim($parts[0]);
$path = trim($parts[1]);
$routeInfo = RouteInfo::where('method', $method)
->where('route', $path)
->first();
$lastlog = DB::table('customer_route_logs')
->where('customer_id', $this->customer->id)
->where('route', $this->route)
->where('last_using_api', '<', $now)
->orderBy('last_using_api', 'desc')
->first();
if ($lastlog) {
$diff = Carbon::parse($lastlog->last_using_api)->diff($now);
$timeSpentFormatted = sprintf('%02d:%02d:%02d', $diff->h + ($diff->d * 24), $diff->i, $diff->s);
DB::table('customer_route_logs')
->where('id', $lastlog->id)
->update(['time_spent' => $timeSpentFormatted]);
}
DB::table('customer_route_logs')->insert([
'customer_id' => $this->customer->id,
'route' => $this->route,
'route_info_id' => $routeInfo ? $routeInfo->id : null,
'last_using_api' => $now,
'time_spent' => null,
]);
}
}

View File

@ -0,0 +1,60 @@
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Http;
use App\Models\Customer;
use App\Models\TahesabDoc;
use Morilog\Jalali\Jalalian;
use App\Http\Controllers\Controller;
class UpdateTahesabDocJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $customer;
public function __construct(Customer $customer)
{
$this->customer = $customer;
}
public function handle()
{
$fromDate = Jalalian::forge(now()->subMonths(1))->format('Y-m-d');
$toDate = Jalalian::forge(now())->format('Y-m-d');
$DoNewMoshtari = [
2000000000,
$this->customer->tahesab_id,
$fromDate,
$toDate,
];
try {
$response = Http::withoutVerifying()
->withToken(Controller::Config('tahesab_token'))
->withHeaders(['DBName' => Controller::Config('tahesab_db')])
->post(Controller::Config('tahesab_api'), [
'DoListAsnad' => $DoNewMoshtari
]);
$data = $response->json();
if ($data) {
TahesabDoc::updateOrCreate(
['customer_id' => $this->customer->id],
['data' => $data]
);
}
} catch (\Exception $e) {
\Log::error("Error updating TahesabDoc for customer {$this->customer->id}: " . $e->getMessage());
}
}
}

View File

@ -5,17 +5,22 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Hash;
use Rooyesh\Wallet\models\Transaction;
use Tymon\JWTAuth\Contracts\JWTSubject;
use App\Http\Controllers\Customer\ProductController as CustomerProductController;
use Illuminate\Support\Facades\Crypt;
use App\Models\CustomerRouteLog;
use Illuminate\Support\Facades\DB;
class Customer extends Authenticatable implements JWTSubject
{
use HasFactory,Selector;
protected $appends = ['customer_type','customer_token',];
use HasFactory, Selector;
protected $appends = ['customer_type', 'customer_token','online_status'];
protected $fillable = [
'fname',
@ -57,9 +62,9 @@ class Customer extends Authenticatable implements JWTSubject
'password',
];
static $TYPES = [
3=>'مجموعه',
1=>'نماینده',
2=>'کاربر'
3 => 'مجموعه',
1 => 'نماینده',
2 => 'کاربر'
];
// static $GENDERS = [
@ -81,94 +86,139 @@ class Customer extends Authenticatable implements JWTSubject
// $products = json_decode(app(CustomerProductController::class)->list_product()->getContent(),true);
// return $products;
// }
public function getCustomerTypeAttribute()
public function isOnline($minutes = 10)
{
$CType = 'کاربر';
if (isset($this->attributes['agent_id'])){
if (isset($this->attributes['agent_id']) && $this->attributes['agent_id']) {
$user = $this->find($this->attributes['agent_id']);
if ($user) {
$CType = ' نماینده ' ;
if ($user->agent_id) {
$Agent = $this->find($user->agent_id);
$CType =' مشتری '. $Agent->name;
}
if (!$this->last_using_api) {
return false;
}
if ($this->last_using_api > now()->subMinutes($minutes)) {
return true;
} else {
return false;
}
}
public function getOnlineStatusAttribute()
{
return $this->isOnline() ? 'online' : 'offline';
}
public function getCustomerTypeAttribute()
{
$CType = 'کاربر';
if (isset($this->attributes['agent_id'])) {
if (isset($this->attributes['agent_id']) && $this->attributes['agent_id']) {
$user = $this->find($this->attributes['agent_id']);
if ($user) {
$CType = ' نماینده ';
if ($user->agent_id) {
$Agent = $this->find($user->agent_id);
$CType = ' مشتری ' . $Agent->name;
}
}
}
// if ($CType != $this->attributes['customer_type']) {
// $this->attributes['customer_type'] = $CType;
// $this->save();
// }
}
return $CType;
}
public function getCustomerTokenAttribute()
{
$key = 'mobin';
return Crypt::encryptString($this->attributes['id'] . '|' . $key);
}
public function setNameAttribute($name = null){
$this->attributes['name'] = $name??[$this->attributes['fname'] , $this->attributes['lname']].join(' ');
}
return $CType;
}
public function package()
{
return $this->belongsTo(Package::class);
}
public function PargarDoc()
{
return $this->hasMany(PargarDoc::class,'accountId','pargar_id');
}
public function CustomersSetting()
{
return $this->belongsTo(CustomersSetting::class,"id","agent_id");
}
public
function getCustomerTokenAttribute()
{
$key = 'mobin';
return Crypt::encryptString($this->attributes['id'] . '|' . $key);
}
public
function setNameAttribute($name = null)
{
$this->attributes['name'] = $name ?? [$this->attributes['fname'], $this->attributes['lname']] . join(' ');
}
public
function package()
{
return $this->belongsTo(Package::class);
}
public
function PargarDoc()
{
return $this->hasMany(PargarDoc::class, 'accountId', 'pargar_id');
}
public
function CustomersSetting()
{
return $this->belongsTo(CustomersSetting::class, "id", "agent_id");
}
public
function agent()
{
return $this->belongsTo(Customer::class, 'agent_id');
}
public function agent()
{
return $this->belongsTo(Customer::class,'agent_id');
}
// public function WalletWallet()
// {
// return $this->hasMany('Rooyesh\Wallet\models\Wallet','owner')->select(['id','name']);
// }
public function Wallet()
{
return $this->hasMany('Rooyesh\Wallet\models\Wallet','owner');
}
public function customer_settings()
{
return $this->hasMany(CustomersSetting::class,'agent_id');
}
public function transactin()
{
return $this->hasMany(Transaction::class,'customer_id');
}
public function avatar()
{
return $this->belongsTo(File::class,'avatar_id');
}
public
function Wallet()
{
return $this->hasMany('Rooyesh\Wallet\models\Wallet', 'owner');
}
public
function customer_settings()
{
return $this->hasMany(CustomersSetting::class, 'agent_id');
}
public
function transactin()
{
return $this->hasMany(Transaction::class, 'customer_id');
}
public
function avatar()
{
return $this->belongsTo(File::class, 'avatar_id');
}
// hash password
public function setPasswordAttribute($value){
$this->attributes['password'] = Hash::make($value);
}
public
function setPasswordAttribute($value)
{
$this->attributes['password'] = Hash::make($value);
}
public function getJWTIdentifier()
{
return $this->getKey();
}
public
function getJWTIdentifier()
{
return $this->getKey();
}
public function getJWTCustomClaims()
{
return [];
}
public function Transaction(){
return $this->hasMany(Transaction::class);
}
public
function getJWTCustomClaims()
{
return [];
}
public
function Transaction()
{
return $this->hasMany(Transaction::class);
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class CustomerRouteLog extends Model
{
public $timestamps = false;
protected $fillable = ['customer_id', 'route', 'last_using_api','route_info_id','time_spent'];
public function customer()
{
return $this->belongsTo(Customer::class);
}
public function routeInfo()
{
return $this->belongsTo(RouteInfo::class, 'route_info_id');
}
}

View File

@ -58,10 +58,13 @@ class Order extends Model
'rate_difference_second_id',
'rate_price_final', //نرخ نهایی جمع/کسر همشون
'rate_price_final_map', //شیوه محاصبه نرخ نهایی
'admin_id'
'product_json',
'admin_id',
'price'
];
protected $casts = [
'finance_order'=>'json',
'product_json'=>'json',
];
static $STS = [
1 => 'باز',

View File

@ -8,15 +8,16 @@ use Illuminate\Database\Eloquent\Model;
class Pargar extends Model
{
use HasFactory;
protected $table = 'pargar_reqasts';
protected $table = 'tahesab_docs';
protected $fillable = [
'm',
'route',
'ip',
'finance_data',
'data',
'finance_head',
];
protected $casts = [
'finance_data' => 'json',
'data' => 'json',
'finance_head' => 'json',
];

View File

@ -11,6 +11,7 @@ class Role extends Model
use softDeletes;
use HasFactory;
protected $table = 'roles';
protected $fillable = ['name', 'permissions'];
protected $casts = [

16
app/Models/RouteInfo.php Normal file
View File

@ -0,0 +1,16 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class RouteInfo extends Model
{
// protected $table = 'route_infos';
// protected $primaryKey = 'id';
protected $fillable = ['route', 'method', 'name','page_name'];
public function logs()
{
return $this->hasMany(CustomerRouteLog::class, 'route_info_id');
}
}

21
app/Models/TahesabDoc.php Normal file
View File

@ -0,0 +1,21 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class TahesabDoc extends Model
{
protected $table = 'tahesab_docs';
protected $fillable = ['customer_id', 'data'];
protected $casts = [
'data' => 'array',
];
public function customer()
{
return $this->belongsTo(Customer::class);
}
}

View File

@ -32,7 +32,8 @@ class User extends Authenticatable implements JWTSubject
'active',
'avatar_id',
'sts',
'role_id'
'role_id',
'is_admin'
];
/**

View File

@ -14,6 +14,7 @@
"laravel/tinker": "^2.5",
"maatwebsite/excel": "^3.1",
"morilog/jalali": "^3.4",
"niklasravnsborg/laravel-pdf": "^4.1",
"tymon/jwt-auth": "^1.0"
},
"require-dev": {

29
config/pdf.php Normal file
View File

@ -0,0 +1,29 @@
<?php
return [
'mode' => 'utf-8',
'format' => 'A4-L',
'author' => '',
'subject' => '',
'keywords' => '',
'creator' => 'Laravel Pdf',
'display_mode' => 'fullpage',
'tempDir' => base_path('../temp/'),
'pdf_a' => false,
'pdf_a_auto' => false,
'icc_profile_path' => '',
'default_font' => 'fa',
'font_path' => base_path('public/font'),
'font_data' => [
'fa' => [
'R' => '/iran-yekan-400.ttf',
'B' => '/iran-yekan-400.ttf',
'useOTL' => 0xFF,
'useKashida' => 75,
],
],
];

11
docker-compose.yml Normal file
View File

@ -0,0 +1,11 @@
version: "3.8"
services:
redis:
image: redis:7-alpine
ports:
- "6363:6379"
volumes:
- /home/liman/server/redis_data:/data
restart: always
command: ["redis-server", "--appendonly", "yes"]

View File

@ -64,4 +64,8 @@ if [ ! -f .env ]; then
cp .env.example .env
else
echo "✅ .env file already exists"
fi
fi
#ساخت اسکریپت pm2 برای صف:
# باعث می‌شود که pm2 این فرآیند را مدیریت کند و اگر قطع شود، دوباره آن را راه‌اندازی کند.
pm2 start "php artisan queue:work" --name laravel-queue

BIN
public/font/Yekan.ttf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

3
resources/views/pdf.blade.php Executable file → Normal file
View File

@ -18,12 +18,11 @@
/* src: url('https://limangold.com/server/fonts/iranSans/woff/IRANSansWeb(FaNum)_Bold.woff') format('woff');*/
/*}*/
* {
font-family: 'iransans', sans-serif !important;
font-family: 'fa' !important;
text-align: right;
line-height: 1.6;
}
body {
font-family: Tahoma, sans-serif;
font-size: 14px;
direction: rtl;
text-align: right;

View File

@ -0,0 +1,282 @@
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
/*@font-face {*/
/* font-family: 'iransans';*/
/* font-style: normal;*/
/* font-weight: normal;*/
/* src: url('https://limangold.com/server/fonts/iranSans/woff/IRANSansWeb(FaNum).woff') format('woff');*/
/*}*/
/*@font-face {*/
/* font-family: 'iransans';*/
/* font-style: normal;*/
/* font-weight: bold;*/
/* src: url('https://limangold.com/server/fonts/iranSans/woff/IRANSansWeb(FaNum)_Bold.woff') format('woff');*/
/*}*/
* {
font-family: 'fa' !important;
text-align: right;
line-height: 1.6;
}
body {
font-size: 14px;
direction: rtl;
text-align: right;
background-color: #f5f5f5;
padding: 20px;
margin: 0;
}
.container {
width: 98%;
max-width: 1600px;
margin: auto;
background: white;
padding: 0;
border-radius: 10px;
box-shadow: 0px 0px 10px rgba(0,0,0,0.1);
overflow: hidden;
}
/* Header Style */
.invoice-header {
background: linear-gradient(to right, #e6f2ff, #cce0ff, #e6f2ff);
padding: 15px 25px;
border-bottom: 2px solid #a8c6ff;
position: relative;
}
.header-box {
text-align: center;
font-size: 28px;
font-weight: bold;
color: #3a5a8c;
padding: 10px;
letter-spacing: 1px;
}
.header-box::before, .header-box::after {
content: "";
color: #6c8ebf;
padding: 0 15px;
font-size: 20px;
vertical-align: middle;
}
.invoice-info {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px 25px;
background-color: #f0f7ff;
border-bottom: 1px dashed #a8c6ff;
flex-wrap: wrap;
gap: 20px;
}
.customer-info {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 30px;
}
.invoice-info-item {
display: flex;
align-items: center;
gap: 5px;
font-size: 13px;
color: #4a6ea9;
}
.invoice-info-item strong {
color: #2c4b7d;
min-width: 80px;
display: inline-block;
}
.date-container {
background-color: #e6f0ff;
padding: 6px 12px;
border-radius: 6px;
border: 1px solid #c2d6ff;
display: flex;
align-items: center;
gap: 15px;
}
.date-box {
display: flex;
align-items: center;
gap: 5px;
font-size: 12px;
}
.date-box span:first-child {
font-weight: bold;
color: #2c4b7d;
}
.date-separator {
color: #a8c6ff;
font-weight: bold;
}
/* Table Style */
.table-container {
margin-top: 0;
border-radius: 0 0 10px 10px;
overflow: hidden;
}
table {
width: 100%;
border-collapse: collapse;
min-width: 1400px;
}
th, td {
padding: 10px;
border: 1px solid #ddd;
text-align: center;
font-size: 14px;
}
th {
background-color: #e6f0ff;
font-weight: bold;
color: #2c4b7d;
border-bottom: 2px solid #c2d6ff;
}
tbody tr:nth-child(even) {
background-color: #f5f9ff;
}
tbody tr:nth-child(odd) {
background-color: #ffffff;
}
</style>
</head>
<body>
<div class="container">
<!-- Header -->
{{-- <div class="invoice-header">--}}
{{-- <div class="invoice-info-item">--}}
{{-- <strong>گزارش حساب {{ $send['user']->name ?? '--' }} ({{ $send['user']->tahesab_id ?? '--' }})</strong>--}}
{{-- <span></span>--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- <div class="invoice-info">--}}
{{-- <div class="customer-info">--}}
{{-- <div class="date-container" >--}}
{{-- <div class="date-box">--}}
{{-- <span>از تاریخ:</span>--}}
{{-- <span>{{ \Carbon\Carbon::parse($send['first_date'])->translatedFormat('Y/m/d') ?? '--' }}</span>--}}
{{-- </div>--}}
{{-- <span class="date-separator"></span>--}}
{{-- <div class="date-box">--}}
{{-- <span>تا تاریخ:</span>--}}
{{-- <span>{{ \Carbon\Carbon::parse($send['last_date'])->translatedFormat('Y/m/d') ?? '--' }}</span>--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- </div>--}}
<div class="report-header" style="background: linear-gradient(to right, #e6f2ff, #cce0ff, #e6f2ff); padding:15px; border-bottom:2px solid #a8c6ff; text-align:center; font-size:20px; font-weight:bold;">
orders
</div>
<label class="report-info" style="padding:15px; background-color:#f0f7ff; border-bottom:1px dashed #a8c6ff;">
<div class="date-container" style="display:flex; justify-content:space-between; align-items:center; gap:15px;">
<div class="date-box" style="background:#e6f0ff; padding:8px 12px; border-radius:6px; border:1px solid #c2d6ff; display:flex; align-items:center; gap:5px;">
<span style="font-weight:bold; color:#2c4b7d; margin-right:10px;">از تاریخ:</span>
<span style="margin-right:15px;">{{ \Carbon\Carbon::parse($send['startDate'])->translatedFormat('Y/m/d') ?? '--' }}</span>
<span style="font-weight:bold; color:#2c4b7d; margin-right:10px;">تا تاریخ:</span>
<span>{{ \Carbon\Carbon::parse($send['endDate'])->translatedFormat('Y/m/d') ?? '--' }}</span>
</div>
{{-- <span class="date-separator" style="color:#a8c6ff; font-weight:bold;"></span>--}}
{{-- <div class="date-box" style="background:#e6f0ff; padding:8px 12px; border-radius:6px; border:1px solid #c2d6ff; display:flex; align-items:center; gap:5px;">--}}
{{-- <span style="font-weight:bold; color:#2c4b7d;">تا تاریخ:</span>--}}
{{-- <span>{{ \Carbon\Carbon::parse($send['last_date'])->translatedFormat('Y/m/d') ?? '--' }}</span>--}}
{{-- </div>--}}
</div>
</label>
<!-- Table Section -->
<div class="">
<table>
<thead>
<tr>
<th style="width: min-content;">کد پیگیری</th>
<th style="width: min-content;">نوع</th>
<th style="width: min-content;">محصول</th>
<th style="width: min-content;">برای</th>
<th style="width: min-content;">وزن</th>
<th style="width: min-content;">در مظنه</th>
<th style="width: min-content;">به مبلغ</th>
<th style="width: min-content;">شرح</th>
<th style="width: min-content;">تاریخ و ساعت</th>
</tr>
</thead>
<tbody>
@foreach($send['orders'] as $order)
<tr style="background-color: {{ $order['direction'] == 1 ? '#fcdede' : '#d8f7e0' }};">
<td>{{ $order['id'] }}</td>
<td>{{ ($order['direction'] == 1)?'فروش':'خرید' }}</td>
<td>{{ $order['product']['title'] ?? '-' }}</td>
<td>{{ $order['customer']['name'] ?? '-' }}</td>
<td style="{{ $order['input_mode'] == 'gold' ? 'color: #B8860B; font-weight: bold;' : 'color: #000000; font-weight: normal;' }}">
{{ $order['amount'] }}
</td>
<td>{{ number_format(($order['rate_price_final']/10000) ?? 0) }}</td>
<td style="{{ $order['input_mode'] == 'cash' ? 'color: #B8860B; font-weight: bold;' : 'color: #000000; font-weight: normal;' }}">
{{ $order['total_price'] }}
</td>
<td>{{ $order['description'] ?? '-' }}</td>
<td>{{ jdate($order['pay_at'])->format('Y/m/d H:i') }}</td>
</tr>
@endforeach
{{-- @foreach($send['data'] as $item)--}}
{{-- <tr>--}}
{{-- <td>{{$loop->iteration}}</td>--}}
{{-- <td>{{$item['Tarikh'] ?? '--'}}</td>--}}
{{-- <td>{{$item['Sh_Factor'] ?? '--' }}</td>--}}
{{-- <td>{{$item['NO'] ?? '--' }}</td>--}}
{{-- <td>{{$item['Mazaneh'] ?? '-' }}</td>--}}
{{-- <td>{{$item['Vazn'] ?? '-' }}</td>--}}
{{-- <td>{{ is_numeric($item['Vazn'] ?? 0) && $item['Vazn'] > 0 ? floatval($item['Vazn']) : '--' }}</td>--}}
{{-- <td>{{ is_numeric($item['Vazn'] ?? 0) && $item['Vazn'] < 0 ? floatval(abs($item['Vazn'])) : '--' }}</td>--}}
{{-- <td>{{ is_numeric($item['TahesabVazni'] ?? 0) ? number_format($item['TahesabVazni']) : '--' }}</td>--}}
{{-- <td>{{ is_numeric($item['TahesabVazni'] ?? 0) ? floatval($item['TahesabVazni']) : '--' }}</td>--}}
{{-- <td>{{ is_numeric($item['Mali'] ?? 0) && $item['Mali'] > 0 ? number_format($item['Mali']) : '--' }}</td>--}}
{{-- <td>{{ is_numeric($item['Mali'] ?? 0) && $item['Mali'] < 0 ? number_format(abs($item['Mali'])) : '--' }}</td>--}}
{{-- <td>{{ is_numeric($item['TahesabMali'] ?? 0) ? number_format($item['TahesabMali']) : '--' }}</td>--}}
{{-- <td>{{$item['Sharh1'] ?? '--' }}</td>--}}
{{-- </tr>--}}
{{-- @endforeach--}}
{{-- @if(isset($send['data']) && (is_array($send['data']) || is_object($send['data'])))--}}
{{-- @foreach($send['data'] as $item)--}}
{{-- <tr>--}}
{{-- <td>{{$loop->iteration}}</td>--}}
{{-- <td>{{$item['Tarikh'] ?? '--'}}</td>--}}
{{-- <td>{{$item['Sh_Factor'] ?? '--' }}</td>--}}
{{-- <td>{{$item['NO'] ?? '--' }}</td>--}}
{{-- <td>{{$item['Mazaneh'] ?? '-' }}</td>--}}
{{-- <td>{{$item['Vazn'] ?? '-' }}</td>--}}
{{-- <td>{{ is_numeric($item['Vazn'] ?? 0) && $item['Vazn'] > 0 ? floatval($item['Vazn']) : '--' }}</td>--}}
{{-- <td>{{ is_numeric($item['Vazn'] ?? 0) && $item['Vazn'] < 0 ? floatval(abs($item['Vazn'])) : '--' }}</td>--}}
{{-- --}}{{-- <td>{{ is_numeric($item['TahesabVazni'] ?? 0) ? number_format($item['TahesabVazni']) : '--' }}</td>--}}
{{-- <td>{{ is_numeric($item['TahesabVazni'] ?? 0) ? floatval($item['TahesabVazni']) : '--' }}</td>--}}
{{-- <td>{{ is_numeric($item['Mali'] ?? 0) && $item['Mali'] > 0 ? number_format($item['Mali']) : '--' }}</td>--}}
{{-- <td>{{ is_numeric($item['Mali'] ?? 0) && $item['Mali'] < 0 ? number_format(abs($item['Mali'])) : '--' }}</td>--}}
{{-- <td>{{ is_numeric($item['TahesabMali'] ?? 0) ? number_format($item['TahesabMali']) : '--' }}</td>--}}
{{-- <td>{{$item['Sharh1'] ?? '--' }}</td>--}}
{{-- </tr>--}}
{{-- @endforeach--}}
{{-- @else--}}
{{-- <tr>--}}
{{-- <td colspan="11">No data available</td>--}}
{{-- </tr>--}}
{{-- @endif--}}
</tbody>
</table>
</div>
</div>
</body>
</html>

0
resources/views/showTransactionReport.blade.php Executable file → Normal file
View File

0
resources/views/sse.blade.php Executable file → Normal file
View File

0
resources/views/welcome.blade.php Executable file → Normal file
View File

251
resources/viewsold/pdf.blade.php Executable file
View File

@ -0,0 +1,251 @@
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
/*@font-face {*/
/* font-family: 'iransans';*/
/* font-style: normal;*/
/* font-weight: normal;*/
/* src: url('https://limangold.com/server/fonts/iranSans/woff/IRANSansWeb(FaNum).woff') format('woff');*/
/*}*/
/*@font-face {*/
/* font-family: 'iransans';*/
/* font-style: normal;*/
/* font-weight: bold;*/
/* src: url('https://limangold.com/server/fonts/iranSans/woff/IRANSansWeb(FaNum)_Bold.woff') format('woff');*/
/*}*/
* {
font-family: 'iransans', sans-serif !important;
text-align: right;
line-height: 1.6;
}
body {
font-family: Tahoma, sans-serif;
font-size: 14px;
direction: rtl;
text-align: right;
background-color: #f5f5f5;
padding: 20px;
margin: 0;
}
.container {
width: 98%;
max-width: 1600px;
margin: auto;
background: white;
padding: 0;
border-radius: 10px;
box-shadow: 0px 0px 10px rgba(0,0,0,0.1);
overflow: hidden;
}
/* Header Style */
.invoice-header {
background: linear-gradient(to right, #e6f2ff, #cce0ff, #e6f2ff);
padding: 15px 25px;
border-bottom: 2px solid #a8c6ff;
position: relative;
}
.header-box {
text-align: center;
font-size: 28px;
font-weight: bold;
color: #3a5a8c;
padding: 10px;
letter-spacing: 1px;
}
.header-box::before, .header-box::after {
content: "";
color: #6c8ebf;
padding: 0 15px;
font-size: 20px;
vertical-align: middle;
}
.invoice-info {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px 25px;
background-color: #f0f7ff;
border-bottom: 1px dashed #a8c6ff;
flex-wrap: wrap;
gap: 20px;
}
.customer-info {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 30px;
}
.invoice-info-item {
display: flex;
align-items: center;
gap: 5px;
font-size: 13px;
color: #4a6ea9;
}
.invoice-info-item strong {
color: #2c4b7d;
min-width: 80px;
display: inline-block;
}
.date-container {
background-color: #e6f0ff;
padding: 6px 12px;
border-radius: 6px;
border: 1px solid #c2d6ff;
display: flex;
align-items: center;
gap: 15px;
}
.date-box {
display: flex;
align-items: center;
gap: 5px;
font-size: 12px;
}
.date-box span:first-child {
font-weight: bold;
color: #2c4b7d;
}
.date-separator {
color: #a8c6ff;
font-weight: bold;
}
/* Table Style */
.table-container {
margin-top: 0;
border-radius: 0 0 10px 10px;
overflow: hidden;
}
table {
width: 100%;
border-collapse: collapse;
min-width: 1400px;
}
th, td {
padding: 10px;
border: 1px solid #ddd;
text-align: center;
font-size: 14px;
}
th {
background-color: #e6f0ff;
font-weight: bold;
color: #2c4b7d;
border-bottom: 2px solid #c2d6ff;
}
tbody tr:nth-child(even) {
background-color: #f5f9ff;
}
tbody tr:nth-child(odd) {
background-color: #ffffff;
}
</style>
</head>
<body>
<div class="container">
<!-- Header -->
{{-- <div class="invoice-header">--}}
{{-- <div class="invoice-info-item">--}}
{{-- <strong>گزارش حساب {{ $send['user']->name ?? '--' }} ({{ $send['user']->tahesab_id ?? '--' }})</strong>--}}
{{-- <span></span>--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- <div class="invoice-info">--}}
{{-- <div class="customer-info">--}}
{{-- <div class="date-container" >--}}
{{-- <div class="date-box">--}}
{{-- <span>از تاریخ:</span>--}}
{{-- <span>{{ \Carbon\Carbon::parse($send['first_date'])->translatedFormat('Y/m/d') ?? '--' }}</span>--}}
{{-- </div>--}}
{{-- <span class="date-separator"></span>--}}
{{-- <div class="date-box">--}}
{{-- <span>تا تاریخ:</span>--}}
{{-- <span>{{ \Carbon\Carbon::parse($send['last_date'])->translatedFormat('Y/m/d') ?? '--' }}</span>--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- </div>--}}
<div class="report-header" style="background: linear-gradient(to right, #e6f2ff, #cce0ff, #e6f2ff); padding:15px; border-bottom:2px solid #a8c6ff; text-align:center; font-size:20px; font-weight:bold;">
<strong>گزارش حساب {{ $send['user']->name ?? '--' }} ({{ $send['user']->tahesab_id ?? '--' }})</strong>
</div>
<label class="report-info" style="padding:15px; background-color:#f0f7ff; border-bottom:1px dashed #a8c6ff;">
<div class="date-container" style="display:flex; justify-content:space-between; align-items:center; gap:15px;">
<div class="date-box" style="background:#e6f0ff; padding:8px 12px; border-radius:6px; border:1px solid #c2d6ff; display:flex; align-items:center; gap:5px;">
<span style="font-weight:bold; color:#2c4b7d; margin-right:10px;">از تاریخ:</span>
<span style="margin-right:15px;">{{ \Carbon\Carbon::parse($send['startDate'])->translatedFormat('Y/m/d') ?? '--' }}</span>
<span style="font-weight:bold; color:#2c4b7d; margin-right:10px;">تا تاریخ:</span>
<span>{{ \Carbon\Carbon::parse($send['endDate'])->translatedFormat('Y/m/d') ?? '--' }}</span>
</div>
{{-- <span class="date-separator" style="color:#a8c6ff; font-weight:bold;"></span>--}}
{{-- <div class="date-box" style="background:#e6f0ff; padding:8px 12px; border-radius:6px; border:1px solid #c2d6ff; display:flex; align-items:center; gap:5px;">--}}
{{-- <span style="font-weight:bold; color:#2c4b7d;">تا تاریخ:</span>--}}
{{-- <span>{{ \Carbon\Carbon::parse($send['last_date'])->translatedFormat('Y/m/d') ?? '--' }}</span>--}}
{{-- </div>--}}
</div>
</label>
<!-- Table Section -->
<div class="table-container">
<table>
<thead>
<tr>
<th style="width: min-content;">ردیف</th>
<th style="width: min-content;">تاریخ</th>
<th style="width: min-content;">شماره سند</th>
<th style="width: min-content;">نوع سند</th>
<th style="width: min-content;">مظنه</th>
<th style="width: min-content;">وزن خالص</th>
<th style="width: min-content;">بدهکار وزنی</th>
<th style="width: min-content;">بستانکار وزنی</th>
<th style="width: min-content;">ته حساب وزنی</th>
<th style="width: min-content;">بدهکاری مالی</th>
<th style="width: min-content;">بستانکار مالی</th>
<th style="width: min-content;">ته حساب مالی</th>
<th style="width: min-content;">شرح</th>
</tr>
</thead>
<tbody>
@if(isset($send['data']) && (is_array($send['data']) || is_object($send['data'])))
@foreach($send['data'] as $item)
<tr>
<td>{{$loop->iteration}}</td>
<td>{{$item['Tarikh'] ?? '--'}}</td>
<td>{{$item['Sh_Factor'] ?? '--' }}</td>
<td>{{$item['NO'] ?? '--' }}</td>
<td>{{$item['Mazaneh'] ?? '-' }}</td>
<td>{{$item['Vazn'] ?? '-' }}</td>
<td>{{ is_numeric($item['Vazn'] ?? 0) && $item['Vazn'] > 0 ? floatval($item['Vazn']) : '--' }}</td>
<td>{{ is_numeric($item['Vazn'] ?? 0) && $item['Vazn'] < 0 ? floatval(abs($item['Vazn'])) : '--' }}</td>
{{-- <td>{{ is_numeric($item['TahesabVazni'] ?? 0) ? number_format($item['TahesabVazni']) : '--' }}</td>--}}
<td>{{ is_numeric($item['TahesabVazni'] ?? 0) ? floatval($item['TahesabVazni']) : '--' }}</td>
<td>{{ is_numeric($item['Mali'] ?? 0) && $item['Mali'] > 0 ? number_format($item['Mali']) : '--' }}</td>
<td>{{ is_numeric($item['Mali'] ?? 0) && $item['Mali'] < 0 ? number_format(abs($item['Mali'])) : '--' }}</td>
<td>{{ is_numeric($item['TahesabMali'] ?? 0) ? number_format($item['TahesabMali']) : '--' }}</td>
<td>{{$item['Sharh1'] ?? '--' }}</td>
</tr>
@endforeach
@else
<tr>
<td colspan="11">No data available</td>
</tr>
@endif
</tbody>
</table>
</div>
</div>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,26 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SSE Example</title>
</head>
<body>
<h1>SSE Example</h1>
<div id="messages"></div>
<script>
if (typeof(EventSource) !== "undefined") {
var source = new EventSource("/sse");
source.onmessage = function(event) {
var data = JSON.parse(event.data);
var messageElement = document.createElement("div");
messageElement.textContent = data.message;
document.getElementById("messages").appendChild(messageElement);
};
} else {
document.getElementById("messages").innerHTML = "Sorry, your browser does not support server-sent events...";
}
</script>
</body>
</html>

View File

@ -0,0 +1,132 @@
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel</title>
<!-- Fonts -->
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap" rel="stylesheet">
<!-- Styles -->
<style>
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}a{background-color:transparent}[hidden]{display:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}a{color:inherit;text-decoration:inherit}svg,video{display:block;vertical-align:middle}video{max-width:100%;height:auto}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-t{border-top-width:1px}.flex{display:flex}.grid{display:grid}.hidden{display:none}.items-center{align-items:center}.justify-center{justify-content:center}.font-semibold{font-weight:600}.h-5{height:1.25rem}.h-8{height:2rem}.h-16{height:4rem}.text-sm{font-size:.875rem}.text-lg{font-size:1.125rem}.leading-7{line-height:1.75rem}.mx-auto{margin-left:auto;margin-right:auto}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-4{margin-top:1rem}.ml-4{margin-left:1rem}.mt-8{margin-top:2rem}.ml-12{margin-left:3rem}.-mt-px{margin-top:-1px}.max-w-6xl{max-width:72rem}.min-h-screen{min-height:100vh}.overflow-hidden{overflow:hidden}.p-6{padding:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pt-8{padding-top:2rem}.fixed{position:fixed}.relative{position:relative}.top-0{top:0}.right-0{right:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.text-center{text-align:center}.text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.underline{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.w-5{width:1.25rem}.w-8{width:2rem}.w-auto{width:auto}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:640px){.sm\:rounded-lg{border-radius:.5rem}.sm\:block{display:block}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:h-20{height:5rem}.sm\:ml-0{margin-left:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pt-0{padding-top:0}.sm\:text-left{text-align:left}.sm\:text-right{text-align:right}}@media (min-width:768px){.md\:border-t-0{border-top-width:0}.md\:border-l{border-left-width:1px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:px-8{padding-left:2rem;padding-right:2rem}}@media (prefers-color-scheme:dark){.dark\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.dark\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.dark\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.dark\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.dark\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.dark\:text-gray-500{--tw-text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--tw-text-opacity))}}
</style>
<style>
body {
font-family: 'Nunito', sans-serif;
}
</style>
</head>
<body class="antialiased">
<div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0">
@if (Route::has('login'))
<div class="hidden fixed top-0 right-0 px-6 py-4 sm:block">
@auth
<a href="{{ url('/home') }}" class="text-sm text-gray-700 dark:text-gray-500 underline">Home</a>
@else
<a href="{{ route('login') }}" class="text-sm text-gray-700 dark:text-gray-500 underline">Log in</a>
@if (Route::has('register'))
<a href="{{ route('register') }}" class="ml-4 text-sm text-gray-700 dark:text-gray-500 underline">Register</a>
@endif
@endauth
</div>
@endif
<div class="max-w-6xl mx-auto sm:px-6 lg:px-8">
<div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
<svg viewBox="0 0 651 192" fill="none" xmlns="http://www.w3.org/2000/svg" class="h-16 w-auto text-gray-700 sm:h-20">
<g clip-path="url(#clip0)" fill="#EF3B2D">
<path d="M248.032 44.676h-16.466v100.23h47.394v-14.748h-30.928V44.676zM337.091 87.202c-2.101-3.341-5.083-5.965-8.949-7.875-3.865-1.909-7.756-2.864-11.669-2.864-5.062 0-9.69.931-13.89 2.792-4.201 1.861-7.804 4.417-10.811 7.661-3.007 3.246-5.347 6.993-7.016 11.239-1.672 4.249-2.506 8.713-2.506 13.389 0 4.774.834 9.26 2.506 13.459 1.669 4.202 4.009 7.925 7.016 11.169 3.007 3.246 6.609 5.799 10.811 7.66 4.199 1.861 8.828 2.792 13.89 2.792 3.913 0 7.804-.955 11.669-2.863 3.866-1.908 6.849-4.533 8.949-7.875v9.021h15.607V78.182h-15.607v9.02zm-1.431 32.503c-.955 2.578-2.291 4.821-4.009 6.73-1.719 1.91-3.795 3.437-6.229 4.582-2.435 1.146-5.133 1.718-8.091 1.718-2.96 0-5.633-.572-8.019-1.718-2.387-1.146-4.438-2.672-6.156-4.582-1.719-1.909-3.032-4.152-3.938-6.73-.909-2.577-1.36-5.298-1.36-8.161 0-2.864.451-5.585 1.36-8.162.905-2.577 2.219-4.819 3.938-6.729 1.718-1.908 3.77-3.437 6.156-4.582 2.386-1.146 5.059-1.718 8.019-1.718 2.958 0 5.656.572 8.091 1.718 2.434 1.146 4.51 2.674 6.229 4.582 1.718 1.91 3.054 4.152 4.009 6.729.953 2.577 1.432 5.298 1.432 8.162-.001 2.863-.479 5.584-1.432 8.161zM463.954 87.202c-2.101-3.341-5.083-5.965-8.949-7.875-3.865-1.909-7.756-2.864-11.669-2.864-5.062 0-9.69.931-13.89 2.792-4.201 1.861-7.804 4.417-10.811 7.661-3.007 3.246-5.347 6.993-7.016 11.239-1.672 4.249-2.506 8.713-2.506 13.389 0 4.774.834 9.26 2.506 13.459 1.669 4.202 4.009 7.925 7.016 11.169 3.007 3.246 6.609 5.799 10.811 7.66 4.199 1.861 8.828 2.792 13.89 2.792 3.913 0 7.804-.955 11.669-2.863 3.866-1.908 6.849-4.533 8.949-7.875v9.021h15.607V78.182h-15.607v9.02zm-1.432 32.503c-.955 2.578-2.291 4.821-4.009 6.73-1.719 1.91-3.795 3.437-6.229 4.582-2.435 1.146-5.133 1.718-8.091 1.718-2.96 0-5.633-.572-8.019-1.718-2.387-1.146-4.438-2.672-6.156-4.582-1.719-1.909-3.032-4.152-3.938-6.73-.909-2.577-1.36-5.298-1.36-8.161 0-2.864.451-5.585 1.36-8.162.905-2.577 2.219-4.819 3.938-6.729 1.718-1.908 3.77-3.437 6.156-4.582 2.386-1.146 5.059-1.718 8.019-1.718 2.958 0 5.656.572 8.091 1.718 2.434 1.146 4.51 2.674 6.229 4.582 1.718 1.91 3.054 4.152 4.009 6.729.953 2.577 1.432 5.298 1.432 8.162 0 2.863-.479 5.584-1.432 8.161zM650.772 44.676h-15.606v100.23h15.606V44.676zM365.013 144.906h15.607V93.538h26.776V78.182h-42.383v66.724zM542.133 78.182l-19.616 51.096-19.616-51.096h-15.808l25.617 66.724h19.614l25.617-66.724h-15.808zM591.98 76.466c-19.112 0-34.239 15.706-34.239 35.079 0 21.416 14.641 35.079 36.239 35.079 12.088 0 19.806-4.622 29.234-14.688l-10.544-8.158c-.006.008-7.958 10.449-19.832 10.449-13.802 0-19.612-11.127-19.612-16.884h51.777c2.72-22.043-11.772-40.877-33.023-40.877zm-18.713 29.28c.12-1.284 1.917-16.884 18.589-16.884 16.671 0 18.697 15.598 18.813 16.884h-37.402zM184.068 43.892c-.024-.088-.073-.165-.104-.25-.058-.157-.108-.316-.191-.46-.056-.097-.137-.176-.203-.265-.087-.117-.161-.242-.265-.345-.085-.086-.194-.148-.29-.223-.109-.085-.206-.182-.327-.252l-.002-.001-.002-.002-35.648-20.524a2.971 2.971 0 00-2.964 0l-35.647 20.522-.002.002-.002.001c-.121.07-.219.167-.327.252-.096.075-.205.138-.29.223-.103.103-.178.228-.265.345-.066.089-.147.169-.203.265-.083.144-.133.304-.191.46-.031.085-.08.162-.104.25-.067.249-.103.51-.103.776v38.979l-29.706 17.103V24.493a3 3 0 00-.103-.776c-.024-.088-.073-.165-.104-.25-.058-.157-.108-.316-.191-.46-.056-.097-.137-.176-.203-.265-.087-.117-.161-.242-.265-.345-.085-.086-.194-.148-.29-.223-.109-.085-.206-.182-.327-.252l-.002-.001-.002-.002L40.098 1.396a2.971 2.971 0 00-2.964 0L1.487 21.919l-.002.002-.002.001c-.121.07-.219.167-.327.252-.096.075-.205.138-.29.223-.103.103-.178.228-.265.345-.066.089-.147.169-.203.265-.083.144-.133.304-.191.46-.031.085-.08.162-.104.25-.067.249-.103.51-.103.776v122.09c0 1.063.568 2.044 1.489 2.575l71.293 41.045c.156.089.324.143.49.202.078.028.15.074.23.095a2.98 2.98 0 001.524 0c.069-.018.132-.059.2-.083.176-.061.354-.119.519-.214l71.293-41.045a2.971 2.971 0 001.489-2.575v-38.979l34.158-19.666a2.971 2.971 0 001.489-2.575V44.666a3.075 3.075 0 00-.106-.774zM74.255 143.167l-29.648-16.779 31.136-17.926.001-.001 34.164-19.669 29.674 17.084-21.772 12.428-43.555 24.863zm68.329-76.259v33.841l-12.475-7.182-17.231-9.92V49.806l12.475 7.182 17.231 9.92zm2.97-39.335l29.693 17.095-29.693 17.095-29.693-17.095 29.693-17.095zM54.06 114.089l-12.475 7.182V46.733l17.231-9.92 12.475-7.182v74.537l-17.231 9.921zM38.614 7.398l29.693 17.095-29.693 17.095L8.921 24.493 38.614 7.398zM5.938 29.632l12.475 7.182 17.231 9.92v79.676l.001.005-.001.006c0 .114.032.221.045.333.017.146.021.294.059.434l.002.007c.032.117.094.222.14.334.051.124.088.255.156.371a.036.036 0 00.004.009c.061.105.149.191.222.288.081.105.149.22.244.314l.008.01c.084.083.19.142.284.215.106.083.202.178.32.247l.013.005.011.008 34.139 19.321v34.175L5.939 144.867V29.632h-.001zm136.646 115.235l-65.352 37.625V148.31l48.399-27.628 16.953-9.677v33.862zm35.646-61.22l-29.706 17.102V66.908l17.231-9.92 12.475-7.182v33.841z"/>
</g>
</svg>
</div>
<div class="mt-8 bg-white dark:bg-gray-800 overflow-hidden shadow sm:rounded-lg">
<div class="grid grid-cols-1 md:grid-cols-2">
<div class="p-6">
<div class="flex items-center">
<svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-8 h-8 text-gray-500"><path d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"></path></svg>
<div class="ml-4 text-lg leading-7 font-semibold"><a href="https://laravel.com/docs" class="underline text-gray-900 dark:text-white">Documentation</a></div>
</div>
<div class="ml-12">
<div class="mt-2 text-gray-600 dark:text-gray-400 text-sm">
Laravel has wonderful, thorough documentation covering every aspect of the framework. Whether you are new to the framework or have previous experience with Laravel, we recommend reading all of the documentation from beginning to end.
</div>
</div>
</div>
<div class="p-6 border-t border-gray-200 dark:border-gray-700 md:border-t-0 md:border-l">
<div class="flex items-center">
<svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-8 h-8 text-gray-500"><path d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z"></path><path d="M15 13a3 3 0 11-6 0 3 3 0 016 0z"></path></svg>
<div class="ml-4 text-lg leading-7 font-semibold"><a href="https://laracasts.com" class="underline text-gray-900 dark:text-white">Laracasts</a></div>
</div>
<div class="ml-12">
<div class="mt-2 text-gray-600 dark:text-gray-400 text-sm">
Laracasts offers thousands of video tutorials on Laravel, PHP, and JavaScript development. Check them out, see for yourself, and massively level up your development skills in the process.
</div>
</div>
</div>
<div class="p-6 border-t border-gray-200 dark:border-gray-700">
<div class="flex items-center">
<svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-8 h-8 text-gray-500"><path d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"></path></svg>
<div class="ml-4 text-lg leading-7 font-semibold"><a href="https://laravel-news.com/" class="underline text-gray-900 dark:text-white">Laravel News</a></div>
</div>
<div class="ml-12">
<div class="mt-2 text-gray-600 dark:text-gray-400 text-sm">
Laravel News is a community driven portal and newsletter aggregating all of the latest and most important news in the Laravel ecosystem, including new package releases and tutorials.
</div>
</div>
</div>
<div class="p-6 border-t border-gray-200 dark:border-gray-700 md:border-l">
<div class="flex items-center">
<svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-8 h-8 text-gray-500"><path d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
<div class="ml-4 text-lg leading-7 font-semibold text-gray-900 dark:text-white">Vibrant Ecosystem</div>
</div>
<div class="ml-12">
<div class="mt-2 text-gray-600 dark:text-gray-400 text-sm">
Laravel's robust library of first-party tools and libraries, such as <a href="https://forge.laravel.com" class="underline">Forge</a>, <a href="https://vapor.laravel.com" class="underline">Vapor</a>, <a href="https://nova.laravel.com" class="underline">Nova</a>, and <a href="https://envoyer.io" class="underline">Envoyer</a> help you take your projects to the next level. Pair them with powerful open source libraries like <a href="https://laravel.com/docs/billing" class="underline">Cashier</a>, <a href="https://laravel.com/docs/dusk" class="underline">Dusk</a>, <a href="https://laravel.com/docs/broadcasting" class="underline">Echo</a>, <a href="https://laravel.com/docs/horizon" class="underline">Horizon</a>, <a href="https://laravel.com/docs/sanctum" class="underline">Sanctum</a>, <a href="https://laravel.com/docs/telescope" class="underline">Telescope</a>, and more.
</div>
</div>
</div>
</div>
</div>
<div class="flex justify-center mt-4 sm:items-center sm:justify-between">
<div class="text-center text-sm text-gray-500 sm:text-left">
<div class="flex items-center">
<svg fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" stroke="currentColor" class="-mt-px w-5 h-5 text-gray-400">
<path d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z"></path>
</svg>
<a href="https://laravel.bigcartel.com" class="ml-1 underline">
Shop
</a>
<svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="ml-4 -mt-px w-5 h-5 text-gray-400">
<path d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z"></path>
</svg>
<a href="https://github.com/sponsors/taylorotwell" class="ml-1 underline">
Sponsor
</a>
</div>
</div>
<div class="ml-4 text-center text-sm text-gray-500 sm:text-right sm:ml-0">
Laravel v{{ Illuminate\Foundation\Application::VERSION }} (PHP v{{ PHP_VERSION }})
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -19,12 +19,18 @@ use Illuminate\Support\Str;
use Telegram\Bot\Api;
function savePargarRequest(Request $request, string $m)
{
$pargar = new Pargar();
$pargar->ip = $request->ip();
$pargar->m = $m;
$pargar->route = $request->fullUrl();
$pargar->data = $request->all();
$pargar->finance_head = $request->headers->all();
$pargar->save();
}
function finalizeProcessing() {
Pargar::latest('id')->take(100)->get()
->each(function ($item) {
Pargar::latest('id')->take(100)->get()->each(function ($item) {
if (is_string($item->finance_data)) {
$decoded = json_decode($item->finance_data, true);
if (json_last_error() === JSON_ERROR_NONE) {
@ -154,69 +160,28 @@ Route::prefix('pargar')->group(function () {
]);
});
Route::post('/accounting/customers', function (Request $request) {
$data = $request->all();
$head = $request->headers->all();
$Pargar = new Pargar();
$Pargar->ip = $request->ip(); // Gets the client IP address
$Pargar->m = 'customerList'; // Gets the client IP address
$Pargar->finance_data = json_encode($data); // Storing request data as JSON
$Pargar->finance_head = json_encode($head); // Storing headers as JSON
$Pargar->save(); // Don't forget to save the model
// $data = $request->all();
// $head = $request->headers->all();
// $Pargar = new Pargar();
// $Pargar->ip = $request->ip(); // Gets the client IP address
// $Pargar->m = 'customerList'; // Gets the client IP address
// $Pargar->finance_data = json_encode($data); // Storing request data as JSON
// $Pargar->finance_head = json_encode($head); // Storing headers as JSON
// $Pargar->save(); // Don't forget to save the model
$data = $request->all();
$key = 'wQ12e245d5%rdpb78oBh31Aos*bIdQemiUeeq9e9G!oey23SMXp40Ew2fodjx9J5buKNW0M4@nYMr1PR6d0KtuqhLQlx*K$';
$auth = $request->header('pargar') ?? $request->header('Authorization');
if ($auth !== $key && $auth !== 'Bearer ' . $key) {
return response()->json(['auth needed'], 401);
}
savePargarRequest($request, 'customerList');
$customers = $request->input('Customers', []);
$duplicated = [];
$saved = [];
foreach ($customers as $customer) {
$accountId = $customer['AccountId'] ?? null;
$fullName = $customer['FullName'] ?? null;
$cellPhone = $customer['CellPhone'] ?? null;
if (!$accountId || !$fullName || !$cellPhone) {
continue; // رد داده ناقص
}
// بررسی تکراری بودن بر اساس AccountId یا CellPhone
$exists = Customer::where('pargar_id', $accountId)
->orWhere('mobile', $cellPhone)
->first();
if ($exists) {
$exists->finance_data_cu = json_encode($data)??"null";
$exists->save();
$duplicated[] = $customer;
continue;
}
$cu = Customer::create([
'pargar_id' => $accountId,
'name' => $fullName,
'mobile' => $cellPhone,
]);
$cu->finance_data_cu = json_encode($data)??null;
$cu->save();
$saved[] = $customer;
}
finalizeProcessing();
// $data = $request->all();
// $key = 'wQ12e245d5%rdpb78oBh31Aos*bIdQemiUeeq9e9G!oey23SMXp40Ew2fodjx9J5buKNW0M4@nYMr1PR6d0KtuqhLQlx*K$';
// $auth = $request->header('pargar') ?? $request->header('Authorization');
// if ($auth !== $key && $auth !== 'Bearer ' . $key) {
// return response()->json(['auth needed'], 401);
// }
// finalizeProcessing();
return response()->json([
'state' => 'true',
'msg' => 'Saved successfully',
'data' => $saved,
'result' => 'OK',
'duplicated' => $duplicated,
'documents' => []
'result' => 'OK'
]);
});
Route::get('/accounting/orders', function (Request $request) {
@ -235,43 +200,18 @@ Route::prefix('pargar')->group(function () {
if ($auth !== $key && $auth !== 'Bearer ' . $key) {
return response()->json(['auth needed'], 401);
}
$orders = Order::where('finance_is_saved',0)->where('sts',2)->limit(100)->get();
$data = $orders->map(function ($order) {
$customer = Customer::where('id',$order->customer_id)->first();
if ($customer->pargar_id){
return [
'OrderId' => (string)$order->id,
'OrderType' => $order->direction == 1 ? 0 : 1,
'PriceType' => 1,
'CustomerAccountId' => $customer->pargar_id,
'ItemId' => 11,
'itemName' => 'ابشده',
'OrderDate' => jdate($order->created_at)->format('Y/m/d-H:i:s'),
'Fee' => $order->rate_price_final,
'Count' => 0,
'Weight' => $order->amount,
'Price' => $order->total_price,
'Carat' => 750,
'Description' => $order->description ?? '',
];
}
});
Order::whereIn('id', $orders->pluck('id'))->update(['finance_is_saved' => 1]);
finalizeProcessing();
return response()->json([
'state' => 'true',
'msg' => '',
'data' => ($data),
// 'data' => [],
'result' => 'OK',
'duplicated' => [],
'documents' => []
]);
});
Route::post('/accounting/orders', function (Request $request) {
finalizeProcessing();
$data = $request->all();
$head = $request->headers->all();
$Pargar = new Pargar();
@ -287,53 +227,10 @@ Route::prefix('pargar')->group(function () {
return response()->json(['auth needed'], 401);
}
$orderIds = $request->input('OrderIds', []);
$validated = [];
foreach ($orderIds as $orderId) {
$order = Order::where('id',$orderId)->first();
if (!$order) {
return response()->json(['msg' => 'سفارشی با این finance_order یافت نشد']);
}
return $order;
return Order::where('id', 402804)->first();
return $order = Order::where('finance_order', $orderId)->first();
if (!$order) {
// ساخت سفارش جدید با فقط شناسه
$order = new Order();
$order->finance_order = $orderId; // یا مقدار پیش‌فرض
$order->finance_data = json_encode($data); // یا مقدار پیش‌فرض
$order->save();
}
$validated[] = [
'OrderId' => $orderId,
'Order' => $order,
'exists' => !is_null($order),
'customer_id' => $order->customer->pargar_id ?? null,
'customer_name' => $order->customer->name ?? null
];
$order->finance_data = json_encode($data); // یا مقدار پیش‌فرض
$order->save();
}
return response()->json([
'state' => true,
'msg' => "با موفقیت ثبت شد",
'data' => null,
'result' => 'OK',
// 'duplicated' => $duplicated,
// 'documents' => $documents,
]);
finalizeProcessing();
return response()->json([
'state' => true,
'msg' => 'مشتری یافت نشد',
'data' => $validated,
'result' => 'OK',
'duplicated' => [],
'documents' => []
@ -361,26 +258,11 @@ Route::prefix('pargar')->group(function () {
if ($auth !== $key && $auth !== 'Bearer ' . $key) {
return response()->json(['auth needed'], 401);
}
$accountId = $request->input('accountId');
if (!$request->hasFile('pdfFile')) {
return response()->json([
'state' => 'false',
'msg' => 'PDF file is required',
'data' => null,
'result' => 'Error'
]);
}
$file = $request->file('pdfFile');
$fileName = $accountId . '_' . time() . '.pdf';
$file->storeAs('customer_pdfs', $fileName);
finalizeProcessing();
return response()->json([
'state' => 'true',
'msg' => 'PDF uploaded successfully',
'data' => ['fileName' => $fileName],
// 'data' => ['fileName' => $fileName],
'result' => 'OK'
]);
});
@ -394,34 +276,6 @@ Route::prefix('pargar')->group(function () {
$Pargar->finance_head = json_encode($head); // Storing headers as JSON
$Pargar->save(); // Don't forget to save the model
$data = $request->all();
$accountId = $request->input('AccountId');
$goldInv = $request->input('GoldInv');
$rialInv = $request->input('RialInv');
$customer = Customer::where('pargar_id', $accountId)->first();
if (!$customer) {
$customer = new Customer();
$customer->finance_data = json_encode($data);
$customer->pargar_id = $accountId;
$customer->save();
return response()->json([
'state' => 'false',
'msg' => 'Customer not found',
'data' => null,
'result' => 'Error',
'duplicated' => [],
'documents' => []
]);
}
$customer->gold_balance = $goldInv; // Changed from gold_inventory to gold_balance
$customer->rial_balance = $rialInv; // Changed from rial_inventory to rial_balance
$customer->finance_data = json_encode($data);
$customer->save();
finalizeProcessing();
return response()->json([
'state' => 'true',

View File

@ -5,108 +5,111 @@ use Illuminate\Support\Facades\Route;
use App\Models\Role;
use App\Models\User;
Route::get('/roles', function () {
$roles = Role::all();
if ($roles->isEmpty()) {
return response()->json(['message' => 'نقشی یافت نشد'], 404);
}
return response()->json($roles);
})->name('roles.index');
Route::middleware('auth:user')->group(function (){
Route::middleware('validation')->group(function () {
Route::get('/roles', function () {
$roles = Role::all();
if ($roles->isEmpty()) {
return response()->json(['message' => 'نقشی یافت نشد'], 422);
}
return response()->json($roles);
})->name('roles.index');
Route::post('/roles', function (Request $request) {
$missingFields = [];
Route::post('/roles', function (Request $request) {
$missingFields = [];
if (!$request->has('name') || empty($request->name)) {
$missingFields[] = 'نام';
} elseif (Role::where('name', $request->name)->exists()) {
return response()->json(['message' => 'فیلد نام قبلا ذخیره شده است'], 422);
}
if (!$request->has('name') || empty($request->name)) {
$missingFields[] = 'نام';
}
if (!$request->has('permissions') || empty($request->permissions)) {
$missingFields[] = 'دسترسی';
}
if (!$request->has('permissions') || empty($request->permissions)) {
$missingFields[] = 'دسترسی';
}
if (!empty($missingFields)) {
$message = 'فیلد ' . implode(' و ', $missingFields) . ' اجباری می‌باشد';
return response()->json(['message' => $message], 422);
}
if (!empty($missingFields)) {
$message = 'فیلد ' . implode(' و ', $missingFields) . ' اجباری می‌باشد';
return response()->json(['message' => $message], 422);
}
$role = Role::create([
'name' => $request->name,
'permissions' => $request->permissions ?? [],
]);
$role = Role::create([
'name' => $request->name,
'permissions' => $request->permissions ?? [],
]);
return response()->json(['message' => 'نقش با موفقیت ایجاد شد', 'role' => $role], 201);
})->name('roles.store');
return response()->json(['message' => 'نقش با موفقیت ایجاد شد', 'role' => $role], 201);
})->name('roles.store');
Route::put('/roles/{id}', function (Request $request, $id) {
$role = Role::find($id);
if (!$role) {
return response()->json(['message' => 'نقش مورد نظر پیدا نشد'], 422);
}
Route::put('/roles/{id}', function (Request $request, $id) {
$role = Role::find($id);
if (!$role) {
return response()->json(['message' => 'نقش مورد نظر پیدا نشد'], 422);
}
$missingFields = [];
$missingFields = [];
if (!$request->has('name') || empty($request->name)) {
$missingFields[] = 'نام';
}
if (!$request->has('name') || empty($request->name)) {
$missingFields[] = 'نام';
}
if (!$request->has('permissions') || empty($request->permissions)) {
$missingFields[] = 'دسترسی';
}
if (!$request->has('permissions') || empty($request->permissions)) {
$missingFields[] = 'دسترسی';
}
if (!empty($missingFields)) {
$message = 'فیلد ' . implode(' و ', $missingFields) . ' اجباری می‌باشد';
return response()->json(['message' => $message], 422);
}
if (!empty($missingFields)) {
$message = 'فیلد ' . implode(' و ', $missingFields) . ' اجباری می‌باشد';
return response()->json(['message' => $message], 422);
}
$role->update([
'name' => $request->name,
'permissions' => $request->permissions ?? [],
]);
$role->update([
'name' => $request->name,
'permissions' => $request->permissions ?? [],
]);
return response()->json(['message' => 'نقش با موفقیت به‌روزرسانی شد', 'role' => $role], 200);
})->name('roles.update');
return response()->json(['message' => 'نقش با موفقیت به‌روزرسانی شد', 'role' => $role], 200);
})->name('roles.update');
Route::delete('/roles/{id}', function ($id) {
$role = Role::find($id);
if (!$role) {
return response()->json(['message' => 'نقش مورد نظر پیدا نشد'], 404);
}
$role->delete();
return response()->json(['message' => 'نقش با موفقیت حذف شد', 'role' => $role], 200);
})->name('roles.destroy');
Route::delete('/roles/{id}', function ($id) {
$role = Role::find($id);
if (!$role) {
return response()->json(['message' => 'نقش مورد نظر پیدا نشد'], 404);
}
$role->delete();
return response()->json(['message' => 'نقش با موفقیت حذف شد', 'role' => $role], 200);
})->name('roles.destroy');
Route::get('/server/admin/me', function (Request $request) {
Route::get('/server/admin/me', function (Request $request) {
$user = \App\Models\User::with('role')->find(2);
$user = \App\Models\User::with('role')->find(2);
return response()->json([
'id' => $user->id,
'name' => $user->name,
'role_id' => $user->role_id,
'permissions' => $user->permissions,
'active' => $user->active,
'super_admin' => $user->super_admin
]);
});
return response()->json([
'id' => $user->id,
'name' => $user->name,
'role_id' => $user->role_id,
'permissions' => $user->permissions,
'active' => $user->active,
'super_admin' => $user->super_admin
]);
});
Route::get('/server/admin/user/{id}', function ($id) {
$user = User::with('role')->find($id);
if (!$user) {
return response()->json(['message' => 'کاربر یافت نشد'], 404);
}
return response()->json([
'id' => $user->id,
'name' => $user->name,
'role_id' => $user->role_id,
'permissions' => $user->role ? $user->role->permissions : [],
'active' => $user->active,
'super_admin' => $user->super_admin,
]);
});
Route::get('/server/admin/user/{id}', function ($id) {
$user = User::with('role')->find($id);
if (!$user) {
return response()->json(['message' => 'کاربر یافت نشد'], 404);
}
return response()->json([
'id' => $user->id,
'name' => $user->name,
'role_id' => $user->role_id,
'permissions' => $user->role ? $user->role->permissions : [],
'active' => $user->active,
'super_admin' => $user->super_admin,
]);
});
});
});

View File

@ -119,6 +119,10 @@ Route::get('/MANDEHnoC', function () {
->get();
return response()->json($pars);
});
Route::get('/gip', function () {
return response()->json($_SERVER['REMOTE_ADDR']);
});
Route::get('/testmogtaba/{id}', function ($id) {
$trigerUrl = Controller::trigerUrl();