diff --git a/.env.example b/.env.example index ce7f61b..e9ba913 100644 --- a/.env.example +++ b/.env.example @@ -70,3 +70,4 @@ TRUSTED_IP="127.0.0.1" NOTIFICATION_SERVER_URL= LOGIN_HASH_VALUE= +SETAD_IP= diff --git a/app/Console/Commands/SendSupervisorCheckStatsCommand.php b/app/Console/Commands/SendSupervisorCheckStatsCommand.php new file mode 100644 index 0000000..0e67815 --- /dev/null +++ b/app/Console/Commands/SendSupervisorCheckStatsCommand.php @@ -0,0 +1,32 @@ +execute(); + $this->info('Done!'); + } +} diff --git a/app/Http/Controllers/HeadquartersDashboard/CumulativeSupervisorPerformanceStatsController.php b/app/Http/Controllers/HeadquartersDashboard/CumulativeSupervisorPerformanceStatsController.php new file mode 100644 index 0000000..efe7807 --- /dev/null +++ b/app/Http/Controllers/HeadquartersDashboard/CumulativeSupervisorPerformanceStatsController.php @@ -0,0 +1,41 @@ +selectRaw(" + province_id, + province_name, + SUM(calls) AS total, + SUM(reviews) AS reviews, + SUM(good) AS good, + SUM(bad) AS bad + ") + ->groupBy('province_id', 'province_name') + ->unionAll(DB::table('supervisor_performances')->selectRaw(" + 0 as province_id, + 'کشوری' as province_name, + SUM(calls) AS total, + SUM(reviews) AS reviews, + SUM(good) AS good, + SUM(bad) AS bad + ")); + + return response()->json( + DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*']) + ); + } +} diff --git a/app/Http/Controllers/HeadquartersDashboard/LoginToProvinceController.php b/app/Http/Controllers/HeadquartersDashboard/LoginToProvinceController.php index 746d348..bb2a13d 100644 --- a/app/Http/Controllers/HeadquartersDashboard/LoginToProvinceController.php +++ b/app/Http/Controllers/HeadquartersDashboard/LoginToProvinceController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\HeadquartersDashboard; use App\Http\Controllers\Controller; +use app\Http\Traits\ApiResponse; use App\Models\Province; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -10,19 +11,20 @@ use Illuminate\Support\Facades\Hash; class LoginToProvinceController extends Controller { - public function loginToProvince(Request $request) + use ApiResponse; + + public function authenticate(Request $request) { $province_ip = Province::query() ->Where('id', '=', $request->province_id) ->value('ip_address'); - $payload = [ + $data = [ 'user_id' => auth()->user()->id, 'token' => Hash::make(config('globalVariables.LOGIN_HASH_VALUE')), + 'ip' => $province_ip, ]; - $url = $province_ip . "?" . http_build_query($payload); - - return redirect($url); + return $this->successResponse($data); } } diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index 887c227..05b8c08 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -37,9 +37,11 @@ class ProfileController extends Controller public function changeAvatar(ChangeAvatarRequest $request): JsonResponse { $user = auth()->user(); + if ($user->avatar){ FileFacade::delete($user->avatar, true); } + $user->update([ 'avatar' => FileFacade::save($request->file('avatar'), 'users/avatars/' . $request->username) ]); @@ -49,16 +51,19 @@ class ProfileController extends Controller public function online(Request $request): JsonResponse { - User::query()->where('telephone_id', '=', $request->telephone_id)->update([ - 'is_online' => true, - ]); + User::query() + ->firstWhere('telephone_id', '=', $request->telephone_id) + ->update(['is_online' => true,]); + return $this->successResponse(); } public function offline(Request $request): JsonResponse { - $user= User::query()->where('telephone_id', '=', $request->telephone_id)->first(); - $user->update(['is_online' => false]); + User::query() + ->firstWhere('telephone_id', '=', $request->telephone_id) + ->update(['is_online' => false]); + return $this->successResponse(); } diff --git a/app/Http/Controllers/ProvinceDashboard/OperatorDialogues/OperatorController.php b/app/Http/Controllers/ProvinceDashboard/OperatorDialogues/OperatorController.php index 2abef87..8a733d9 100644 --- a/app/Http/Controllers/ProvinceDashboard/OperatorDialogues/OperatorController.php +++ b/app/Http/Controllers/ProvinceDashboard/OperatorDialogues/OperatorController.php @@ -4,6 +4,8 @@ namespace App\Http\Controllers\ProvinceDashboard\OperatorDialogues; use App\Exports\OperatorDialogues\OperatorCartableExcel; use App\Http\Controllers\Controller; +use app\Http\Traits\ApiResponse; +use App\Models\OperatorDialogue; use App\Services\Dashboard\Province\OperatorDialogues\DataTableService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -12,6 +14,7 @@ use Symfony\Component\HttpFoundation\BinaryFileResponse; class OperatorController extends Controller { + use ApiResponse; /** * Display a listing of the resource. */ @@ -23,9 +26,9 @@ class OperatorController extends Controller /** * Display the specified resource. */ - public function show(string $id) + public function show(OperatorDialogue $operatorDialogue): JsonResponse { - // + return $this->successResponse($operatorDialogue); } /** diff --git a/app/Http/Controllers/ProvinceDashboard/OperatorDialogues/SupervisorController.php b/app/Http/Controllers/ProvinceDashboard/OperatorDialogues/SupervisorController.php index a1ef601..c3cdace 100644 --- a/app/Http/Controllers/ProvinceDashboard/OperatorDialogues/SupervisorController.php +++ b/app/Http/Controllers/ProvinceDashboard/OperatorDialogues/SupervisorController.php @@ -44,5 +44,4 @@ class SupervisorController extends Controller $data = $dataTableService->dataTable($request, true); return Excel::download(new SupervisorCartableExcel($data['data']), $name); } - } diff --git a/app/Http/Controllers/ProvinceDashboard/PeopleMessages/SupervisorController.php b/app/Http/Controllers/ProvinceDashboard/PeopleMessages/SupervisorController.php index cee7a46..7d265b5 100644 --- a/app/Http/Controllers/ProvinceDashboard/PeopleMessages/SupervisorController.php +++ b/app/Http/Controllers/ProvinceDashboard/PeopleMessages/SupervisorController.php @@ -4,6 +4,8 @@ namespace App\Http\Controllers\ProvinceDashboard\PeopleMessages; use App\Exports\PeopleMessages\SupervisorCartableExcel; use App\Http\Controllers\Controller; +use app\Http\Traits\ApiResponse; +use App\Models\PeopleMessage; use App\Services\Dashboard\Province\PeopleMessages\DataTableService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -11,6 +13,8 @@ use Maatwebsite\Excel\Facades\Excel; class SupervisorController extends Controller { + use ApiResponse; + /** * Display a listing of the resource. */ @@ -29,8 +33,8 @@ class SupervisorController extends Controller /** * Display the specified resource. */ - public function show(string $id) + public function show(PeopleMessage $peopleMessage) { - // + return $this->successResponse($peopleMessage); } } diff --git a/app/Http/Controllers/ProvinceDashboard/VerifyAuthenticationController.php b/app/Http/Controllers/ProvinceDashboard/VerifyAuthenticationController.php new file mode 100644 index 0000000..e5d12e3 --- /dev/null +++ b/app/Http/Controllers/ProvinceDashboard/VerifyAuthenticationController.php @@ -0,0 +1,28 @@ +token)) { + return $this->errorResponse('Invalid token'); + } + + $user = User::query()->findOrFail($request->user_id); + + Auth::login($user); + + return $this->successResponse(); + } +} diff --git a/app/Http/Middleware/VerifySetadIp.php b/app/Http/Middleware/VerifySetadIp.php index a6d3bac..00f3b45 100644 --- a/app/Http/Middleware/VerifySetadIp.php +++ b/app/Http/Middleware/VerifySetadIp.php @@ -11,18 +11,14 @@ class VerifySetadIp /** * Handle an incoming request. * - * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next + * @param Closure(Request): (Response) $next */ public function handle(Request $request, Closure $next): Response { - $masterServerIp = env('MASTER_SERVER_IP'); - if (is_null($masterServerIp)) { - return response('Master server IP not configured.', 500); + if ($request->ip() == config('globalVariables.SETAD_IP')) { + return $next($request); } - if ($request->ip() !== $masterServerIp) { - return response('Unauthorized.', 401); - } - return $next($request); + abort(Response::HTTP_FORBIDDEN); } } diff --git a/app/Models/ExpertPerformance.php b/app/Models/ExpertPerformance.php deleted file mode 100644 index a6aa1f8..0000000 --- a/app/Models/ExpertPerformance.php +++ /dev/null @@ -1,12 +0,0 @@ - */ - use HasFactory; -} diff --git a/app/Models/SupervisorPerformance.php b/app/Models/SupervisorPerformance.php new file mode 100644 index 0000000..0003ff1 --- /dev/null +++ b/app/Models/SupervisorPerformance.php @@ -0,0 +1,15 @@ + */ + use HasFactory; + + protected $guarded = []; +} diff --git a/app/Models/SystemMessage.php b/app/Models/SystemMessage.php index 20e004a..d69a3e1 100644 --- a/app/Models/SystemMessage.php +++ b/app/Models/SystemMessage.php @@ -2,13 +2,23 @@ namespace App\Models; +use Database\Factories\SystemMessageFactory; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\Storage; class SystemMessage extends Model { - /** @use HasFactory<\Database\Factories\SystemMessageFactory> */ + /** @use HasFactory */ use HasFactory; protected $guarded = []; + + protected function voice(): Attribute + { + return Attribute::make( + get: fn($value) => $value == null ? null : Storage::disk('public')->url($value) + ); + } } diff --git a/app/Services/Commands/SendSupervisorCheckStatsReportService.php b/app/Services/Commands/SendSupervisorCheckStatsReportService.php new file mode 100644 index 0000000..759dcfa --- /dev/null +++ b/app/Services/Commands/SendSupervisorCheckStatsReportService.php @@ -0,0 +1,80 @@ +url = config('ProvinceInfo.center_ip'); + $this->channelName = 'send_supervisor_check_stats_report'; + $this->provinceId = config('ProvinceInfo.id'); + $this->provinceName = config('ProvinceInfo.name'); + } + + /** + * @throws ConnectionException + * @throws RequestException + */ + public function execute(): void + { + try + { + $data = $this->prepare(); + Http::post($this->url, $data)->throw(); + Log::channel($this->channelName)->info(SendSupervisorCheckStatsReportService::class, [$this->provinceName, array_sum($data), 'successful']); + } + catch (Exception $e) + { + Log::channel($this->channelName)->error(SendSupervisorCheckStatsReportService::class, [$e->getMessage()]); + throw $e; + } + } + + private function prepare(): array + { + $query = " + SELECT + {$this->provinceId} AS province_id, + '{$this->provinceName}' AS province_name, + od.date, + COUNT(*) AS reviews, + COUNT(CASE WHEN is_good = 1 THEN 1 END) AS good, + COUNT(CASE WHEN is_good = 0 THEN 1 END) AS bad, + COALESCE(cdr_data.calls, 0) AS calls + FROM ( + SELECT date, is_good + FROM operator_dialogues + WHERE supervisor_id IS NOT NULL + AND create_at > NOW() - INTERVAL 3 DAY + ) AS od + LEFT JOIN ( + SELECT + DATE(calldate) AS d, + COUNT(CASE + WHEN dcontext = 'from-internal' + AND disposition = 'ANSWERED' + AND dst > 100 AND dst < 105 + THEN 1 END) AS calls + FROM asteriskcdrdb.cdr + WHERE calldate > NOW() - INTERVAL 3 DAY + GROUP BY d + ) AS cdr_data + ON od.date = cdr_data.d + GROUP BY od.date, cdr_data.calls + ORDER BY od.date DESC"; + + return DB::select($query); + } +} diff --git a/app/Services/Dashboard/Province/OperatorDialogues/DataTableService.php b/app/Services/Dashboard/Province/OperatorDialogues/DataTableService.php index 0a0fc65..4354160 100644 --- a/app/Services/Dashboard/Province/OperatorDialogues/DataTableService.php +++ b/app/Services/Dashboard/Province/OperatorDialogues/DataTableService.php @@ -12,12 +12,11 @@ class DataTableService public function index(Request $request) { $query = DB::table('asteriskcdrdb.cdr') - ->leftJoin('crm_db.voice_experts', 'asteriskcdrdb.cdr.uniqueid', '=', 'crm_db.operator_dialogues.cdr_unique_id') + ->leftJoin('crm_db.operator_dialogues', 'asteriskcdrdb.cdr.uniqueid', '=', 'crm_db.operator_dialogues.cdr_unique_id') ->where('dst', '<>', '') ->where('lastapp', '=', 'Dial') ->where('duration', '>', 0) - ->where('recordingfile', '<>', '') - ->select('*'); + ->where('recordingfile', '<>', ''); return DataTableFacade::run( $query, diff --git a/app/Services/Dashboard/Province/ReportService.php b/app/Services/Dashboard/Province/ReportService.php index 18bef68..f3952d6 100644 --- a/app/Services/Dashboard/Province/ReportService.php +++ b/app/Services/Dashboard/Province/ReportService.php @@ -13,18 +13,18 @@ class ReportService $query = DB::table('asteriskcdrdb.cdr') ->selectRaw(" DATE(calldate) AS d, - COUNT(CASE WHEN (recordingfile = '' OR recordingfile LIKE 'q-%') THEN 1 END) AS c_all, - COUNT(CASE WHEN lastdata = 'IAX2/serverpeer/100' THEN 1 END) AS c_teh4, - COUNT(CASE WHEN lastdata = 'IAX2/242serverpeer/200' THEN 1 END) AS c_teh5, - COUNT(CASE WHEN dst = '500' THEN 1 END) AS c_os4, - COUNT(CASE WHEN dst = '600' THEN 1 END) AS c_os5, - COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 THEN 1 END) AS c_ok, - COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'NO ANSWER' AND dst BETWEEN 101 AND 104 AND duration > 14 THEN 1 END) AS c_nok, - COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 AND billsec > 9 THEN 1 END) AS c_b10, - COUNT(CASE WHEN lastapp = 'Busy' THEN 1 END) AS c_dnd, - COUNT(CASE WHEN dst BETWEEN 502 AND 599 THEN 1 END) AS c_trans, - COUNT(CASE WHEN disposition <> 'BUSY' AND dst BETWEEN 101 AND 105 THEN 1 END) AS ch_all, - AVG(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' THEN billsec END) AS c_avg + COUNT(CASE WHEN (recordingfile = '' OR recordingfile LIKE 'q-%') THEN 1 END) AS total, + COUNT(CASE WHEN lastdata = 'IAX2/serverpeer/100' THEN 1 END) AS teh4, + COUNT(CASE WHEN lastdata = 'IAX2/242serverpeer/200' THEN 1 END) AS teh5, + COUNT(CASE WHEN dst = '500' THEN 1 END) AS os4, + COUNT(CASE WHEN dst = '600' THEN 1 END) AS os5, + COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 THEN 1 END) AS ok, + COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'NO ANSWER' AND dst BETWEEN 101 AND 104 AND duration > 14 THEN 1 END) AS nok, + COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 AND billsec > 9 THEN 1 END) AS b10, + COUNT(CASE WHEN lastapp = 'Busy' THEN 1 END) AS dnd, + COUNT(CASE WHEN dst BETWEEN 502 AND 599 THEN 1 END) AS trans, + COUNT(CASE WHEN disposition <> 'BUSY' AND dst BETWEEN 101 AND 105 THEN 1 END) AS all, + AVG(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' THEN billsec END) AS avg "); // ->whereBetween('calldate', [$from, $to]) // use Carbon or date strings // ->groupBy(DB::raw('DATE(calldate)')) @@ -44,8 +44,8 @@ class ReportService { $query = DB::table('people_messages') ->selectRaw(' - COUNT(CASE WHEN is_listen = 1 THEN 1 END) AS c_l, - COUNT(CASE WHEN is_listen = 0 THEN 1 END) AS c_nl + COUNT(CASE WHEN is_listen = 1 THEN 1 END) AS l, + COUNT(CASE WHEN is_listen = 0 THEN 1 END) AS nl '); // ->whereBetween('date', [$date_from, $date_to]) // ->first(); @@ -85,21 +85,20 @@ class ReportService { $query = DB::table('asteriskcdrdb.cdr') ->selectRaw(" - SELECT * - (ch_all - (c_ok + c_nok)) AS c_fail + (all - (ok + nok)) AS fail FROM ( SELECT DATE(calldate) AS d, dst, - COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 THEN 1 END) AS c_ok, - COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'NO ANSWER' AND dst BETWEEN 101 AND 104 AND duration > 14 THEN 1 END) AS c_nok, - COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 AND billsec > 9 THEN 1 END) AS c_b10, - COUNT(CASE WHEN lastapp = 'Busy' THEN 1 END) AS c_dnd, - COUNT(CASE WHEN dst BETWEEN 502 AND 599 THEN 1 END) AS c_trans, - COUNT(CASE WHEN disposition <> 'BUSY' AND dst BETWEEN 101 AND 105 THEN 1 END) AS ch_all + COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 THEN 1 END) AS ok, + COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'NO ANSWER' AND dst BETWEEN 101 AND 104 AND duration > 14 THEN 1 END) AS nok, + COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 AND billsec > 9 THEN 1 END) AS b10, + COUNT(CASE WHEN lastapp = 'Busy' THEN 1 END) AS dnd, + COUNT(CASE WHEN dst BETWEEN 502 AND 599 THEN 1 END) AS trans, + COUNT(CASE WHEN disposition <> 'BUSY' AND dst BETWEEN 101 AND 105 THEN 1 END) AS all FROM asteriskcdrdb.cdr - WHERE dst BETWEEN 101 AND 105 AND calldate BETWEEN ? AND ? + WHERE dst BETWEEN 101 AND 105 GROUP BY d, dst ORDER BY d, dst ); @@ -127,24 +126,22 @@ class ReportService { $query = DB::table('asteriskcdrdb.cdr') ->selectRaw(" - SELECT * - (ch_all - (c_ok + c_nok)) AS c_fail + (all - (ok + nok)) AS fail FROM ( SELECT DATE(calldate) AS d, dst, - COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 THEN 1 END) AS c_ok, - COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'NO ANSWER' AND dst BETWEEN 101 AND 104 AND duration > 14 THEN 1 END) AS c_nok, - COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 AND billsec > 9 THEN 1 END) AS c_b10, - COUNT(CASE WHEN lastapp = 'Busy' THEN 1 END) AS c_dnd, - COUNT(CASE WHEN dst BETWEEN 502 AND 599 THEN 1 END) AS c_trans, - COUNT(CASE WHEN disposition <> 'BUSY' AND dst BETWEEN 101 AND 105 THEN 1 END) AS ch_all + COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 THEN 1 END) AS ok, + COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'NO ANSWER' AND dst BETWEEN 101 AND 104 AND duration > 14 THEN 1 END) AS nok, + COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 AND billsec > 9 THEN 1 END) AS b10, + COUNT(CASE WHEN lastapp = 'Busy' THEN 1 END) AS dnd, + COUNT(CASE WHEN dst BETWEEN 502 AND 599 THEN 1 END) AS trans, + COUNT(CASE WHEN disposition <> 'BUSY' AND dst BETWEEN 101 AND 105 THEN 1 END) AS all FROM asteriskcdrdb.cdr - WHERE dst BETWEEN 101 AND 105 AND calldate BETWEEN ? AND ? - GROUP dst - ORDER dst - ); + WHERE dst BETWEEN 101 AND 105 + GROUP BY dst + ORDER BY dst); "); return DataTableFacade::run( diff --git a/config/globalVariables.php b/config/globalVariables.php index 65c5e42..ec26ab5 100644 --- a/config/globalVariables.php +++ b/config/globalVariables.php @@ -4,4 +4,5 @@ return [ 'TRUSTED_IP' => explode(',', env("TRUSTED_IP", '127.0.0.1')), 'NOTIFICATION_SERVER_URL' => env('NOTIFICATION_SERVER_URL', '127.0.0.1'), 'LOGIN_HASH_VALUE' => env('LOGIN_HASH_VALUE'), + 'SETAD_IP' => env('SETAD_IP'), ]; diff --git a/config/logging.php b/config/logging.php index ca78f2e..ddd3970 100644 --- a/config/logging.php +++ b/config/logging.php @@ -150,6 +150,11 @@ return [ 'path' => storage_path('logs/send_system_message_stats_report.log'), 'level' => 'debug', ], - ], + 'send_supervisor_check_stats_report' => [ + 'driver' => 'single', + 'path' => storage_path('logs/send_supervisor_check_stats_report.log'), + 'level' => 'debug', + ], + ], ]; diff --git a/database/factories/ExpertPerformanceFactory.php b/database/factories/SupervisorPerformanceFactory.php similarity index 81% rename from database/factories/ExpertPerformanceFactory.php rename to database/factories/SupervisorPerformanceFactory.php index 2ee7b2e..c878543 100644 --- a/database/factories/ExpertPerformanceFactory.php +++ b/database/factories/SupervisorPerformanceFactory.php @@ -5,9 +5,9 @@ namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; /** - * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\ExpertPerformance> + * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\SupervisorPerformance> */ -class ExpertPerformanceFactory extends Factory +class SupervisorPerformanceFactory extends Factory { /** * Define the model's default state. 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 deleted file mode 100644 index 2a0b866..0000000 --- a/database/migrations/2025_07_23_061700_create_expert_performances_table.php +++ /dev/null @@ -1,27 +0,0 @@ -id(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('expert_performances'); - } -}; diff --git a/database/migrations/2025_08_10_064355_create_supervisor_performances_table.php b/database/migrations/2025_08_10_064355_create_supervisor_performances_table.php new file mode 100644 index 0000000..0f6718d --- /dev/null +++ b/database/migrations/2025_08_10_064355_create_supervisor_performances_table.php @@ -0,0 +1,34 @@ +id(); + $table->date('date'); + $table->foreignId('province_id')->constrained('provinces'); + $table->string('province_name'); + $table->integer('calls'); + $table->integer('reviews'); + $table->integer('good'); + $table->integer('bad'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('supervisor_performances'); + } +}; diff --git a/database/seeders/ExpertPerformanceSeeder.php b/database/seeders/SupervisorPerformanceSeeder.php similarity index 82% rename from database/seeders/ExpertPerformanceSeeder.php rename to database/seeders/SupervisorPerformanceSeeder.php index ea2f8ea..1efcbbb 100644 --- a/database/seeders/ExpertPerformanceSeeder.php +++ b/database/seeders/SupervisorPerformanceSeeder.php @@ -5,7 +5,7 @@ namespace Database\Seeders; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; -class ExpertPerformanceSeeder extends Seeder +class SupervisorPerformanceSeeder extends Seeder { /** * Run the database seeds. diff --git a/public/file_example_WAV_1MG.wav b/public/file_example_WAV_1MG.wav new file mode 100644 index 0000000..3179e0e Binary files /dev/null and b/public/file_example_WAV_1MG.wav differ diff --git a/routes/console.php b/routes/console.php index 8243f79..31b8b56 100644 --- a/routes/console.php +++ b/routes/console.php @@ -3,11 +3,8 @@ use Illuminate\Foundation\Inspiring; use Illuminate\Support\Facades\Artisan; -Artisan::command('inspire', function () { - $this->comment(Inspiring::quote()); -})->purpose('Display an inspiring quote'); - Schedule::command('report:send-call-stats')->everyTwoMinutes(); Schedule::command('report:send-system-message-stats')->everyThreeMinutes(); Schedule::command('report:send-keypress-stats')->everyFourMinutes(); Schedule::command('report:send-people-message-stats')->everyFiveMinutes(); +Schedule::command('report:send-supervisor-check-stats')->everyFiveMinutes(); diff --git a/routes/web.php b/routes/web.php index 73a7790..7f1a5c6 100644 --- a/routes/web.php +++ b/routes/web.php @@ -13,7 +13,7 @@ use App\Http\Controllers\HeadquartersDashboard\CumulativeCentersStatsController; use App\Http\Controllers\HeadquartersDashboard\CumulativeKeypressStatsController; use App\Http\Controllers\HeadquartersDashboard\CumulativeMessageRatingStatsController; use App\Http\Controllers\HeadquartersDashboard\CumulativeVoiceRatingStatsController; -use App\Http\Controllers\ProvinceDashboard\CheckSetadController; +use App\Http\Controllers\ProvinceDashboard\VerifyAuthenticationController; use App\Http\Middleware\SuperAdminCheck; use Illuminate\Support\Facades\Route; @@ -203,19 +203,20 @@ Route::prefix('server')->group(function () { Route::get('/{peopleMessage}', 'show')->name('show'); }); }); - Route::middleware(['auth', 'permission:setat_ip']) + + Route::middleware(['auth', 'role:admin']) ->prefix('login_to_province') ->name('loginToProvince.') ->controller(LoginToProvinceController::class) ->group(function () { - Route::post('/', 'loginToProvince')->name('loginToProvince'); - }); - Route::middleware('auth') - ->prefix('check_setad') - ->name('checkSetad.') - ->controller(CheckSetadController::class) - ->group(function () { - Route::get('/', 'verifyToken')->name('verifyToken'); + Route::post('/', 'authenticate')->name('authenticate'); }); + Route::middleware(['auth', 'setadIp']) + ->prefix('verify_authentication') + ->name('verifyAuthentication.') + ->controller(VerifyAuthenticationController::class) + ->group(function () { + Route::get('/', 'login')->name('login'); + }); });