Files
Sio-Back/app/Http/Controllers/AtencionClientes/ServiciosController.php
SIO Admin de656b70a2 feat: Actualizacion sistema SIO Backend
- Nuevo modulo de historial de cambios (ServicioHistorial)
- Observer para tracking automatico de cambios en servicios
- Correccion de variables auxiliar en ServiciosController
- Actualizacion de configuraciones y migraciones
- Endpoint para consultar historial de cambios

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 23:01:55 +00:00

1485 lines
63 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers\AtencionClientes;
use App\Http\Requests\AtencionCliente\LitrajeRequest;
use App\Models\RolUser;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use setasign\Fpdi\Fpdi;
use const App\Http\Controllers\ASESOR_OPERACIONES;
use const App\Http\Controllers\AUXILIAR_TECNICO_1;
use const App\Http\Controllers\AUXILIAR_TECNICO_2;
use const App\Http\Controllers\CANCELADO;
use const App\Http\Controllers\NEGATIVO;
use const App\Http\Controllers\PAGADO;
use const App\Http\Controllers\PENDIENTE;
use const App\Http\Controllers\REALIZADO;
use const App\Http\Controllers\REPROGRAMADO;
use const App\Http\Controllers\VISITA;
use App\Http\Requests\AtencionCliente\ServiciosRequest;
use App\Mail\SolicitudServicio;
use App\Models\CatEstatuServicio;
use App\Models\CatFormaPago;
use App\Models\CatOrigen;
use App\Models\CatServicio;
use App\Models\CatTipoServicio;
use App\Models\Cliente;
use App\Models\ClienteDomicilio;
use App\Models\ServicioDet;
use App\Models\ServicioEnc;
use App\Models\ServicioProgreso;
use App\Models\User;
use App\Models\Vehiculo;
use App\Models\VehiculoSucursal;
use Carbon\Carbon;
use GuzzleHttp\Client;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Storage;
//define('FPDF_FONTPATH', resource_path('fonts/'));
class ServiciosController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
$deleted = $request->input('deleted');
$orderBy = $request->input('sortBy', 'servicios_det.fecha_solicitud');
$order = $request->input('order', 'ASC');
$user = Auth::user();
$campos = [
'servicios_progreso.id as progreso_solicitud_id',
'servicios_enc.id as solicitud_servicio_id',
'servicios_enc.forma_pago_id',
'cat_formas_pagos.nombre as forma_pago_nombre',
'cat_formas_pagos.zeros as forma_pago_zeros',
'fecha_agenda',
'usuario_agenda_id',
'users.nombre as usuario_agenda_nombre',
'users.apellido_paterno as usuario_agenda_apellido_paterno',
'users.apellido_materno as usuario_agenda_apellido_materno',
'servicios_enc.cliente_id',
'clientes.denominacion',
'servicios_enc.cliente_domicilio_id',
'clientes_domicilios.nombre_responsable_sucursal as clientes_nombre_responsable_sucursal',
'clientes_domicilios.celular_responsable as clientes_celular_responsable',
'clientes_domicilios.calle as clientes_calle',
'clientes_domicilios.num_ext as clientes_num_ext',
'clientes_domicilios.num_int as clientes_num_int',
'clientes_domicilios.colonia as clientes_colonia',
'clientes_domicilios.cp as clientes_cp',
'clientes_domicilios.telefono as clientes_telefono',
'clientes_domicilios.lat as clientes_lat',
'clientes_domicilios.lng as clientes_lng',
'servicios_enc.deleted_at',
'servicios_det.id',
'servicios_det.servicio_id',
'cat_servicios.nombre as servicio_nombre',
'servicios_det.estatus_servicio_id',
'cat_estatus_servicios.nombre as estatus_servicio_nombre',
'servicios_det.tipo_servicio_id',
'cat_tipos_servicios.nombre as tipo_servicio_nombre',
'cat_estatus_servicios.color_1 as estatus_servicio_color_1',
'cat_estatus_servicios.color_2 as estatus_servicio_color_2',
'fecha_solicitud',
'servicios_det.duracion',
'definido_cliente',
'servicios_det.operador_id',
'operador.nombre as operador_nombre',
'operador.apellido_paterno as operador_apellido_paterno',
'operador.apellido_materno as operador_apellido_materno',
'servicios_det.vehiculo_id',
'cat_vehiculos.num_economico as vehiculo_num_economico',
'servicios_det.fecha_solicitud',
'sucursales.nombre as vehiculo_sucursal',
'sucursales.id as vehiculo_sucursal_id',
'sucursal_operador.nombre as operador_sucursal',
'sucursal_operador.id as operador_sucursal_id',
'servicios_det.auxiliar_1 as auxiliar_1_id',
'servicios_det.auxiliar_2 as auxiliar_2_id',
'auxiliares_1.nombre as auxiliar_1',
'auxiliares_2.nombre as auxiliar_2',
'sucursal_auxiliares_1.nombre as sucursal_auxiliar_1',
'sucursal_auxiliares_2.nombre as sucursal_auxiliar_2',
'servicios_det.costo_servicio',
'servicios_det.aceptado',
'servicios_det.observacion_atencion_cliente',
'servicios_det.requiere_encuesta',
'servicios_progreso.litraje',
'servicios_det.facturado',
'cat_motivos_estatus.nombre as motivo_estatus',
DB::raw("IF(encuesta_contestada = 1, 1, 0) 'encuesta_contestada'")
];
$queryBuilder = ServicioDet::select($campos)
->joinDetalleServicioDet()
->join('servicios_enc', 'servicios_enc.id', '=', 'servicios_det.servicio_enc_id')
->join('cat_formas_pagos', 'cat_formas_pagos.id', '=', 'servicios_enc.forma_pago_id')
->join('users', 'users.id', '=', 'servicios_enc.usuario_agenda_id')
->join('clientes', 'clientes.id', '=', 'servicios_enc.cliente_id')
->join('clientes_domicilios', 'clientes_domicilios.id', '=', 'servicios_enc.cliente_domicilio_id')
->leftJoin('servicios_progreso', 'servicios_progreso.servicio_det_id', '=', 'servicios_det.id')
->leftJoin('cat_motivos_estatus', 'cat_motivos_estatus.id', '=', 'servicios_det.cat_motivos_estatus_id')
->where('servicios_enc.sucursal_id', $user->sucursal_id)
->orderBy($orderBy, $order);
if ($estatus_servicio = $request->get('estatus_servicio', false)) {
$queryBuilder->where('servicios_det.estatus_servicio_id', $estatus_servicio);
}
if ($fecha = $request->get('fecha', false)) {
$queryBuilder->whereDate('servicios_det.fecha_solicitud', $fecha);
}
if ($query = $request->get('query', false)) {
$queryBuilder->where(function ($q) use ($query) {
$q->where('servicios_enc.id', 'like', '%' . $query . '%')
->orWhere('operador.nombre', 'like', '%' . $query . '%')
->orWhere('operador.apellido_paterno', 'like', '%' . $query . '%')
->orWhere('operador.apellido_materno', 'like', '%' . $query . '%')
->orWhere('clientes.denominacion', 'like', '%' . $query . '%')
->orWhere('clientes_domicilios.colonia', 'like', '%' . $query . '%')
->orWhere('clientes_domicilios.telefono', 'like', '%' . $query . '%')
->orWhere('clientes_domicilios.celular_responsable', 'like', '%' . $query . '%')
->orWhere('cat_formas_pagos.nombre', 'like', '%' . $query . '%')
->orWhere('cat_estatus_servicios.nombre', 'like', '%' . $query . '%');
});
}
if ($deleted) {
$queryBuilder->onlyTrashed();
}
if ($perPage = $request->input('perPage', false)) {
$data = $queryBuilder->paginate($perPage);
foreach ($data->items() as $servicio) {
$servicio->cantidad_servicios = ServicioDet::where('servicio_enc_id', $servicio->solicitud_servicio_id)
->count();
$iniciado = ServicioProgreso::where('servicio_enc_id', $servicio->solicitud_servicio_id)
->where('servicio_det_id', $servicio->id)
->first();
$servicio->iniciado = ($iniciado) ? 1 : 0;
$servicio->tiempo_atencion = $this->diferenciaFechas($servicio->fecha_agenda, $servicio->fecha_solicitud);
}
$servicios = $data;
} else {
$data = $queryBuilder->get();
foreach ($data as $servicio) {
$servicio->cantidad_servicios = ServicioDet::where('servicio_enc_id', $servicio->solicitud_servicio_id)
->count();
$iniciado = ServicioProgreso::where('servicio_enc_id', $servicio->solicitud_servicio_id)
->where('servicio_det_id', $servicio->id)
->first();
$servicio->iniciado = ($iniciado) ? 1 : 0;
$servicio->tiempo_atencion = $this->diferenciaFechas($servicio->fecha_agenda, $servicio->fecha_solicitud);
}
$servicios = ['data' => $data];
}
return response()->success($servicios);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(ServiciosRequest $request)
{
ini_set('default_socket_timeout', 10800);
ini_set('memory_limit', '-1');
set_time_limit(0);
$data = $request->all();
$data_servicios = $data['servicios'];
$user = Auth::user();
DB::beginTransaction();
try {
$data['fecha_agenda'] = Carbon::now()->toDateTimeString();
$data['usuario_agenda_id'] = $user->id;
$data['sucursal_id'] = $user->sucursal_id;
$servicio = ServicioEnc::create($data);
$now = Carbon::now()->format('Y-m-d');
foreach ($data_servicios as $servicios) {
$contain_aux_1 = array_key_exists('auxiliar_1', $servicios);
$contain_aux_2 = array_key_exists('auxiliar_2', $servicios);
$fecha_solicitada = Carbon::createFromTimeString($servicios['fecha_solicitud'])->format('Y-m-d');
if ($fecha_solicitada < $now) {
DB::rollBack();
return response()->unprocessable('Error', ['La fecha de solicitud no puede ser anterior a la actual']);
}
if ($contain_aux_1 && $contain_aux_2) {
if ($servicios['auxiliar_1'] == $servicios['auxiliar_2']) {
$aux = User::where('id', $servicios['auxiliar_1'])->first();
$error_aux = ["El auxiliar: '" . $aux->nombre . " " . $aux->apellido_paterno . " " . $aux->apellido_materno . "' no está disponible."];
DB::rollBack();
return response()->unprocessable('Error', $error_aux);
}
}
$servicios_data = $servicios;
$servicios_data['servicio_det_id'] = '';
$validacion = $this->validarOperadorVehiculoLocal($servicios_data);
if (count($validacion) > 0) {
DB::rollBack();
return response()->unprocessable('Error', $validacion[0]);
}
//Comentado por rechazo del cliente
/*if($fecha_solicitada != $now){
$servicios['aceptado'] = 1;
}*/
$servicios['aceptado'] = 1;
$servicio->servicios()->create($servicios);
}
$dservicios = ServicioDet::where('servicio_enc_id', $servicio->id)->get();
$correos = [];
$correo_cliente = Cliente::select('email')->where('id', $servicio->cliente_id)->first();
$correo_cliente_domicilio = ClienteDomicilio::select('email')->where('id', $servicio->cliente_domicilio_id)->first();
if ($correo_cliente && $correo_cliente->email) {
array_push($correos, $correo_cliente->email);
}
if ($correo_cliente_domicilio && $correo_cliente_domicilio->email) {
array_push($correos, $correo_cliente_domicilio->email);
}
/* foreach ($dservicios as $servicios){
if((count($correos) > 0) && ($servicios->estatus_servicio_id == PENDIENTE || $servicios->estatus_servicio_id == REPROGRAMADO || $servicios->estatus_servicio_id == VISITA || $servicios['estatus_servicio_id'] == PAGADO)){
Mail::to($correos)->send(new SolicitudServicio($servicios->id));
}
}*/
foreach ($dservicios as $servicios) {
$fecha_solicitada = Carbon::createFromTimeString($servicios->fecha_solicitud)->format('Y-m-d');
//Envio de notificacion
$usuario = User::where('id', $servicios->operador_id)->first();
if (Carbon::parse($usuario->last_login)->isToday() && ($usuario->token_firebase && $fecha_solicitada == $now) && ($servicios->estatus_servicio_id == PENDIENTE || $servicios->estatus_servicio_id == REPROGRAMADO || $servicios->estatus_servicio_id == VISITA || $servicios['estatus_servicio_id'] == PAGADO)) {
if (!$this->enviarNotificacion($servicios, $usuario)) {
DB::rollBack();
return response()->unprocessable('Error', ['Error al actualizar el Servicio.']);
}
}
}
DB::commit();
return response()->success(['result' => 'ok']);
} catch (\Exception $e) {
DB::rollBack();
Log::info($e);
return response()->unprocessable('Error', ['Error al guardar el Servicio.']);
}
}
private function validarOperadorVehiculoLocal($data)
{
$fecha_solicitada = $data['fecha_solicitud'];
list($h, $m) = explode(":", $data['duracion']);
$fecha_solicitada_duracion = Carbon::createFromTimeString($data['fecha_solicitud'])
->addHour($h)
->addMinutes($m)
->toDateTimeString();
$fecha_solicitud = Carbon::createFromTimeString($data['fecha_solicitud'])->format('Y-m-d');
/*if(is_numeric($data['servicio_det_id'])){
$servicios = ServicioDet::select("servicios_det.*",
DB::raw("CASE WHEN (fecha_solicitud>='$fecha_solicitada' OR ADDTIME(fecha_solicitud, duracion)<='$fecha_solicitada') AND
(fecha_solicitud>='$fecha_solicitada_duracion' OR ADDTIME(fecha_solicitud, duracion)<='$fecha_solicitada_duracion')
THEN 'DISPONIBLE' ELSE 'NO_DISPONIBLE' END AS validacion_1"),
DB::raw("CASE WHEN (fecha_solicitud='$fecha_solicitada' AND ADDTIME(fecha_solicitud, duracion)='$fecha_solicitada_duracion')
THEN 'NO_DISPONIBLE' ELSE null END AS validacion_2"))
->whereDate('fecha_solicitud', $fecha_solicitud)
//->whereDate('fecha_solicitud', Carbon::now()->format('Y-m-d'))
->where('id', '<>', $data['servicio_det_id'])
->whereIn('estatus_servicio_id',[PENDIENTE,REPROGRAMADO,PAGADO,VISITA])
->get();
}else{
$servicios = ServicioDet::select("servicios_det.*",
DB::raw("CASE WHEN (fecha_solicitud>='$fecha_solicitada' OR ADDTIME(fecha_solicitud, duracion)<='$fecha_solicitada') AND
(fecha_solicitud>='$fecha_solicitada_duracion' OR ADDTIME(fecha_solicitud, duracion)<='$fecha_solicitada_duracion')
THEN 'DISPONIBLE' ELSE 'NO_DISPONIBLE' END AS validacion_1"),
DB::raw("CASE WHEN (fecha_solicitud='$fecha_solicitada' AND ADDTIME(fecha_solicitud, duracion)='$fecha_solicitada_duracion')
THEN 'NO_DISPONIBLE' ELSE null END AS validacion_2"))
->whereDate('fecha_solicitud', $fecha_solicitud)
//->whereDate('fecha_solicitud', Carbon::now()->format('Y-m-d'))
->whereIn('estatus_servicio_id',[PENDIENTE,REPROGRAMADO,PAGADO,VISITA])
->get();
}*/
$servicios = ServicioDet::select("servicios_det.*",
DB::raw("CASE WHEN('$fecha_solicitada'<=fecha_solicitud AND '$fecha_solicitada'<ADDTIME(fecha_solicitud, duracion) AND ('$fecha_solicitada_duracion'>fecha_solicitud AND '$fecha_solicitada_duracion'<ADDTIME(fecha_solicitud, duracion)))
THEN 'NO_DISPONIBLE'
ELSE
(CASE WHEN('$fecha_solicitada'<=fecha_solicitud AND '$fecha_solicitada_duracion'>=ADDTIME(fecha_solicitud, duracion))
THEN 'NO_DISPONIBLE'
ELSE
(CASE WHEN('$fecha_solicitada'>=fecha_solicitud AND '$fecha_solicitada_duracion'<=ADDTIME(fecha_solicitud, duracion))
THEN 'NO_DISPONIBLE'
ELSE
(CASE WHEN('$fecha_solicitada'>fecha_solicitud AND '$fecha_solicitada'<ADDTIME(fecha_solicitud, duracion) AND '$fecha_solicitada_duracion'>=ADDTIME(fecha_solicitud, duracion))
THEN 'NO_DISPONIBLE'
ELSE
'DISPONIBLE'
END)
END)
END)
END AS 'validacion_1'"))
->whereDate('fecha_solicitud', $fecha_solicitud)
->whereIn('estatus_servicio_id', [PENDIENTE, REPROGRAMADO, PAGADO, VISITA]);
if (is_numeric($data['servicio_det_id'])) {
$servicios->where('id', '<>', $data['servicio_det_id']);
}
$servicios = $servicios->get();
$ocupados = array();
foreach ($servicios as $s) {
if (($s->validacion_1 == "NO_DISPONIBLE")) {
$exists_operador = collect($ocupados)->contains('operador_id', $s->operador_id);
$exists_vehiculo = collect($ocupados)->contains('vehiculo_id', $s->vehiculo_id);
if (!$exists_operador && !$exists_vehiculo) {
$operador = User::where('id', $s->operador_id)->first();
$operador_name = ($s->operador_id == $data['operador_id']) ? "El operador: '" . $operador->nombre . " " . $operador->apellido_paterno . " " . $operador->apellido_materno . "' no está disponible." : null;
$vehiculo = Vehiculo::where('id', $s->vehiculo_id)->first();
$vehiculo_name = ($s->vehiculo_id == $data['vehiculo_id']) ? "El vehiculo: '" . $vehiculo->num_economico . "' no está disponible." : null;
$auxiliar_1 = User::where('id', $s->auxiliar_1)->first();
$auxiliar_2 = User::where('id', $s->auxiliar_2)->first();
$contain_aux_1 = array_key_exists('auxiliar_1', $data);
$contain_aux_2 = array_key_exists('auxiliar_2', $data);
$auxiliar_1_name = null;
$auxiliar_2_name = null;
$auxiliar_3_name = null;
if ($auxiliar_1) {
$auxiliar_1_name = ($contain_aux_1 && $s->auxiliar_1 == $data['auxiliar_1']) ? "El auxiliar: '" . $auxiliar_1->nombre . " " . $auxiliar_1->apellido_paterno . " " . $auxiliar_1->apellido_materno . "' no está disponible." : null;
}
if ($auxiliar_2) {
$auxiliar_2_name = ($contain_aux_2 && $s->auxiliar_2 == $data['auxiliar_2']) ? "El auxiliar: '" . $auxiliar_2->nombre . " " . $auxiliar_2->apellido_paterno . " " . $auxiliar_2->apellido_materno . "' no está disponible." : null;
}
$salida_array = compact('operador_name', 'vehiculo_name', 'auxiliar_1_name', 'auxiliar_2_name', 'auxiliar_3_name');
$salida = collect($salida_array)->filter()->values();
if (count($salida) > 0) {
array_push($ocupados, $salida);
}
}
}
}
return $ocupados;
}
public function validarOperadorVehiculo(Request $request)
{
$data = $request->all();
$fecha_solicitada = $data['fecha_solicitud'];
$fecha_solicitada_duracion = Carbon::createFromTimeString($data['fecha_solicitud'])
->addHour($data['horas_duracion'])
->addMinutes($data['minutos_duracion'])
->toDateTimeString();
$fecha_solicitud = Carbon::createFromTimeString($data['fecha_solicitud'])->format('Y-m-d');
/*if(is_numeric($data['servicio_det_id'])){
$servicios = ServicioDet::select("servicios_det.*",
DB::raw("CASE WHEN (fecha_solicitud>='$fecha_solicitada' OR ADDTIME(fecha_solicitud, duracion)<='$fecha_solicitada') AND
(fecha_solicitud>='$fecha_solicitada_duracion' OR ADDTIME(fecha_solicitud, duracion)<='$fecha_solicitada_duracion')
THEN 'DISPONIBLE' ELSE 'NO_DISPONIBLE' END AS validacion_1"),
DB::raw("CASE WHEN (fecha_solicitud='$fecha_solicitada' AND ADDTIME(fecha_solicitud, duracion)='$fecha_solicitada_duracion')
THEN 'NO_DISPONIBLE' ELSE null END AS validacion_2"))
->whereDate('fecha_solicitud', $fecha_solicitud)
//->whereDate('fecha_solicitud', Carbon::now()->format('Y-m-d'))
//->where('id', '<>', $data['servicio_det_id'])
->whereIn('estatus_servicio_id',[PENDIENTE,REPROGRAMADO,PAGADO,VISITA])
->get();
}else{
$servicios = ServicioDet::select("servicios_det.*",
DB::raw("CASE WHEN (fecha_solicitud>='$fecha_solicitada' OR ADDTIME(fecha_solicitud, duracion)<='$fecha_solicitada') AND
(fecha_solicitud>='$fecha_solicitada_duracion' OR ADDTIME(fecha_solicitud, duracion)<='$fecha_solicitada_duracion')
THEN 'DISPONIBLE' ELSE 'NO_DISPONIBLE' END AS validacion_1"),
DB::raw("CASE WHEN (fecha_solicitud='$fecha_solicitada' AND ADDTIME(fecha_solicitud, duracion)='$fecha_solicitada_duracion')
THEN 'NO_DISPONIBLE' ELSE null END AS validacion_2"))
->whereDate('fecha_solicitud', $fecha_solicitud)
//->whereDate('fecha_solicitud', Carbon::now()->format('Y-m-d'))
->whereIn('estatus_servicio_id',[PENDIENTE,REPROGRAMADO,PAGADO,VISITA])
->get();
}*/
$servicios = ServicioDet::select("servicios_det.*",
DB::raw("CASE WHEN('$fecha_solicitada'<=fecha_solicitud AND '$fecha_solicitada'<ADDTIME(fecha_solicitud, duracion) AND ('$fecha_solicitada_duracion'>fecha_solicitud AND '$fecha_solicitada_duracion'<ADDTIME(fecha_solicitud, duracion)))
THEN 'NO_DISPONIBLE'
ELSE
(CASE WHEN('$fecha_solicitada'<=fecha_solicitud AND '$fecha_solicitada_duracion'>=ADDTIME(fecha_solicitud, duracion))
THEN 'NO_DISPONIBLE'
ELSE
(CASE WHEN('$fecha_solicitada'>=fecha_solicitud AND '$fecha_solicitada_duracion'<=ADDTIME(fecha_solicitud, duracion))
THEN 'NO_DISPONIBLE'
ELSE
(CASE WHEN('$fecha_solicitada'>fecha_solicitud AND '$fecha_solicitada'<ADDTIME(fecha_solicitud, duracion) AND '$fecha_solicitada_duracion'>=ADDTIME(fecha_solicitud, duracion))
THEN 'NO_DISPONIBLE'
ELSE
'DISPONIBLE'
END)
END)
END)
END AS 'validacion_1'"))
->whereDate('fecha_solicitud', $fecha_solicitud)
->whereIn('estatus_servicio_id', [PENDIENTE, REPROGRAMADO, PAGADO, VISITA])
->get();
$ocupados = array();
foreach ($servicios as $s) {
//if(($s->validacion_1 == "NO_DISPONIBLE") || ($s->validacion_1 == "DISPONIBLE" && $s->validacion_2 == "NO_DISPONIBLE")){
if (($s->validacion_1 == "NO_DISPONIBLE")) {
$exists_operador = collect($ocupados)->contains('operador_id', $s->operador_id);
$exists_vehiculo = collect($ocupados)->contains('vehiculo_id', $s->vehiculo_id);
if (!$exists_operador && !$exists_vehiculo) {
array_push($ocupados, ['operador_id' => $s->operador_id, 'vehiculo_id' => $s->vehiculo_id, 'solicitud_servicio_id' => $s->id, 'auxiliar_1' => $s->auxiliar_1, 'auxiliar_2' => $s->auxiliar_2, 'servicio_id' => $s->id]);
}
}
}
return response()->success($ocupados);
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$user = Auth::user();
$permiso_especial = Auth::user()->permiso_especial;
$now = Carbon::now()->format('Y-m-d');
$campos_enc = [
'servicios_enc.id',
'servicios_enc.forma_pago_id',
'cat_formas_pagos.nombre as forma_pago_nombre',
'cat_formas_pagos.zeros as forma_pago_zeros',
'fecha_agenda',
'usuario_agenda_id',
'users.nombre as usuario_agenda_nombre',
'users.apellido_paterno as usuario_agenda_apellido_paterno',
'users.apellido_materno as usuario_agenda_apellido_materno',
'servicios_enc.cliente_id',
'clientes.denominacion',
'servicios_enc.cliente_domicilio_id',
'clientes_domicilios.calle as clientes_calle',
'clientes_domicilios.num_ext as clientes_num_ext',
'clientes_domicilios.num_int as clientes_num_int',
'clientes_domicilios.colonia as clientes_colonia',
'clientes_domicilios.cp as clientes_cp',
'clientes_domicilios.telefono as clientes_telefono',
'clientes_domicilios.lat as clientes_lat',
'clientes_domicilios.lng as clientes_lng',
'servicios_enc.deleted_at',
'servicios_enc.origen_id',
'cat_origenes.nombre as origen_nombre',
];
$servicio_enc = ServicioEnc::select($campos_enc)
->joinDetalleServicioEnc()
->join('cat_origenes', 'servicios_enc.origen_id', '=', 'cat_origenes.id')
->where('servicios_enc.id', $id)
->where('servicios_enc.sucursal_id', $user->sucursal_id)
->first();
$campos_det = [
'servicios_det.id',
'servicios_det.servicio_id',
'cat_servicios.nombre as servicio_nombre',
'servicios_det.estatus_servicio_id',
'cat_estatus_servicios.nombre as estatus_servicio_nombre',
'cat_estatus_servicios.color_1 as estatus_servicio_color_1',
'cat_estatus_servicios.color_2 as estatus_servicio_color_2',
'servicios_det.tipo_servicio_id',
'cat_tipos_servicios.nombre as tipo_servicio_nombre',
'duracion',
'definido_cliente',
'servicios_det.operador_id',
'operador.nombre as operador_nombre',
'operador.apellido_paterno as operador_apellido_paterno',
'operador.apellido_materno as operador_apellido_materno',
'servicios_det.vehiculo_id',
'cat_vehiculos.num_economico as vehiculo_num_economico',
'servicios_det.fecha_solicitud',
'sucursales.nombre as vehiculo_sucursal',
'sucursales.id as vehiculo_sucursal_id',
'sucursal_operador.nombre as operador_sucursal',
'sucursal_operador.id as operador_sucursal_id',
'servicios_det.auxiliar_1 as auxiliar_1_id',
'servicios_det.auxiliar_2 as auxiliar_2_id',
'auxiliares_1.nombre as auxiliar_1',
'auxiliares_2.nombre as auxiliar_2',
'sucursal_auxiliares_1.nombre as sucursal_auxiliar_1',
'sucursal_auxiliares_2.nombre as sucursal_auxiliar_2',
'servicios_det.costo_servicio',
'servicios_det.aceptado',
'servicios_det.observacion_atencion_cliente',
'servicios_det.requiere_encuesta',
'servicios_det.facturado'
];
$servicio_enc->servicios = ServicioDet::select($campos_det)
->joinDetalleServicioDet()
->where('servicio_enc_id', $id)
->get();
foreach ($servicio_enc->servicios as $servicio) {
$iniciado = ServicioProgreso::where('servicio_enc_id', $id)
->where('servicio_det_id', $servicio->id)
->whereNull('fecha_fin_servidor')
->first();
$servicio->iniciado = ($iniciado) ? 1 : 0;
list($fecha, $hora) = explode(" ", $servicio->fecha_solicitud);
$estatus_servicio = $servicio->estatus_servicio_id;
$servicio->puede_editar = $this->validarEditar($iniciado, $estatus_servicio, $fecha, $now, $permiso_especial);
}
//$servicio_enc->permiso_especial = $permiso_especial;
return response()->success($servicio_enc);
}
public function validarEditar($iniciado, $estatus_servicio, $fecha, $now, $permiso_especial)
{
$user_rol = RolUser::where('user_id', Auth::user()->id)->first();
if ($permiso_especial) {
//Tienen permiso especial
$puede_editar = 1;
} elseif ($fecha >= $now && $estatus_servicio == PENDIENTE && !$iniciado && $user_rol->role_id == 1) {
$puede_editar = 2;
} else {
$puede_editar = 0;
}
return $puede_editar;
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(ServiciosRequest $request, $id)
{
$data = $request->all();
$data_servicios = $data['servicios'];
$now = Carbon::now()->format('Y-m-d');
DB::beginTransaction();
try {
$servicio = ServicioEnc::where('id', $id)
->withTrashed()
->firstOrFail();
$servicio->update($data);
//
$correos = [];
$correo_cliente = Cliente::select('email')->where('id', $servicio->cliente_id)->first();
$correo_cliente_domicilio = ClienteDomicilio::select('email')->where('id', $servicio->cliente_domicilio_id)->first();
if ($correo_cliente && $correo_cliente->email) {
array_push($correos, $correo_cliente->email);
}
if ($correo_cliente_domicilio && $correo_cliente_domicilio->email) {
array_push($correos, $correo_cliente_domicilio->email);
}
//
foreach ($data_servicios as $servicios) {
$contain_aux_1 = array_key_exists('auxiliar_1', $servicios);
$contain_aux_2 = array_key_exists('auxiliar_2', $servicios);
if ($contain_aux_1 && $contain_aux_2) {
if ($servicios['auxiliar_1'] == $servicios['auxiliar_2']) {
$aux = User::where('id', $servicios['auxiliar_1'])->first();
$error_aux = ["El auxiliar: '" . $aux->nombre . " " . $aux->apellido_paterno . " " . $aux->apellido_materno . "' no está disponible."];
DB::rollBack();
return response()->unprocessable('Error', $error_aux);
}
}
$servicios_data = $servicios;
$servicios_data['servicio_det_id'] = $servicios['id'];
$validacion = $this->validarOperadorVehiculoLocal($servicios_data);
if (count($validacion) > 0) {
DB::rollBack();
return response()->unprocessable('Error', $validacion[0]);
}
if ($servicios['estatus_servicio_id'] == NEGATIVO || $servicios['estatus_servicio_id'] == REALIZADO || $servicios['estatus_servicio_id'] == CANCELADO) {
if (Auth::user()->permiso_especial) {
$datos = [
'estatus_servicio_id' => $servicios['estatus_servicio_id'],
'costo_servicio' => $servicios['costo_servicio'],
'operador_id' => $servicios['operador_id'],
'vehiculo_id' => $servicios['vehiculo_id'],
'tipo_servicio_id' => $servicios['tipo_servicio_id'],
'servicio_id' => $servicios['servicio_id'],
'facturado' => $servicios['facturado'],
'observacion_atencion_cliente' => $servicios['observacion_atencion_cliente']
];
if ($contain_aux_1) {
$datos['auxiliar_1'] = $servicios['auxiliar_1'];
}
if ($contain_aux_2) {
$datos['auxiliar_2'] = $servicios['auxiliar_2'];
}
} else {
if ($servicios['estatus_servicio_id'] == NEGATIVO) {
$datos = [
'estatus_servicio_id' => $servicios['estatus_servicio_id'],
'costo_servicio' => $servicios['costo_servicio']
];
} else {
$datos = [
'estatus_servicio_id' => $servicios['estatus_servicio_id']
];
}
}
$s = ServicioDet::where('id', $servicios['id'])
->first();
$s_enc = $s->servicio_enc_id;
$s_det = $s->id;
$s->update($datos);
if($servicios['estatus_servicio_id'] == NEGATIVO || $servicios['estatus_servicio_id'] == REALIZADO){
$auxiliar_id = null;
if($contain_aux_1){
$auxiliar_id = $datos['auxiliar_1'];
}elseif($contain_aux_2){
$auxiliar_id = $datos['auxiliar_2'];
}
$this->changePDF($servicios['costo_servicio'], $servicios['operador_id'], $auxiliar_id,$servicios['vehiculo_id'], $s_enc, $s_det, $servicios['fecha_solicitud']);
}
} else {
$servicio = ServicioDet::where('id', $servicios['id'])
->first();
$usuario = User::where('id', $servicios['operador_id'])->first();
$now = Carbon::now()->format('Y-m-d');
$fecha_solicitada = Carbon::createFromTimeString($servicios['fecha_solicitud'])->format('Y-m-d');
if (Carbon::parse($usuario->last_login)->isToday() && ($usuario->token_firebase && $fecha_solicitada == $now && $servicio->operador_id != $servicios['operador_id']) && ($servicios['estatus_servicio_id'] == PENDIENTE || $servicios['estatus_servicio_id'] == REPROGRAMADO || $servicios['estatus_servicio_id'] == VISITA || $servicios['estatus_servicio_id'] == PAGADO)) {
if (!$this->enviarNotificacion($servicios, $usuario)) {
DB::rollBack();
return response()->unprocessable('Error', ['Error al actualizar el Servicio.']);
}
}
if (!$servicio->aceptado && !$servicio->operador_id && !$servicio->operador_id) {
$servicios['aceptado'] = 0;
$servicios['observacion'] = null;
$servicio->update($servicios);
//Envio de notificacion
if (Carbon::parse($usuario->last_login)->isToday() && ($usuario->token_firebase && $fecha_solicitada == $now) && ($servicios['estatus_servicio_id'] == PENDIENTE || $servicios['estatus_servicio_id'] == REPROGRAMADO || $servicios['estatus_servicio_id'] == VISITA || $servicios['estatus_servicio_id'] == PAGADO)) {
if (!$this->enviarNotificacion($servicios, $usuario)) {
DB::rollBack();
return response()->unprocessable('Error', ['Error al actualizar el Servicio.']);
}
}
} else {
$servicio['facturado'] = $servicios['facturado'];
$servicio->update($servicios);
}
//
/*if (count($correos) > 0) {
try {
Mail::to($correos)->send(new SolicitudServicio($servicios['id']));
} catch (\Exception $e) {
\Log::info("Error al enviar correo: " . json_encode($e->getMessage()));
}
}*/
//
}
}
DB::commit();
return response()->success($servicio);
} catch (\Exception $e) {
DB::rollBack();
Log::info($e);
return response()->unprocessable('Error', ['Error al actualizar el Servicio.']);
}
}
public function changePDF($costo, $asesor_id, $auxiliar_id, $vehiculo_id, $servicio_enc_id, $servicio_det_id, $fecha_solicitud){
$ruta_pdf = "app/public/servicios/recibos_pdf/solicitud_" . $servicio_enc_id."_servicio_" . $servicio_det_id . ".pdf";
if(Storage::disk('public')->exists("servicios/recibos_pdf/solicitud_" . $servicio_enc_id."_servicio_" . $servicio_det_id . ".pdf")){
$this->updatePDF($costo, $asesor_id, $auxiliar_id, $vehiculo_id, $ruta_pdf, $fecha_solicitud);
}else{
$this->generarPDF($servicio_enc_id, $servicio_det_id, true);
}
return true;
}
public function updatePDF($costo, $asesor_id, $auxiliar_id, $vehiculo_id, $ruta_pdf, $fecha_solicitud){
$date1 = new Carbon($fecha_solicitud);
$date2 = new Carbon("2023-02-02");
$is_less = $date1->lt($date2);
$pdf = new FPDI('P','mm','Letter');
$pdf->SetAutoPageBreak(false);
$pdf->AddFont('Helvetica', 'N', 'helvetica.php');
$pdf->AddPage('P','Letter');
$pdf->setSourceFile(storage_path($ruta_pdf));
$tplId = $pdf->importPage(1);
$pdf->useTemplate($tplId);
$pdf->setMargins(0,0,0);
$pdf->SetFont('helvetica','N',12);
$pdf->SetFillColor(255,255,255);
if($is_less){
$pdf->Rect(13.2, 234.5, 36.7, 4.8, 'F');
$pdf->SetXY(14.45,232.2);
$pdf->Write(10, $costo);
$pdf->Rect(13.2, 245.6, 92.5, 4.8, 'F');
$pdf->SetXY(15,243);
$pdf->Write(10, $this->name($asesor_id));
}else{
$pdf->Rect(11.5, 233.7, 37, 4.8, 'F');
$pdf->SetXY(13.2,231.8);
$pdf->Write(10, $costo);
$pdf->Rect(11.5, 245.5, 92.5, 6.5, 'F');
$pdf->SetXY(13.4,243);
$pdf->Write(10, $this->name($asesor_id));
}
/*$pdf->Rect(11.5, 256.7, 92.5, 6.5, 'F');
$pdf->SetXY(15,252);
$pdf->Write(10, $auxiliar_id ? $this->name($auxiliar_id) : '');
$pdf->Rect(107, 256.5, 48.5, 6.8, 'F');
$pdf->SetXY(110,252);
$pdf->Write(10, $this->name($vehiculo_id, false));*/
$pdf->Output(storage_path($ruta_pdf),'F',true);
return true;
}
public function name($id, $is_user = true){
if($is_user){
$user = User::where('id', $id)
->firstOrFail();
$name = $user->nombre . ' ' . $user->apellido_paterno . ' ' . $user->apellido_materno;
}else{
$vehiculo = Vehiculo::where('id', $id)
->firstOrFail();
$name = $vehiculo->num_economico;
}
return $name;
}
private function enviarNotificacion($servicios, $usuario)
{
try {
$authorization = config('firebase')['authorization'];
$project_id = config('firebase')['project_id'];
$endpoint = config('firebase')['endpoint'];
$headers = [
'Authorization' => 'key=' . $authorization,
'project_id' => $project_id,
'content-type' => 'application/json'
];
$cat_servicio = CatServicio::where('id', $servicios['servicio_id'])->first();
$datos = ['registration_ids' => array($usuario->token_firebase),
'data' => ['servicio_id' => $servicios['id'], 'title' => 'Nuevo servicio asignado', 'body' => $cat_servicio->nombre]];
$client = new Client();
$client->post($endpoint, [
'headers' => $headers,
'json' => $datos,
]);
return true;
} catch (\Exception $e) {
Log::info("Firebase error: " . json_encode($e->getMessage()));
return false;
}
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id, Request $request)
{
$deleted = $request->input('deleted');
if ($deleted) {
$servicio = ServicioEnc::where('id', $id)
->onlyTrashed()
->first();
$servicio->restore();
} else {
$servicio = ServicioEnc::findOrFail($id);
$servicio->delete();
}
return response()->success(['result' => 'ok']);
}
public function servicios(Request $request)
{
$orderBy = $request->input('sortBy', 'nombre');
$order = $request->input('order', 'asc');
$queryBuilder = CatServicio::orderBy($orderBy, $order);
if ($query = $request->get('query', false)) {
$queryBuilder->where(function ($q) use ($query) {
$q->where('nombre', 'like', '%' . $query . '%');
});
}
if ($perPage = $request->input('perPage', false)) {
$data = $queryBuilder->paginate($perPage);
} else {
$data = ['data' => $queryBuilder->get()];
}
return response()->success($data);
}
public function estatusServicios(Request $request)
{
$orderBy = $request->input('sortBy', 'nombre');
$order = $request->input('order', 'asc');
$queryBuilder = CatEstatuServicio::orderBy($orderBy, $order);
if ($query = $request->get('query', false)) {
$queryBuilder->where(function ($q) use ($query) {
$q->where('nombre', 'like', '%' . $query . '%');
});
}
if ($perPage = $request->input('perPage', false)) {
$data = $queryBuilder->paginate($perPage);
} else {
$data = ['data' => $queryBuilder->get()];
}
return response()->success($data);
}
public function formasPagos(Request $request)
{
$orderBy = $request->input('sortBy', 'nombre');
$order = $request->input('order', 'asc');
$queryBuilder = CatFormaPago::orderBy($orderBy, $order);
if ($query = $request->get('query', false)) {
$queryBuilder->where(function ($q) use ($query) {
$q->where('nombre', 'like', '%' . $query . '%');
});
}
if ($perPage = $request->input('perPage', false)) {
$data = $queryBuilder->paginate($perPage);
} else {
$data = ['data' => $queryBuilder->get()];
}
return response()->success($data);
}
public function tiposServicios(Request $request)
{
$orderBy = $request->input('sortBy', 'nombre');
$order = $request->input('order', 'asc');
$queryBuilder = CatTipoServicio::orderBy($orderBy, $order);
if ($query = $request->get('query', false)) {
$queryBuilder->where(function ($q) use ($query) {
$q->where('nombre', 'like', '%' . $query . '%');
});
}
if ($perPage = $request->input('perPage', false)) {
$data = $queryBuilder->paginate($perPage);
} else {
$data = ['data' => $queryBuilder->get()];
}
return response()->success($data);
}
public function clientes(Request $request)
{
$orderBy = $request->input('sortBy', 'denominacion');
$order = $request->input('order', 'asc');
$user = Auth::user();
$queryBuilder = Cliente::select('clientes.*')
->leftJoin('clientes_domicilios', function ($join) {
$join->on('clientes.id', '=', 'clientes_domicilios.cliente_id');
$join->whereNull('clientes_domicilios.deleted_at');
})
->where('sucursal_id', $user->sucursal_id)
->orderBy($orderBy, $order);
if ($query = $request->get('query', false)) {
$queryBuilder->where(function ($q) use ($query) {
$q->where('clientes.denominacion', 'like', '%' . $query . '%')
->orWhere('clientes_domicilios.telefono', '=', $query)
->orWhere('clientes.id', '=', $query);
});
}
$queryBuilder->groupBy('clientes.id');
if ($perPage = $request->input('perPage', false)) {
$data = $queryBuilder->paginate($perPage);
} else {
$data = ['data' => $queryBuilder->get()];
}
return response()->success($data);
}
public function domicilioXCliente($cliente_id, Request $request)
{
$orderBy = $request->input('sortBy', 'calle');
$order = $request->input('order', 'asc');
$queryBuilder = ClienteDomicilio::where('cliente_id', $cliente_id)->orderBy($orderBy, $order);
if ($query = $request->get('query', false)) {
$queryBuilder->where(function ($q) use ($query) {
$q->where('calle', 'like', '%' . $query . '%');
});
}
if ($perPage = $request->input('perPage', false)) {
$data = $queryBuilder->paginate($perPage);
} else {
$data = ['data' => $queryBuilder->get()];
}
return response()->success($data);
}
public function operadores(Request $request)
{
$orderBy = $request->input('sortBy', 'users.nombre');
$order = $request->input('order', 'asc');
$user = Auth::user();
$queryBuilder = User::select('users.*', 'sucursales.nombre as sucursal')
->where('tipo_empleado_id', ASESOR_OPERACIONES)
->where('users.sucursal_id', $user->sucursal_id)
->join('sucursales', 'sucursales.id', '=', 'users.sucursal_id')
->orderBy($orderBy, $order);
if ($query = $request->get('query', false)) {
$queryBuilder->where(function ($q) use ($query) {
$q->where('users.nombre', 'like', '%' . $query . '%')
->orWhere('users.apellido_paterno', 'like', '%' . $query . '%')
->orWhere('users.apellido_materno', 'like', '%' . $query . '%');
});
}
if ($perPage = $request->input('perPage', false)) {
$data = $queryBuilder->paginate($perPage);
} else {
$data = ['data' => $queryBuilder->get()];
}
return response()->success($data);
}
public function vehiculos(Request $request)
{
$orderBy = $request->input('sortBy', 'num_economico');
$order = $request->input('order', 'asc');
$user = Auth::user();
$queryBuilder = Vehiculo::select('cat_vehiculos.*')
->join('vehiculos_sucursales', 'vehiculos_sucursales.vehiculo_id', '=', 'cat_vehiculos.id')
->where('sucursal_id', $user->sucursal_id)
->orderBy($orderBy, $order);
if ($query = $request->get('query', false)) {
$queryBuilder->where(function ($q) use ($query) {
$q->where('num_economico', 'like', '%' . $query . '%');
});
}
if ($perPage = $request->input('perPage', false)) {
$data = $queryBuilder->paginate($perPage);
foreach ($data->items() as $vehiculo) {
$vehiculo->sucursales = VehiculoSucursal::select('sucursales.id as sucursal_id', 'sucursales.nombre as sucursal')
->join('sucursales', 'sucursales.id', '=', 'vehiculos_sucursales.sucursal_id')
->where('vehiculo_id', $vehiculo->id)
->get();
}
$vehiculo = $data;
} else {
$data = $queryBuilder->get();
foreach ($data as $vehiculo) {
$vehiculo->sucursales = VehiculoSucursal::select('sucursales.id as sucursal_id', 'sucursales.nombre as sucursal')
->join('sucursales', 'sucursales.id', '=', 'vehiculos_sucursales.sucursal_id')
->where('vehiculo_id', $vehiculo->id)
->get();
}
$vehiculo = ['data' => $data];
}
return response()->success($vehiculo);
}
public function auxiliares(Request $request)
{
$orderBy = $request->input('sortBy', 'users.nombre');
$order = $request->input('order', 'asc');
$user = Auth::user();
$queryBuilder = User::select('users.*', 'sucursales.nombre as sucursal')
->join('sucursales', 'sucursales.id', '=', 'users.sucursal_id')
->whereIn('tipo_empleado_id', [AUXILIAR_TECNICO_1, AUXILIAR_TECNICO_2])
->where('users.sucursal_id', $user->sucursal_id)
->orderBy($orderBy, $order);
if ($query = $request->get('query', false)) {
$queryBuilder->where(function ($q) use ($query) {
$q->where('users.nombre', 'like', '%' . $query . '%')
->orWhere('users.apellido_paterno', 'like', '%' . $query . '%')
->orWhere('users.apellido_materno', 'like', '%' . $query . '%');
});
}
if ($perPage = $request->input('perPage', false)) {
$data = $queryBuilder->paginate($perPage);
} else {
$data = ['data' => $queryBuilder->get()];
}
return response()->success($data);
}
public function origenes(Request $request)
{
$orderBy = $request->input('sortBy', 'nombre');
$order = $request->input('order', 'asc');
$queryBuilder = CatOrigen::orderBy($orderBy, $order);
if ($query = $request->get('query', false)) {
$queryBuilder->where(function ($q) use ($query) {
$q->where('nombre', 'like', '%' . $query . '%');
});
}
if ($perPage = $request->input('perPage', false)) {
$data = $queryBuilder->paginate($perPage);
} else {
$data = ['data' => $queryBuilder->get()];
}
return response()->success($data);
}
public function removeAuxiliar(Request $request, $servicio_id, $auxiliar_id)
{
$todos = $request->input('todos');
if ($todos) {
ServicioDet::where('id', $servicio_id)
->first()
->update(['auxiliar_1' => null, 'auxiliar_2' => null]);
} else {
$servicio_det_1 = ServicioDet::where('id', $servicio_id)
->where('auxiliar_1', $auxiliar_id)
->first();
$servicio_det_2 = ServicioDet::where('id', $servicio_id)
->where('auxiliar_2', $auxiliar_id)
->first();
if ($servicio_det_1) {
$servicio_det_1->update(['auxiliar_1' => null]);
} elseif ($servicio_det_2) {
$servicio_det_2->update(['auxiliar_2' => null]);
}
}
return response()->success(['result' => 'ok']);
}
public function generarPDF($servicio_enc_id, $servicio_det_id, $local = false)
{
setlocale(LC_MONETARY, 'en_US');
$det = ServicioDet::where('id', $servicio_det_id)->first();
if ($det->estatus_servicio_id != REALIZADO && $det->estatus_servicio_id != NEGATIVO) {
return response()->unprocessable('Error', ['El servicio no está terminado.']);
}
$servicio_progreso_id = ServicioProgreso::where('servicio_enc_id', $servicio_enc_id)
->where('servicio_det_id', $servicio_det_id)
->first();
if($servicio_progreso_id && Storage::disk('public')->exists("servicios/recibos_pdf/solicitud_" . $servicio_enc_id."_servicio_" . $servicio_det_id . ".pdf")) {
return response()->file(storage_path('app/public/servicios/recibos_pdf/' . 'solicitud_' . $servicio_enc_id . '_servicio_' . $servicio_det_id . '.pdf'));
}
$campos = [
'servicios_enc.id as folio',
'clientes.denominacion as nombre_cliente',
DB::raw("DATE_FORMAT(`servicios_det`.`fecha_solicitud`, '%d/%m/%Y') as 'fecha_solicitud'"),
'clientes_domicilios.ciudad',
'clientes_domicilios.celular_responsable as telefono',
'clientes_domicilios.nombre_responsable_sucursal as contacto',
'cat_servicios.nombre as servicio',
'servicios_progreso.comentarios as observaciones',
'servicios_det.costo_servicio',
DB::raw("TIME_FORMAT(`servicios_progreso`.`fecha_ini_celular`, '%H:%i:%s') as 'fecha_inicio'"),
'servicios_progreso.duracion',
DB::raw("TIME_FORMAT(`servicios_progreso`.`fecha_fin_celular`, '%H:%i:%s') as 'fecha_final'"),
DB::raw("CONCAT(asesor.nombre,' ',asesor.apellido_paterno,' ',asesor.apellido_materno) as asesor"),
'sucursales.nombre as sucursal',
DB::raw("CONCAT(auxiliar.nombre,' ',auxiliar.apellido_paterno,' ',auxiliar.apellido_materno) as auxiliar"),
'cat_vehiculos.num_economico as vehiculo',
'servicios_progreso.firma',
'estatus_servicio_id',
'clientes_domicilios.calle',
'clientes_domicilios.num_ext',
'clientes_domicilios.num_int',
'clientes_domicilios.colonia',
'clientes_domicilios.cp',
'servicios_progreso.aplica_garantia',
'cat_motivos_estatus.nombre as motivo_estatus'
];
$servicios = ServicioDet::select($campos)
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->join('clientes', 'servicios_enc.cliente_id', '=', 'clientes.id')
->join('clientes_domicilios', 'servicios_enc.cliente_domicilio_id', '=', 'clientes_domicilios.id')
->join('cat_servicios', 'servicios_det.servicio_id', '=', 'cat_servicios.id')
->leftJoin('servicios_progreso', 'servicios_det.id', '=', 'servicios_progreso.servicio_det_id')
->join('users as asesor', 'servicios_det.operador_id', '=', 'asesor.id')
->leftJoin('users as auxiliar', 'servicios_det.auxiliar_1', '=', 'auxiliar.id')
->join('sucursales', 'servicios_enc.sucursal_id', '=', 'sucursales.id')
->join('cat_vehiculos', 'servicios_det.vehiculo_id', '=', 'cat_vehiculos.id')
->leftJoin('cat_motivos_estatus', 'cat_motivos_estatus.id', '=', 'servicios_det.cat_motivos_estatus_id')
->where('servicios_det.id', $servicio_det_id)
->where('servicios_det.servicio_enc_id', $servicio_enc_id)
->firstOrFail();
$num_int = ($servicios->num_int) ? ' INT. ' . $servicios->num_int : '';
$cp = ($servicios->cp) ? ' C.P. ' . $servicios->cp : '';
$servicios['domicilio'] = 'CALLE ' . $servicios->calle . ' ' . $servicios->num_ext . $num_int . ', COL. ' . $servicios->colonia . $cp;
$servicios['folio'] = str_pad($servicios->folio, 5, "0", STR_PAD_LEFT);
$servicios['telefono'] = $this->phone_number_format($servicios->telefono);
if ($servicios->estatus_servicio_id == NEGATIVO) {
$costo_negativo = $servicios->costo_servicio;
$costo = 0.00;
} else {
$costo_negativo = 0.00;
$costo = $servicios->costo_servicio;
}
$servicios['costo_servicio'] = money_format('%(#10n', $costo);
$servicios['costo_negativo'] = money_format('%(#10n', $costo_negativo);
if ($servicios->duracion) {
list($h, $m, $s) = explode(":", $servicios->duracion);
$servicios['duracion'] = (int)$h . 'hr ' . $m . 'm ' . $s . 's';
} else {
$servicios['duracion'] = "00hr 00m 00s";
}
/*
if ($servicio_progreso_id) {
$evidencias_inicio = ServicioEvidencia::where('servicio_progreso_id', $servicio_progreso_id->id)
->where('etapa', 'Inicio')
->get();
$evidencias_proceso = ServicioEvidencia::where('servicio_progreso_id', $servicio_progreso_id->id)
->where('etapa', 'Proceso')
->get();
$evidencias_terminado = ServicioEvidencia::where('servicio_progreso_id', $servicio_progreso_id->id)
->where('etapa', 'Final')
->get();
$inicio = 0;
$proceso = 0;
$terminado = 0;
foreach ($evidencias_inicio as $e_i) {
$inicio++;
$servicios["evidencia_inicio_$inicio"] = $e_i->imagen;
}
foreach ($evidencias_proceso as $e_p) {
$proceso++;
$servicios["evidencia_proceso_$proceso"] = $e_p->imagen;
}
foreach ($evidencias_terminado as $e_t) {
$terminado++;
$servicios["evidencia_terminado_$terminado"] = $e_t->imagen;
}
}
*/
try {
$pdf = App::make('dompdf.wrapper');
$pdf->loadHTML(view('recibos/servicios-lite', compact('servicios')));
$nombre_pdf = 'solicitud_' . $servicio_enc_id . '_servicio_' . $servicio_det_id . '.pdf';
Storage::disk('public')->put('servicios/recibos_pdf/' . $nombre_pdf, $pdf->output());
return $pdf->stream($nombre_pdf);
} catch (\Exception $e) {
Log::info($e);
return response()->unprocessable('Error', ['Error al generar PDF.']);
}
}
function phone_number_format($number)
{
// Allow only Digits, remove all other characters.
$number = preg_replace("/[^\d]/", "", $number);
// get number length.
$length = strlen($number);
// if number = 10
if ($length == 10) {
$number = preg_replace("/^1?(\d{3})(\d{3})(\d{4})$/", "($1) $2 $3", $number);
}
return $number;
}
function actualizarLitraje(LitrajeRequest $request, $id)
{
$litraje = $request->input('litraje');
if (Auth::user()->permiso_especial) {
$servicio_progreso = ServicioProgreso::findOrFail($id);
/*if($servicio_progreso->litraje){
return response()->unprocessable('Error', ['Este servicio ya cuenta con un litraje asignado']);
}*/
$servicio_progreso->update(['litraje' => $litraje]);
return response()->success(['result' => 'ok']);
}
return response()->unauthorized('No es posible actualizar, pongase en contacto con un administrador');
}
/**
* Obtener historial de cambios de un servicio
*/
public function historial($servicio_det_id)
{
$historial = \App\Models\ServicioHistorial::where('servicio_det_id', $servicio_det_id)
->join('users', 'users.id', '=', 'servicios_historial.usuario_id')
->select(
'servicios_historial.*',
'users.nombre as usuario_nombre',
'users.apellido_paterno as usuario_apellido'
)
->orderBy('servicios_historial.created_at', 'DESC')
->get()
->map(function ($item) {
$camposLegibles = \App\Models\ServicioHistorial::$camposLegibles;
$item->campo_legible = $camposLegibles[$item->campo] ?? $item->campo;
$item->usuario_completo = $item->usuario_nombre . ' ' . $item->usuario_apellido;
$item->tiempo_transcurrido = \Carbon\Carbon::parse($item->created_at)->diffForHumans();
return $item;
});
return response()->success($historial);
}
function filtrosServicios(Request $request){
$user = Auth::user();
$origenes = CatOrigen::select('id', 'nombre')->orderBy('nombre','ASC')->get();
$formas_pagos= CatFormaPago::select('id', 'nombre')->orderBy('nombre','ASC')->get();
$estatus_servicios = CatEstatuServicio::select('id', 'nombre')->orderBy('nombre','ASC')->get();
$servicios = CatServicio::select('id', 'nombre')->orderBy('nombre','ASC')->get();
$tipo_servicio = CatTipoServicio::select('id', 'nombre')->orderBy('nombre','ASC')->get();
$vehiculos = Vehiculo::select('id', 'num_economico', 'descripcion', 'tipo_vehiculo_id')->orderBy('descripcion','ASC')->get();
$operadores = User::select('users.*', 'sucursales.nombre as sucursal')->where('tipo_empleado_id', ASESOR_OPERACIONES)->where('users.sucursal_id', $user->sucursal_id)->join('sucursales', 'sucursales.id', '=', 'users.sucursal_id')->orderBy('users.nombre','ASC')->get();
$auxiliares = User::select('users.*', 'sucursales.nombre as sucursal')->join('sucursales', 'sucursales.id', '=', 'users.sucursal_id')->whereIn('tipo_empleado_id', [AUXILIAR_TECNICO_1, AUXILIAR_TECNICO_2])->where('users.sucursal_id', $user->sucursal_id)->orderBy('users.nombre','ASC')->get();
return response()->success(compact('origenes', 'formas_pagos', 'estatus_servicios', 'servicios', 'tipo_servicio', 'vehiculos', 'operadores', 'auxiliares'));
}
public function agenda(Request $request){
$start_day = $request->input('start_day');
$end_day = $request->input('end_day');
$campos = [
DB::raw("CONCAT(`users`.`nombre`,' ',`users`.`apellido_paterno`) as nombre_operador"),
DB::raw("DATE_FORMAT(`fecha_solicitud`, '%h:%i %p') as hora_servicio"),
DB::raw("DATE_FORMAT(`duracion`, '%Hh %im') as duracion_servicio"),
"clientes.denominacion as denominacion_cliente",
"fecha_solicitud as start_day",
DB::raw("ADDTIME(`fecha_solicitud`, `duracion`) as end_day"),
"color_web as color_estatus",
"cat_estatus_servicios.nombre as nombre_estatus"
];
$servicios = ServicioDet::select($campos)
->join('users', 'servicios_det.operador_id', '=', 'users.id')
->join('cat_estatus_servicios', 'servicios_det.estatus_servicio_id', '=', 'cat_estatus_servicios.id')
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->join('clientes', 'servicios_enc.cliente_id', '=', 'clientes.id')
->where('servicios_enc.sucursal_id', Auth::user()->sucursal_id);
if($start_day && $end_day){
$servicios->whereRaw("Date(`fecha_solicitud`) between '$start_day' and '$end_day'");
}else{
$servicios->whereRaw("Date(`fecha_solicitud`) = '$start_day'");
}
$servicios = $servicios->orderBy('servicios_det.operador_id')->get();
return response()->success($servicios);
}
}