From 1d763a3221aa666009520b2c96dcae80625b7adc Mon Sep 17 00:00:00 2001 From: faezehzafarbakhsh Date: Sun, 14 Dec 2025 17:16:42 +0330 Subject: [PATCH 01/54] Write webservice for harim and Cmms --- .env.example | 5 ++ .../Commands/GetMachinesInfoListCommand.php | 1 + app/Enums/HarimStates.php | 7 ++ .../V3/Dashboard/Harim/DetailController.php | 60 +++++++++++++++++ .../Detail/HarimSubmitInvoiceRequest.php | 30 +++++++++ .../Cartables/Harim/HarimPaymentService.php | 65 +++++++++++++++++++ config/harim_web_services.php | 4 ++ ...add_driver_name_to_cmms_machines_table.php | 28 ++++++++ resources/views/version2/dashboard.blade.php | 2 +- 9 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 app/Http/Requests/V3/Dashboard/Harim/Detail/HarimSubmitInvoiceRequest.php create mode 100644 app/Services/Cartables/Harim/HarimPaymentService.php create mode 100644 database/migrations/2025_12_14_103256_add_driver_name_to_cmms_machines_table.php diff --git a/.env.example b/.env.example index 4e0ec85b..8daaa305 100644 --- a/.env.example +++ b/.env.example @@ -50,6 +50,11 @@ PAYMENT_USERNAME= PAYMENT_PASSWORD= PAYMENT_LINK= +HARIM_PAYMENT_USERNAME= +HARIM_PAYMENT_PASSWORD= +HARIM_PAYMENT_URL= +HARIM_PAYMENT_LINK= + RMS_VERSION=3.0 RMS_CTO_PHONE_NUMBER= diff --git a/app/Console/Commands/GetMachinesInfoListCommand.php b/app/Console/Commands/GetMachinesInfoListCommand.php index a11742cd..98ce995f 100644 --- a/app/Console/Commands/GetMachinesInfoListCommand.php +++ b/app/Console/Commands/GetMachinesInfoListCommand.php @@ -57,6 +57,7 @@ class GetMachinesInfoListCommand extends Command 'province_id' => $entry['UnitGroupCode'] ?? null, 'city_id' => $entry['UnitCode'] ?? null, 'station_id' => $entry['Layer3Code'] ?? null, + 'driver_name' => $entry['DriverName'] ?? null, ]); ++$updatedRows; diff --git a/app/Enums/HarimStates.php b/app/Enums/HarimStates.php index 426cb23a..580e2020 100644 --- a/app/Enums/HarimStates.php +++ b/app/Enums/HarimStates.php @@ -21,6 +21,10 @@ enum HarimStates: int case BARESI_ARSE_VA_AYAN_ERSAL_SHODE_TAVASOT_MODIR_KOL = 15; case MOKHALEFAT_BA_DASTGAH = 16; case ETMAM_FARAYAND = 17; + case SODOR_FACTOR = 18; + case PARDAKHT_FACTOR = 19; + case SABT_FISH = 20; + public function label(): string { @@ -42,6 +46,9 @@ enum HarimStates: int self::BARESI_ARSE_VA_AYAN_ERSAL_SHODE_TAVASOT_MODIR_KOL => "تائید عرصه و اعیان ارسال شده توسط مدیر", self::MOKHALEFAT_BA_DASTGAH => "مخالفت با درخواست", self::ETMAM_FARAYAND => "اتمام فرایند", + self::SODOR_FACTOR => "صدور فاکتور", + self::PARDAKHT_FACTOR => "پرداخت فاکتور", + self::SABT_FISH => "ثبت فیش", }; } } \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/Harim/DetailController.php b/app/Http/Controllers/V3/Dashboard/Harim/DetailController.php index 2b63341a..a3a6b019 100644 --- a/app/Http/Controllers/V3/Dashboard/Harim/DetailController.php +++ b/app/Http/Controllers/V3/Dashboard/Harim/DetailController.php @@ -2,12 +2,18 @@ namespace App\Http\Controllers\V3\Dashboard\Harim; +use App\Facades\Sms\Sms; +use App\Enums\HarimStates; use App\Exceptions\ProhibitedAction; use App\Http\Controllers\Controller; +use App\Http\Requests\V3\Dashboard\Harim\Detail\HarimSubmitInvoiceRequest; use App\Http\Traits\ApiResponse; use App\Models\Harim; use App\Models\HarimState; +use App\Services\Cartables\Harim\HarimPaymentService; use Illuminate\Http\JsonResponse; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\DB; use Throwable; class DetailController extends Controller @@ -30,4 +36,58 @@ class DetailController extends Controller ->orderBy('id', 'desc') ->get(['id', 'expert_description', 'action_name', 'previous_state_name'])); } + + /** + * @throws Throwable + * @throws ProhibitedAction + */ + public function submitInvoice(Harim $harim, HarimPaymentService $harimpaymentService, HarimSubmitInvoiceRequest $request): JsonResponse + { + $lock = Cache::lock("harimPayment-{$harim->id}", 10); + throw_if(! $lock->get(), new ProhibitedAction('امکان درخواست مجدد تا 10 ثانیه دیگر وجود ندارد')); + + $payment_amount = $harim->payment_amount; + + $bill_code = $harimpaymentService->invoiceBillApi($harim->national_id, $payment_amount); + + DB::transaction(function () use ($bill_code, $harim) { + + $harim->histories()->update([ +// 'bill_code' => $bill_code, + 'status' => HarimStates::SODOR_FACTOR->value, + 'status_fa' => HarimStates::SODOR_FACTOR->label(), + ]); + + }); + + $msg = "فاکتور با شناسه پرداخت \n" . explode("/", $harim->bill_code)[0]. "\n برای پرداخت از لینک زیر اقدام نمایید.\n\n" + . config('harim_web_services.Harim_Payment.LINK')."/#/pay/".explode("/", $harim->bill_code)[0]."/$payment_amount"; + + Sms::sendSms($harim->phone_number, $msg); + + $lock->release(); + + return $this->successResponse(); + } + + /** + * @throws Throwable + */ + public function checkPaymentStatus(Harim $harim, HarimPaymentService $harimpaymentService): JsonResponse + { + DB::transaction(function () use ($harim, $harimpaymentService) { + + $response = json_decode($harimpaymentService->callPaymentStatusBillApi(explode('/', $harim->bill_code)[0])); + + throw_if(! $response->isPayed, new ProhibitedAction('پرداخت انجام نشده است')); + + $harim->histories()->update([ + 'status' => HarimStates::PARDAKHT_FACTOR->value, + 'status_fa' => HarimStates::PARDAKHT_FACTOR->label(), + ]); + + }); + + return $this->successResponse($harim); + } } diff --git a/app/Http/Requests/V3/Dashboard/Harim/Detail/HarimSubmitInvoiceRequest.php b/app/Http/Requests/V3/Dashboard/Harim/Detail/HarimSubmitInvoiceRequest.php new file mode 100644 index 00000000..4ae854f4 --- /dev/null +++ b/app/Http/Requests/V3/Dashboard/Harim/Detail/HarimSubmitInvoiceRequest.php @@ -0,0 +1,30 @@ +harim->state_id == HarimStates::SABT_FISH->value; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(): array + { + return [ + // + ]; + } +} diff --git a/app/Services/Cartables/Harim/HarimPaymentService.php b/app/Services/Cartables/Harim/HarimPaymentService.php new file mode 100644 index 00000000..9b9a4f69 --- /dev/null +++ b/app/Services/Cartables/Harim/HarimPaymentService.php @@ -0,0 +1,65 @@ + config('harim_web_services.Harim_Payment.username'), + 'password' => config('harim_web_services.Harim_Payment.PASSWORD'), + 'amount' => $payment_amount, + 'serial' => "12345", + 'type' => 1, + 'instanceid' => 123, + 'ownerid' => $national_id, + 'calculationBox' => "{\"rows\":[{\"amount\":" . $payment_amount . ",\"code\":\"7070011026200593\"}]}" + ); + + $response = Http::retry(3, 100)->withBody(http_build_query($payload)) + ->post(config('harim_web_services.Harim_Payment.url')); + + return $response->body(); + + } + catch (\Throwable $th) { + throw new ProhibitedAction('خطا در ارتباط با سرویس پرداخت'); + } + } + return 0; + } + + public function callPaymentStatusBillApi($bill_code) + { + if (App::isProduction()) + { + try { + $username = config('harim_web_services.Harim_Payment.username'); + $password = config('harim_web_services.Harim_Payment.PASSWORD'); + $url = config('harim_web_services.Harim_Payment.url'); + + $result = "{$url}/{$username}/{$password}/{$bill_code}"; + + $response = Http::timeout(10)->get($result); + + + return $response; + } catch (\Throwable $th) { + abort(500); + } + } + return json_encode(['isPayed' => 1]); + } +} diff --git a/config/harim_web_services.php b/config/harim_web_services.php index dc3f4686..6628fe54 100644 --- a/config/harim_web_services.php +++ b/config/harim_web_services.php @@ -38,5 +38,9 @@ return [ 'Harim_Payment' => [ 'fee' => env('HARIM_AMOUNT_FEE'), + 'username' => env('HARIM_ENCRYPTION_USERNAME'), + 'password' => env('HARIM_ENCRYPTION_PASSWORD'), + 'url' => env('HARIM_ENCRYPTION_URL'), + 'LINK' => env('HARIM_ENCRYPTION_LINK'), ] ]; diff --git a/database/migrations/2025_12_14_103256_add_driver_name_to_cmms_machines_table.php b/database/migrations/2025_12_14_103256_add_driver_name_to_cmms_machines_table.php new file mode 100644 index 00000000..80699afb --- /dev/null +++ b/database/migrations/2025_12_14_103256_add_driver_name_to_cmms_machines_table.php @@ -0,0 +1,28 @@ +string('driver_name')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('cmms_machines', function (Blueprint $table) { + $table->dropColumn('driver_name'); + }); + } +}; diff --git a/resources/views/version2/dashboard.blade.php b/resources/views/version2/dashboard.blade.php index 92a36e6c..bf8b5ac9 100644 --- a/resources/views/version2/dashboard.blade.php +++ b/resources/views/version2/dashboard.blade.php @@ -19,7 +19,7 @@ رسیدگی به شکایات واکنش سریع @endcan @can('add-safety-and-privacy') - ثبت نگهداری حریم راه + ثبت نگهداری حریم راه @endcan @endsection -- 2.49.1 From 71a0fe976937b579f3c7f8410ce0c58e7b036a59 Mon Sep 17 00:00:00 2001 From: faezehzafarbakhsh Date: Mon, 15 Dec 2025 12:03:15 +0330 Subject: [PATCH 02/54] improve service --- .env.example | 4 +++- .../TransportaionUnit/AllocateRequest.php | 6 +++--- .../Cartables/Harim/HarimPaymentService.php | 18 ++++++++++-------- config/harim_web_services.php | 3 ++- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/.env.example b/.env.example index 8daaa305..f9adb344 100644 --- a/.env.example +++ b/.env.example @@ -53,7 +53,9 @@ PAYMENT_LINK= HARIM_PAYMENT_USERNAME= HARIM_PAYMENT_PASSWORD= HARIM_PAYMENT_URL= -HARIM_PAYMENT_LINK= +HARIM_PAYMENT_SERIAL= +HARIM_PAYMENT_INSTANCE_ID= + RMS_VERSION=3.0 RMS_CTO_PHONE_NUMBER= diff --git a/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php index d5cc2956..de093022 100644 --- a/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php +++ b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php @@ -36,13 +36,13 @@ class AllocateRequest extends FormRequest return [ function (Validator $validator) { $duplicateMission = Mission::query()->where('machine_id', '=', $this->machine_id) - ->whereBetween('start_date', [$this->mission->start_date, $this->mission->end_date]) - ->orWhereBetween('end_date', [$this->mission->start_date, $this->mission->end_date]) + ->where('start_date', '<=', $this->mission->end_date) + ->where('end_date', '>=', $this->mission->start_date) ->exists(); if ($duplicateMission) { $validator->errors()->add( - 'machine', + 'machine_id', 'خودروی مورد نظر در این زمان رزرو می باشد' ); } diff --git a/app/Services/Cartables/Harim/HarimPaymentService.php b/app/Services/Cartables/Harim/HarimPaymentService.php index 9b9a4f69..ef78b702 100644 --- a/app/Services/Cartables/Harim/HarimPaymentService.php +++ b/app/Services/Cartables/Harim/HarimPaymentService.php @@ -21,14 +21,16 @@ class HarimPaymentService 'username' => config('harim_web_services.Harim_Payment.username'), 'password' => config('harim_web_services.Harim_Payment.PASSWORD'), 'amount' => $payment_amount, - 'serial' => "12345", + 'serial' => config('harim_web_services.Harim_Payment.serial'), 'type' => 1, - 'instanceid' => 123, + 'instanceid' => config('harim_web_services.Harim_Payment.instanceid'), 'ownerid' => $national_id, 'calculationBox' => "{\"rows\":[{\"amount\":" . $payment_amount . ",\"code\":\"7070011026200593\"}]}" ); - $response = Http::retry(3, 100)->withBody(http_build_query($payload)) + $response = Http::withBody(http_build_query($payload)) + ->throw() + ->withoutVerifying() ->post(config('harim_web_services.Harim_Payment.url')); return $response->body(); @@ -52,12 +54,12 @@ class HarimPaymentService $result = "{$url}/{$username}/{$password}/{$bill_code}"; - $response = Http::timeout(10)->get($result); + return Http::get($result) + ->throw() + ->body(); - - return $response; - } catch (\Throwable $th) { - abort(500); + }catch (\Throwable $th) { + throw new ProhibitedAction('خطا در دریافت'); } } return json_encode(['isPayed' => 1]); diff --git a/config/harim_web_services.php b/config/harim_web_services.php index 6628fe54..8c377bf0 100644 --- a/config/harim_web_services.php +++ b/config/harim_web_services.php @@ -41,6 +41,7 @@ return [ 'username' => env('HARIM_ENCRYPTION_USERNAME'), 'password' => env('HARIM_ENCRYPTION_PASSWORD'), 'url' => env('HARIM_ENCRYPTION_URL'), - 'LINK' => env('HARIM_ENCRYPTION_LINK'), + 'serial' => env('HARIM_ENCRYPTION_SERIAL'), + 'instanceid' => env('HARIM_ENCRYPTION_INSTANCE_ID'), ] ]; -- 2.49.1 From 0a2df262e1356da7e87ebdd761d785086bb5f472 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 20 Dec 2025 11:36:14 +0330 Subject: [PATCH 03/54] debug --- app/Enums/MissionViolationStatus.php | 17 +++++++++++ .../Mission/RequestPortalController.php | 5 ++++ .../Mission/ViolationManagementController.php | 24 ++++++++++------ app/Http/Controllers/V3/ProfileController.php | 1 + ...024_12_11_110000_create_rahdaran_table.php | 2 +- ...add_column_to_mission_violations_table.php | 28 +++++++++++++++++++ routes/v3.php | 1 + 7 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 app/Enums/MissionViolationStatus.php create mode 100644 database/migrations/2025_12_20_103013_add_column_to_mission_violations_table.php diff --git a/app/Enums/MissionViolationStatus.php b/app/Enums/MissionViolationStatus.php new file mode 100644 index 00000000..9124e2e9 --- /dev/null +++ b/app/Enums/MissionViolationStatus.php @@ -0,0 +1,17 @@ + "بدون اقدام", + self::EGHDAM_SHODE => "اقدام شده", + }; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index adf24fe7..b35a66e6 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -94,6 +94,11 @@ class RequestPortalController extends Controller 'state_name' => MissionStates::name(MissionStates::END_MISSION->value), ]); + if ($mission->category_id == 2) { + $rpc = new OperatorController; + $rpc->store($mission); + } + $state = MissionStates::START_MISSION->value; $category = $request->category_id; $machine = CMMSMachine::query()->find($request->machine_id); diff --git a/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php b/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php index 4e6e95ad..7da66744 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php @@ -10,12 +10,15 @@ use App\Http\Controllers\Controller; use App\Http\Controllers\V3\Dashboard\RoadPatrol\OperatorController; use App\Http\Requests\V3\Mission\RequestPortal\NoProcessRequest; use App\Http\Traits\ApiResponse; +use App\Models\CMMSMachine; use App\Models\Mission; +use App\Models\MissionViolation; use App\Services\Cartables\Mission\DailyMoveMachineService; use Carbon\Carbon; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; +use Throwable; class ViolationManagementController extends Controller { @@ -28,9 +31,12 @@ class ViolationManagementController extends Controller return response()->json($data); } - public function noProcess(NoProcessRequest $request): JsonResponse + /** + * @throws Throwable + */ + public function noProcess(NoProcessRequest $request, MissionViolation $violation): JsonResponse { - DB::transaction(function () use ($request) { + DB::transaction(function () use ($request, $violation) { $start = Carbon::parse($request->start_date); $end = Carbon::parse($request->end_date); @@ -38,6 +44,7 @@ class ViolationManagementController extends Controller $user = auth()->user(); $zone = $request->zone; $state = MissionStates::END_MISSION->value; + $machine = CMMSMachine::query()->where('machine_code', '=', $violation->machine_code)->first(['id', 'machine_code']); $mission = Mission::query()->create([ 'user_id' => $user->id, @@ -50,22 +57,23 @@ class ViolationManagementController extends Controller 'zone_fa' => MissionZones::name($zone), 'type' => $type, 'type_fa' => MissionTypes::name($type), - 'start_date' => $request->start_date, - 'end_date' => $request->end_date, + 'start_date' => $request->start_date,// + 'end_date' => $request->end_date,// 'end_point' => $request->end_point, - 'area' => json_encode($request->area), + 'area' => json_encode($request->area),// 'category_id' => $request->category_id, 'category_name' => MissionCategory::name($request->category_id), - 'start_time' => $request->start_date, - 'finish_time' => $request->end_date, + 'start_time' => $request->start_date,// + 'finish_time' => $request->end_date,// 'state_id' => $state, 'state_name' => MissionStates::name($state), 'explanation' => $request->explanation, 'request_date' => now(), + 'machine_id' => $machine->id,// + 'machine_code' => $machine->machine_code,// ]); $mission->rahdaran()->sync($request->rahdaran); - $mission->machines()->attach($request->machines); $mission->rahdaran()->attach($request->driver, ['is_driver' => true]); if ($mission->category_id == 2) { diff --git a/app/Http/Controllers/V3/ProfileController.php b/app/Http/Controllers/V3/ProfileController.php index ab0eed0f..7dc9a448 100644 --- a/app/Http/Controllers/V3/ProfileController.php +++ b/app/Http/Controllers/V3/ProfileController.php @@ -31,6 +31,7 @@ class ProfileController extends Controller 'degree' => $user->degree, 'mobile' => $user->mobile, 'province_id' => $user->province_id, + 'city_id' => $user->city_id, 'avatar' => $user->avatarUrl(), ]); } diff --git a/database/migrations/2024_12_11_110000_create_rahdaran_table.php b/database/migrations/2024_12_11_110000_create_rahdaran_table.php index 615a1d74..32366a54 100644 --- a/database/migrations/2024_12_11_110000_create_rahdaran_table.php +++ b/database/migrations/2024_12_11_110000_create_rahdaran_table.php @@ -14,7 +14,7 @@ return new class extends Migration Schema::create('rahdaran', function (Blueprint $table) { $table->id(); $table->string('name'); - $table->string('code'); + $table->string('code')->nullable(); $table->timestamps(); }); } diff --git a/database/migrations/2025_12_20_103013_add_column_to_mission_violations_table.php b/database/migrations/2025_12_20_103013_add_column_to_mission_violations_table.php new file mode 100644 index 00000000..23c1457f --- /dev/null +++ b/database/migrations/2025_12_20_103013_add_column_to_mission_violations_table.php @@ -0,0 +1,28 @@ +smallInteger('status')->default(0); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('mission_violations', function (Blueprint $table) { + $table->dropColumn('status'); + }); + } +}; diff --git a/routes/v3.php b/routes/v3.php index 01351520..4bab477b 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -526,6 +526,7 @@ Route::prefix('missions') ->controller(ViolationManagementController::class) ->group(function () { Route::get('/', 'index')->name('index'); + Route::post('/no_process','noProcess')->name('noProcess'); }); }); -- 2.49.1 From 175b0fb6c7720db2572f8b57d16a565c8e43c72a Mon Sep 17 00:00:00 2001 From: faezehzafarbakhsh Date: Sun, 14 Dec 2025 17:16:42 +0330 Subject: [PATCH 04/54] Write webservice for harim and Cmms --- .env.example | 5 ++ .../Commands/GetMachinesInfoListCommand.php | 1 + app/Enums/HarimStates.php | 7 ++ .../V3/Dashboard/Harim/DetailController.php | 60 +++++++++++++++++ .../Detail/HarimSubmitInvoiceRequest.php | 30 +++++++++ .../Cartables/Harim/HarimPaymentService.php | 65 +++++++++++++++++++ config/harim_web_services.php | 4 ++ ...add_driver_name_to_cmms_machines_table.php | 28 ++++++++ resources/views/version2/dashboard.blade.php | 2 +- 9 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 app/Http/Requests/V3/Dashboard/Harim/Detail/HarimSubmitInvoiceRequest.php create mode 100644 app/Services/Cartables/Harim/HarimPaymentService.php create mode 100644 database/migrations/2025_12_14_103256_add_driver_name_to_cmms_machines_table.php diff --git a/.env.example b/.env.example index 4e0ec85b..8daaa305 100644 --- a/.env.example +++ b/.env.example @@ -50,6 +50,11 @@ PAYMENT_USERNAME= PAYMENT_PASSWORD= PAYMENT_LINK= +HARIM_PAYMENT_USERNAME= +HARIM_PAYMENT_PASSWORD= +HARIM_PAYMENT_URL= +HARIM_PAYMENT_LINK= + RMS_VERSION=3.0 RMS_CTO_PHONE_NUMBER= diff --git a/app/Console/Commands/GetMachinesInfoListCommand.php b/app/Console/Commands/GetMachinesInfoListCommand.php index a11742cd..98ce995f 100644 --- a/app/Console/Commands/GetMachinesInfoListCommand.php +++ b/app/Console/Commands/GetMachinesInfoListCommand.php @@ -57,6 +57,7 @@ class GetMachinesInfoListCommand extends Command 'province_id' => $entry['UnitGroupCode'] ?? null, 'city_id' => $entry['UnitCode'] ?? null, 'station_id' => $entry['Layer3Code'] ?? null, + 'driver_name' => $entry['DriverName'] ?? null, ]); ++$updatedRows; diff --git a/app/Enums/HarimStates.php b/app/Enums/HarimStates.php index 426cb23a..580e2020 100644 --- a/app/Enums/HarimStates.php +++ b/app/Enums/HarimStates.php @@ -21,6 +21,10 @@ enum HarimStates: int case BARESI_ARSE_VA_AYAN_ERSAL_SHODE_TAVASOT_MODIR_KOL = 15; case MOKHALEFAT_BA_DASTGAH = 16; case ETMAM_FARAYAND = 17; + case SODOR_FACTOR = 18; + case PARDAKHT_FACTOR = 19; + case SABT_FISH = 20; + public function label(): string { @@ -42,6 +46,9 @@ enum HarimStates: int self::BARESI_ARSE_VA_AYAN_ERSAL_SHODE_TAVASOT_MODIR_KOL => "تائید عرصه و اعیان ارسال شده توسط مدیر", self::MOKHALEFAT_BA_DASTGAH => "مخالفت با درخواست", self::ETMAM_FARAYAND => "اتمام فرایند", + self::SODOR_FACTOR => "صدور فاکتور", + self::PARDAKHT_FACTOR => "پرداخت فاکتور", + self::SABT_FISH => "ثبت فیش", }; } } \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/Harim/DetailController.php b/app/Http/Controllers/V3/Dashboard/Harim/DetailController.php index 2b63341a..a3a6b019 100644 --- a/app/Http/Controllers/V3/Dashboard/Harim/DetailController.php +++ b/app/Http/Controllers/V3/Dashboard/Harim/DetailController.php @@ -2,12 +2,18 @@ namespace App\Http\Controllers\V3\Dashboard\Harim; +use App\Facades\Sms\Sms; +use App\Enums\HarimStates; use App\Exceptions\ProhibitedAction; use App\Http\Controllers\Controller; +use App\Http\Requests\V3\Dashboard\Harim\Detail\HarimSubmitInvoiceRequest; use App\Http\Traits\ApiResponse; use App\Models\Harim; use App\Models\HarimState; +use App\Services\Cartables\Harim\HarimPaymentService; use Illuminate\Http\JsonResponse; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\DB; use Throwable; class DetailController extends Controller @@ -30,4 +36,58 @@ class DetailController extends Controller ->orderBy('id', 'desc') ->get(['id', 'expert_description', 'action_name', 'previous_state_name'])); } + + /** + * @throws Throwable + * @throws ProhibitedAction + */ + public function submitInvoice(Harim $harim, HarimPaymentService $harimpaymentService, HarimSubmitInvoiceRequest $request): JsonResponse + { + $lock = Cache::lock("harimPayment-{$harim->id}", 10); + throw_if(! $lock->get(), new ProhibitedAction('امکان درخواست مجدد تا 10 ثانیه دیگر وجود ندارد')); + + $payment_amount = $harim->payment_amount; + + $bill_code = $harimpaymentService->invoiceBillApi($harim->national_id, $payment_amount); + + DB::transaction(function () use ($bill_code, $harim) { + + $harim->histories()->update([ +// 'bill_code' => $bill_code, + 'status' => HarimStates::SODOR_FACTOR->value, + 'status_fa' => HarimStates::SODOR_FACTOR->label(), + ]); + + }); + + $msg = "فاکتور با شناسه پرداخت \n" . explode("/", $harim->bill_code)[0]. "\n برای پرداخت از لینک زیر اقدام نمایید.\n\n" + . config('harim_web_services.Harim_Payment.LINK')."/#/pay/".explode("/", $harim->bill_code)[0]."/$payment_amount"; + + Sms::sendSms($harim->phone_number, $msg); + + $lock->release(); + + return $this->successResponse(); + } + + /** + * @throws Throwable + */ + public function checkPaymentStatus(Harim $harim, HarimPaymentService $harimpaymentService): JsonResponse + { + DB::transaction(function () use ($harim, $harimpaymentService) { + + $response = json_decode($harimpaymentService->callPaymentStatusBillApi(explode('/', $harim->bill_code)[0])); + + throw_if(! $response->isPayed, new ProhibitedAction('پرداخت انجام نشده است')); + + $harim->histories()->update([ + 'status' => HarimStates::PARDAKHT_FACTOR->value, + 'status_fa' => HarimStates::PARDAKHT_FACTOR->label(), + ]); + + }); + + return $this->successResponse($harim); + } } diff --git a/app/Http/Requests/V3/Dashboard/Harim/Detail/HarimSubmitInvoiceRequest.php b/app/Http/Requests/V3/Dashboard/Harim/Detail/HarimSubmitInvoiceRequest.php new file mode 100644 index 00000000..4ae854f4 --- /dev/null +++ b/app/Http/Requests/V3/Dashboard/Harim/Detail/HarimSubmitInvoiceRequest.php @@ -0,0 +1,30 @@ +harim->state_id == HarimStates::SABT_FISH->value; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(): array + { + return [ + // + ]; + } +} diff --git a/app/Services/Cartables/Harim/HarimPaymentService.php b/app/Services/Cartables/Harim/HarimPaymentService.php new file mode 100644 index 00000000..9b9a4f69 --- /dev/null +++ b/app/Services/Cartables/Harim/HarimPaymentService.php @@ -0,0 +1,65 @@ + config('harim_web_services.Harim_Payment.username'), + 'password' => config('harim_web_services.Harim_Payment.PASSWORD'), + 'amount' => $payment_amount, + 'serial' => "12345", + 'type' => 1, + 'instanceid' => 123, + 'ownerid' => $national_id, + 'calculationBox' => "{\"rows\":[{\"amount\":" . $payment_amount . ",\"code\":\"7070011026200593\"}]}" + ); + + $response = Http::retry(3, 100)->withBody(http_build_query($payload)) + ->post(config('harim_web_services.Harim_Payment.url')); + + return $response->body(); + + } + catch (\Throwable $th) { + throw new ProhibitedAction('خطا در ارتباط با سرویس پرداخت'); + } + } + return 0; + } + + public function callPaymentStatusBillApi($bill_code) + { + if (App::isProduction()) + { + try { + $username = config('harim_web_services.Harim_Payment.username'); + $password = config('harim_web_services.Harim_Payment.PASSWORD'); + $url = config('harim_web_services.Harim_Payment.url'); + + $result = "{$url}/{$username}/{$password}/{$bill_code}"; + + $response = Http::timeout(10)->get($result); + + + return $response; + } catch (\Throwable $th) { + abort(500); + } + } + return json_encode(['isPayed' => 1]); + } +} diff --git a/config/harim_web_services.php b/config/harim_web_services.php index dc3f4686..6628fe54 100644 --- a/config/harim_web_services.php +++ b/config/harim_web_services.php @@ -38,5 +38,9 @@ return [ 'Harim_Payment' => [ 'fee' => env('HARIM_AMOUNT_FEE'), + 'username' => env('HARIM_ENCRYPTION_USERNAME'), + 'password' => env('HARIM_ENCRYPTION_PASSWORD'), + 'url' => env('HARIM_ENCRYPTION_URL'), + 'LINK' => env('HARIM_ENCRYPTION_LINK'), ] ]; diff --git a/database/migrations/2025_12_14_103256_add_driver_name_to_cmms_machines_table.php b/database/migrations/2025_12_14_103256_add_driver_name_to_cmms_machines_table.php new file mode 100644 index 00000000..80699afb --- /dev/null +++ b/database/migrations/2025_12_14_103256_add_driver_name_to_cmms_machines_table.php @@ -0,0 +1,28 @@ +string('driver_name')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('cmms_machines', function (Blueprint $table) { + $table->dropColumn('driver_name'); + }); + } +}; diff --git a/resources/views/version2/dashboard.blade.php b/resources/views/version2/dashboard.blade.php index 92a36e6c..bf8b5ac9 100644 --- a/resources/views/version2/dashboard.blade.php +++ b/resources/views/version2/dashboard.blade.php @@ -19,7 +19,7 @@ رسیدگی به شکایات واکنش سریع @endcan @can('add-safety-and-privacy') - ثبت نگهداری حریم راه + ثبت نگهداری حریم راه @endcan @endsection -- 2.49.1 From 5d3d2bd973c202e4db6e28f701c87abb1bd4ca06 Mon Sep 17 00:00:00 2001 From: faezehzafarbakhsh Date: Mon, 15 Dec 2025 12:03:15 +0330 Subject: [PATCH 05/54] improve service --- .env.example | 4 +++- .../TransportaionUnit/AllocateRequest.php | 6 +++--- .../Cartables/Harim/HarimPaymentService.php | 18 ++++++++++-------- config/harim_web_services.php | 3 ++- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/.env.example b/.env.example index 8daaa305..f9adb344 100644 --- a/.env.example +++ b/.env.example @@ -53,7 +53,9 @@ PAYMENT_LINK= HARIM_PAYMENT_USERNAME= HARIM_PAYMENT_PASSWORD= HARIM_PAYMENT_URL= -HARIM_PAYMENT_LINK= +HARIM_PAYMENT_SERIAL= +HARIM_PAYMENT_INSTANCE_ID= + RMS_VERSION=3.0 RMS_CTO_PHONE_NUMBER= diff --git a/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php index d5cc2956..de093022 100644 --- a/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php +++ b/app/Http/Requests/V3/Mission/TransportaionUnit/AllocateRequest.php @@ -36,13 +36,13 @@ class AllocateRequest extends FormRequest return [ function (Validator $validator) { $duplicateMission = Mission::query()->where('machine_id', '=', $this->machine_id) - ->whereBetween('start_date', [$this->mission->start_date, $this->mission->end_date]) - ->orWhereBetween('end_date', [$this->mission->start_date, $this->mission->end_date]) + ->where('start_date', '<=', $this->mission->end_date) + ->where('end_date', '>=', $this->mission->start_date) ->exists(); if ($duplicateMission) { $validator->errors()->add( - 'machine', + 'machine_id', 'خودروی مورد نظر در این زمان رزرو می باشد' ); } diff --git a/app/Services/Cartables/Harim/HarimPaymentService.php b/app/Services/Cartables/Harim/HarimPaymentService.php index 9b9a4f69..ef78b702 100644 --- a/app/Services/Cartables/Harim/HarimPaymentService.php +++ b/app/Services/Cartables/Harim/HarimPaymentService.php @@ -21,14 +21,16 @@ class HarimPaymentService 'username' => config('harim_web_services.Harim_Payment.username'), 'password' => config('harim_web_services.Harim_Payment.PASSWORD'), 'amount' => $payment_amount, - 'serial' => "12345", + 'serial' => config('harim_web_services.Harim_Payment.serial'), 'type' => 1, - 'instanceid' => 123, + 'instanceid' => config('harim_web_services.Harim_Payment.instanceid'), 'ownerid' => $national_id, 'calculationBox' => "{\"rows\":[{\"amount\":" . $payment_amount . ",\"code\":\"7070011026200593\"}]}" ); - $response = Http::retry(3, 100)->withBody(http_build_query($payload)) + $response = Http::withBody(http_build_query($payload)) + ->throw() + ->withoutVerifying() ->post(config('harim_web_services.Harim_Payment.url')); return $response->body(); @@ -52,12 +54,12 @@ class HarimPaymentService $result = "{$url}/{$username}/{$password}/{$bill_code}"; - $response = Http::timeout(10)->get($result); + return Http::get($result) + ->throw() + ->body(); - - return $response; - } catch (\Throwable $th) { - abort(500); + }catch (\Throwable $th) { + throw new ProhibitedAction('خطا در دریافت'); } } return json_encode(['isPayed' => 1]); diff --git a/config/harim_web_services.php b/config/harim_web_services.php index 6628fe54..8c377bf0 100644 --- a/config/harim_web_services.php +++ b/config/harim_web_services.php @@ -41,6 +41,7 @@ return [ 'username' => env('HARIM_ENCRYPTION_USERNAME'), 'password' => env('HARIM_ENCRYPTION_PASSWORD'), 'url' => env('HARIM_ENCRYPTION_URL'), - 'LINK' => env('HARIM_ENCRYPTION_LINK'), + 'serial' => env('HARIM_ENCRYPTION_SERIAL'), + 'instanceid' => env('HARIM_ENCRYPTION_INSTANCE_ID'), ] ]; -- 2.49.1 From e435aa83721c1e0c2af3c8236b60f0e925fe8765 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 20 Dec 2025 15:52:57 +0330 Subject: [PATCH 06/54] create no process --- app/Enums/MissionViolationStatus.php | 2 +- app/Enums/MissionViolationType.php | 2 +- .../V3/Dashboard/Mission/ViolationManagementController.php | 2 ++ .../Requests/V3/Mission/RequestPortal/NoProcessRequest.php | 4 +--- app/Services/Cartables/Mission/DailyMoveMachineService.php | 2 +- routes/v3.php | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/Enums/MissionViolationStatus.php b/app/Enums/MissionViolationStatus.php index 9124e2e9..68c75118 100644 --- a/app/Enums/MissionViolationStatus.php +++ b/app/Enums/MissionViolationStatus.php @@ -5,7 +5,7 @@ namespace App\Enums; enum MissionViolationStatus: int { case BEDON_EGHDAM = 0; - case EGHDAM_SHODE = 2; + case EGHDAM_SHODE = 1; public function label(): string { diff --git a/app/Enums/MissionViolationType.php b/app/Enums/MissionViolationType.php index e9c55b0c..1969841f 100644 --- a/app/Enums/MissionViolationType.php +++ b/app/Enums/MissionViolationType.php @@ -10,7 +10,7 @@ enum MissionViolationType: int public function label(): string { return match ($this) { - self::KHOROJ_BEDONE_MOGAVEZ => "خروج بدون مجوز ", + self::KHOROJ_BEDONE_MOGAVEZ => "خروج بدون مجوز", self::ADAM_TAHAROK => "عدم تحرک", }; } diff --git a/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php b/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php index 7da66744..d4b49d7b 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php @@ -76,6 +76,8 @@ class ViolationManagementController extends Controller $mission->rahdaran()->sync($request->rahdaran); $mission->rahdaran()->attach($request->driver, ['is_driver' => true]); + $violation->update(['status' => 1]); + if ($mission->category_id == 2) { $rpc = new OperatorController; $rpc->store($mission); diff --git a/app/Http/Requests/V3/Mission/RequestPortal/NoProcessRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/NoProcessRequest.php index 9531a82b..5437dca1 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/NoProcessRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/NoProcessRequest.php @@ -12,7 +12,7 @@ class NoProcessRequest extends FormRequest */ public function authorize(): bool { - return true; + return $this->violation->status === 0 && $this->violation->type === 1; } /** @@ -25,8 +25,6 @@ class NoProcessRequest extends FormRequest return [ 'rahdaran' => 'array', 'rahdaran.*' => 'exists:rahdaran,id', - 'machines' => 'required|array', - 'machines.*' => 'required|integer|exists:cmms_machines,id', 'driver' => 'required|integer|exists:rahdaran,id', 'zone' => 'required|in:1,2,3', 'start_date' => 'required|date', diff --git a/app/Services/Cartables/Mission/DailyMoveMachineService.php b/app/Services/Cartables/Mission/DailyMoveMachineService.php index c074fba6..bed5ddd4 100644 --- a/app/Services/Cartables/Mission/DailyMoveMachineService.php +++ b/app/Services/Cartables/Mission/DailyMoveMachineService.php @@ -15,7 +15,7 @@ class DailyMoveMachineService $request, allowedFilters: ['*'], allowedSortings: ['*'], - allowedSelects: ['id', 'mission_id', 'machine_code', 'request_date', 'type', 'exit_time', 'enter_time'] + allowedSelects: ['id', 'mission_id', 'machine_code', 'request_date', 'type', 'exit_time', 'enter_time', 'status'] ); } } diff --git a/routes/v3.php b/routes/v3.php index 4bab477b..2b3774a5 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -526,7 +526,7 @@ Route::prefix('missions') ->controller(ViolationManagementController::class) ->group(function () { Route::get('/', 'index')->name('index'); - Route::post('/no_process','noProcess')->name('noProcess'); + Route::post('/no_process/{violation}','noProcess')->name('noProcess'); }); }); -- 2.49.1 From 053d0cdb966167e501d1fbd4cc8ac3f59ae7ee3a Mon Sep 17 00:00:00 2001 From: faezehzafarbakhsh Date: Sat, 20 Dec 2025 16:00:55 +0330 Subject: [PATCH 07/54] create new report --- app/Enums/CmmsMachineStatus.php | 8 ++ .../V3/Dashboard/Mission/ReportController.php | 58 ++++++++++ .../Cartables/Mission/ReportService.php | 103 ++++++++++++++++++ routes/v3.php | 9 ++ 4 files changed, 178 insertions(+) create mode 100644 app/Http/Controllers/V3/Dashboard/Mission/ReportController.php create mode 100644 app/Services/Cartables/Mission/ReportService.php diff --git a/app/Enums/CmmsMachineStatus.php b/app/Enums/CmmsMachineStatus.php index b679da8f..f8539109 100644 --- a/app/Enums/CmmsMachineStatus.php +++ b/app/Enums/CmmsMachineStatus.php @@ -7,6 +7,10 @@ enum CmmsMachineStatus: int case AMADE= 1; case RESERVE = 2; case DAR_MAMORIAT = 3; + case KHAREGE_AZ_RADE = 4; + case DAR_TAMIR = 5 ; + case FOROKHTEH_SHODE = 6; + case NIZE_BE_TAMIR =7 ; public function label(): string { @@ -14,6 +18,10 @@ enum CmmsMachineStatus: int self::AMADE => 'آماده', self::RESERVE => 'رزرو', self::DAR_MAMORIAT => 'در ماموریت', + self::KHAREGE_AZ_RADE => 'خارج از محدوده', + self::DAR_TAMIR => 'در تعمیر', + self::FOROKHTEH_SHODE => ' فروخته شده', + self::NIZE_BE_TAMIR => 'نیاز به تعمیر', }; } } \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/Mission/ReportController.php b/app/Http/Controllers/V3/Dashboard/Mission/ReportController.php new file mode 100644 index 00000000..6685b30c --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/Mission/ReportController.php @@ -0,0 +1,58 @@ +successResponse([ + 'activities' => $reportrService->countryActivity($request), + 'provinces' => Province::all(['id', 'name_fa']), + ]); + } + +// public function provinceActivity(Request $request, OperatorService $operatorService): JsonResponse +// { +// +// $data = $operatorService->provinceActivity( +// $request, +// 90, +// ); +// +// return $this->successResponse([ +// 'activities' => $data, +// 'edarateShahri' => EdarateShahri::where('province_id', $request->province_id)->get(['id', 'name_fa']), +// ]); +// } +// +// public function countryExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse +// { +// $data = $operatorService->countryActivity(90, $request); +// $name = 'گزارش نگهداری حریم راه برای راه دسترسی غیر مجاز '.verta()->now()->format('Y-m-d H-i').'.xlsx'; +// +// return Excel::download(new ExcelReport($data), $name); +// } +// +// public function provinceExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse +// { +// $data = $operatorService->provinceActivity( +// $request, +// 90, +// ); +// $name = 'گزارش نگهداری حریم راه برای راه دسترسی غیر مجاز '.verta()->now()->format('Y-m-d H-i').'.xlsx'; +// +// return Excel::download(new AccessRoadReport($data, $request), $name); +// } +} diff --git a/app/Services/Cartables/Mission/ReportService.php b/app/Services/Cartables/Mission/ReportService.php new file mode 100644 index 00000000..03808c9a --- /dev/null +++ b/app/Services/Cartables/Mission/ReportService.php @@ -0,0 +1,103 @@ +user(); + + throw_if(is_null($user->edarate_shahri_id), new ProhibitedAction('اداره ای برای شما در سامانه ثبت نشده است!')); + + $query = Mission::query()->where('edare_shahri_id', '=', $user->edarate_shahri_id); + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + ); + } + + public function countryActivity(Request $request): array + { + $from = null; + $to = null; + + $filters = json_decode($request->filters ?? '[]', true); + + foreach ($filters as $filter) { + if (($filter['fn'] ?? null) === 'between' && ($filter['id'] ?? null) === 'created_at') { + $from = ($filter['value'][0] ?? null) ? ($filter['value'][0] . ' 00:00:00') : null; + $to = ($filter['value'][1] ?? null) ? ($filter['value'][1] . ' 23:59:59') : null; + break; + } + } + + $from ??= '1970-01-01 00:00:00'; + $to ??= now()->endOfDay()->toDateTimeString(); + + $sql = " + WITH r AS ( + SELECT + p.id, + p.name_fa AS province_name, + + COUNT(DISTINCT CASE + WHEN mv.type = 1 + AND mv.created_at BETWEEN :from AND :to + THEN mv.id + END) AS no_mission_count, + + COUNT(DISTINCT CASE + WHEN m.mission_duration != m.in_area_duration + AND m.created_at BETWEEN :from AND :to + THEN m.id + END) AS out_of_area_count + + FROM provinces p + LEFT JOIN cmms_machines cm + ON cm.province_id = p.id + LEFT JOIN mission_violations mv + ON TRIM(cm.machine_code) = TRIM(mv.machine_code) + LEFT JOIN missions m + ON m.province_id = p.id + + GROUP BY p.id, p.name_fa + ) + + SELECT + 'کل کشور' AS province_name, + SUM(no_mission_count) AS no_mission_count, + SUM(out_of_area_count) AS out_of_area_count + FROM r + + UNION ALL + + SELECT + province_name, no_mission_count, out_of_area_count + FROM r + + ORDER BY + CASE WHEN province_name = 'کل کشور' THEN 0 ELSE 1 END, + province_name + "; + + return DB::select($sql, [ + 'from' => $from, + 'to' => $to, + ]); + } + + public function provinceActivity(Request $request, int $info_id): array + { + // + } +} \ No newline at end of file diff --git a/routes/v3.php b/routes/v3.php index 01351520..e076ffde 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -527,6 +527,15 @@ Route::prefix('missions') ->group(function () { Route::get('/', 'index')->name('index'); }); + Route::prefix('report') + ->name('reports.') + ->controller(\App\Http\Controllers\V3\Dashboard\Mission\ReportController::class) + ->group(function () { + Route::get('/country_activity', 'countryActivity')->name('countryActivity'); + Route::get('/province_activity', 'provinceActivity')->name('provinceActivity'); + Route::get('/country_excel_activity', 'countryExcelActivity')->name('countryExcelActivity'); + Route::get('/province_excel_activity', 'provinceExcelActivity')->name('provinceExcelActivity'); + }); }); Route::prefix('harim') -- 2.49.1 From 2c843eaeabe4c6a26266285ff8be068a711272fc Mon Sep 17 00:00:00 2001 From: faezehzafarbakhsh Date: Sun, 21 Dec 2025 09:02:03 +0330 Subject: [PATCH 08/54] fix time --- .../Cartables/Mission/ReportService.php | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/app/Services/Cartables/Mission/ReportService.php b/app/Services/Cartables/Mission/ReportService.php index 03808c9a..1a50d4a6 100644 --- a/app/Services/Cartables/Mission/ReportService.php +++ b/app/Services/Cartables/Mission/ReportService.php @@ -28,21 +28,8 @@ class ReportService public function countryActivity(Request $request): array { - $from = null; - $to = null; - - $filters = json_decode($request->filters ?? '[]', true); - - foreach ($filters as $filter) { - if (($filter['fn'] ?? null) === 'between' && ($filter['id'] ?? null) === 'created_at') { - $from = ($filter['value'][0] ?? null) ? ($filter['value'][0] . ' 00:00:00') : null; - $to = ($filter['value'][1] ?? null) ? ($filter['value'][1] . ' 23:59:59') : null; - break; - } - } - - $from ??= '1970-01-01 00:00:00'; - $to ??= now()->endOfDay()->toDateTimeString(); + $from = $request->from_date ?? today()->startOfDay(); + $to = $request->to_date ?? today()->endOfDay(); $sql = " WITH r AS ( @@ -96,7 +83,7 @@ class ReportService ]); } - public function provinceActivity(Request $request, int $info_id): array + public function provinceActivity(Request $request, int $info_id) { // } -- 2.49.1 From 7ba3d531555b956a80b1bb77e55af89c809bb879 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sun, 21 Dec 2025 15:15:24 +0330 Subject: [PATCH 09/54] add web service --- .../Mission/ControlUnitController.php | 20 ++++++++++++++++--- .../Mission/RequestPortalController.php | 18 +++++++++++++++-- .../TransportaionUnit/DeallocateRequest.php | 3 ++- .../Mission/SendDataToFMSListener.php | 10 +--------- app/Services/FMS/GetErrorRateService.php | 13 ++++++++++-- 5 files changed, 47 insertions(+), 17 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php b/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php index 93f29906..06a07c13 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/ControlUnitController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\V3\Dashboard\Mission; +use App\Enums\FMSResultCode; use App\Enums\MissionStates; use App\Events\V3\Dashboard\Mission\SendDataToFMSEvent; use App\Http\Controllers\Controller; @@ -11,6 +12,7 @@ use App\Http\Requests\V3\Mission\ControlUnit\StartRequest; use App\Http\Traits\ApiResponse; use App\Models\Mission; use App\Services\Cartables\Mission\ControlUnitService; +use App\Services\FMS\GetErrorRateService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; @@ -52,9 +54,9 @@ class ControlUnitController extends Controller /** * @throws Throwable */ - public function finish(FinishRequest $request, Mission $mission): JsonResponse + public function finish(FinishRequest $request, Mission $mission, GetErrorRateService $getErrorRateService): JsonResponse { - DB::transaction(function () use ($mission) { + DB::transaction(function () use ($mission, $getErrorRateService) { $mission->histories()->create([ 'user_id' => auth()->user()->id, 'previous_state_id' => $mission->state_id, @@ -69,6 +71,18 @@ class ControlUnitController extends Controller 'finish_time' => now(), 'mission_duration' => strtotime(now()) - strtotime($mission->start_time), ]); + + $getErrorRateService->setInputParameters($mission); + $responseData = $getErrorRateService->run(); + + $mission->update([ + 'in_area_duration' => $responseData['timeInAreaSeconds'], + 'first_enter' => $responseData['firstEnter'], + 'last_exit' => $responseData['lastExit'], + 'point_number_sent' => $responseData['noOfPointsInMission'], + 'fms_result_code' => $responseData['resultCode'], + 'fms_result_message' => FMSResultCode::name($responseData['resultCode']), + ]); }); if ($mission->category_id == 2) { @@ -76,7 +90,7 @@ class ControlUnitController extends Controller $rpc->store($mission); } - SendDataToFMSEvent::dispatch($mission); +// SendDataToFMSEvent::dispatch($mission); return $this->successResponse(); } diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index b35a66e6..007195a9 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\V3\Dashboard\Mission; +use App\Enums\FMSResultCode; use App\Enums\MissionCategory; use App\Enums\MissionStates; use App\Enums\MissionTypes; @@ -17,6 +18,7 @@ use App\Models\CMMSMachine; use App\Models\Mission; use App\Models\RoadObserved; use App\Services\Cartables\Mission\RequestPortalService; +use App\Services\FMS\GetErrorRateService; use Carbon\Carbon; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -83,9 +85,9 @@ class RequestPortalController extends Controller /** * @throws Throwable */ - public function continueMission(ContinueMissionRequest $request, Mission $mission): JsonResponse + public function continueMission(ContinueMissionRequest $request, Mission $mission, GetErrorRateService $getErrorRateService): JsonResponse { - DB::transaction(function () use ($request, $mission) { + DB::transaction(function () use ($request, $mission, $getErrorRateService) { $user = auth()->user(); $mission->update([ @@ -94,6 +96,18 @@ class RequestPortalController extends Controller 'state_name' => MissionStates::name(MissionStates::END_MISSION->value), ]); + $getErrorRateService->setInputParameters($mission); + $responseData = $getErrorRateService->run(); + + $mission->update([ + 'in_area_duration' => $responseData['timeInAreaSeconds'], + 'first_enter' => $responseData['firstEnter'], + 'last_exit' => $responseData['lastExit'], + 'point_number_sent' => $responseData['noOfPointsInMission'], + 'fms_result_code' => $responseData['resultCode'], + 'fms_result_message' => FMSResultCode::name($responseData['resultCode']), + ]); + if ($mission->category_id == 2) { $rpc = new OperatorController; $rpc->store($mission); diff --git a/app/Http/Requests/V3/Mission/TransportaionUnit/DeallocateRequest.php b/app/Http/Requests/V3/Mission/TransportaionUnit/DeallocateRequest.php index f20d833a..e2d94deb 100644 --- a/app/Http/Requests/V3/Mission/TransportaionUnit/DeallocateRequest.php +++ b/app/Http/Requests/V3/Mission/TransportaionUnit/DeallocateRequest.php @@ -13,7 +13,8 @@ class DeallocateRequest extends FormRequest */ public function authorize(): bool { - return $this->mission->edare_shahri_id == auth()->user()->edarate_shahri_id && $this->mission->state_id == MissionStates::REQUEST_CREATED->value; + return $this->mission->edare_shahri_id == auth()->user()->edarate_shahri_id && + in_array($this->mission->state_id, [MissionStates::REQUEST_CREATED->value, MissionStates::PENDING_CONFIRMATION->value]); } /** diff --git a/app/Listeners/V3/Dashboard/Mission/SendDataToFMSListener.php b/app/Listeners/V3/Dashboard/Mission/SendDataToFMSListener.php index 90f2671b..1e40d59d 100644 --- a/app/Listeners/V3/Dashboard/Mission/SendDataToFMSListener.php +++ b/app/Listeners/V3/Dashboard/Mission/SendDataToFMSListener.php @@ -28,15 +28,7 @@ class SendDataToFMSListener implements ShouldQueue { $mission = $event->mission; - $this->getErrorRateService->setInputParameters([ - 'username' => config('fms_web_services.Error_Rate.username'), - 'password' => config('fms_web_services.Error_Rate.password'), - 'missionArea' => $mission->getMissionAreaForFms(), - 'missionStartDT' => $mission->start_time->format('Y-m-d\TH:i:s'), - 'missionEndDT' => $mission->finish_time->format('Y-m-d\TH:i:s'), - 'machineCode' => $mission->machine_code, - 'areaType' => $mission->area['type'] === 'polygon' ? 1 : 2, - ]); + $this->getErrorRateService->setInputParameters($mission); $responseData = $this->getErrorRateService->run(); diff --git a/app/Services/FMS/GetErrorRateService.php b/app/Services/FMS/GetErrorRateService.php index a01562de..60b5cec5 100644 --- a/app/Services/FMS/GetErrorRateService.php +++ b/app/Services/FMS/GetErrorRateService.php @@ -2,6 +2,7 @@ namespace App\Services\FMS; +use App\Models\Mission; use Exception; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; @@ -18,9 +19,17 @@ class GetErrorRateService $this->channelName = 'fms_error_rate'; } - public function setInputParameters(array $inputs): void + public function setInputParameters(Mission $mission): void { - $this->inputParameters = $inputs; + $this->inputParameters = [ + 'username' => config('fms_web_services.Error_Rate.username'), + 'password' => config('fms_web_services.Error_Rate.password'), + 'missionArea' => $mission->getMissionAreaForFms(), + 'missionStartDT' => $mission->start_time->format('Y-m-d\TH:i:s'), + 'missionEndDT' => $mission->finish_time->format('Y-m-d\TH:i:s'), + 'machineCode' => $mission->machine_code, + 'areaType' => $mission->area['type'] === 'polygon' ? 1 : 2, + ]; } /** -- 2.49.1 From 8abfd32be8885240387c6006715b9ff023a0f75d Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 22 Dec 2025 09:53:02 +0330 Subject: [PATCH 10/54] add station layer --- app/Enums/FMSResultCode.php | 2 +- .../Mission/RequestPortalController.php | 24 ++++++++------ .../Mission/ViolationManagementController.php | 10 +++--- .../RequestPortal/NoProcessRequest.php | 6 ++-- .../Mission/RequestPortal/UpdateRequest.php | 2 +- .../Cartables/Mission/ControlUnitService.php | 18 ++++++++--- .../Mission/RequestPortalService.php | 7 +++-- .../Mission/TransportationUnitService.php | 16 ++++++++-- ...22_090308_add_column_to_missions_table.php | 31 +++++++++++++++++++ ...12_22_090921_add_column_to_users_table.php | 28 +++++++++++++++++ routes/v3.php | 6 ++-- 11 files changed, 118 insertions(+), 32 deletions(-) create mode 100644 database/migrations/2025_12_22_090308_add_column_to_missions_table.php create mode 100644 database/migrations/2025_12_22_090921_add_column_to_users_table.php diff --git a/app/Enums/FMSResultCode.php b/app/Enums/FMSResultCode.php index 810d1db5..55f77426 100644 --- a/app/Enums/FMSResultCode.php +++ b/app/Enums/FMSResultCode.php @@ -18,7 +18,7 @@ enum FMSResultCode: string "-1" => "نام ﮐﺎرﺑﺮي ﯾﺎ ﮐﻠﻤﻪ ﻋﺒﻮر ﺻﺤﯿﺢ ﻧﯿﺴﺖ.", "-2" => "خودرو با کد مورد نظر وجود ندارد یا دستگاه ردیاب به آن متصل نیست.", "-3" => "کاربر به خودرو مورد نظر دسترسی ندارد.", - "-4" => "ﺗﻌﺪاد دﻓﻌﺎت ﺟﺮاي ﺗﺎﺑﻊ ﺑﯿﺶ از ﺣﺪ ﻣﺠﺎز اﺳﺖ(اﯾﻦ ﺳﺮوﯾﺲ را در ﻫﺮ ثاﻧﯿﻪ ﻓﻘﻂ ﯾﮏ ﺑﺎر ﻣﯽﺗﻮان اﺟﺮاﮐﺮد)", + "-4" => "ﺗﻌﺪاد دﻓﻌﺎت اﺟﺮاي ﺗﺎﺑﻊ ﺑﯿﺶ از ﺣﺪ ﻣﺠﺎز اﺳﺖ(اﯾﻦ ﺳﺮوﯾﺲ را در ﻫﺮ ثاﻧﯿﻪ ﻓﻘﻂ ﯾﮏ ﺑﺎر ﻣﯽﺗﻮان اﺟﺮاﮐﺮد)", "-5" => "پارامتر های داده شده صحیح نیستند", ]; diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index 007195a9..55e61d0f 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -69,6 +69,7 @@ class RequestPortalController extends Controller 'category_name' => MissionCategory::name($category), 'explanation' => $request->explanation, 'code' => rand(100000, 999999), + 'station_id' => $user->station_id ]); $mission->rahdaran()->sync($request->rahdaran); @@ -108,10 +109,10 @@ class RequestPortalController extends Controller 'fms_result_message' => FMSResultCode::name($responseData['resultCode']), ]); - if ($mission->category_id == 2) { - $rpc = new OperatorController; - $rpc->store($mission); - } +// if ($mission->category_id == 2) { +// $rpc = new OperatorController; +// $rpc->store($mission); +// } $state = MissionStates::START_MISSION->value; $category = $request->category_id; @@ -142,6 +143,7 @@ class RequestPortalController extends Controller 'start_time' => now(), 'machine_id' => $machine->id, 'machine_code' => $machine->machine_code, + 'station_id' => $user->station_id ]); $newMission->rahdaran()->sync($request->rahdaran); @@ -207,6 +209,7 @@ class RequestPortalController extends Controller $user = auth()->user(); $zone = $request->zone; $state = MissionStates::END_MISSION->value; + $machine = CMMSMachine::query()->where('id', '=', $request->machine_id)->first(['id', 'machine_code']); $mission = Mission::query()->create([ 'user_id' => $user->id, @@ -222,7 +225,6 @@ class RequestPortalController extends Controller 'start_date' => $request->start_date, 'end_date' => $request->end_date, 'end_point' => $request->end_point, - 'area' => json_encode($request->area), 'category_id' => $request->category_id, 'category_name' => MissionCategory::name($request->category_id), 'start_time' => $request->start_date, @@ -231,16 +233,18 @@ class RequestPortalController extends Controller 'state_name' => MissionStates::name($state), 'explanation' => $request->explanation, 'request_date' => now(), + 'machine_id' => $machine->id, + 'machine_code' => $machine->machine_code, + 'station_id' => $user->station_id ]); $mission->rahdaran()->sync($request->rahdaran); - $mission->machines()->attach($request->machines); $mission->rahdaran()->attach($request->driver, ['is_driver' => true]); - if ($mission->category_id == 2) { - $rpc = new OperatorController; - $rpc->store($mission); - } +// if ($mission->category_id == 2) { +// $rpc = new OperatorController; +// $rpc->store($mission); +// } }); return $this->successResponse(); diff --git a/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php b/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php index d4b49d7b..1abdf927 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php @@ -60,7 +60,6 @@ class ViolationManagementController extends Controller 'start_date' => $request->start_date,// 'end_date' => $request->end_date,// 'end_point' => $request->end_point, - 'area' => json_encode($request->area),// 'category_id' => $request->category_id, 'category_name' => MissionCategory::name($request->category_id), 'start_time' => $request->start_date,// @@ -71,6 +70,7 @@ class ViolationManagementController extends Controller 'request_date' => now(), 'machine_id' => $machine->id,// 'machine_code' => $machine->machine_code,// + 'station_id' => $user->station_id ]); $mission->rahdaran()->sync($request->rahdaran); @@ -78,10 +78,10 @@ class ViolationManagementController extends Controller $violation->update(['status' => 1]); - if ($mission->category_id == 2) { - $rpc = new OperatorController; - $rpc->store($mission); - } +// if ($mission->category_id == 2) { +// $rpc = new OperatorController; +// $rpc->store($mission); +// } }); return $this->successResponse(); diff --git a/app/Http/Requests/V3/Mission/RequestPortal/NoProcessRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/NoProcessRequest.php index 5437dca1..6017d6fd 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/NoProcessRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/NoProcessRequest.php @@ -30,9 +30,9 @@ class NoProcessRequest extends FormRequest 'start_date' => 'required|date', 'end_date' => 'required|date|after:start_date|before:now', 'end_point' => 'required|string', - 'area' => 'required|array', - 'area.type' => 'required|string', - 'area.coordinates' => 'required|array', +// 'area' => 'required|array', +// 'area.type' => 'required|string', +// 'area.coordinates' => 'required|array', 'category_id' => 'required|in:1,2,3', 'explanation' => 'required|string', ]; diff --git a/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php index d9764a7d..fb80a7f6 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/UpdateRequest.php @@ -26,7 +26,7 @@ class UpdateRequest extends FormRequest public function rules(): array { return [ - 'rahdaran' => 'required|array', + 'rahdaran' => 'array', 'rahdaran.*' => 'exists:rahdaran,id', 'requested_machines' => 'required|array', 'type' => 'required|in:1,2', diff --git a/app/Services/Cartables/Mission/ControlUnitService.php b/app/Services/Cartables/Mission/ControlUnitService.php index aa559a65..df6c06c8 100644 --- a/app/Services/Cartables/Mission/ControlUnitService.php +++ b/app/Services/Cartables/Mission/ControlUnitService.php @@ -16,11 +16,21 @@ class ControlUnitService public function dataTable(Request $request) { - $query = Mission::query() - ->whereIn('state_id', [ + $user = Auth::user(); + + $query = Mission::query()->whereIn('state_id', [ MissionStates::PENDING_CONFIRMATION->value, MissionStates::START_MISSION->value - ]) - ->where('edare_shahri_id', '=', Auth::user()->edarate_shahri_id); + ]); + + if ($user->hasPermissionTo('manage-control-unit-station')) { + $query->where('station_id', '=', $user->station_id); + } + elseif ($user->hasPermissionTo('manage-control-unit-city')) { + $query->where('city_id', '=', $user->city_id); + } + elseif ($user->hasPermissionTo('manage-control-unit-province')) { + $query->where('province_id', '=', $user->province_id); + } return DataTableFacade::run( $query, diff --git a/app/Services/Cartables/Mission/RequestPortalService.php b/app/Services/Cartables/Mission/RequestPortalService.php index ca765a5e..354a1cb6 100644 --- a/app/Services/Cartables/Mission/RequestPortalService.php +++ b/app/Services/Cartables/Mission/RequestPortalService.php @@ -17,8 +17,11 @@ class RequestPortalService $user = auth()->user(); $query = Mission::query(); - if ($user->hasPermissionTo('manage-request-portal-city')) { - $query->where('edare_shahri_id', '=', $user->edarate_shahri_id); + if ($user->hasPermissionTo('manage-request-portal-station')) { + $query->where('station_id', '=', $user->station_id); + } + elseif ($user->hasPermissionTo('manage-request-portal-city')) { + $query->where('city_id', '=', $user->city_id); } elseif ($user->hasPermissionTo('manage-request-portal-province')) { $query->where('province_id', '=', $user->province_id); diff --git a/app/Services/Cartables/Mission/TransportationUnitService.php b/app/Services/Cartables/Mission/TransportationUnitService.php index be19780d..a33e5d01 100644 --- a/app/Services/Cartables/Mission/TransportationUnitService.php +++ b/app/Services/Cartables/Mission/TransportationUnitService.php @@ -12,9 +12,19 @@ class TransportationUnitService { public function dataTable(Request $request) { - $query = Mission::query() - ->whereIn('state_id', [MissionStates::REQUEST_CREATED->value, MissionStates::PENDING_CONFIRMATION->value]) - ->where('edare_shahri_id', '=', Auth::user()->edarate_shahri_id); + $user = Auth::user(); + + $query = Mission::query()->whereIn('state_id', [MissionStates::REQUEST_CREATED->value, MissionStates::PENDING_CONFIRMATION->value]); + + if ($user->hasPermissionTo('manage-transportation-unit-station')) { + $query->where('station_id', '=', $user->station_id); + } + elseif ($user->hasPermissionTo('manage-transportation-unit-city')) { + $query->where('city_id', '=', $user->city_id); + } + elseif ($user->hasPermissionTo('manage-transportation-unit-province')) { + $query->where('province_id', '=', $user->province_id); + } return DataTableFacade::run( $query, diff --git a/database/migrations/2025_12_22_090308_add_column_to_missions_table.php b/database/migrations/2025_12_22_090308_add_column_to_missions_table.php new file mode 100644 index 00000000..df9bc42b --- /dev/null +++ b/database/migrations/2025_12_22_090308_add_column_to_missions_table.php @@ -0,0 +1,31 @@ +unsignedSmallInteger('station_id')->nullable(); + $table->unsignedSmallInteger('city_id')->nullable(); + $table->string('station_name')->nullable(); + $table->string('city_name')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('missions', function (Blueprint $table) { + $table->dropColumn(['station_id', 'city_id', 'station_name', 'city_name']); + }); + } +}; diff --git a/database/migrations/2025_12_22_090921_add_column_to_users_table.php b/database/migrations/2025_12_22_090921_add_column_to_users_table.php new file mode 100644 index 00000000..1a1388d6 --- /dev/null +++ b/database/migrations/2025_12_22_090921_add_column_to_users_table.php @@ -0,0 +1,28 @@ +unsignedSmallInteger('station_id')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('station_id'); + }); + } +}; diff --git a/routes/v3.php b/routes/v3.php index 2b3774a5..f569eb6e 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -484,7 +484,7 @@ Route::prefix('missions') ->group(function () { Route::name('requestPortal.') ->prefix('request_portal') - ->middleware('permission:manage-request-portal-city|manage-request-portal-province|manage-request-portal-country') + ->middleware('permission:manage-request-portal-city|manage-request-portal-province|manage-request-portal-country|manage-request-portal-station') ->controller(RequestPortalController::class) ->group(function () { Route::get('/', 'index')->name('index'); @@ -497,7 +497,7 @@ Route::prefix('missions') }); Route::name('transportationUnit.') ->prefix('transportation_unit') - ->middleware('permission:manage-transportation-unit') + ->middleware('permission:manage-transportation-unit-city|manage-transportation-unit-province|manage-transportation-unit-country|manage-transportation-unit-station') ->controller(TransportationUnitController::class) ->group(function () { Route::get('/', 'index')->name('index'); @@ -507,7 +507,7 @@ Route::prefix('missions') }); Route::name('controlUnit.') ->prefix('control_unit') - ->middleware('permission:manage-control-unit') + ->middleware('permission:manage-control-unit-city|manage-control-unit-province|manage-control-unit-country|manage-control-unit-station') ->controller(ControlUnitController::class) ->group(function () { Route::get('/', 'index')->name('index'); -- 2.49.1 From e8e0f2c7242b038565f880976e453c543624dbd5 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 22 Dec 2025 11:38:18 +0330 Subject: [PATCH 11/54] add city --- .../V3/Dashboard/Mission/RequestPortalController.php | 6 ++++++ .../V3/Dashboard/Mission/ViolationManagementController.php | 2 ++ 2 files changed, 8 insertions(+) diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index 55e61d0f..cb4b9b8c 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -50,6 +50,8 @@ class RequestPortalController extends Controller 'username' => $user->username, 'province_id' => $user->province_id, 'province_name' => $user->province_fa, + 'city_id' => $user->city_id ?? null, + 'city_name' => $user->city_fa ?? null, 'edare_shahri_id' => $user->edarate_shahri_id ?? null, 'edare_shahri_name' => $user->edarate_shahri_name ?? null, 'state_id' => $state, @@ -123,6 +125,8 @@ class RequestPortalController extends Controller 'username' => $user->username, 'province_id' => $user->province_id, 'province_name' => $user->province_fa, + 'city_id' => $user->city_id ?? null, + 'city_name' => $user->city_fa ?? null, 'edare_shahri_id' => $user->edarate_shahri_id ?? null, 'edare_shahri_name' => $user->edarate_shahri_name ?? null, 'state_id' => $state, @@ -216,6 +220,8 @@ class RequestPortalController extends Controller 'username' => $user->username, 'province_id' => $user->province_id, 'province_name' => $user->province_fa, + 'city_id' => $user->city_id ?? null, + 'city_name' => $user->city_fa ?? null, 'edare_shahri_id' => $user->edarate_shahri_id ?? null, 'edare_shahri_name' => $user->edarate_shahri_name ?? null, 'zone' => $zone, diff --git a/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php b/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php index 1abdf927..d2e79c57 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/ViolationManagementController.php @@ -51,6 +51,8 @@ class ViolationManagementController extends Controller 'username' => $user->username, 'province_id' => $user->province_id, 'province_name' => $user->province_fa, + 'city_id' => $user->city_id ?? null, + 'city_name' => $user->city_fa ?? null, 'edare_shahri_id' => $user->edarate_shahri_id ?? null, 'edare_shahri_name' => $user->edarate_shahri_name ?? null, 'zone' => $zone, -- 2.49.1 From 89a0e1d2282de8c38063eb0b935111fd3f54627b Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 23 Dec 2025 11:00:07 +0330 Subject: [PATCH 12/54] create permission --- .../Commands/DailyMovingMachineCommand.php | 1 + .../Mission/RequestPortalController.php | 19 ++++++++++-- .../RequestPortal/NoProcessRequest.php | 9 +++--- app/Models/MissionViolation.php | 9 +++++- .../Mission/DailyMoveMachineService.php | 15 ++++++++++ ...add_column_to_mission_violations_table.php | 29 +++++++++++++++++++ .../layouts/dashboard/_sidebar.blade.php | 10 +++++++ routes/v3.php | 1 + 8 files changed, 85 insertions(+), 8 deletions(-) create mode 100644 database/migrations/2025_12_23_104217_add_column_to_mission_violations_table.php diff --git a/app/Console/Commands/DailyMovingMachineCommand.php b/app/Console/Commands/DailyMovingMachineCommand.php index 5b059dfd..dfe5d9b2 100644 --- a/app/Console/Commands/DailyMovingMachineCommand.php +++ b/app/Console/Commands/DailyMovingMachineCommand.php @@ -54,6 +54,7 @@ class DailyMovingMachineCommand extends Command MissionViolation::query()->create([ 'machine_code' => $code, + 'machine_id' => CMMSMachine::query()->firstWhere('machine_code', '=', $code)->id, 'type' => MissionViolationType::KHOROJ_BEDONE_MOGAVEZ->value, 'request_date' => $date, 'mileage' => $cmm['mileageKM'], diff --git a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php index cb4b9b8c..1bb3de72 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/RequestPortalController.php @@ -204,16 +204,16 @@ class RequestPortalController extends Controller /** * @throws Throwable */ - public function noProcess(NoProcessRequest $request): JsonResponse + public function noProcess(NoProcessRequest $request, GetErrorRateService $getErrorRateService): JsonResponse { - DB::transaction(function () use ($request) { + DB::transaction(function () use ($request, $getErrorRateService) { $start = Carbon::parse($request->start_date); $end = Carbon::parse($request->end_date); $type = $start->diffInMinutes($end) > 480 ? MissionTypes::NO_PROCESS_ROZANE->value : MissionTypes::NO_PROCESS_SAATY->value; $user = auth()->user(); $zone = $request->zone; $state = MissionStates::END_MISSION->value; - $machine = CMMSMachine::query()->where('id', '=', $request->machine_id)->first(['id', 'machine_code']); + $machine = CMMSMachine::query()->where('machine_code', '=', $request->machine_code)->first(['id', 'machine_code']); $mission = Mission::query()->create([ 'user_id' => $user->id, @@ -229,6 +229,7 @@ class RequestPortalController extends Controller 'type' => $type, 'type_fa' => MissionTypes::name($type), 'start_date' => $request->start_date, + 'area' => json_encode($request->area), 'end_date' => $request->end_date, 'end_point' => $request->end_point, 'category_id' => $request->category_id, @@ -247,6 +248,18 @@ class RequestPortalController extends Controller $mission->rahdaran()->sync($request->rahdaran); $mission->rahdaran()->attach($request->driver, ['is_driver' => true]); + $getErrorRateService->setInputParameters($mission); + $responseData = $getErrorRateService->run(); + + $mission->update([ + 'in_area_duration' => $responseData['timeInAreaSeconds'], + 'first_enter' => $responseData['firstEnter'], + 'last_exit' => $responseData['lastExit'], + 'point_number_sent' => $responseData['noOfPointsInMission'], + 'fms_result_code' => $responseData['resultCode'], + 'fms_result_message' => FMSResultCode::name($responseData['resultCode']), + ]); + // if ($mission->category_id == 2) { // $rpc = new OperatorController; // $rpc->store($mission); diff --git a/app/Http/Requests/V3/Mission/RequestPortal/NoProcessRequest.php b/app/Http/Requests/V3/Mission/RequestPortal/NoProcessRequest.php index 6017d6fd..cab007cc 100644 --- a/app/Http/Requests/V3/Mission/RequestPortal/NoProcessRequest.php +++ b/app/Http/Requests/V3/Mission/RequestPortal/NoProcessRequest.php @@ -12,7 +12,8 @@ class NoProcessRequest extends FormRequest */ public function authorize(): bool { - return $this->violation->status === 0 && $this->violation->type === 1; +// return $this->violation->status === 0 && $this->violation->type === 1; + return true; } /** @@ -30,9 +31,9 @@ class NoProcessRequest extends FormRequest 'start_date' => 'required|date', 'end_date' => 'required|date|after:start_date|before:now', 'end_point' => 'required|string', -// 'area' => 'required|array', -// 'area.type' => 'required|string', -// 'area.coordinates' => 'required|array', + 'area' => 'array', + 'area.type' => 'string', + 'area.coordinates' => 'array', 'category_id' => 'required|in:1,2,3', 'explanation' => 'required|string', ]; diff --git a/app/Models/MissionViolation.php b/app/Models/MissionViolation.php index b1ff3be1..cb947151 100644 --- a/app/Models/MissionViolation.php +++ b/app/Models/MissionViolation.php @@ -4,14 +4,21 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasOne; class MissionViolation extends Model { use HasFactory; protected $guarded =[]; - public function mission() + public function mission(): BelongsTo { return $this->belongsTo(Mission::class); } + + public function machine(): HasOne + { + return $this->hasOne(CMMSMachine::class); + } } diff --git a/app/Services/Cartables/Mission/DailyMoveMachineService.php b/app/Services/Cartables/Mission/DailyMoveMachineService.php index bed5ddd4..9e83ef0d 100644 --- a/app/Services/Cartables/Mission/DailyMoveMachineService.php +++ b/app/Services/Cartables/Mission/DailyMoveMachineService.php @@ -5,11 +5,26 @@ namespace App\Services\Cartables\Mission; use App\Facades\DataTable\DataTableFacade; use App\Models\MissionViolation; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; class DailyMoveMachineService { public function dataTable(Request $request) { + $user = Auth::user(); + + $query = MissionViolation::query(); + + if ($user->hasPermissionTo('manage-violation-station')) { + $query->whereRelation('machine', 'station_id', '=', $user->station_id); + } + elseif ($user->hasPermissionTo('manage-violation-city')) { + $query->whereRelation('machine', 'city_id', '=', $user->city_id); + } + elseif ($user->hasPermissionTo('manage-violation-province')) { + $query->whereRelation('machine', 'province_id', '=', $user->province_id); + } + return DataTableFacade::run( MissionViolation::query(), $request, diff --git a/database/migrations/2025_12_23_104217_add_column_to_mission_violations_table.php b/database/migrations/2025_12_23_104217_add_column_to_mission_violations_table.php new file mode 100644 index 00000000..ba151dfd --- /dev/null +++ b/database/migrations/2025_12_23_104217_add_column_to_mission_violations_table.php @@ -0,0 +1,29 @@ +foreignId('machine_id')->constrained('cmms_machines'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('mission_violations', function (Blueprint $table) { + $table->dropForeign('mission_violations_machine_id_foreign'); + $table->dropColumn('machine_id'); + }); + } +}; diff --git a/resources/views/layouts/dashboard/_sidebar.blade.php b/resources/views/layouts/dashboard/_sidebar.blade.php index 9a558a1b..8facdd81 100644 --- a/resources/views/layouts/dashboard/_sidebar.blade.php +++ b/resources/views/layouts/dashboard/_sidebar.blade.php @@ -178,6 +178,16 @@ @endcan + @canany(['manage-request-portal-city', 'manage-request-portal-province', 'manage-request-portal-country', 'manage-request-portal-station', + 'manage-transportation-unit-city', 'manage-transportation-unit-province', 'manage-transportation-unit-country', 'manage-transportation-unit-station', + 'manage-control-unit-city', 'manage-control-unit-province', 'manage-control-unit-country', 'manage-control-unit-station', + ]) + + @endcan @canany(['add-road-patrol', 'show-road-patrol-supervise-cartable', 'show-road-patrol-supervise-cartable-province'])