fix the bugs

This commit is contained in:
2025-08-13 14:14:28 +03:30
parent 9a0758a754
commit f77d0ee0d0
11 changed files with 69 additions and 82 deletions

View File

@@ -19,10 +19,10 @@ RUN apk update && apk add --no-cache \
&& docker-php-ext-install pdo_pgsql pdo_mysql gd zip && docker-php-ext-install pdo_pgsql pdo_mysql gd zip
# Set the working directory # Set the working directory
WORKDIR /var/www/laravel WORKDIR /var/www/crm/backend
COPY . . COPY . .
RUN chmod -R 777 /var/www/laravel/storage /var/www/laravel/bootstrap/cache RUN chmod -R 777 /var/www/crm/backend/storage /var/www/crm/backend/bootstrap/cache
# Install Composer # Install Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

View File

@@ -27,8 +27,8 @@ class UserManagementController extends Controller
User::query()->where('username', "<>", "witel"), User::query()->where('username', "<>", "witel"),
$request, $request,
allowedFilters: array('id', 'full_name', 'username', 'province_id', 'phone_number', 'national_id', 'telephone_id'), 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'), allowedRelations: array('roles:id,name_fa'),
allowedRelations: array('roles:id,name_fa') allowedSortings: array('id', 'full_name', 'username', 'province_id', 'phone_number', 'national_id', 'telephone_id')
); );
return response()->json($data); return response()->json($data);

View File

@@ -123,7 +123,7 @@ class CallController extends Controller
$size = $request->size ?? config('global_variables.MAX_RECORDS_COUNT'); $size = $request->size ?? config('global_variables.MAX_RECORDS_COUNT');
$calls_data = Call::query() $calls_data = Call::query()
->when($phone_number, fn($query, $phone_number) => $query->where('phone_number', '=', $phone_number)) ->when($phone_number, fn($query, $phone_number) => $query->where('caller_phone_number', '=', $phone_number))
->orderBy('created_at', 'DESC') ->orderBy('created_at', 'DESC')
->limit($size) ->limit($size)
->get(); ->get();

View File

@@ -52,7 +52,7 @@ class ProfileController extends Controller
public function online(Request $request): JsonResponse public function online(Request $request): JsonResponse
{ {
User::query() User::query()
->firstWhere('telephone_id', '=', $request->telephone_id) ->Where('telephone_id', '=', $request->telephone_id)
->update(['is_online' => true,]); ->update(['is_online' => true,]);
return $this->successResponse(); return $this->successResponse();

View File

@@ -22,14 +22,22 @@ class SupervisorController extends Controller
return response()->json($dataTableService->index($request)); return response()->json($dataTableService->index($request));
} }
public function rate(RateRequest $request,OperatorDialogue $operatorDialogue): JsonResponse public function rate(RateRequest $request): JsonResponse
{ {
$operatorDialogue->update([ OperatorDialogue::query()->updateOrCreate(
'supervisor_id' => auth()->user()->id, [
'is_good' => $request->is_good, $request->cdr_unique_id
'is_listen' => true, ],
'description' => $request->description, [
]); 'cdr_unique_id' => $request->cdr_unique_id,
'date' => $request->date,
'supervisor_id' => auth()->user()->id,
'is_good' => $request->is_good,
'is_listen' => true,
'description' => $request->description,
]
);
return $this->successResponse(); return $this->successResponse();
} }

View File

