140 lines
4.6 KiB
PHP
140 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Cliente;
|
|
use App\Models\ScoreConfig;
|
|
|
|
class ClienteScoreController extends Controller
|
|
{
|
|
|
|
public function __construct()
|
|
{
|
|
$this->middleware('permission:score_clientes_view', ['only' => ['show', 'index']]);
|
|
}
|
|
|
|
public function index(Request $request)
|
|
{
|
|
$start_date = $request->get('start_date');
|
|
$end_date = $request->get('end_date');
|
|
$categoria = $request->get('categoria');
|
|
|
|
$clientes = Cliente::with('score')
|
|
->select('clientes.*')
|
|
->where('empresa_id', $request->empresa_id)
|
|
->where('status', 1)
|
|
->join('cliente_scores', 'cliente_scores.cliente_id', '=', 'clientes.id')
|
|
->when(!empty($request->razao_social), function ($q) use ($request) {
|
|
return $q->where(function ($quer) use ($request) {
|
|
return $quer->where('razao_social', 'LIKE', "%$request->razao_social%");
|
|
});
|
|
})
|
|
->when(!empty($start_date), function ($query) use ($start_date) {
|
|
return $query->whereDate('created_at', '>=', $start_date);
|
|
})
|
|
->when(!empty($end_date), function ($query) use ($end_date) {
|
|
return $query->whereDate('created_at', '<=', $end_date);
|
|
})
|
|
->when(!empty($categoria), function ($query) use ($categoria) {
|
|
return $query->where('cliente_scores.categoria', $categoria);
|
|
})
|
|
->get();
|
|
|
|
return view('clientes.score.index', compact('clientes'));
|
|
}
|
|
|
|
public function show($clienteId)
|
|
{
|
|
$cliente = Cliente::with(['score', 'scoreHistorico'])
|
|
->findOrFail($clienteId);
|
|
|
|
return view('clientes.score.show', compact('cliente'));
|
|
}
|
|
|
|
public function config(Request $request){
|
|
$item = ScoreConfig::firstOrCreate(
|
|
['empresa_id' => $request->empresa_id],
|
|
$this->defaultConfig($request->empresa_id)
|
|
);
|
|
|
|
return view('clientes.score.config', compact('item'));
|
|
}
|
|
|
|
private function defaultConfig($empresaId): array
|
|
{
|
|
return [
|
|
'empresa_id' => $empresaId,
|
|
'pagamentos' => [
|
|
['min'=>95,'score'=>350],
|
|
['min'=>80,'score'=>250],
|
|
['min'=>60,'score'=>120],
|
|
['min'=>0,'score'=>0],
|
|
],
|
|
'volume' => [
|
|
['min'=>100000,'score'=>200],
|
|
['min'=>30000,'score'=>120],
|
|
['min'=>0,'score'=>60],
|
|
],
|
|
'tempo' => [
|
|
['min'=>3,'score'=>150],
|
|
['min'=>1,'score'=>100],
|
|
['min'=>0,'score'=>40],
|
|
],
|
|
'ticket' => [
|
|
['min'=>3000,'score'=>150],
|
|
['min'=>1000,'score'=>90],
|
|
['min'=>0,'score'=>40],
|
|
],
|
|
'penalidades' => [
|
|
['min'=>10,'score'=>150],
|
|
['min'=>5,'score'=>80],
|
|
['min'=>0,'score'=>0],
|
|
],
|
|
'categorias' => [
|
|
['min'=>800,'nome'=>'Ouro'],
|
|
['min'=>500,'nome'=>'Prata'],
|
|
['min'=>0,'nome'=>'Bronze'],
|
|
],
|
|
];
|
|
}
|
|
|
|
public function updateConfig(Request $request)
|
|
{
|
|
$empresaId = $request->empresa_id;
|
|
|
|
$data = $request->only(['pagamentos','volume','tempo','ticket','penalidades','categorias']);
|
|
|
|
foreach ($data as $k => $arr) {
|
|
// $data[$k] = array_values(array_filter($arr, fn($r) => isset($r['min'])));
|
|
$data[$k] = array_values(array_map(function ($r) {
|
|
|
|
if (isset($r['min'])) {
|
|
$r['min'] = str_replace(',', '.', $r['min']);
|
|
$r['min'] = is_numeric($r['min']) ? (float)$r['min'] : 0;
|
|
}
|
|
|
|
if (isset($r['score'])) {
|
|
$r['score'] = str_replace(',', '.', $r['score']);
|
|
$r['score'] = is_numeric($r['score']) ? (float)$r['score'] : 0;
|
|
}
|
|
|
|
return $r;
|
|
|
|
}, array_filter($arr, fn($r) => isset($r['min']))));
|
|
}
|
|
|
|
foreach (['pagamentos','volume','tempo','ticket','penalidades'] as $k) {
|
|
usort($data[$k], fn($a,$b) => ($b['min'] <=> $a['min']));
|
|
}
|
|
usort($data['categorias'], fn($a,$b) => ($b['min'] <=> $a['min']));
|
|
|
|
$cfg = ScoreConfig::firstOrCreate(['empresa_id' => $empresaId], $this->defaultConfig($empresaId));
|
|
$cfg->update($data);
|
|
|
|
session()->flash("flash_success", "Configuração de score salva com sucesso!");
|
|
return redirect()->back();
|
|
}
|
|
|
|
}
|