diff --git a/.env.example b/.env.example index e3d6ee7..6f8f318 100644 --- a/.env.example +++ b/.env.example @@ -20,19 +20,13 @@ LOG_STACK=single LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug -DB_CONNECTION=pgsql +DB_CONNECTION=mysql DB_HOST=127.0.0.1 -DB_PORT=5432 +DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD= -ASTERISK_DB_HOST= -ASTERISK_DB_PORT= -ASTERISK_DB_DATABASE= -ASTERISK_DB_USERNAME= -ASTERISK_DB_PASSWORD= - SESSION_DRIVER=database SESSION_LIFETIME=120 SESSION_ENCRYPT=false diff --git a/Dockerfile b/Dockerfile index 6825188..afd3059 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -FROM docker.arvancloud.ir/php:8.3-fpm-alpine3.21 +FROM docker.arvancloud.ir/php:8.3-fpm-alpine3.21 -# Install common php extension dependencies +# Install common PHP extension dependencies RUN apk update && apk add --no-cache \ bash \ nano \ @@ -8,13 +8,14 @@ RUN apk update && apk add --no-cache \ libpng \ libpng-dev \ libjpeg-turbo-dev \ - libwebp \ + freetype-dev \ libwebp-dev \ libxml2-dev \ unzip \ libzip-dev \ libpq-dev \ - && docker-php-ext-install pdo_pgsql + && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ + && docker-php-ext-install pdo_pgsql gd zip # Set the working directory WORKDIR /var/www/laravel @@ -22,13 +23,12 @@ COPY . . RUN chmod -R 777 /var/www/laravel/storage /var/www/laravel/bootstrap/cache - -# install composer +# Install Composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer -# Set the default command to run php-fpm -CMD composer install;\ - php artisan key:generate;\ - php artisan migrate ;\ - php artisan db:seed;\ - php-fpm +# Default command +CMD composer install \ + && php artisan key:generate \ + && php artisan migrate \ + && php artisan db:seed \ + && php-fpm diff --git a/app/Enums/PeopleMessageActions.php b/app/Enums/PeopleMessageActions.php new file mode 100644 index 0000000..41e2def --- /dev/null +++ b/app/Enums/PeopleMessageActions.php @@ -0,0 +1,23 @@ + 'عدم نیاز به ثبت (مشکل راه)', + 2 => 'عدم نیاز به ثبت (مشکل حمل و نقلی)', + 3 => 'عدم نیاز به ثبت (مشکل عوارضی)', + 4 => 'ثبت سوانح (مشکل راه)', + 5 => 'ثبت سوانح (مشکل حمل و نقلی)', + ]; + + return $mapArray[$state]; + } +} diff --git a/app/Http/Controllers/HeadquartersDashboard/CumulativeCentersStatsController.php b/app/Http/Controllers/HeadquartersDashboard/CumulativeCentersStatsController.php index 2f027d6..70141c6 100644 --- a/app/Http/Controllers/HeadquartersDashboard/CumulativeCentersStatsController.php +++ b/app/Http/Controllers/HeadquartersDashboard/CumulativeCentersStatsController.php @@ -4,7 +4,6 @@ namespace App\Http\Controllers\HeadquartersDashboard; use App\Facades\DataTable\DataTableFacade; use App\Http\Controllers\Controller; -use app\Http\Traits\ApiResponse; use App\Models\CountryCallsReport; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -12,12 +11,10 @@ use Illuminate\Support\Facades\DB; class CumulativeCentersStatsController extends Controller { - use ApiResponse; - public function index(Request $request): JsonResponse { - $data = DB::select(" - SELECT + $query = DB::table('country_calls_reports') + ->selectRaw(" province_id, province_name, SUM(total) as total, @@ -33,30 +30,35 @@ class CumulativeCentersStatsController extends Controller SUM(talked_to_operator) as talked_to_operator, AVG(average_calls_time) as average_calls_time, SUM(fails) as fails - FROM country_calls_reports - GROUP BY province_id, province_name + ") + ->groupBy('province_id', 'province_name') + ->unionAll( + DB::table('country_calls_reports') + ->selectRaw(" + 0 as province_id, + 'کشوری' as province_name, + SUM(total), + SUM(route_to_teh4), + SUM(route_to_teh5), + SUM(route_to_os4), + SUM(route_to_os5), + SUM(answered), + SUM(answered_over10), + SUM(missed), + SUM(dnd), + SUM(transferred), + SUM(talked_to_operator), + AVG(average_calls_time), + SUM(fails) + ") + ); - UNION ALL - - SELECT - 0 as province_id, - 'کشور' as province_name, - SUM(total), - SUM(route_to_teh4), - SUM(route_to_teh5), - SUM(route_to_os4), - SUM(route_to_os5), - SUM(answered), - SUM(answered_over10), - SUM(missed), - SUM(dnd), - SUM(transferred), - SUM(talked_to_operator), - AVG(average_calls_time), - SUM(fails) - FROM country_calls_reports - "); - - return $this->successResponse($data); + return response()->json( + DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*']) + ); } } diff --git a/app/Http/Controllers/HeadquartersDashboard/CumulativeKeypressStatsController.php b/app/Http/Controllers/HeadquartersDashboard/CumulativeKeypressStatsController.php index 809af22..805f6e1 100644 --- a/app/Http/Controllers/HeadquartersDashboard/CumulativeKeypressStatsController.php +++ b/app/Http/Controllers/HeadquartersDashboard/CumulativeKeypressStatsController.php @@ -4,20 +4,15 @@ namespace App\Http\Controllers\HeadquartersDashboard; use App\Facades\DataTable\DataTableFacade; use App\Http\Controllers\Controller; -use app\Http\Traits\ApiResponse; -use App\Models\CountryKeypressReport; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class CumulativeKeypressStatsController extends Controller { - use ApiResponse; - public function index(Request $request): JsonResponse { - $data = DB::select(" - SELECT + $query = DB::table('country_keypress_reports')->selectRaw(" province_id, province_name, SUM(total) as total, @@ -35,32 +30,34 @@ class CumulativeKeypressStatsController extends Controller SUM(key2_1) as key2_1, SUM(key2_2) as key2_2, SUM(key2_3) as key2_3 - FROM country_keypress_reports - GROUP BY province_id, province_name + ") + ->groupBy('province_id', 'province_name') + ->unionAll(DB::table('country_keypress_reports')->selectRaw(" + 0 as province_id, + 'کشوری' as province_name, + SUM(total), + SUM(key1), + SUM(key2), + SUM(key3), + SUM(key4), + SUM(key5), + SUM(key6), + SUM(key9), + SUM(key4_1), + SUM(key4_2), + SUM(key5_1), + SUM(key5_2), + SUM(key2_1), + SUM(key2_2), + SUM(key2_3) + ")); - UNION ALL - - SELECT - 0 as province_id, - 'کشوری' as province_name, - SUM(total), - SUM(key1), - SUM(key2), - SUM(key3), - SUM(key4), - SUM(key5), - SUM(key6), - SUM(key9), - SUM(key4_1), - SUM(key4_2), - SUM(key5_1), - SUM(key5_2), - SUM(key2_1), - SUM(key2_2), - SUM(key2_3) - FROM country_keypress_reports - "); - - return $this->successResponse($data); + return response()->json( + DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*']) + ); } } diff --git a/app/Http/Controllers/HeadquartersDashboard/CumulativeMessageRatingStatsController.php b/app/Http/Controllers/HeadquartersDashboard/CumulativeMessageRatingStatsController.php index dadaad3..12b60de 100644 --- a/app/Http/Controllers/HeadquartersDashboard/CumulativeMessageRatingStatsController.php +++ b/app/Http/Controllers/HeadquartersDashboard/CumulativeMessageRatingStatsController.php @@ -2,19 +2,18 @@ namespace App\Http\Controllers\HeadquartersDashboard; +use App\Facades\DataTable\DataTableFacade; use App\Http\Controllers\Controller; use app\Http\Traits\ApiResponse; use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class CumulativeMessageRatingStatsController extends Controller { - use ApiResponse; - - public function index(): JsonResponse + public function index(Request $request): JsonResponse { - $data = DB::select(" - SELECT + $query = DB::table('country_message_rating_reports')->selectRaw(" province_id, province_name, SUM(total) as total, @@ -26,12 +25,9 @@ class CumulativeMessageRatingStatsController extends Controller SUM(action3) as action3, SUM(action4) as action4, SUM(action5) as action5 - FROM country_message_rating_reports - GROUP BY province_id, province_name - - UNION ALL - - SELECT + ") + ->groupBy('province_id', 'province_name') + ->unionAll(DB::table('country_message_rating_reports')->selectRaw(" 0 as province_id, 'کشوری' as province_name, SUM(total), @@ -43,9 +39,14 @@ class CumulativeMessageRatingStatsController extends Controller SUM(action3), SUM(action4), SUM(action5) - FROM country_message_rating_reports - "); + ")); - return $this->successResponse($data); + return response()->json( + DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*']) + ); } } diff --git a/app/Http/Controllers/HeadquartersDashboard/CumulativeVoiceRatingStatsController.php b/app/Http/Controllers/HeadquartersDashboard/CumulativeVoiceRatingStatsController.php index dc37863..f5008cd 100644 --- a/app/Http/Controllers/HeadquartersDashboard/CumulativeVoiceRatingStatsController.php +++ b/app/Http/Controllers/HeadquartersDashboard/CumulativeVoiceRatingStatsController.php @@ -4,41 +4,38 @@ namespace App\Http\Controllers\HeadquartersDashboard; use App\Facades\DataTable\DataTableFacade; use App\Http\Controllers\Controller; -use app\Http\Traits\ApiResponse; -use App\Models\CountryVoiceRatingReport; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class CumulativeVoiceRatingStatsController extends Controller { - use ApiResponse; - public function index(Request $request): JsonResponse { - $data = DB::select(" - SELECT + $query = DB::table('country_voice_rating_reports')->selectRaw(" province_id, province_name, SUM(message_quality_ok) as message_quality_ok, SUM(message_format_ok) as message_format_ok, SUM(message_quality_nok) as message_quality_nok, SUM(message_format_nok) as message_format_nok - FROM country_voice_rating_reports - GROUP BY province_id, province_name - - UNION ALL - - SELECT + ") + ->groupBy('province_id', 'province_name') + ->unionAll(DB::table('country_voice_rating_reports')->selectRaw(" 0 as province_id, 'کشوری' as province_name, SUM(message_quality_ok), SUM(message_format_ok), SUM(message_quality_nok), SUM(message_format_nok) - FROM country_voice_rating_reports - "); + ")); - return $this->successResponse($data); + return response()->json( + DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*']) + ); } } diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index fb6053f..887c227 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -7,7 +7,6 @@ use App\Http\Requests\Profile\ChangeAvatarRequest; use App\Http\Requests\Profile\ChangePasswordRequest; use App\Http\Resources\Admin\UserResource; use App\Http\Traits\ApiResponse; -use App\Models\Session; use App\Models\User; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -59,10 +58,7 @@ class ProfileController extends Controller public function offline(Request $request): JsonResponse { $user= User::query()->where('telephone_id', '=', $request->telephone_id)->first(); - $user->update([ - 'is_online' => false, - ]); - Session::query()->where('user_id','=',$user->id)->delete(); + $user->update(['is_online' => false]); return $this->successResponse(); } diff --git a/app/Http/Controllers/ProvinceDashboard/PeopleMessages/OperatorController.php b/app/Http/Controllers/ProvinceDashboard/PeopleMessages/OperatorController.php new file mode 100644 index 0000000..41677ec --- /dev/null +++ b/app/Http/Controllers/ProvinceDashboard/PeopleMessages/OperatorController.php @@ -0,0 +1,49 @@ +json($dataTableService->index($request)); + } + + public function excel() + { + + } + + public function handle(Request $request, PeopleMessage $peopleMessage): JsonResponse + { + $peopleMessage->update([ + 'listen_at' => now(), + 'is_listen' => true, + 'action_id' => $request->action_id, + 'action_name' => PeopleMessageActions::name($request->action_id), + 'description' => $request->description, + 'savaneh_id' => $request->savaneh_id, + ]); + return $this->successResponse(); + } + + /** + * Display the specified resource. + */ + public function show(PeopleMessage $peopleMessage): JsonResponse + { + return $this->successResponse($peopleMessage); + } +} diff --git a/app/Http/Controllers/ProvinceDashboard/PeopleMessages/SupervisorController.php b/app/Http/Controllers/ProvinceDashboard/PeopleMessages/SupervisorController.php new file mode 100644 index 0000000..49d7365 --- /dev/null +++ b/app/Http/Controllers/ProvinceDashboard/PeopleMessages/SupervisorController.php @@ -0,0 +1,57 @@ +json($operatorService->datatable($request)); + } + + /** + * Display the specified resource. + */ + public function show(SystemMessage $systemMessage): JsonResponse + { + return $this->successResponse($systemMessage->only(['id','duration','date', 'voice'])); + } + + public function download(string $id) + { + // + } + + public function excel() + { + + } +} diff --git a/app/Http/Controllers/ProvinceDashboard/SystemMessages/SupervisorController.php b/app/Http/Controllers/ProvinceDashboard/SystemMessages/SupervisorController.php new file mode 100644 index 0000000..af3cbac --- /dev/null +++ b/app/Http/Controllers/ProvinceDashboard/SystemMessages/SupervisorController.php @@ -0,0 +1,48 @@ +json($supervisorService->datatable($request)); + } + + public function excel() + { + + } + + /** + * Store a newly created resource in storage. + */ + public function rate(RateRequest $request, SystemMessage $systemMessage): JsonResponse + { + $systemMessage->update([ + 'message_quality' => $request->message_quality, + 'format_quality' => $request->format_quality, + ]); + return $this->successResponse(); + } + + /** + * Display the specified resource. + */ + public function show(SystemMessage $systemMessage): JsonResponse + { + return $this->successResponse($systemMessage); + } +} diff --git a/app/Http/Requests/Admin/UserManagement/StoreRequest.php b/app/Http/Requests/Admin/UserManagement/StoreRequest.php index cc34bdb..b47db05 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:1,2', + 'gender' => 'required|in:male,female', '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/Requests/ProvinceDashboard/SystemMessages/RateRequest.php b/app/Http/Requests/ProvinceDashboard/SystemMessages/RateRequest.php new file mode 100644 index 0000000..dbee8c1 --- /dev/null +++ b/app/Http/Requests/ProvinceDashboard/SystemMessages/RateRequest.php @@ -0,0 +1,30 @@ + + */ + public function rules(): array + { + return [ + 'message_quality' => 'required|in:0,1', + 'format_quality' => 'required|in:0,1', + ]; + } +} diff --git a/app/Models/Cdr.php b/app/Models/Cdr.php index 1146aac..50c6c63 100644 --- a/app/Models/Cdr.php +++ b/app/Models/Cdr.php @@ -6,6 +6,5 @@ use Illuminate\Database\Eloquent\Model; class Cdr extends Model { - protected $connection = 'asterisk'; protected $table = 'cdr'; } diff --git a/app/Models/OperatorDialogueRating.php b/app/Models/OperatorDialogueRating.php new file mode 100644 index 0000000..73b3651 --- /dev/null +++ b/app/Models/OperatorDialogueRating.php @@ -0,0 +1,15 @@ + */ + use HasFactory; + + protected $guarded = []; +} diff --git a/app/Models/PeopleMessage.php b/app/Models/PeopleMessage.php new file mode 100644 index 0000000..6aa3379 --- /dev/null +++ b/app/Models/PeopleMessage.php @@ -0,0 +1,14 @@ + */ + use HasFactory; + + protected $guarded = []; +} diff --git a/app/Models/PeopleMessageAction.php b/app/Models/PeopleMessageAction.php new file mode 100644 index 0000000..5c98c9f --- /dev/null +++ b/app/Models/PeopleMessageAction.php @@ -0,0 +1,14 @@ + */ + use HasFactory; + + protected $guarded = []; +} diff --git a/app/Models/SystemMessage.php b/app/Models/SystemMessage.php new file mode 100644 index 0000000..20e004a --- /dev/null +++ b/app/Models/SystemMessage.php @@ -0,0 +1,14 @@ + */ + use HasFactory; + + protected $guarded = []; +} diff --git a/app/Services/Dashboard/Province/PeopleMessages/DataTableService.php b/app/Services/Dashboard/Province/PeopleMessages/DataTableService.php new file mode 100644 index 0000000..6fe18db --- /dev/null +++ b/app/Services/Dashboard/Province/PeopleMessages/DataTableService.php @@ -0,0 +1,28 @@ +user(); + + $query = PeopleMessage::query()->where('edare_shahri_id', '=', $user->edarate_shahri_id); + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + allowedSelects: [ + 'id','caller_phone_number','date', 'voice', 'listen_at', 'review_duration', + 'is_listen', 'action_id', 'action_name', 'description', 'savaneh_id' + ] + ); + } +} diff --git a/app/Services/Dashboard/Province/SystemMessages/OperatorService.php b/app/Services/Dashboard/Province/SystemMessages/OperatorService.php new file mode 100644 index 0000000..54460b8 --- /dev/null +++ b/app/Services/Dashboard/Province/SystemMessages/OperatorService.php @@ -0,0 +1,25 @@ +user(); + + $query = SystemMessage::query()->where('edare_shahri_id', '=', $user->edarate_shahri_id); + + return DataTableFacade::run( + $query, + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + allowedSelects: ['id','duration','date', 'voice', 'type_id', 'type_name'] + ); + } +} diff --git a/app/Services/Dashboard/Province/SystemMessages/SupervisorService.php b/app/Services/Dashboard/Province/SystemMessages/SupervisorService.php new file mode 100644 index 0000000..8f6584c --- /dev/null +++ b/app/Services/Dashboard/Province/SystemMessages/SupervisorService.php @@ -0,0 +1,23 @@ + env('DB_ENCRYPT', 'yes'), // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), ], - - 'asterisk' => [ - 'driver' => 'mysql', - 'url' => env('DB_URL'), - 'host' => env('ASTERISK_DB_HOST', '127.0.0.1'), - 'port' => env('ASTERISK_DB_PORT', '3306'), - 'database' => env('ASTERISK_DB_DATABASE', 'laravel'), - 'username' => env('ASTERISK_DB_USERNAME', 'root'), - 'password' => env('ASTERISK_DB_PASSWORD', ''), - 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => env('DB_CHARSET', 'utf8mb4'), - 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), - 'prefix' => '', - 'prefix_indexes' => true, - 'strict' => true, - 'engine' => null, - 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), - ]) : [], - ], ], /* diff --git a/database/factories/OperatorDialogueRatingFactory.php b/database/factories/OperatorDialogueRatingFactory.php new file mode 100644 index 0000000..1d80042 --- /dev/null +++ b/database/factories/OperatorDialogueRatingFactory.php @@ -0,0 +1,23 @@ + + */ +class OperatorDialogueRatingFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/factories/PeopleMessageActionFactory.php b/database/factories/PeopleMessageActionFactory.php new file mode 100644 index 0000000..08765e5 --- /dev/null +++ b/database/factories/PeopleMessageActionFactory.php @@ -0,0 +1,23 @@ + + */ +class PeopleMessageActionFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/factories/PeopleMessageFactory.php b/database/factories/PeopleMessageFactory.php new file mode 100644 index 0000000..05ee363 --- /dev/null +++ b/database/factories/PeopleMessageFactory.php @@ -0,0 +1,23 @@ + + */ +class PeopleMessageFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/factories/SystemMessageFactory.php b/database/factories/SystemMessageFactory.php new file mode 100644 index 0000000..7be37a9 --- /dev/null +++ b/database/factories/SystemMessageFactory.php @@ -0,0 +1,23 @@ + + */ +class SystemMessageFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/migrations/2025_07_24_095509_create_people_message_actions_table.php b/database/migrations/2025_07_24_095509_create_people_message_actions_table.php new file mode 100644 index 0000000..b751838 --- /dev/null +++ b/database/migrations/2025_07_24_095509_create_people_message_actions_table.php @@ -0,0 +1,28 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('people_message_actions'); + } +}; diff --git a/database/migrations/2025_07_29_063532_create_system_messages_table.php b/database/migrations/2025_07_29_063532_create_system_messages_table.php new file mode 100644 index 0000000..089c5c7 --- /dev/null +++ b/database/migrations/2025_07_29_063532_create_system_messages_table.php @@ -0,0 +1,34 @@ +id(); + $table->integer('duration'); + $table->dateTime('date'); + $table->string('voice'); + $table->integer('message_quality'); + $table->integer('format_quality'); + $table->integer('type_id'); + $table->string('type_name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('system_messages'); + } +}; diff --git a/database/migrations/2025_07_29_072224_create_operator_dialogue_ratings_table.php b/database/migrations/2025_07_29_072224_create_operator_dialogue_ratings_table.php new file mode 100644 index 0000000..ca6c42c --- /dev/null +++ b/database/migrations/2025_07_29_072224_create_operator_dialogue_ratings_table.php @@ -0,0 +1,33 @@ +id(); + $table->string('cdr_unique_id'); + $table->dateTime('date'); + $table->foreignId('expert_id')->constrained('users'); + $table->boolean('is_listen')->default(false); + $table->boolean('is_good'); + $table->string('description')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('operator_dialogue_ratings'); + } +}; diff --git a/database/migrations/2025_07_29_094322_create_people_messages_table.php b/database/migrations/2025_07_29_094322_create_people_messages_table.php new file mode 100644 index 0000000..b9f6f53 --- /dev/null +++ b/database/migrations/2025_07_29_094322_create_people_messages_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('caller_phone_number'); + $table->dateTime('date'); + $table->string('voice'); + $table->integer('review_duration')->nullable(); + $table->dateTime('listen_at')->nullable(); + $table->boolean('is_listen')->default(false); + $table->foreignId('action_id')->nullable()->constrained(); + $table->string('action_name')->nullable(); + $table->string('description')->nullable(); + $table->unsignedBigInteger('savaneh_id')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('people_messages'); + } +}; diff --git a/database/seeders/OperatorDialogueRatingSeeder.php b/database/seeders/OperatorDialogueRatingSeeder.php new file mode 100644 index 0000000..27a7eff --- /dev/null +++ b/database/seeders/OperatorDialogueRatingSeeder.php @@ -0,0 +1,17 @@ +