Files
Sio-Back/app/Http/Controllers/Operador/ServiciosProgresoController.php
2025-12-26 17:21:11 -08:00

475 lines
18 KiB
PHP

<?php
namespace App\Http\Controllers\Operador;
use const App\Http\Controllers\COSTO_SERVICIO_NEGATIVO;
use const App\Http\Controllers\NEGATIVO;
use const App\Http\Controllers\REALIZADO;
use App\Http\Requests\Operador\FinalizarServicioRequest;
use App\Http\Requests\Operador\GuardarEvidenciaRequest;
use App\Http\Requests\Operador\GuardarFirmaRequest;
use App\Http\Requests\Operador\IniciarServicioRequest;
use App\Mail\SolicitudServicioTerminado;
use App\Models\Cliente;
use App\Models\ClienteDomicilio;
use App\Models\ServicioDet;
use App\Models\ServicioEnc;
use App\Models\ServicioEvidencia;
use App\Models\ServicioProgreso;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Log;
use Excel;
class ServiciosProgresoController extends Controller
{
/**
* Iniciar Servicio.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function iniciarServicio(IniciarServicioRequest $request)
{
$data = $request->all();
$now = Carbon::now()->format('Y-m-d');
$servicio = ServicioProgreso::where('servicio_enc_id', $data['servicio_enc_id'])
->where('servicio_det_id', $data['servicio_det_id'])
->first();
$servicio_det = ServicioDet::where('servicio_enc_id', $data['servicio_enc_id'])
->where('id', $data['servicio_det_id'])
->first();
list($fecha) = explode(" ", $servicio_det->fecha_solicitud);
//Validar fecha de solicitud
if($now != $fecha){
//return response()->unprocessable('Parametros inválidos',['El servicio no se puede iniciar ya que corresponde a otra fecha.']);
}
//Validar que el servicio no este iniciado
if($servicio){
return response()->unprocessable('Parametros inválidos',['El servicio ya está iniciado.']);
}
$data['fecha_ini_servidor'] = Carbon::now()->toDateTimeString();
//Se agrego por detalle de Geolocalizacion
$servicio_enc = ServicioEnc::select('clientes_domicilios.lat','clientes_domicilios.lng')
->join('clientes_domicilios','servicios_enc.cliente_domicilio_id', '=','clientes_domicilios.id')
->where('servicios_enc.id', $servicio_det->servicio_enc_id)
->first();
$data['lat_ini'] = $servicio_enc->lat;
$data['lng_ini'] = $servicio_enc->lng;
//
ServicioProgreso::create($data);
return response()->success(['result' => 'ok']);
}
/**
* Finalizar Servicio.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function finalizarServicio(FinalizarServicioRequest $request)
{
$data = $request->only(['fecha_fin_celular', 'duracion', 'lat_fin', 'lng_fin', 'comentarios', 'aplica_garantia','litraje']);
$cat_motivos_estatus_id = $request->input('cat_motivos_estatus_id',0);
$now = Carbon::now();
$servicio_enc_id = $request->input('servicio_enc_id');
$servicio_det_id = $request->input('servicio_det_id');
$litraje = $request->litraje;
$servicio_progreso = ServicioProgreso::where('servicio_enc_id', $servicio_enc_id)
->where('servicio_det_id', $servicio_det_id)
->first();
$servicio_det = ServicioDet::where('servicio_enc_id', $servicio_enc_id)
->where('id', $servicio_det_id)
->first();
$servicio = ServicioEnc::where('id', $servicio_enc_id)->first();
$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);
}
//Validar fecha de solicitud
/*
list($fecha) = explode(" ", $servicio_det->fecha_solicitud);
if($now->format('Y-m-d') != $fecha){
return response()->unprocessable('Parametros inválidos',['No se puede finalizar el servicio ya que corresponde a otra fecha.']);
}*/
//Validar que el servicio no este terminado
if($servicio_det->estatus_servicio_id == REALIZADO){
return response()->unprocessable('Parametros inválidos',['El servicio ya está terminado']);
}
//Validar que el servicio esté iniciado
if(!$servicio_progreso){
return response()->unprocessable('Parametros inválidos',['El servicio no está iniciado.']);
}
DB::beginTransaction();
try {
$data['fecha_fin_servidor'] = $now->toDateTimeString();
//Se agrego por detalle de Geolocalizacion
$servicio_enc = ServicioEnc::select('clientes_domicilios.lat','clientes_domicilios.lng')
->join('clientes_domicilios','servicios_enc.cliente_domicilio_id', '=','clientes_domicilios.id')
->where('servicios_enc.id', $servicio_det->servicio_enc_id)
->first();
$data['lat_fin'] = $servicio_enc->lat;
$data['lng_fin'] = $servicio_enc->lng;
if($litraje == 0){
$data['litraje'] = null;
}else{
$data['litraje'] = $litraje;
}
$servicio_progreso->update($data);
if ($cat_motivos_estatus_id != 0){
$servicio_det->update(
[
'estatus_servicio_id' => NEGATIVO,
'cat_motivos_estatus_id' => $cat_motivos_estatus_id,
'costo_servicio' => COSTO_SERVICIO_NEGATIVO,
]
);
} else{
$servicio_det->update(['estatus_servicio_id' => REALIZADO]);
}
DB::commit();
try {
if(count($correos) > 0){
Mail::to($correos)->send(new SolicitudServicioTerminado($servicio_enc_id,$servicio_det_id));
}
}catch (\Exception $e){
return response()->success(['result' => 'ok']);
}
return response()->success(['result' => 'ok']);
} catch (\Exception $e) {
DB::rollBack();
Log::info($e);
return response()->unprocessable('Error', ['Error al finalizar servicio.']);
}
}
/**
* Guardar Evidencia.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function guardarEvidencia(GuardarEvidenciaRequest $request)
{
$data = $request->only(['etapa', 'lat', 'lng', 'servicio_enc_id', 'servicio_det_id']);
$servicio_progreso = ServicioProgreso::where('servicio_enc_id', $data['servicio_enc_id'])
->where('servicio_det_id', $data['servicio_det_id'])
->first();
$servicio_det = ServicioDet::where('servicio_enc_id', $data['servicio_enc_id'])
->where('id', $data['servicio_det_id'])
->first();
//Validar que el servicio no este terminado
if($servicio_det->estatus_servicio_id == REALIZADO){
return response()->success(['result' => 'ok']);
}
//Validar que el servicio esté iniciado
if(!$servicio_progreso){
return response()->success(['result' => 'ok']);
}
//Validar imagen
if (!$request->hasFile('imagen') || !$request->file('imagen')->isValid()){
return response()->success(['result' => 'ok']);
}
//Validar etapa
if($data['etapa'] != 'Inicio' && $data['etapa'] != 'Proceso' && $data['etapa'] != 'Final'){
return response()->success(['result' => 'ok']);
}
$imagen = $request->imagen;
$uuid = $imagen->hash('sha256');
//Validar que la imagen no haya sido capturada
if(ServicioEvidencia::where('uuid', $uuid)->first()){
return response()->success(['result' => 'ok']);
}
DB::beginTransaction();
try {
$data['uuid'] = $uuid;
$data['servicio_progreso_id'] = $servicio_progreso->id;
//Se agrego por detalle de Geolocalizacion
$servicio_enc = ServicioEnc::select('clientes_domicilios.lat','clientes_domicilios.lng')
->join('clientes_domicilios','servicios_enc.cliente_domicilio_id', '=','clientes_domicilios.id')
->where('servicios_enc.id', $servicio_det->servicio_enc_id)
->first();
$data['lat'] = $servicio_enc->lat;
$data['lng'] = $servicio_enc->lng;
//
$evidencia = ServicioEvidencia::create($data);
/*
* IMAGEN
*/
$nombre_img = 'solicitud_'.$data['servicio_enc_id'].'_servicio_'.$data['servicio_det_id'].'_evidencia_'.$evidencia->id.'.'.$imagen->extension();
$imagen->storeAs('public/servicios/evidencias', $nombre_img);
$evidencia->update(['imagen' => $nombre_img]);
DB::commit();
return response()->success(['result' => 'ok']);
} catch (\Exception $e) {
DB::rollBack();
Log::info($e);
return response()->success(['result' => 'ok']);
}
}
/**
* Guardar Evidencia.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function guardarFirmas(GuardarFirmaRequest $request)
{
$data = $request->only(['servicio_enc_id', 'servicio_det_id']);
$servicio_progreso = ServicioProgreso::where('servicio_enc_id', $data['servicio_enc_id'])
->where('servicio_det_id', $data['servicio_det_id'])
->first();
/*
* Validar imagen
* Se comenta por el cambio de guardado
*/
if (!$request->hasFile('imagen') || !$request->file('imagen')->isValid()){
return response()->success(['result' => 'ok']);
}
$imagen = $request->imagen;
try {
/*
* IMAGEN
*/
$nombre_img = 'firma_'.'solicitud_'.$data['servicio_enc_id'].'_servicio_'.$data['servicio_det_id'].'.'.$imagen->extension();
$imagen->storeAs('public/servicios/firmas', $nombre_img);
$servicio_progreso->update(['firma' => $nombre_img]);
return response()->success(['result' => 'ok']);
} catch (\Exception $e) {
Log::info($e);
return response()->success(['result' => 'ok']);
}
}
/**
* Guardar Evidencia.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
/*public function guardarEvidencia(GuardarEvidenciaRequest $request)
{
$data = $request->only(['etapa', 'lat', 'lng', 'servicio_enc_id', 'servicio_det_id']);
$imagen = $request->input('imagen');
$now = Carbon::now()->format('Y-m-d');
$servicio_progreso = ServicioProgreso::where('servicio_enc_id', $data['servicio_enc_id'])
->where('servicio_det_id', $data['servicio_det_id'])
->first();
$servicio_det = ServicioDet::where('servicio_enc_id', $data['servicio_enc_id'])
->where('id', $data['servicio_det_id'])
->first();
list($fecha) = explode(" ", $servicio_det->fecha_solicitud);
//Validar fecha de solicitud
if($now != $fecha){
//return response()->unprocessable('Parametros inválidos',['No se pueden guardar evidencias ya que el servicio corresponde a otra fecha.']);
}
//Validar que el servicio no este terminado
if($servicio_det->estatus_servicio_id == REALIZADO){
//return response()->unprocessable('Parametros inválidos',['El servicio ya está terminado']);
//Se agrega para que regrese la petición pero no se guarda información
return response()->success(['result' => 'ok']);
}
//Validar que el servicio esté iniciado
if(!$servicio_progreso){
//return response()->unprocessable('Parametros inválidos',['El servicio no está iniciado.']);
//Se agrega para que regrese la petición pero no se guarda información
return response()->success(['result' => 'ok']);
}
//Validar imagen
//if (!$request->hasFile('imagen') || !$request->file('imagen')->isValid()){
// return response()->unprocessable('Parametros inválidos',['Imagen invalida']);
//}
//Validar etapa
if($data['etapa'] != 'Inicio' && $data['etapa'] != 'Proceso' && $data['etapa'] != 'Final'){
//return response()->unprocessable('Parametros inválidos',['El valor etapa no es valido']);
//Se agrega para que regrese la petición pero no se guarda información
return response()->success(['result' => 'ok']);
}
//$imagen = $request->imagen;
//$uuid = hash_file('sha256', $imagen);
//Validar que la imagen no haya sido capturada
//if(ServicioEvidencia::where('uuid', $uuid)->first()){
return response()->unprocessable('Parametros inválidos',['La imagen ya fue capturada']);
//}
DB::beginTransaction();
try {
$data['uuid'] = hash('sha256', $imagen);
$data['servicio_progreso_id'] = $servicio_progreso->id;
//Se agrego por detalle de Geolocalizacion
$servicio_enc = ServicioEnc::select('clientes_domicilios.lat','clientes_domicilios.lng')
->join('clientes_domicilios','servicios_enc.cliente_domicilio_id', '=','clientes_domicilios.id')
->where('servicios_enc.id', $servicio_det->servicio_enc_id)
->first();
$data['lat'] = $servicio_enc->lat;
$data['lng'] = $servicio_enc->lng;
//
$evidencia = ServicioEvidencia::create($data);
//$nombre_img = 'solicitud_'.$data['servicio_enc_id'].'_servicio_'.$data['servicio_det_id'].'_evidencia_'.$evidencia->id.'.'.$imagen->extension();
//$imagen->storeAs('public/servicios/evidencias', $nombre_img);
$nombre_img = 'solicitud_'.$data['servicio_enc_id'].'_servicio_'.$data['servicio_det_id'].'_evidencia_'.$evidencia->id.'.jpeg';
Storage::disk('public')->put('servicios/evidencias/' . $nombre_img, $this->base64ToImage($imagen), 'public');
$evidencia->update(['imagen' => $nombre_img]);
DB::commit();
return response()->success(['result' => 'ok']);
} catch (\Exception $e) {
DB::rollBack();
Log::info($e);
return response()->unprocessable('Error', ['Error al guardar la evidencia.']);
}
}
public function guardarFirmas(GuardarFirmaRequest $request)
{
$data = $request->only(['servicio_enc_id', 'servicio_det_id']);
$servicio_progreso = ServicioProgreso::where('servicio_enc_id', $data['servicio_enc_id'])
->where('servicio_det_id', $data['servicio_det_id'])
->first();
// $now = Carbon::now()->format('Y-m-d');
//
// $servicio_det = ServicioDet::where('servicio_enc_id', $data['servicio_enc_id'])
// ->where('id', $data['servicio_det_id'])
// ->first();
//
// list($fecha) = explode(" ", $servicio_det->fecha_solicitud);
//
// //Validar fecha de solicitud
// if($now != $fecha){
// return response()->unprocessable('Parametros inválidos',['No se pueden guardar evidencias ya que el servicio corresponde a otra fecha.']);
// }
//
// //Validar que el servicio no este terminado
// if($servicio_det->estatus_servicio_id == REALIZADO){
// return response()->unprocessable('Parametros inválidos',['El servicio ya está terminado']);
// }
//
// //Validar que el servicio esté iniciado
// if(!$servicio_progreso){
// return response()->unprocessable('Parametros inválidos',['El servicio no está iniciado.']);
// }
// if (!$request->hasFile('imagen') || !$request->file('imagen')->isValid()){
// return response()->unprocessable('Parametros inválidos',['Imagen invalida']);
// }
$imagen = $request->input('imagen');
try {
// $nombre_img = 'firma_'.'solicitud_'.$data['servicio_enc_id'].'_servicio_'.$data['servicio_det_id'].'.'.$imagen->extension();
// $imagen->storeAs('public/servicios/firmas', $nombre_img);
$nombre_img = 'firma_'.'solicitud_'.$data['servicio_enc_id'].'_servicio_'.$data['servicio_det_id'].'.jpeg';
Storage::disk('public')->put('servicios/firmas/' . $nombre_img, $this->base64ToImage($imagen), 'public');
$servicio_progreso->update(['firma' => $nombre_img]);
return response()->success(['result' => 'ok']);
} catch (\Exception $e) {
Log::info($e);
return response()->unprocessable('Error', ['Error al guardar la firma.']);
}
}*/
public function verificarServicio(Request $request){
$servicios_id = $request->all();
$servicios = array();
foreach ($servicios_id as $s){
$servicio_det = ServicioDet::find($s);
if($servicio_det && $servicio_det->estatus_servicio_id == REALIZADO){
array_push($servicios,['servicio_id' => $s]);
}
}
return response()->success($servicios);
}
}