From e0ff2fa9cae072b9dceb44169de3c2c8a3ebd9b0 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 21 Jul 2025 09:05:51 +0330 Subject: [PATCH 1/7] remove avatar from user management --- app/Http/Controllers/Admin/UserManagementController.php | 9 +-------- app/Http/Controllers/CallController.php | 2 +- app/Http/Controllers/ProfileController.php | 1 + app/Http/Requests/Admin/UserManagement/StoreRequest.php | 2 +- app/Http/Resources/Admin/UserResource.php | 1 + .../2025_04_28_101821_create_provinces_table.php | 2 ++ 6 files changed, 7 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Admin/UserManagementController.php b/app/Http/Controllers/Admin/UserManagementController.php index dbb0292..1f7f035 100644 --- a/app/Http/Controllers/Admin/UserManagementController.php +++ b/app/Http/Controllers/Admin/UserManagementController.php @@ -23,10 +23,8 @@ class UserManagementController extends Controller public function index(Request $request): JsonResponse { - $query = User::query()->where('username', "<>", "witel"); - $data = DataTableFacade::run( - $query, + User::query()->where('username', "<>", "witel"), $request, allowedFilters: array('id', 'full_name', 'username', 'province_id', 'phone_number', 'national_id', 'telephone_id'), allowedSortings: array('id', 'full_name', 'username', 'province_id', 'phone_number', 'national_id', 'telephone_id'), @@ -41,10 +39,6 @@ class UserManagementController extends Controller DB::transaction(function () use ($request) { $province = Province::query()->find($request->province_id); - $avatar = $request->avatar - ? FileFacade::save($request->file('avatar'), 'users/avatars/' . $request->username) - : null; - $user = User::query()->create([ 'full_name' => $request->full_name, 'username' => $request->username, @@ -55,7 +49,6 @@ class UserManagementController extends Controller 'province_id' => $province->id, 'province_fa' => $province->name, 'password' => Hash::make($request->password), - 'avatar' => $avatar, 'email' => $request->email, 'telephone_id' => $request->telephone_id, ]); diff --git a/app/Http/Controllers/CallController.php b/app/Http/Controllers/CallController.php index 14242d7..6cf67ba 100644 --- a/app/Http/Controllers/CallController.php +++ b/app/Http/Controllers/CallController.php @@ -105,7 +105,7 @@ class CallController extends Controller $event_name = Event::query()->find($event_id)->first()->name; - CallHistory::create([ + CallHistory::query()->create([ 'call_id' => $call->id, 'telephone_id' => $call->telephone_id, 'caller_phone_number' => $call->caller_phone_number, diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index becd223..fb6053f 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -21,6 +21,7 @@ class ProfileController extends Controller { return $this->successResponse(new UserResource(auth()->user())); } + public function changePassword(ChangePasswordRequest $request): JsonResponse { $user = auth()->user(); diff --git a/app/Http/Requests/Admin/UserManagement/StoreRequest.php b/app/Http/Requests/Admin/UserManagement/StoreRequest.php index f828f54..a8bd73d 100644 --- a/app/Http/Requests/Admin/UserManagement/StoreRequest.php +++ b/app/Http/Requests/Admin/UserManagement/StoreRequest.php @@ -26,7 +26,7 @@ class StoreRequest extends FormRequest 'full_name' => 'required|max:255|string', 'username' => 'required|unique:users,username|string', 'position' => 'required', - 'gender' => 'required|in:male,female', + 'gender' => 'required|in:1,2', 'national_id' => 'required|digits:10|unique:users,national_id', 'phone_number' => 'required|numeric|digits:11|unique:users,phone_number|regex:/^09\d{9}$/', 'province_id' => 'required|exists:provinces,id', diff --git a/app/Http/Resources/Admin/UserResource.php b/app/Http/Resources/Admin/UserResource.php index 7f81196..a3b05c4 100644 --- a/app/Http/Resources/Admin/UserResource.php +++ b/app/Http/Resources/Admin/UserResource.php @@ -26,6 +26,7 @@ class UserResource extends JsonResource 'province_id' => $this->province_id, 'province_name' => $this->province_name, 'role' => $this->roles->pluck('id', 'name_fa'), + 'permissions' => $this->getPermissionNames(), 'telephone_id' => $this->telephone_id ]; } diff --git a/database/migrations/2025_04_28_101821_create_provinces_table.php b/database/migrations/2025_04_28_101821_create_provinces_table.php index 1c2a32b..b2a5d64 100644 --- a/database/migrations/2025_04_28_101821_create_provinces_table.php +++ b/database/migrations/2025_04_28_101821_create_provinces_table.php @@ -16,6 +16,8 @@ return new class extends Migration $table->string('name'); $table->double('lat'); $table->double('lon'); + $table->string('ip'); + $table->string('camera_ip'); $table->timestamps(); }); } From f35f886345ea4f292c8d984f1dfb64987b94234c Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 21 Jul 2025 15:08:53 +0330 Subject: [PATCH 2/7] create all country tables --- app/Models/CountryCallsReport.php | 12 +++++ app/Models/CountryKeypressReport.php | 12 +++++ app/Models/CountryMessageRatingReport.php | 12 +++++ app/Models/CountryVoiceRatingReport.php | 12 +++++ app/Models/ExpertPerformance.php | 12 +++++ .../factories/CountryCallsReportFactory.php | 23 ++++++++++ .../CountryKeypressReportFactory.php | 23 ++++++++++ .../CountryMessageRatingReportFactory.php | 23 ++++++++++ .../CountryVoiceRatingReportFactory.php | 23 ++++++++++ .../factories/ExpertPerformanceFactory.php | 23 ++++++++++ ...258_create_country_calls_reports_table.php | 42 ++++++++++++++++++ ..._create_country_keypress_reports_table.php | 44 +++++++++++++++++++ ...ate_country_voice_rating_reports_table.php | 35 +++++++++++++++ ...e_country_message_rating_reports_table.php | 35 +++++++++++++++ ...94121_create_expert_performances_table.php | 27 ++++++++++++ database/seeders/CountryCallsReportSeeder.php | 17 +++++++ .../seeders/CountryKeypressReportSeeder.php | 17 +++++++ .../CountryMessageRatingReportSeeder.php | 17 +++++++ .../CountryVoiceRatingReportSeeder.php | 17 +++++++ database/seeders/ExpertPerformanceSeeder.php | 17 +++++++ 20 files changed, 443 insertions(+) create mode 100644 app/Models/CountryCallsReport.php create mode 100644 app/Models/CountryKeypressReport.php create mode 100644 app/Models/CountryMessageRatingReport.php create mode 100644 app/Models/CountryVoiceRatingReport.php create mode 100644 app/Models/ExpertPerformance.php create mode 100644 database/factories/CountryCallsReportFactory.php create mode 100644 database/factories/CountryKeypressReportFactory.php create mode 100644 database/factories/CountryMessageRatingReportFactory.php create mode 100644 database/factories/CountryVoiceRatingReportFactory.php create mode 100644 database/factories/ExpertPerformanceFactory.php create mode 100644 database/migrations/2025_07_21_055258_create_country_calls_reports_table.php create mode 100644 database/migrations/2025_07_21_061758_create_country_keypress_reports_table.php create mode 100644 database/migrations/2025_07_21_062738_create_country_voice_rating_reports_table.php create mode 100644 database/migrations/2025_07_21_072211_create_country_message_rating_reports_table.php create mode 100644 database/migrations/2025_07_21_094121_create_expert_performances_table.php create mode 100644 database/seeders/CountryCallsReportSeeder.php create mode 100644 database/seeders/CountryKeypressReportSeeder.php create mode 100644 database/seeders/CountryMessageRatingReportSeeder.php create mode 100644 database/seeders/CountryVoiceRatingReportSeeder.php create mode 100644 database/seeders/ExpertPerformanceSeeder.php diff --git a/app/Models/CountryCallsReport.php b/app/Models/CountryCallsReport.php new file mode 100644 index 0000000..7112254 --- /dev/null +++ b/app/Models/CountryCallsReport.php @@ -0,0 +1,12 @@ + */ + use HasFactory; +} diff --git a/app/Models/CountryKeypressReport.php b/app/Models/CountryKeypressReport.php new file mode 100644 index 0000000..f8dbbfc --- /dev/null +++ b/app/Models/CountryKeypressReport.php @@ -0,0 +1,12 @@ + */ + use HasFactory; +} diff --git a/app/Models/CountryMessageRatingReport.php b/app/Models/CountryMessageRatingReport.php new file mode 100644 index 0000000..3e7501a --- /dev/null +++ b/app/Models/CountryMessageRatingReport.php @@ -0,0 +1,12 @@ + */ + use HasFactory; +} diff --git a/app/Models/CountryVoiceRatingReport.php b/app/Models/CountryVoiceRatingReport.php new file mode 100644 index 0000000..bf3b2c6 --- /dev/null +++ b/app/Models/CountryVoiceRatingReport.php @@ -0,0 +1,12 @@ + */ + use HasFactory; +} diff --git a/app/Models/ExpertPerformance.php b/app/Models/ExpertPerformance.php new file mode 100644 index 0000000..a6aa1f8 --- /dev/null +++ b/app/Models/ExpertPerformance.php @@ -0,0 +1,12 @@ + */ + use HasFactory; +} diff --git a/database/factories/CountryCallsReportFactory.php b/database/factories/CountryCallsReportFactory.php new file mode 100644 index 0000000..eb117cb --- /dev/null +++ b/database/factories/CountryCallsReportFactory.php @@ -0,0 +1,23 @@ + + */ +class CountryCallsReportFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/factories/CountryKeypressReportFactory.php b/database/factories/CountryKeypressReportFactory.php new file mode 100644 index 0000000..257e3ff --- /dev/null +++ b/database/factories/CountryKeypressReportFactory.php @@ -0,0 +1,23 @@ + + */ +class CountryKeypressReportFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/factories/CountryMessageRatingReportFactory.php b/database/factories/CountryMessageRatingReportFactory.php new file mode 100644 index 0000000..89c523c --- /dev/null +++ b/database/factories/CountryMessageRatingReportFactory.php @@ -0,0 +1,23 @@ + + */ +class CountryMessageRatingReportFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/factories/CountryVoiceRatingReportFactory.php b/database/factories/CountryVoiceRatingReportFactory.php new file mode 100644 index 0000000..c8176bb --- /dev/null +++ b/database/factories/CountryVoiceRatingReportFactory.php @@ -0,0 +1,23 @@ + + */ +class CountryVoiceRatingReportFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/factories/ExpertPerformanceFactory.php b/database/factories/ExpertPerformanceFactory.php new file mode 100644 index 0000000..2ee7b2e --- /dev/null +++ b/database/factories/ExpertPerformanceFactory.php @@ -0,0 +1,23 @@ + + */ +class ExpertPerformanceFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/migrations/2025_07_21_055258_create_country_calls_reports_table.php b/database/migrations/2025_07_21_055258_create_country_calls_reports_table.php new file mode 100644 index 0000000..c6aaea4 --- /dev/null +++ b/database/migrations/2025_07_21_055258_create_country_calls_reports_table.php @@ -0,0 +1,42 @@ +id(); + $table->foreignId('province_id')->constrained('provinces'); + $table->date('date'); + $table->integer('total'); + $table->integer('route_to_teh4'); + $table->integer('route_to_teh5'); + $table->integer('route_to_os4'); + $table->integer('route_to_os5'); + $table->integer('answered'); + $table->integer('answered_over10'); + $table->integer('missed'); + $table->integer('dnd'); + $table->integer('transferred'); + $table->integer('talked_to_operator'); + $table->float('average_calls_time'); + $table->integer('fails'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('country_calls_reports'); + } +}; diff --git a/database/migrations/2025_07_21_061758_create_country_keypress_reports_table.php b/database/migrations/2025_07_21_061758_create_country_keypress_reports_table.php new file mode 100644 index 0000000..896ca98 --- /dev/null +++ b/database/migrations/2025_07_21_061758_create_country_keypress_reports_table.php @@ -0,0 +1,44 @@ +id(); + $table->foreignId('province_id')->constrained('provinces'); + $table->date('date'); + $table->integer('total'); + $table->integer('key1'); + $table->integer('key2'); + $table->integer('key3'); + $table->integer('key4'); + $table->integer('key5'); + $table->integer('key6'); + $table->integer('key9'); + $table->integer('key4_1'); + $table->integer('key4_2'); + $table->integer('key5_1'); + $table->integer('key5_2'); + $table->integer('key2_1'); + $table->integer('key2_2'); + $table->integer('key2_3'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('country_keypress_reports'); + } +}; diff --git a/database/migrations/2025_07_21_062738_create_country_voice_rating_reports_table.php b/database/migrations/2025_07_21_062738_create_country_voice_rating_reports_table.php new file mode 100644 index 0000000..e2cf554 --- /dev/null +++ b/database/migrations/2025_07_21_062738_create_country_voice_rating_reports_table.php @@ -0,0 +1,35 @@ +id(); + $table->foreignId('province_id')->constrained('provinces'); + $table->date('date'); + $table->integer('voice_quality_ok'); + $table->integer('message_quality_ok'); + $table->integer('voice_format_ok'); + $table->integer('voice_quality_nok'); + $table->integer('message_quality_nok'); + $table->integer('voice_format_nok'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('country_voice_rating_reports'); + } +}; diff --git a/database/migrations/2025_07_21_072211_create_country_message_rating_reports_table.php b/database/migrations/2025_07_21_072211_create_country_message_rating_reports_table.php new file mode 100644 index 0000000..1f7ba2a --- /dev/null +++ b/database/migrations/2025_07_21_072211_create_country_message_rating_reports_table.php @@ -0,0 +1,35 @@ +id(); + $table->foreignId('province_id')->constrained('provinces'); + $table->date('date'); + $table->integer('very_good'); + $table->integer('good'); + $table->integer('average'); + $table->integer('bad'); + $table->integer('very_bad'); + $table->integer('wrong_code'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('country_message_rating_reports'); + } +}; diff --git a/database/migrations/2025_07_21_094121_create_expert_performances_table.php b/database/migrations/2025_07_21_094121_create_expert_performances_table.php new file mode 100644 index 0000000..2a0b866 --- /dev/null +++ b/database/migrations/2025_07_21_094121_create_expert_performances_table.php @@ -0,0 +1,27 @@ +id(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('expert_performances'); + } +}; diff --git a/database/seeders/CountryCallsReportSeeder.php b/database/seeders/CountryCallsReportSeeder.php new file mode 100644 index 0000000..81d2945 --- /dev/null +++ b/database/seeders/CountryCallsReportSeeder.php @@ -0,0 +1,17 @@ + Date: Tue, 22 Jul 2025 09:35:20 +0330 Subject: [PATCH 3/7] create setad report db --- .../Admin/UserManagementController.php | 1 + app/Http/Controllers/AuthController.php | 4 ---- .../Admin/UserManagement/StoreRequest.php | 2 +- .../Admin/UserManagement/UpdateRequest.php | 1 + app/Http/Requests/Auth/LoginRequest.php | 19 ------------------- 5 files changed, 3 insertions(+), 24 deletions(-) diff --git a/app/Http/Controllers/Admin/UserManagementController.php b/app/Http/Controllers/Admin/UserManagementController.php index 1f7f035..55d639c 100644 --- a/app/Http/Controllers/Admin/UserManagementController.php +++ b/app/Http/Controllers/Admin/UserManagementController.php @@ -79,6 +79,7 @@ class UserManagementController extends Controller 'province_id' => $province->id, 'province_fa' => $province->name, 'email' => $request->email, + 'telephone_id' => $request->telephone_id, ]); $user->syncRoles(Role::query()->find($request->role_id)); diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index f9a7ab6..c566d73 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -33,15 +33,11 @@ class AuthController extends Controller { Auth::user()->update([ 'last_login' => now(), - 'telephone_id' => $request->telephone_id, ]); } public function logout(Request $request): JsonResponse { - Auth::user()->update([ - 'telephone_id' => null, - ]); Auth::guard()->logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); diff --git a/app/Http/Requests/Admin/UserManagement/StoreRequest.php b/app/Http/Requests/Admin/UserManagement/StoreRequest.php index a8bd73d..cc34bdb 100644 --- a/app/Http/Requests/Admin/UserManagement/StoreRequest.php +++ b/app/Http/Requests/Admin/UserManagement/StoreRequest.php @@ -32,8 +32,8 @@ class StoreRequest extends FormRequest 'province_id' => 'required|exists:provinces,id', 'password' => 'required|regex:/^(?=.*[a-zA-Z])(?=.*\d).+$/|min:8', 'role_id' => 'required|exists:roles,id', - 'avatar' => 'mimes:png,jpg,pdf|max:2048', 'email' => 'email|unique:users,email', + 'telephone_id' => 'required|numeric|unique:users,telephone_id', ]; } } diff --git a/app/Http/Requests/Admin/UserManagement/UpdateRequest.php b/app/Http/Requests/Admin/UserManagement/UpdateRequest.php index 436995c..28590a0 100644 --- a/app/Http/Requests/Admin/UserManagement/UpdateRequest.php +++ b/app/Http/Requests/Admin/UserManagement/UpdateRequest.php @@ -39,6 +39,7 @@ class UpdateRequest extends FormRequest 'role_id' => 'required|exists:roles,id', 'avatar' => 'mimes:png,jpg,pdf|max:2048', 'email' => ['email', Rule::unique('users', 'email')->ignore($this->user->id)], + 'telephone_id' => ['required', 'numeric', Rule::unique('users', 'telephone_id')->ignore($this->user->id)], ]; } } diff --git a/app/Http/Requests/Auth/LoginRequest.php b/app/Http/Requests/Auth/LoginRequest.php index 3c57153..b1b0a94 100644 --- a/app/Http/Requests/Auth/LoginRequest.php +++ b/app/Http/Requests/Auth/LoginRequest.php @@ -27,25 +27,6 @@ class LoginRequest extends FormRequest return [ 'username' => 'required|exists:users,username', 'password' => 'required|string', - 'telephone_id' => 'required|string' - ]; - } - - public function after(): array - { - return [ - function (Validator $validator) { - $user = User::query()->where('telephone_id', '=', $this->telephone_id); - if ($user->exists()) { - if ($user->first()->is_online) { - $validator->errors()->add( - 'telephone_id', - __('messages.telephone_id_is_in_use') - ); - } - $user->first()->update(['telephone_id' => null]); - } - } ]; } } From 0b543ac1f0bde92cb9c876ba0d947795865d3267 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 22 Jul 2025 14:59:57 +0330 Subject: [PATCH 4/7] add fake data --- .../CumulativeCentersStatsController.php | 23 ++++++++++++++++ .../CumulativeKeypressStatsController.php | 23 ++++++++++++++++ .../CumulativeVoiceRatingStatsController.php | 23 ++++++++++++++++ .../factories/CountryCallsReportFactory.php | 17 +++++++++++- .../CountryKeypressReportFactory.php | 19 ++++++++++++- .../CountryMessageRatingReportFactory.php | 10 ++++++- .../CountryVoiceRatingReportFactory.php | 10 ++++++- routes/web.php | 27 +++++++++++++++++++ 8 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 app/Http/Controllers/Setad/CumulativeCentersStatsController.php create mode 100644 app/Http/Controllers/Setad/CumulativeKeypressStatsController.php create mode 100644 app/Http/Controllers/Setad/CumulativeVoiceRatingStatsController.php diff --git a/app/Http/Controllers/Setad/CumulativeCentersStatsController.php b/app/Http/Controllers/Setad/CumulativeCentersStatsController.php new file mode 100644 index 0000000..6cea4ba --- /dev/null +++ b/app/Http/Controllers/Setad/CumulativeCentersStatsController.php @@ -0,0 +1,23 @@ +json($data); + } +} diff --git a/app/Http/Controllers/Setad/CumulativeKeypressStatsController.php b/app/Http/Controllers/Setad/CumulativeKeypressStatsController.php new file mode 100644 index 0000000..47cdec0 --- /dev/null +++ b/app/Http/Controllers/Setad/CumulativeKeypressStatsController.php @@ -0,0 +1,23 @@ +json($data); + } +} diff --git a/app/Http/Controllers/Setad/CumulativeVoiceRatingStatsController.php b/app/Http/Controllers/Setad/CumulativeVoiceRatingStatsController.php new file mode 100644 index 0000000..15802b4 --- /dev/null +++ b/app/Http/Controllers/Setad/CumulativeVoiceRatingStatsController.php @@ -0,0 +1,23 @@ +json($data); + } +} diff --git a/database/factories/CountryCallsReportFactory.php b/database/factories/CountryCallsReportFactory.php index eb117cb..c469845 100644 --- a/database/factories/CountryCallsReportFactory.php +++ b/database/factories/CountryCallsReportFactory.php @@ -2,6 +2,7 @@ namespace Database\Factories; +use App\Models\Province; use Illuminate\Database\Eloquent\Factories\Factory; /** @@ -17,7 +18,21 @@ class CountryCallsReportFactory extends Factory public function definition(): array { return [ - // + 'province_id' => Province::factory(), + 'date' => $this->faker->date(), + 'total' => $this->faker->numberBetween(1000, 10000), + 'route_to_teh4' => $this->faker->numberBetween(10, 100), + 'route_to_teh5' => $this->faker->numberBetween(10, 100), + 'route_to_os4' => $this->faker->numberBetween(10, 100), + 'route_to_os5' => $this->faker->numberBetween(10, 100), + 'answered' => $this->faker->numberBetween(10, 100), + 'answered_over10' => $this->faker->numberBetween(10, 100), + 'missed' => $this->faker->numberBetween(10, 100), + 'dnd' => $this->faker->numberBetween(10, 100), + 'transferred' => $this->faker->numberBetween(10, 100), + 'talked_to_operator' => $this->faker->numberBetween(10, 100), + 'average_calls_time' => $this->faker->numberBetween(10, 100), + 'fails' => $this->faker->numberBetween(10, 100), ]; } } diff --git a/database/factories/CountryKeypressReportFactory.php b/database/factories/CountryKeypressReportFactory.php index 257e3ff..9ac1df1 100644 --- a/database/factories/CountryKeypressReportFactory.php +++ b/database/factories/CountryKeypressReportFactory.php @@ -2,6 +2,7 @@ namespace Database\Factories; +use App\Models\Province; use Illuminate\Database\Eloquent\Factories\Factory; /** @@ -17,7 +18,23 @@ class CountryKeypressReportFactory extends Factory public function definition(): array { return [ - // + 'province_id' => Province::factory(), + 'date' => $this->faker->date(), + 'total' => $this->faker->numberBetween(1000, 10000), + 'key1' => $this->faker->numberBetween(10, 100), + 'key2' => $this->faker->numberBetween(10, 100), + 'key3' => $this->faker->numberBetween(10, 100), + 'key4' => $this->faker->numberBetween(10, 100), + 'key5' => $this->faker->numberBetween(10, 100), + 'key6' => $this->faker->numberBetween(10, 100), + 'key9' => $this->faker->numberBetween(10, 100), + 'key4_1' => $this->faker->numberBetween(10, 100), + 'key4_2' => $this->faker->numberBetween(10, 100), + 'key5_1' => $this->faker->numberBetween(10, 100), + 'key5_2' => $this->faker->numberBetween(10, 100), + 'key2_1' => $this->faker->numberBetween(10, 100), + 'key2_2' => $this->faker->numberBetween(10, 100), + 'key2_3' => $this->faker->numberBetween(10, 100), ]; } } diff --git a/database/factories/CountryMessageRatingReportFactory.php b/database/factories/CountryMessageRatingReportFactory.php index 89c523c..e696309 100644 --- a/database/factories/CountryMessageRatingReportFactory.php +++ b/database/factories/CountryMessageRatingReportFactory.php @@ -2,6 +2,7 @@ namespace Database\Factories; +use App\Models\Province; use Illuminate\Database\Eloquent\Factories\Factory; /** @@ -17,7 +18,14 @@ class CountryMessageRatingReportFactory extends Factory public function definition(): array { return [ - // + 'province_id' => Province::factory(), + 'date' => $this->faker->date(), + 'very_good' => $this->faker->numberBetween(10, 100), + 'good' => $this->faker->numberBetween(10, 100), + 'average' => $this->faker->numberBetween(10, 100), + 'bad' => $this->faker->numberBetween(10, 100), + 'very_bad' => $this->faker->numberBetween(10, 100), + 'wrong_code' => $this->faker->numberBetween(10, 100), ]; } } diff --git a/database/factories/CountryVoiceRatingReportFactory.php b/database/factories/CountryVoiceRatingReportFactory.php index c8176bb..5aca74a 100644 --- a/database/factories/CountryVoiceRatingReportFactory.php +++ b/database/factories/CountryVoiceRatingReportFactory.php @@ -2,6 +2,7 @@ namespace Database\Factories; +use App\Models\Province; use Illuminate\Database\Eloquent\Factories\Factory; /** @@ -17,7 +18,14 @@ class CountryVoiceRatingReportFactory extends Factory public function definition(): array { return [ - // + 'province_id' => Province::factory(), + 'date' => $this->faker->date(), + 'voice_quality_ok' => $this->faker->numberBetween(10, 100), + 'message_quality_ok' => $this->faker->numberBetween(10, 100), + 'voice_format_ok' => $this->faker->numberBetween(10, 100), + 'voice_quality_nok' => $this->faker->numberBetween(10, 100), + 'message_quality_nok' => $this->faker->numberBetween(10, 100), + 'voice_format_nok' => $this->faker->numberBetween(10, 100), ]; } } diff --git a/routes/web.php b/routes/web.php index fe8628b..371e4fe 100644 --- a/routes/web.php +++ b/routes/web.php @@ -8,6 +8,9 @@ use App\Http\Controllers\CallController; use App\Http\Controllers\CategoryController; use App\Http\Controllers\ProfileController; use App\Http\Controllers\ProvinceController; +use App\Http\Controllers\Setad\CumulativeCentersStatsController; +use App\Http\Controllers\Setad\CumulativeKeypressStatsController; +use App\Http\Controllers\Setad\CumulativeVoiceRatingStatsController; use App\Http\Middleware\SuperAdminCheck; use Illuminate\Support\Facades\Route; @@ -92,4 +95,28 @@ Route::prefix('server')->group(function () { Route::post('/{role}', 'update')->name('update'); Route::delete('/{role}', 'destroy')->name('destroy'); }); + + Route::middleware('auth') + ->prefix('cumulative_stats') + ->name('cumulativeStats.') + ->controller(CumulativeCentersStatsController::class) + ->group(function () { + Route::get('/', 'index')->name('index'); + }); + + Route::middleware('auth') + ->prefix('cumulative_voice_ratings') + ->name('cumulativeVoiceRatings.') + ->controller(CumulativeVoiceRatingStatsController::class) + ->group(function () { + Route::get('/', 'index')->name('index'); + }); + + Route::middleware('auth') + ->prefix('cumulative_keypress_stats') + ->name('cumulativeKeypressStats.') + ->controller(CumulativeKeypressStatsController::class) + ->group(function () { + Route::get('/', 'index')->name('index'); + }); }); From ca89fe0371d48315f13c1580466f08b4d87ee78c Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Wed, 23 Jul 2025 08:46:21 +0330 Subject: [PATCH 5/7] create factory and seeder for fake data --- database/factories/CountryCallsReportFactory.php | 3 +++ database/factories/CountryKeypressReportFactory.php | 3 +++ database/factories/CountryMessageRatingReportFactory.php | 3 +++ database/factories/CountryVoiceRatingReportFactory.php | 3 +++ database/factories/ProvinceFactory.php | 4 +++- .../2025_07_21_055258_create_country_calls_reports_table.php | 1 + ...025_07_21_061758_create_country_keypress_reports_table.php | 1 + ...07_21_062738_create_country_voice_rating_reports_table.php | 1 + ..._21_072211_create_country_message_rating_reports_table.php | 1 + database/seeders/CountryCallsReportSeeder.php | 3 ++- database/seeders/CountryKeypressReportSeeder.php | 3 ++- database/seeders/CountryMessageRatingReportSeeder.php | 3 ++- database/seeders/CountryVoiceRatingReportSeeder.php | 3 ++- 13 files changed, 27 insertions(+), 5 deletions(-) diff --git a/database/factories/CountryCallsReportFactory.php b/database/factories/CountryCallsReportFactory.php index c469845..6d49675 100644 --- a/database/factories/CountryCallsReportFactory.php +++ b/database/factories/CountryCallsReportFactory.php @@ -19,6 +19,9 @@ class CountryCallsReportFactory extends Factory { return [ 'province_id' => Province::factory(), + 'province_name' => function (array $attributes) { + return Province::query()->find($attributes['province_id'])->name; + }, 'date' => $this->faker->date(), 'total' => $this->faker->numberBetween(1000, 10000), 'route_to_teh4' => $this->faker->numberBetween(10, 100), diff --git a/database/factories/CountryKeypressReportFactory.php b/database/factories/CountryKeypressReportFactory.php index 9ac1df1..22170d6 100644 --- a/database/factories/CountryKeypressReportFactory.php +++ b/database/factories/CountryKeypressReportFactory.php @@ -19,6 +19,9 @@ class CountryKeypressReportFactory extends Factory { return [ 'province_id' => Province::factory(), + 'province_name' => function (array $attributes) { + return Province::query()->find($attributes['province_id'])->name; + }, 'date' => $this->faker->date(), 'total' => $this->faker->numberBetween(1000, 10000), 'key1' => $this->faker->numberBetween(10, 100), diff --git a/database/factories/CountryMessageRatingReportFactory.php b/database/factories/CountryMessageRatingReportFactory.php index e696309..e8c56df 100644 --- a/database/factories/CountryMessageRatingReportFactory.php +++ b/database/factories/CountryMessageRatingReportFactory.php @@ -19,6 +19,9 @@ class CountryMessageRatingReportFactory extends Factory { return [ 'province_id' => Province::factory(), + 'province_name' => function (array $attributes) { + return Province::query()->find($attributes['province_id'])->name; + }, 'date' => $this->faker->date(), 'very_good' => $this->faker->numberBetween(10, 100), 'good' => $this->faker->numberBetween(10, 100), diff --git a/database/factories/CountryVoiceRatingReportFactory.php b/database/factories/CountryVoiceRatingReportFactory.php index 5aca74a..1825e6a 100644 --- a/database/factories/CountryVoiceRatingReportFactory.php +++ b/database/factories/CountryVoiceRatingReportFactory.php @@ -19,6 +19,9 @@ class CountryVoiceRatingReportFactory extends Factory { return [ 'province_id' => Province::factory(), + 'province_name' => function (array $attributes) { + return Province::query()->find($attributes['province_id'])->name; + }, 'date' => $this->faker->date(), 'voice_quality_ok' => $this->faker->numberBetween(10, 100), 'message_quality_ok' => $this->faker->numberBetween(10, 100), diff --git a/database/factories/ProvinceFactory.php b/database/factories/ProvinceFactory.php index 891ea6e..49e3b46 100644 --- a/database/factories/ProvinceFactory.php +++ b/database/factories/ProvinceFactory.php @@ -17,9 +17,11 @@ class ProvinceFactory extends Factory public function definition(): array { return [ - 'name' => $this->faker->state, + 'name' => $this->faker->name(), 'lat' => $this->faker->latitude, 'lon' => $this->faker->longitude, + 'ip' => $this->faker->ipv4, + 'camera_ip' => $this->faker->ipv4, ]; } } diff --git a/database/migrations/2025_07_21_055258_create_country_calls_reports_table.php b/database/migrations/2025_07_21_055258_create_country_calls_reports_table.php index c6aaea4..c4f5e08 100644 --- a/database/migrations/2025_07_21_055258_create_country_calls_reports_table.php +++ b/database/migrations/2025_07_21_055258_create_country_calls_reports_table.php @@ -14,6 +14,7 @@ return new class extends Migration Schema::create('country_calls_reports', function (Blueprint $table) { $table->id(); $table->foreignId('province_id')->constrained('provinces'); + $table->string('province_name'); $table->date('date'); $table->integer('total'); $table->integer('route_to_teh4'); diff --git a/database/migrations/2025_07_21_061758_create_country_keypress_reports_table.php b/database/migrations/2025_07_21_061758_create_country_keypress_reports_table.php index 896ca98..71154c3 100644 --- a/database/migrations/2025_07_21_061758_create_country_keypress_reports_table.php +++ b/database/migrations/2025_07_21_061758_create_country_keypress_reports_table.php @@ -14,6 +14,7 @@ return new class extends Migration Schema::create('country_keypress_reports', function (Blueprint $table) { $table->id(); $table->foreignId('province_id')->constrained('provinces'); + $table->string('province_name'); $table->date('date'); $table->integer('total'); $table->integer('key1'); diff --git a/database/migrations/2025_07_21_062738_create_country_voice_rating_reports_table.php b/database/migrations/2025_07_21_062738_create_country_voice_rating_reports_table.php index e2cf554..b31a6c5 100644 --- a/database/migrations/2025_07_21_062738_create_country_voice_rating_reports_table.php +++ b/database/migrations/2025_07_21_062738_create_country_voice_rating_reports_table.php @@ -14,6 +14,7 @@ return new class extends Migration Schema::create('country_voice_rating_reports', function (Blueprint $table) { $table->id(); $table->foreignId('province_id')->constrained('provinces'); + $table->string('province_name'); $table->date('date'); $table->integer('voice_quality_ok'); $table->integer('message_quality_ok'); diff --git a/database/migrations/2025_07_21_072211_create_country_message_rating_reports_table.php b/database/migrations/2025_07_21_072211_create_country_message_rating_reports_table.php index 1f7ba2a..1f92bfb 100644 --- a/database/migrations/2025_07_21_072211_create_country_message_rating_reports_table.php +++ b/database/migrations/2025_07_21_072211_create_country_message_rating_reports_table.php @@ -14,6 +14,7 @@ return new class extends Migration Schema::create('country_message_rating_reports', function (Blueprint $table) { $table->id(); $table->foreignId('province_id')->constrained('provinces'); + $table->string('province_name'); $table->date('date'); $table->integer('very_good'); $table->integer('good'); diff --git a/database/seeders/CountryCallsReportSeeder.php b/database/seeders/CountryCallsReportSeeder.php index 81d2945..ac41790 100644 --- a/database/seeders/CountryCallsReportSeeder.php +++ b/database/seeders/CountryCallsReportSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders; +use App\Models\CountryCallsReport; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; @@ -12,6 +13,6 @@ class CountryCallsReportSeeder extends Seeder */ public function run(): void { - // + CountryCallsReport::factory()->count(10)->create(); } } diff --git a/database/seeders/CountryKeypressReportSeeder.php b/database/seeders/CountryKeypressReportSeeder.php index 941a9f8..a4e46c1 100644 --- a/database/seeders/CountryKeypressReportSeeder.php +++ b/database/seeders/CountryKeypressReportSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders; +use App\Models\CountryKeypressReport; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; @@ -12,6 +13,6 @@ class CountryKeypressReportSeeder extends Seeder */ public function run(): void { - // + CountryKeypressReport::factory()->count(10)->create(); } } diff --git a/database/seeders/CountryMessageRatingReportSeeder.php b/database/seeders/CountryMessageRatingReportSeeder.php index 23e42a7..08c8eed 100644 --- a/database/seeders/CountryMessageRatingReportSeeder.php +++ b/database/seeders/CountryMessageRatingReportSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders; +use App\Models\CountryMessageRatingReport; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; @@ -12,6 +13,6 @@ class CountryMessageRatingReportSeeder extends Seeder */ public function run(): void { - // + CountryMessageRatingReport::factory()->count(5)->create(); } } diff --git a/database/seeders/CountryVoiceRatingReportSeeder.php b/database/seeders/CountryVoiceRatingReportSeeder.php index 1d56157..007e534 100644 --- a/database/seeders/CountryVoiceRatingReportSeeder.php +++ b/database/seeders/CountryVoiceRatingReportSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders; +use App\Models\CountryVoiceRatingReport; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; @@ -12,6 +13,6 @@ class CountryVoiceRatingReportSeeder extends Seeder */ public function run(): void { - // + CountryVoiceRatingReport::factory()->count(10)->create(); } } From bc31ce9e37c913dda8c11a99b927932244a0cdc1 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Wed, 23 Jul 2025 09:03:16 +0330 Subject: [PATCH 6/7] add column to province table --- .../2025_04_28_101821_create_provinces_table.php | 2 -- ...025_07_21_094121_add_column_to_provinces_table.php} | 10 ++++++---- 2 files changed, 6 insertions(+), 6 deletions(-) rename database/migrations/{2025_07_21_094121_create_expert_performances_table.php => 2025_07_21_094121_add_column_to_provinces_table.php} (57%) diff --git a/database/migrations/2025_04_28_101821_create_provinces_table.php b/database/migrations/2025_04_28_101821_create_provinces_table.php index b2a5d64..1c2a32b 100644 --- a/database/migrations/2025_04_28_101821_create_provinces_table.php +++ b/database/migrations/2025_04_28_101821_create_provinces_table.php @@ -16,8 +16,6 @@ return new class extends Migration $table->string('name'); $table->double('lat'); $table->double('lon'); - $table->string('ip'); - $table->string('camera_ip'); $table->timestamps(); }); } diff --git a/database/migrations/2025_07_21_094121_create_expert_performances_table.php b/database/migrations/2025_07_21_094121_add_column_to_provinces_table.php similarity index 57% rename from database/migrations/2025_07_21_094121_create_expert_performances_table.php rename to database/migrations/2025_07_21_094121_add_column_to_provinces_table.php index 2a0b866..3181646 100644 --- a/database/migrations/2025_07_21_094121_create_expert_performances_table.php +++ b/database/migrations/2025_07_21_094121_add_column_to_provinces_table.php @@ -11,9 +11,9 @@ return new class extends Migration */ public function up(): void { - Schema::create('expert_performances', function (Blueprint $table) { - $table->id(); - $table->timestamps(); + Schema::create('provinces', function (Blueprint $table) { + $table->string('ip'); + $table->string('camera_ip'); }); } @@ -22,6 +22,8 @@ return new class extends Migration */ public function down(): void { - Schema::dropIfExists('expert_performances'); + Schema::table('provinces', function (Blueprint $table) { + $table->dropColumn(['ip', 'camera_ip']); + }); } }; From 9af2c7c7d70e0c3863382c802312d2265d6ddc2f Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Wed, 23 Jul 2025 09:51:30 +0330 Subject: [PATCH 7/7] add comment to factories --- .../factories/CountryCallsReportFactory.php | 1 + .../CountryKeypressReportFactory.php | 1 + .../CountryMessageRatingReportFactory.php | 1 + .../CountryVoiceRatingReportFactory.php | 1 + ...1_094121_add_column_to_provinces_table.php | 6 ++--- ...61700_create_expert_performances_table.php | 27 +++++++++++++++++++ 6 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 database/migrations/2025_07_23_061700_create_expert_performances_table.php diff --git a/database/factories/CountryCallsReportFactory.php b/database/factories/CountryCallsReportFactory.php index 6d49675..2633de0 100644 --- a/database/factories/CountryCallsReportFactory.php +++ b/database/factories/CountryCallsReportFactory.php @@ -17,6 +17,7 @@ class CountryCallsReportFactory extends Factory */ public function definition(): array { +// $this->faker->randomElement(Province::all()->pluck('id')->toArray()) return [ 'province_id' => Province::factory(), 'province_name' => function (array $attributes) { diff --git a/database/factories/CountryKeypressReportFactory.php b/database/factories/CountryKeypressReportFactory.php index 22170d6..63fd69d 100644 --- a/database/factories/CountryKeypressReportFactory.php +++ b/database/factories/CountryKeypressReportFactory.php @@ -17,6 +17,7 @@ class CountryKeypressReportFactory extends Factory */ public function definition(): array { +// $this->faker->randomElement(Province::all()->pluck('id')->toArray()) return [ 'province_id' => Province::factory(), 'province_name' => function (array $attributes) { diff --git a/database/factories/CountryMessageRatingReportFactory.php b/database/factories/CountryMessageRatingReportFactory.php index e8c56df..475dd76 100644 --- a/database/factories/CountryMessageRatingReportFactory.php +++ b/database/factories/CountryMessageRatingReportFactory.php @@ -17,6 +17,7 @@ class CountryMessageRatingReportFactory extends Factory */ public function definition(): array { +// $this->faker->randomElement(Province::all()->pluck('id')->toArray()) return [ 'province_id' => Province::factory(), 'province_name' => function (array $attributes) { diff --git a/database/factories/CountryVoiceRatingReportFactory.php b/database/factories/CountryVoiceRatingReportFactory.php index 1825e6a..e794741 100644 --- a/database/factories/CountryVoiceRatingReportFactory.php +++ b/database/factories/CountryVoiceRatingReportFactory.php @@ -17,6 +17,7 @@ class CountryVoiceRatingReportFactory extends Factory */ public function definition(): array { +// $this->faker->randomElement(Province::all()->pluck('id')->toArray()) return [ 'province_id' => Province::factory(), 'province_name' => function (array $attributes) { diff --git a/database/migrations/2025_07_21_094121_add_column_to_provinces_table.php b/database/migrations/2025_07_21_094121_add_column_to_provinces_table.php index 3181646..67752ab 100644 --- a/database/migrations/2025_07_21_094121_add_column_to_provinces_table.php +++ b/database/migrations/2025_07_21_094121_add_column_to_provinces_table.php @@ -11,9 +11,9 @@ return new class extends Migration */ public function up(): void { - Schema::create('provinces', function (Blueprint $table) { - $table->string('ip'); - $table->string('camera_ip'); + Schema::table('provinces', function (Blueprint $table) { + $table->string('ip')->nullable(); + $table->string('camera_ip')->nullable(); }); } diff --git a/database/migrations/2025_07_23_061700_create_expert_performances_table.php b/database/migrations/2025_07_23_061700_create_expert_performances_table.php new file mode 100644 index 0000000..2a0b866 --- /dev/null +++ b/database/migrations/2025_07_23_061700_create_expert_performances_table.php @@ -0,0 +1,27 @@ +id(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('expert_performances'); + } +};