@@ -22,6 +22,7 @@ class RateRequest extends FormRequest
public function rules(): array public function rules(): array
{ {
return [ return [
'cdr_unique_id' => 'required|string',
'is_good' => 'required|in:0,1', 'is_good' => 'required|in:0,1',
'description' => 'string', 'description' => 'string',
]; ];

View File

@@ -12,7 +12,7 @@ class DataTableService
public function index(Request $request) public function index(Request $request)
{ {
$query = DB::table('asteriskcdrdb.cdr') $query = DB::table('asteriskcdrdb.cdr')
->leftJoin('crm_db.operator_dialogues', 'asteriskcdrdb.cdr.uniqueid', '=', 'crm_db.operator_dialogues.cdr_unique_id') ->leftJoin('roaddb.operator_dialogues', 'asteriskcdrdb.cdr.uniqueid', '=', 'roaddb.operator_dialogues.cdr_unique_id')
->where('dst', '<>', '') ->where('dst', '<>', '')
->where('lastapp', '=', 'Dial') ->where('lastapp', '=', 'Dial')
->where('duration', '>', 0) ->where('duration', '>', 0)

View File

@@ -4,11 +4,12 @@ namespace App\Services\Dashboard\Province;
use App\Facades\DataTable\DataTableFacade; use App\Facades\DataTable\DataTableFacade;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class ReportService class ReportService
{ {
public function cumulative(Request $request) public function cumulative(Request $request): Collection
{ {
$query = DB::table('asteriskcdrdb.cdr') $query = DB::table('asteriskcdrdb.cdr')
->selectRaw(" ->selectRaw("
@@ -23,13 +24,9 @@ class ReportService
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 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 lastapp = 'Busy' THEN 1 END) AS dnd,
COUNT(CASE WHEN dst BETWEEN 502 AND 599 THEN 1 END) AS trans, 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, COUNT(CASE WHEN disposition <> 'BUSY' AND dst BETWEEN 101 AND 105 THEN 1 END) AS all_calls,
AVG(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' THEN billsec END) AS avg AVG(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' THEN billsec END) AS avg
"); ")->groupByRaw('DATE(calldate)');
// ->whereBetween('calldate', [$from, $to]) // use Carbon or date strings
// ->groupBy(DB::raw('DATE(calldate)'))
// ->orderByDesc(DB::raw('DATE(calldate)'))
// ->get();
$data = DataTableFacade::run( $data = DataTableFacade::run(
$query, $query,
@@ -38,6 +35,9 @@ class ReportService
allowedSortings: ['*'], allowedSortings: ['*'],
allowedGroupBy: ['d'] allowedGroupBy: ['d']
); );
$data = collect($data);
$totals = [ $totals = [
'd' => 'TOTAL', 'd' => 'TOTAL',
'total' => $data->sum('total'), 'total' => $data->sum('total'),
@@ -66,8 +66,6 @@ class ReportService
COUNT(CASE WHEN is_listen = 1 THEN 1 END) AS l, COUNT(CASE WHEN is_listen = 1 THEN 1 END) AS l,
COUNT(CASE WHEN is_listen = 0 THEN 1 END) AS nl COUNT(CASE WHEN is_listen = 0 THEN 1 END) AS nl
'); ');
// ->whereBetween('date', [$date_from, $date_to])
// ->first();
return DataTableFacade::run( return DataTableFacade::run(
$query, $query,
@@ -81,57 +79,33 @@ class ReportService
{ {
$query = DB::table('asteriskcdrdb.cdr') $query = DB::table('asteriskcdrdb.cdr')
->where('recordingfile', '<>', ''); ->where('recordingfile', '<>', '');
// ->whereBetween('calldate', ["$date_from $time_from", "$date_to $time_to"])
// ->when($cid, function ($query, $cid) {
// return $query->where('src', 'like', "%{$cid}%");
// })
// ->when($c_op, function ($query, $c_op) {
// return $query->where('dst', $c_op);
// }, function ($query) {
// return $query->whereBetween('dst', [100, 110]);
// })
// ->orderByDesc('calldate');
return DataTableFacade::run( return DataTableFacade::run(
$query, $query,
$request, $request,
allowedFilters: ['*'], allowedFilters: ['*'],
allowedSortings: ['*'], allowedSortings: ['*'],
allowedSelects: ['calldate', 'src', 'dst', 'disposition', 'duration']
); );
} }
public function operatorPerformanceDaily(Request $request) public function operatorPerformanceDaily(Request $request)
{ {
$query = DB::table('asteriskcdrdb.cdr') $query = DB::table(DB::raw("(SELECT *, CAST(dst AS UNSIGNED) AS dst_num FROM asteriskcdrdb.cdr) AS cdr"))
->selectRaw(" ->selectRaw("
* DATE(calldate) AS d,
(all - (ok + nok)) AS fail dst,
FROM ( COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst_num BETWEEN 1 AND 104 THEN 1 END) AS ok,
SELECT COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'NO ANSWER' AND dst_num BETWEEN 1 AND 104 AND duration > 14 THEN 1 END) AS nok,
DATE(calldate) AS d, COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst_num BETWEEN 1 AND 104 AND billsec > 9 THEN 1 END) AS b10,
dst, COUNT(CASE WHEN lastapp = 'Busy' THEN 1 END) AS dnd,
COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 THEN 1 END) AS ok, COUNT(CASE WHEN dst_num BETWEEN 502 AND 599 THEN 1 END) AS trans,
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 disposition <> 'BUSY' AND dst_num BETWEEN 1 AND 105 THEN 1 END) AS total_calls
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, ->whereBetween('dst_num', [1, 105])
COUNT(CASE WHEN dst BETWEEN 502 AND 599 THEN 1 END) AS trans, ->groupBy(DB::raw('DATE(calldate)'), 'dst')
COUNT(CASE WHEN disposition <> 'BUSY' AND dst BETWEEN 101 AND 105 THEN 1 END) AS all ->orderBy(DB::raw('DATE(calldate)'))
FROM asteriskcdrdb.cdr ->orderBy('dst');
WHERE dst BETWEEN 101 AND 105
GROUP BY d, dst
ORDER BY d, dst
);
");
// ->whereBetween('calldate', ["$date_from $time_from", "$date_to $time_to"])
// ->when($cid, function ($query, $cid) {
// return $query->where('src', 'like', "%{$cid}%");
// })
// ->when($c_op, function ($query, $c_op) {
// return $query->where('dst', $c_op);
// }, function ($query) {
// return $query->whereBetween('dst', [100, 110]);
// })
// ->orderByDesc('calldate');
return DataTableFacade::run( return DataTableFacade::run(
$query, $query,
@@ -143,25 +117,21 @@ class ReportService
public function operatorPerformanceTotal(Request $request) public function operatorPerformanceTotal(Request $request)
{ {
$query = DB::table('asteriskcdrdb.cdr') $query = DB::table(DB::raw("(SELECT *, CAST(dst AS UNSIGNED) AS dst_num FROM asteriskcdrdb.cdr) AS cdr"))
->selectRaw(" ->selectRaw("
* DATE(calldate) AS d,
(all - (ok + nok)) AS fail dst,
FROM ( COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst_num BETWEEN 1 AND 104 THEN 1 END) AS ok,
SELECT COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'NO ANSWER' AND dst_num BETWEEN 1 AND 104 AND duration > 14 THEN 1 END) AS nok,
DATE(calldate) AS d, COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst_num BETWEEN 1 AND 104 AND billsec > 9 THEN 1 END) AS b10,
dst, COUNT(CASE WHEN lastapp = 'Busy' THEN 1 END) AS dnd,
COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 THEN 1 END) AS ok, COUNT(CASE WHEN dst_num BETWEEN 502 AND 599 THEN 1 END) AS trans,
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 disposition <> 'BUSY' AND dst_num BETWEEN 1 AND 105 THEN 1 END) AS total_calls
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, ->whereBetween('dst_num', [1, 105])
COUNT(CASE WHEN dst BETWEEN 502 AND 599 THEN 1 END) AS trans, ->groupBy('dst')
COUNT(CASE WHEN disposition <> 'BUSY' AND dst BETWEEN 101 AND 105 THEN 1 END) AS all ->orderBy(DB::raw('DATE(calldate)'))
FROM asteriskcdrdb.cdr ->orderBy('dst');
WHERE dst BETWEEN 101 AND 105
GROUP BY dst
ORDER BY dst);
");
return DataTableFacade::run( return DataTableFacade::run(
$query, $query,

View File

@@ -13,7 +13,7 @@ return new class extends Migration
{ {
Schema::create('operator_dialogues', function (Blueprint $table) { Schema::create('operator_dialogues', function (Blueprint $table) {
$table->id(); $table->id();
$table->string('cdr_unique_id'); $table->string('cdr_unique_id', 32)->collation('utf8mb4_general_ci');
$table->dateTime('date'); $table->dateTime('date');
$table->foreignId('supervisor_id')->constrained('users'); $table->foreignId('supervisor_id')->constrained('users');
$table->boolean('is_listen')->default(false); $table->boolean('is_listen')->default(false);

View File

@@ -37,8 +37,15 @@ class PermissionSeeder extends Seeder
'guard_name' => 'api', 'guard_name' => 'api',
'created_at' => now(), 'created_at' => now(),
'updated_at' => now() 'updated_at' => now()
],
[
'id' => 4,
'name' => 'teleport_to_province',
'name_fa' => 'انتقال به استان ها',
'guard_name' => 'api',
'created_at' => now(),
'updated_at' => now()
] ]
]); ]);
} }
} }

View File

@@ -15,6 +15,7 @@ use App\Http\Controllers\ProfileController;
use App\Http\Controllers\ProvinceController; use App\Http\Controllers\ProvinceController;
use App\Http\Controllers\ProvinceDashboard\ReportController; use App\Http\Controllers\ProvinceDashboard\ReportController;
use App\Http\Controllers\ProvinceDashboard\VerifyAuthenticationController; use App\Http\Controllers\ProvinceDashboard\VerifyAuthenticationController;
use App\Http\Middleware\SuperAdminCheck;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;