Carga inicial

This commit is contained in:
IvanAS94
2025-12-26 17:21:11 -08:00
parent 45d9afc951
commit 51880798ca
359 changed files with 42159 additions and 1 deletions

View File

@@ -0,0 +1,409 @@
<?php
namespace App\Http\Controllers\Reportes;
use App\Http\Requests\Reportes\CapacidadAprovechadaRequest;
use App\Http\Requests\Reportes\ConsultarVehiculosRequest;
use App\Models\ServicioDet;
use App\Models\Vehiculo;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB;
use Excel;
class CapacidadAprovechadaController extends Controller
{
public function consultarVehiculos(ConsultarVehiculosRequest $request){
$sucursal = $request->input('sucursal');
$fecha_inicio = $request->input('fecha_inicio');
$fecha_final = $request->input('fecha_final');
$orderBy = $request->input('sortBy','id');
$order = $request->input('order','asc');
$queryBuilder = Vehiculo::select('id', 'num_economico')
->join('vehiculos_sucursales', 'cat_vehiculos.id', '=', 'vehiculos_sucursales.vehiculo_id')
->where('vehiculos_sucursales.sucursal_id', $sucursal)
->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 $v){
$v->servicios_cantidad = ServicioDet::where('servicios_det.vehiculo_id', $v->id)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->count();
}
$vehiculos = $data;
}else{
$data = $queryBuilder->get();
foreach ($data as $v){
$v->servicios_cantidad = ServicioDet::where('servicios_det.vehiculo_id', $v->id)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->count();
}
$vehiculos = ['data'=>$data];
}
return response()->success($vehiculos);
}
public function reportes(CapacidadAprovechadaRequest $request){
$orderBy = $request->input('sortBy','servicios_enc.id');
$order = $request->input('order','asc');
$sucursal = $request->input('sucursal');
$fecha_inicio = $request->input('fecha_inicio');
$fecha_final = $request->input('fecha_final');
$vehiculo_id = $request->input('vehiculo_id');
$campos = [
'servicios_enc.id as numero_solicitud',
DB::raw("DATE(servicios_det.fecha_solicitud) as 'fecha_servicio'"),
DB::raw("TIME(servicios_det.fecha_solicitud) as 'hora_servicio'"),
'cat_servicios.nombre as servicio',
'servicios_det.costo_servicio as costo',
'cat_tipos_servicios.nombre as tipo_servicio',
'cat_estatus_servicios.nombre as estatus_servicio',
'clientes.denominacion as nombre_cliente',
'clientes_domicilios.calle as calle_cliente',
'clientes_domicilios.entre_calles as entre_calles_cliente',
'clientes_domicilios.num_ext as num_ext_cliente',
'clientes_domicilios.num_int as num_int_cliente',
'clientes_domicilios.colonia as colonia_cliente',
'clientes_domicilios.ciudad as ciudad_cliente',
'clientes_domicilios.cp as cp_cliente',
'asesor.nombre as nombre_asesor',
'asesor.apellido_paterno as apellido_paterno_asesor',
'asesor.apellido_materno as apellido_materno_asesor',
'auxiliar.nombre as nombre_auxiliar',
'auxiliar.apellido_paterno as apellido_paterno_auxiliar',
'auxiliar.apellido_materno as apellido_materno_auxiliar',
'servicios_progreso.duracion as duracion_servicio'
];
$queryBuilder = ServicioDet::select($campos)
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->join('cat_servicios', 'servicios_det.servicio_id', '=', 'cat_servicios.id')
->join('cat_tipos_servicios', 'servicios_det.tipo_servicio_id', '=', 'cat_tipos_servicios.id')
->join('cat_estatus_servicios','servicios_det.estatus_servicio_id','=','cat_estatus_servicios.id')
->join('clientes','servicios_enc.cliente_id','=','clientes.id')
->join('clientes_domicilios','servicios_enc.cliente_domicilio_id','=','clientes_domicilios.id')
->join('users as asesor', 'servicios_det.operador_id', '=', 'asesor.id')
->leftJoin('users as auxiliar', 'servicios_det.auxiliar_1', '=', 'auxiliar.id')
->leftJoin('servicios_progreso', 'servicios_det.id', '=', 'servicios_progreso.servicio_det_id')
->where('servicios_enc.sucursal_id', $sucursal)
->where('servicios_det.vehiculo_id', $vehiculo_id)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->orderBy($orderBy,$order);
if($query = $request->get('query',false)){
$queryBuilder->where(function($q) use ($query){
//$q->where('nombre','like','%' .$query.'%');
});
}
$total_servicios = $queryBuilder->count();
$total_costo = $queryBuilder->sum('servicios_det.costo_servicio');
$total_duracion = $this->sumarTiempos($queryBuilder->pluck('duracion_servicio'));
if($perPage = $request->input('perPage',false)){
$data = $queryBuilder->paginate($perPage)->toArray();
}else{
$data = ['data'=>$queryBuilder->get()];
}
$data['total_servicios'] = $total_servicios;
$data['total_costo'] = $total_costo;
list($h,$m,$s) = explode(':',$total_duracion);
$data['total_duracion'] = $h."hr ".$m."m ".$s."s";
return response()->success($data);
}
public function generarExcel(CapacidadAprovechadaRequest $request){
$sucursal = $request->input('sucursal');
$fecha_inicio = $request->input('fecha_inicio');
$fecha_final = $request->input('fecha_final');
$vehiculo_id = $request->input('vehiculo_id');
$campos = [
'servicios_enc.id as numero_solicitud',
DB::raw("DATE(servicios_det.fecha_solicitud) as 'fecha_servicio'"),
DB::raw("TIME(servicios_det.fecha_solicitud) as 'hora_servicio'"),
'cat_servicios.nombre as servicio',
'servicios_det.costo_servicio as costo',
'cat_tipos_servicios.nombre as tipo_servicio',
'cat_estatus_servicios.nombre as estatus_servicio',
'clientes.denominacion as nombre_cliente',
DB::raw("CONCAT(clientes_domicilios.calle,' ',clientes_domicilios.num_ext,' ', clientes_domicilios.colonia,' ',clientes_domicilios.cp,' ',clientes_domicilios.ciudad) as domicilio"),
DB::raw("CONCAT(asesor.nombre,' ',asesor.apellido_paterno,' ',asesor.apellido_materno) as asesor"),
DB::raw("CONCAT(auxiliar.nombre,' ',auxiliar.apellido_paterno,' ',auxiliar.apellido_materno) as auxiliar"),
'servicios_progreso.duracion as duracion_servicio'
];
$queryBuilder = ServicioDet::select($campos)
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->join('cat_servicios', 'servicios_det.servicio_id', '=', 'cat_servicios.id')
->join('cat_tipos_servicios', 'servicios_det.tipo_servicio_id', '=', 'cat_tipos_servicios.id')
->join('cat_estatus_servicios','servicios_det.estatus_servicio_id','=','cat_estatus_servicios.id')
->join('clientes','servicios_enc.cliente_id','=','clientes.id')
->join('clientes_domicilios','servicios_enc.cliente_domicilio_id','=','clientes_domicilios.id')
->join('users as asesor', 'servicios_det.operador_id', '=', 'asesor.id')
->leftJoin('users as auxiliar', 'servicios_det.auxiliar_1', '=', 'auxiliar.id')
->leftJoin('servicios_progreso', 'servicios_det.id', '=', 'servicios_progreso.servicio_det_id')
->where('servicios_enc.sucursal_id', $sucursal)
->where('servicios_det.vehiculo_id', $vehiculo_id)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->orderBy('servicios_enc.id','asc');
$servicios = $queryBuilder->get();
$total = $queryBuilder->count();
$total_costo = $queryBuilder->sum('servicios_det.costo_servicio');
$duracion = $this->sumarTiempos($queryBuilder->pluck('duracion_servicio'));
list($h,$m,$s) = explode(':',$duracion);
$total_duracion = $h."hr ".$m."m ".$s."s";
$vehiculo = Vehiculo::select('num_economico', 'cat_tipos_vehiculos.nombre as tipo_vehiculo')
->join('cat_tipos_vehiculos', 'cat_vehiculos.tipo_vehiculo_id', '=', 'cat_tipos_vehiculos.id')
->where('cat_vehiculos.id', $vehiculo_id)
->first();
$titulo = "Reporte Capacidad Aprovechada ".$vehiculo->num_economico."_".$vehiculo->tipo_vehiculo;
list($y_i, $m_i, $d_i) = explode("-", $fecha_inicio);
list($y_f, $m_f, $d_f) = explode("-", $fecha_final);
$f_i = $d_i."_".$m_i."_".$y_i;
$f_f = $d_f."_".$m_f."_".$y_f;
$nombre = "Reporte_Capacidad_Aprovechada_".$vehiculo->num_economico."_".$vehiculo->tipo_vehiculo."_".$f_i."-".$f_f;
foreach ($servicios as $s){
$s->costo = floatval($s->costo);
list($y, $m, $d) = explode("-", $s->fecha_servicio);
$s->fecha_servicio = "$d/$m/$y";
$s->numero_solicitud = (int)$s->numero_solicitud;
}
Excel::create($nombre, function($excel) use($servicios, $titulo, $fecha_inicio, $fecha_final, $total, $total_costo, $total_duracion){
// Set the title
$excel->setTitle('Reporte de Servicios de Cliente');
// Chain the setters
$excel->setCreator('DRENAX')
->setCompany('DRENAX');
// Call them separately
$excel->setDescription('Reporte de Servicios de Cliente');
$excel->sheet('Reporte_Capacidad_Aprovechada', function ($sheet) use($servicios, $titulo, $fecha_inicio, $fecha_final, $total, $total_costo, $total_duracion) {
$sheet->setColumnFormat(array(
'F' => '"$"#,##0.00_-',
'C' => 'd/m/y',
'L8' => '"$"#,##0.00_-'
));
//Mostrar logo
$sheet->mergeCells('B2:D6');
$objDrawing = new \PHPExcel_Worksheet_Drawing;
$objDrawing->setPath(resource_path('assets/images/logos').'/logo_drenax.png');
$objDrawing->setWidth(95);
$objDrawing->setHeight(80);
$objDrawing->setCoordinates('B2');
$objDrawing->setOffsetX(9);
$objDrawing->setOffsetY(9);
$objDrawing->setWorksheet($sheet);
$sheet->mergeCells('G2:J6');
$sheet->cell('G2', function($cell) use($titulo) {
$cell->setFontFamily('Aharoni');
$cell->setFontWeight('bold');
$cell->setAlignment('center');
$cell->setValignment('center');
$cell->setFontSize(20);
$cell->setValue($titulo);
});
$sheet->cell('H8', function($cell) use($fecha_inicio) {
list($y, $m, $d) = explode("-", $fecha_inicio);
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Del: '.$d.'/'.$m.'/'.$y);
});
$sheet->cell('I8', function($cell) use($fecha_final) {
list($y, $m, $d) = explode("-", $fecha_final);
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Al: '.$d.'/'.$m.'/'.$y);
});
$sheet->cell('K7', function($cell) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Total en Horas de servicio:');
});
$sheet->cell('K8', function($cell) use($total_duracion) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue($total_duracion);
});
$sheet->cell('L7', function($cell) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Total en Costos del servicio:');
});
$sheet->cell('L8', function($cell) use($total_costo) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue($total_costo);
});
$sheet->cell('M7', function($cell) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Total:');
});
$sheet->cell('M8', function($cell) use($total) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue($total.' Servicios');
});
//Mostar valores de consulta
$sheet->fromArray($servicios, null, 'B9', true);
//Formato en columnas de titulo
$sheet->cells('B9:M9', function ($cells) {
$cells->setBackground('#001870');
$cells->setFontColor('#ffffff');
$cells->setFontSize(13);
$cells->setFontFamily('Calibri');
$cells->setAlignment('left');
$cells->setFontWeight('bold');
});
$sheet->getStyle('B9:M9' , $sheet->getHighestRow())->getAlignment()->setWrapText(true);
//Titulos personalizados
$titulos_cell = [
['cell' => 'B9', 'titulo' => 'Número de solicitud'],
['cell' => 'C9', 'titulo' => 'Fecha del servicio'],
['cell' => 'D9', 'titulo' => 'Hora del servicio'],
['cell' => 'E9', 'titulo' => 'Servicio'],
['cell' => 'F9', 'titulo' => 'Costo de servicio'],
['cell' => 'G9', 'titulo' => 'Tipo de servicio'],
['cell' => 'H9', 'titulo' => 'Estatus de servicio'],
['cell' => 'I9', 'titulo' => 'Nombre del cliente'],
['cell' => 'J9', 'titulo' => 'Domicilio de servicio'],
['cell' => 'K9', 'titulo' => 'Asesor de operaciones'],
['cell' => 'L9', 'titulo' => 'Auxiliar de operaciones'],
['cell' => 'M9', 'titulo' => 'Duración del servicio (cronómetro)']
];
foreach ($titulos_cell as $t){
$sheet->cell($t['cell'], function($cell) use($t) {
$cell->setValue($t['titulo']);
});
}
//Size a columnas indicadas
$columns_set = [
'B9', 'C9', 'D9', 'M9'
];
foreach ($columns_set as $c){
$set_column = [
$c => [
'width' => ($c == 'M9')? 23: 14,
'height' => 40
]
];
$sheet->setSize($set_column);
}
//AutoSize en columnas indicadas
$columns_auto= [
'E','F','G','H','I','J','K', 'L'
];
foreach ($columns_auto as $c){
$sheet->getColumnDimension($c)->setAutoSize(true);
}
$sheet->setWidth(array(
'A' => 3,
));
//Borde
$columns_border= [
'B','C','D','E','F','G','H','I','J','K','L','M'
];
for ($i=0; $i<= $total; $i++){
$row = 9 + $i;
foreach ($columns_border as $cb){
$border = "$cb$row:$cb$row";
$sheet->cells($border, function ($cells) {
$cells->setBorder('thin', 'thin', 'thin', 'thin');
});
if($row != 9 && ($cb == 'C' || $cb == 'D' || $cb == 'F' || $cb == 'N')){
$sheet->cells("$cb$row", function ($cells) {
$cells->setAlignment('right');
});
}
}
}
});
})->store('xls', storage_path('app') . '/public/reportes/servicios_capacidad/');
return response()->success(['nombre_archivo' => $nombre.'.xls?micro='.$this->getMicroSeconds()]);
}
}

View File

@@ -0,0 +1,709 @@
<?php
namespace App\Http\Controllers\Reportes;
use const App\Http\Controllers\DOMESTICO;
use const App\Http\Controllers\EMPRESARIAL;
use App\Http\Requests\Reportes\EncuestasGeneralRequest;
use App\Models\PreguntaDomestico;
use App\Models\PreguntaEmpresarial;
use App\Models\RespuestaDomestico;
use App\Models\ServicioDet;
use App\Models\ServicioEnc;
use App\Models\ServicioEncuestaDomestico;
use App\Models\ServicioEncuestaEmpresarial;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB;
use Illuminate\Support\Arr;
use Log;
use Maatwebsite\Excel\Facades\Excel;
class EncuestasGeneralController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function resultado(EncuestasGeneralRequest $request) {
$year = $request->input('year');
$month = $request->input('mes',Carbon::now()->format('m'));
$operador_id = $request->input('operador_id', 0);
$sucursal = $request->input('sucursal');
$empresarial = $this->empresarial($month, $year, $operador_id, $sucursal);
$domestico = $this->domestico($month, $year, $operador_id, $sucursal);
return response()->success(compact('domestico', 'empresarial'));
}
public function domestico($month, $year, $operador_id, $sucursal) {
$servicios_det = ServicioDet::select('servicios_det.id')
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->whereMonth('servicios_det.fecha_solicitud', $month)
->whereYear('servicios_det.fecha_solicitud', $year)
->where('requiere_encuesta', 1)
->where('servicios_enc.sucursal_id', $sucursal)
->where('tipo_servicio_id', DOMESTICO);
if($operador_id){
$servicios_det->where(function($q) use ($operador_id){
$q->where('operador_id',$operador_id)
->orWhere('auxiliar_1',$operador_id)
->orWhere('auxiliar_2',$operador_id);
});
}
$id = $servicios_det->pluck('id');
$d = ServicioEncuestaDomestico::select('preguntas_domestico.nombre as pregunta', DB::raw('ROUND(AVG(coalesce(respuestas_domestico.puntuacion,0)), 2) as puntuacion'))
->join('respuestas_domestico', 'servicios_encuestas_domestico.respuesta_id', '=', 'respuestas_domestico.id')
->join('preguntas_domestico','servicios_encuestas_domestico.pregunta_id', '=','preguntas_domestico.id')
->whereIn('servicio_det_id', $id)
->whereNotNull('respuesta_id')
->groupBy('servicios_encuestas_domestico.pregunta_id', 'preguntas_domestico.nombre')
->get();
$salida = [];
foreach ($d as $e){
$salida[] = [$e->pregunta, (float)$e->puntuacion];
}
return $salida;
}
public function empresarial($month, $year, $operador_id, $sucursal){
$servicios_det = ServicioDet::select('servicios_det.id')
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->whereMonth('servicios_det.fecha_solicitud', $month)
->whereYear('servicios_det.fecha_solicitud', $year)
->where('requiere_encuesta', 1)
->where('servicios_enc.sucursal_id', $sucursal)
->where('tipo_servicio_id', EMPRESARIAL);
if($operador_id){
$servicios_det->where(function($q) use ($operador_id){
$q->where('operador_id',$operador_id)
->orWhere('auxiliar_1',$operador_id)
->orWhere('auxiliar_2',$operador_id);
});
}
$id = $servicios_det->pluck('id');
$e = ServicioEncuestaEmpresarial::select('preguntas_empresarial.nombre as pregunta', DB::raw('ROUND(AVG(coalesce(respuestas_empresarial.puntuacion,0)), 2) as puntuacion'))
->join('respuestas_empresarial', 'servicios_encuestas_empresarial.respuesta_id', '=', 'respuestas_empresarial.id')
->join('preguntas_empresarial','servicios_encuestas_empresarial.pregunta_id', '=','preguntas_empresarial.id')
->whereIn('servicio_det_id', $id)
->whereNotNull('respuesta_id')
->groupBy('servicios_encuestas_empresarial.pregunta_id', 'preguntas_empresarial.nombre')
->get();
$salida = [];
foreach ($e as $l){
$salida[] = [$l->pregunta, (float)$l->puntuacion];
}
return $salida;
}
public function generarExcel(EncuestasGeneralRequest $request) {
$year = $request->input('year');
$month = $request->input('mes',Carbon::now()->format('m'));
$operador_id = $request->input('operador_id', null);
$sucursal = $request->input('sucursal', 1);
/*$domestico = PreguntaDomestico::select('nombre')
->where('mostrar_numero', 1)
->get();
$preguntas_domestico = [];
foreach ($domestico as $l){
$preguntas_domestico[] = [$l->nombre];
}
$empresarial = PreguntaEmpresarial::select('nombre')
->where('mostrar_numero', 1)
->get();
$preguntas_empresarial = [];
foreach ($empresarial as $z){
$preguntas_empresarial[] = [$z->nombre];
}*/
// Se va a calcular el promedio para domestico
(int)$suma = 0;
(int)$contador= 0;
(double)$promedio_domestico = 0;
$domestico = $this->domesticoExcel($year, $month, $operador_id, $sucursal);
$dom = [];
foreach ($domestico as $domestic) {
$preg = [];
foreach($domestic->preguntas as $detalle) {
if($detalle->puntuacion){
$preg[] = $detalle->puntuacion;
$suma += $detalle->puntuacion;
$contador = $contador + 1;
}
}
$det = [$domestic->servicio_id, $domestic->fecha_solicitud, $domestic->cliente, $domestic->operador, $domestic->fecha_nacimiento, $domestic->correo];
$dom[] = array_merge($det, $preg);
}
if($contador){
(double)$promedio_domestico = $suma / $contador;
}
//Cálculo del promedio de empresarial
$empresarial = $this->empresarialExcel($year, $month, $operador_id, $sucursal);
(int)$suma_e = 0;
(int)$contador_e= 0;
(double)$promedio_empresarial = 0;
$empa = [];
foreach ($empresarial as $empresa) {
$preg = [];
foreach($empresa->preguntas as $detalle) {
if($detalle->puntuacion){
$preg[] = $detalle->puntuacion;
$suma_e += $detalle->puntuacion;
$contador_e = $contador_e + 1;
}
}
$det = [$empresa->servicio_id, $empresa->fecha_solicitud, $empresa->cliente, $empresa->operador, $empresa->fecha_nacimiento, $empresa->correo];
$empa[] = array_merge($det, $preg);
}
if($contador_e){
(double)$promedio_empresarial = $suma_e / $contador_e;
}
//Información que va necesitar el excel nombre y titulos
$total = $domestico->count();
//Transformar el número del mes por la información
$mes = '';
$meses = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
foreach ($meses as $key => $m){
if($key+1 == $month) {
$mes = $m;
}
}
if($operador_id){
$query = User::select(DB::raw("CONCAT(users.nombre,' ', users.apellido_paterno, ' ', users.apellido_materno) as operador"))
->where('id', $operador_id)
->first();
$operador_title = $query->operador;
}
$total_e = $empresarial->count();
$nombre = ($operador_id) ? "Reporte_encuestas_domestico_empresarial".'_'.$mes.'_'.$year.'_detalle'.'_'. str_replace(' ', '_', $operador_title) : "Reporte_encuestas_domestico_empresarial".'_'.$mes.'_'.$year.'_'.$operador_title;
$titulo_domestico = ($operador_id) ? "Reporte encuestas doméstico".' '.$operador_title : "Reporte encuestas doméstico general";
$titulo_empresarial = ($operador_id) ? "Reporte encuestas empresarial".' '.$operador_title : "Reporte encuestas empresarial general";
//Generación del excel
Excel::create($nombre, function ($excel) use($dom, $total, $titulo_domestico, $promedio_domestico, $promedio_empresarial, $titulo_empresarial, $empa, $total_e, $sucursal, $mes, $year) {
// Set del título del documento
$excel->setTitle('Reporte de Encuestas');
// Seters de la campañía
$excel->setCreator('DRENAX')
->setCompany('DRENAX');
// Creación de la descripción
$excel->setDescription('Reporte de Encuesta en servicios');
$excel->sheet('Reporte_encuestas_domestico', function ($sheet) use($dom, $titulo_domestico, $total, $promedio_domestico, $sucursal, $mes, $year){
$sheet->mergeCells('B2:D6');
//Mostrar el logo
$objDrawing = new \PHPExcel_Worksheet_Drawing;
$objDrawing->setPath(resource_path('assets/images/logos').'/logo_drenax.png');
$objDrawing->setWidth(95);
$objDrawing->setHeight(80);
$objDrawing->setCoordinates('B2');
$objDrawing->setOffsetX(9);
$objDrawing->setOffsetY(9);
$objDrawing->setWorksheet($sheet);
//Mostrar el título de la hoja de excel
$sheet->mergeCells('G2:J6');
$sheet->cell('G2', function($cell) use($titulo_domestico) {
$cell->setFontFamily('Aharoni');
$cell->setFontWeight('bold');
$cell->setAlignment('center');
$cell->setValignment('center');
$cell->setFontSize(20);
$cell->setValue($titulo_domestico);
});
//Información entre el encabezado y la información
$sheet->cell('N7', function($cell) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Fecha');
});
$sheet->cell('N8', function($cell) use($mes, $year) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue($mes.' '.$year);
});
$sheet->cell('O7', function($cell) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Promedio General:');
});
$sheet->cell('O8', function($cell) use($promedio_domestico) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue($promedio_domestico.'%');
});
// Mostar valores de consulta
$sheet->fromArray($dom, null, 'B9', true);
//Formato en columnas de titulo
$sheet->cells('B9:O9', function ($cells) {
$cells->setBackground('#001870');
$cells->setFontColor('#ffffff');
$cells->setFontSize(13);
$cells->setFontFamily('Calibri');
$cells->setAlignment('left');
$cells->setFontWeight('bold');
});
// Asignar el listado
$sheet->getStyle('B9:O9' , $sheet->getHighestRow())->getAlignment()->setWrapText(true);
//Titulos personalizados
$titulos_cell = [
['cell' => 'B9', 'titulo' => 'Número de servicio'],
['cell' => 'C9', 'titulo' => 'Fecha de solicitud'],
['cell' => 'D9', 'titulo' => 'Cliente'],
['cell' => 'E9', 'titulo' => 'Asesor asignado'],
['cell' => 'F9', 'titulo' => 'Fecha de nacimiento'],
['cell' => 'G9', 'titulo' => 'Correo'],
['cell' => 'H9', 'titulo' => '¿El personal se presentó y mostró la orden de trabajo previo a la realización de su servicio?'],
['cell' => 'I9', 'titulo' => '¿Cómo califica la puntualidad de nuestro personal?'],
['cell' => 'J9', 'titulo' => '¿Cómo califica la imagen de nuestro personal?'],
['cell' => 'K9', 'titulo' => '¿El asesor usó los instrumentos de seguridad e higiene para la correcta ejecución del servicio?'],
['cell' => 'L9', 'titulo' => '¿Cómo califica la atención y asesoría brindada por los asesores?'],
['cell' => 'M9', 'titulo' => '¿El servicio fue efectivo quedando conforme con lo que contrató?'],
['cell' => 'N9', 'titulo' => '¿Cómo califica la atención y asesoría telefonica?'],
['cell' => 'O9', 'titulo' => 'De acuerdo al servicio recibido, ¿usted nos recomendaría?']
];
// Obtener los títulos de la tabla
foreach ($titulos_cell as $t){
$sheet->cell($t['cell'], function($cell) use($t) {
$cell->setValue($t['titulo']);
});
}
//Darle un tamaño a las celdas
$columns_set = [
'B9', 'C9', 'D9', 'K9', 'L9'
];
foreach ($columns_set as $c){
$set_column = [
$c => [
'width' => ($c == 'D9' || $c == 'G9')? 25: 16,
'height' => 40
]
];
$sheet->setSize($set_column);
}
$question_set = [
'H9', 'I9', 'J9', 'K9', 'L9', 'M9', 'N9', 'O9'
];
foreach ($question_set as $q){
$question = [
$q => [
'width' => 35,
'height' => 50
]
];
$sheet->setSize($question);
}
//Tamaño automático en columnas indicadas
$columns_auto= [
'E','F','G'
];
foreach ($columns_auto as $c){
$sheet->getColumnDimension($c)->setAutoSize(true);
}
$sheet->setWidth(array(
'A' => 3,
));
//Borde
$columns_border= [
'B','C','D','E','F','G','H','I','J','K','L', 'M', 'N', 'O'
];
for ($i=0; $i<= $total; $i++){
$row = 9 + $i;
foreach ($columns_border as $cb){
$border = "$cb$row:$cb$row";
$sheet->cells($border, function ($cells) {
$cells->setBorder('thin', 'thin', 'thin', 'thin');
});
if($row != 9 && ($cb == 'C' || $cb == 'F' || $cb == 'L')){
$sheet->cells("$cb$row", function ($cells) {
$cells->setAlignment('right');
});
}
}
}
});
$excel->sheet('Reporte_encuestas_empresarial', function ($sheet) use($promedio_domestico, $sucursal, $mes, $year, $titulo_empresarial, $promedio_empresarial, $empa, $total_e){
$sheet->mergeCells('B2:D6');
//Mostrar el logo
$objDrawing = new \PHPExcel_Worksheet_Drawing;
$objDrawing->setPath(resource_path('assets/images/logos').'/logo_drenax.png');
$objDrawing->setWidth(95);
$objDrawing->setHeight(80);
$objDrawing->setCoordinates('B2');
$objDrawing->setOffsetX(9);
$objDrawing->setOffsetY(9);
$objDrawing->setWorksheet($sheet);
//Mostrar el título de la hoja de excel
$sheet->mergeCells('G2:J6');
$sheet->cell('G2', function($cell) use($titulo_empresarial) {
$cell->setFontFamily('Aharoni');
$cell->setFontWeight('bold');
$cell->setAlignment('center');
$cell->setValignment('center');
$cell->setFontSize(20);
$cell->setValue($titulo_empresarial);
});
//Información entre el encabezado y la información
$sheet->cell('P7', function($cell) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Fecha');
});
$sheet->cell('P8', function($cell) use($mes, $year) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue($mes.' '.$year);
});
$sheet->cell('Q7', function($cell) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Promedio General:');
});
$sheet->cell('Q8', function($cell) use($promedio_empresarial) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue($promedio_empresarial.'%');
});
// Mostar valores de consulta
$sheet->fromArray($empa, null, 'B9', true);
//Formato en columnas de titulo
$sheet->cells('B9:Q9', function ($cells) {
$cells->setBackground('#001870');
$cells->setFontColor('#ffffff');
$cells->setFontSize(13);
$cells->setFontFamily('Calibri');
$cells->setAlignment('left');
$cells->setFontWeight('bold');
});
$sheet->getStyle('B9:Q9' , $sheet->getHighestRow())->getAlignment()->setWrapText(true);
//Titulos personalizados
$titulos_cell = [
['cell' => 'B9', 'titulo' => 'Número de servicio'],
['cell' => 'C9', 'titulo' => 'Fecha de solicitud'],
['cell' => 'D9', 'titulo' => 'Cliente'],
['cell' => 'E9', 'titulo' => 'Asesor asignado'],
['cell' => 'F9', 'titulo' => 'Fecha de nacimiento'],
['cell' => 'G9', 'titulo' => 'Correo'],
['cell' => 'H9', 'titulo' => '¿Su servicio fue programado en tiempo y forma?'],
['cell' => 'I9', 'titulo' => '¿El asesor de operaciones realiza recibo de servicio, y es llenado correctamente hora de inicio y hora final?'],
['cell' => 'J9', 'titulo' => '¿Cómo califica la imagen del personal?'],
['cell' => 'K9', 'titulo' => '¿El asesor usó los instrumentos de seguridad e higiene para la correcta ejecución del servicio?'],
['cell' => 'L9', 'titulo' => '¿Cómo califica la atención y asesoría brindada por los asesores de operaciones?'],
['cell' => 'M9', 'titulo' => '¿Cómo califica la calidad del servicio contratado?'],
['cell' => 'N9', 'titulo' => '¿Cómo califica la atención y asesoría telefonica?'],
['cell' => 'O9', 'titulo' => '¿Recibió su factura del mes en tiempo y forma?'],
['cell' => 'P9', 'titulo' => '¿Cómo califica nuestra área de cobranza?'],
['cell' => 'Q9', 'titulo' => '¿Cómo califica en general a la empresa DRENAX?']
];
// Obtener los títulos de la tabla
foreach ($titulos_cell as $t){
$sheet->cell($t['cell'], function($cell) use($t) {
$cell->setValue($t['titulo']);
});
}
//Darle un tamaño a las celdas
$columns_set = [
'B9', 'C9', 'D9', 'K9', 'L9'
];
foreach ($columns_set as $c){
$set_column = [
$c => [
'width' => ($c == 'D9' || $c == 'G9')? 25: 16,
'height' => 40
]
];
$sheet->setSize($set_column);
}
$question_set = [
'H9', 'I9', 'J9', 'K9', 'L9', 'M9', 'N9', 'O9', 'P9', 'Q9'
];
foreach ($question_set as $q){
$question = [
$q => [
'width' => 35,
'height' => 50
]
];
$sheet->setSize($question);
}
//Tamaño automático en columnas indicadas
$columns_auto= [
'E','F','G'
];
foreach ($columns_auto as $c){
$sheet->getColumnDimension($c)->setAutoSize(true);
}
$sheet->setWidth(array(
'A' => 3,
));
//Borde
$columns_border= [
'B','C','D','E','F','G','H','I','J','K','L', 'M', 'N', 'O', 'P', 'Q'
];
for ($i=0; $i<= $total_e; $i++){
$row = 9 + $i;
foreach ($columns_border as $cb){
$border = "$cb$row:$cb$row";
$sheet->cells($border, function ($cells) {
$cells->setBorder('thin', 'thin', 'thin', 'thin');
});
if($row != 9 && ($cb == 'C' || $cb == 'F' || $cb == 'L')){
$sheet->cells("$cb$row", function ($cells) {
$cells->setAlignment('right');
});
}
}
}
});
// Hoja de excel por defecto
$excel->setActiveSheetIndex(0);
})->store('xls', storage_path('app') . '/public/reportes/servicios_encuestas/');
return response()->success(['nombre_archivo' => $nombre.'.xls?micro='.$this->getMicroSeconds()]);
}
public function domesticoExcel($year, $month, $operador_id, $sucursal){
// Campos que se necesitan para mostrar en el reporte de excel
$campos = [
'servicios_det.id as servicio_id',
DB::raw("DATE(servicios_det.fecha_solicitud) as 'fecha_solicitud'"),
'clientes.denominacion as cliente',
DB::raw("CONCAT(users.nombre,' ', users.apellido_paterno, ' ', users.apellido_materno) as operador")];
//Consulta pra trae y filtrar la información para mostrar
$servicios_det = ServicioDet::select($campos)
->join('users', 'servicios_det.operador_id', '=', 'users.id')
->join('servicios_enc', 'servicio_enc_id', '=', 'servicios_enc.id')
->join('clientes', 'servicios_enc.cliente_id', '=', 'clientes.id')
->whereMonth('servicios_det.fecha_solicitud', $month)
->whereYear('servicios_det.fecha_solicitud', $year)
->where('requiere_encuesta', 1)
->where('tipo_servicio_id', DOMESTICO)
->where('users.sucursal_id', $sucursal)
->orderBy('users.tipo_empleado_id', 'asc')
->orderBy('servicios_det.id', 'asc')
->orderBy('operador', 'asc');
// Validamos si está filtrado por asesor o bien auxiliar de operación
if($operador_id){
$servicios_det->where(function($q) use ($operador_id){
$q->where('operador_id',$operador_id)
->orWhere('auxiliar_1',$operador_id)
->orWhere('auxiliar_2',$operador_id);
});
}
// Obtenemos los datos antes que se va a realizar la próxima consulta
$servicios = $servicios_det->get();
foreach($servicios as $servicio){
// Esta consulta es para traer la cantidad de preguntas que vamos a mostrar en el excel
$servicio->preguntas = ServicioEncuestaDomestico::select('respuestas_domestico.puntuacion as puntuacion')
->join('respuestas_domestico', 'respuesta_id','=','respuestas_domestico.id')
->where('servicio_det_id', $servicio->servicio_id)
->get();
// obtenemos la fecha de nacimiento del cliente en caso de haberla mandado
$fecha = ServicioEncuestaDomestico::select('respuesta')
->where('servicio_det_id', $servicio->servicio_id)
->where('pregunta_id', 11)
->first();
$servicio->fecha_nacimiento = ($fecha)? $fecha->respuesta : null;
//Obtenemos el correo del cliente en caso dde haberla aceptado
$correo = ServicioEncuestaDomestico::select('respuesta')
->where('servicio_det_id', $servicio->servicio_id)
->where('pregunta_id', 10)
->first();
$servicio->correo = ($correo)? $correo->respuesta : null;
}
return $servicios;
}
// Esta funcion es para traer los datos que necesitamos para la hoja de servicios empresariales
public function empresarialExcel($year, $month, $operador_id, $sucursal){
$campos = [
'servicios_det.id as servicio_id',
DB::raw("DATE(servicios_det.fecha_solicitud) as 'fecha_solicitud'"),
'clientes.denominacion as cliente',
DB::raw("CONCAT(users.nombre,' ', users.apellido_paterno, ' ', users.apellido_materno) as operador")];
$servicios_det = ServicioDet::select($campos)
->join('users', 'servicios_det.operador_id', '=', 'users.id')
->join('servicios_enc', 'servicio_enc_id', '=', 'servicios_enc.id')
->join('clientes', 'servicios_enc.cliente_id', '=', 'clientes.id')
->whereMonth('servicios_det.fecha_solicitud', $month)
->whereYear('servicios_det.fecha_solicitud', $year)
->where('requiere_encuesta', 1)
->where('tipo_servicio_id', EMPRESARIAL)
->where('users.sucursal_id', $sucursal)
->orderBy('users.tipo_empleado_id', 'asc')
->orderBy('servicios_det.id', 'asc')
->orderBy('operador', 'asc');
if($operador_id){
$servicios_det->where(function($q) use ($operador_id){
$q->where('operador_id',$operador_id)
->orWhere('auxiliar_1',$operador_id)
->orWhere('auxiliar_2',$operador_id);
});
}
$servicios_emp = $servicios_det->get();
foreach($servicios_emp as $servicio_emp){
$servicio_emp->preguntas = ServicioEncuestaEmpresarial::select('respuestas_empresarial.puntuacion as puntuacion')
->join('respuestas_empresarial', 'respuesta_id','=','respuestas_empresarial.id')
->where('servicio_det_id', $servicio_emp->servicio_id)
->get();
$fecha = ServicioEncuestaEmpresarial::select('respuesta')
->where('servicio_det_id', $servicio_emp->servicio_id)
->where('pregunta_id', 11)
->first();
$servicio_emp->fecha_nacimiento = ($fecha)? $fecha->respuesta : null;
$correo = ServicioEncuestaEmpresarial::select('respuesta')
->where('servicio_det_id', $servicio_emp->servicio_id)
->where('pregunta_id', 10)
->first();
$servicio_emp->correo = ($correo)? $correo->respuesta : null;
}
return $servicios_emp;
}
}

View File

@@ -0,0 +1,261 @@
<?php
namespace App\Http\Controllers\Reportes;
use const App\Http\Controllers\ASESOR_OPERACIONES;
use const App\Http\Controllers\AUXILIAR_TECNICO_1;
use const App\Http\Controllers\AUXILIAR_TECNICO_2;
use App\Http\Requests\Reportes\FiltroAsesoresRequest;
use App\Models\CatEstatuServicio;
use App\Models\CatOrigen;
use App\Models\CatServicio;
use App\Models\CatTipoServicio;
use App\Models\ServicioDet;
use App\Models\ServicioEncuestaDomestico;
use App\Models\ServicioEncuestaEmpresarial;
use App\Models\Sucursal;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Auth;
use Log;
class FiltrosController extends Controller
{
public function sucursales(Request $request){
$deleted = $request->input('deleted');
$orderBy = $request->input('sortBy','nombre');
$order = $request->input('order','asc');
$queryBuilder = Sucursal::orderBy($orderBy,$order);
if($query = $request->get('query',false)){
$queryBuilder->where(function($q) use ($query){
$q->where('nombre','like','%' .$query.'%');
});
}
if($deleted) {
$queryBuilder->onlyTrashed();
}
if($perPage = $request->input('perPage',false)){
$sucursal = $queryBuilder->paginate($perPage);
}else{
$sucursal = ['data'=>$queryBuilder->get()];
}
return response()->success($sucursal);
}
public function servicios(Request $request)
{
$deleted = $request->input('deleted');
$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($deleted) {
$queryBuilder->onlyTrashed();
}
if($perPage = $request->input('perPage',false)){
$servicios = $queryBuilder->paginate($perPage);
}else{
$servicios = ['data'=>$queryBuilder->get()];
}
return response()->success($servicios);
}
public function tiposServicio(Request $request)
{
$deleted = $request->input('deleted');
$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($deleted) {
$queryBuilder->onlyTrashed();
}
if($perPage = $request->input('perPage',false)){
$tipos_servicios = $queryBuilder->paginate($perPage);
}else{
$tipos_servicios = ['data'=>$queryBuilder->get()];
}
return response()->success($tipos_servicios);
}
public function estatusServicio(Request $request)
{
$deleted = $request->input('deleted');
$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($deleted) {
$queryBuilder->onlyTrashed();
}
if($perPage = $request->input('perPage',false)){
$estatus = $queryBuilder->paginate($perPage);
}else{
$estatus = ['data'=>$queryBuilder->get()];
}
return response()->success($estatus);
}
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 asesores(FiltroAsesoresRequest $request) {
$sucursal = $request->input('sucursal');
$orderBy = $request->input('sortBy','tipo_empleado_id');
$order = $request->input('order','asc');
$month = $request->input('mes');
$year = $request->input('year');
$queryBuilder = User::select('id', 'nombre', 'apellido_paterno', 'apellido_materno', 'tipo_empleado_id')
->where('sucursal_id', $sucursal)
->whereIn('tipo_empleado_id', [ASESOR_OPERACIONES, AUXILIAR_TECNICO_1, AUXILIAR_TECNICO_2])
->orderBy($orderBy, $order)
->orderBy('nombre','asc');
if($query = $request->get('query',false)){
$queryBuilder->where(function($q) use ($query){
$q->where('nombre','like','%' .$query.'%')
->orWhere('apellido_paterno','like','%' .$query.'%')
->orWhere('apellido_materno','like','%' .$query.'%');
});
}
if($perPage = $request->input('perPage',false)){
$data = $queryBuilder->paginate($perPage);
foreach ($data->items() as $u){
if($u->tipo_empleado_id == ASESOR_OPERACIONES){
$u->tipo_empleado = 'Asesor de Operaciones';
$servi = ServicioDet::select('id')
->where('servicios_det.operador_id', $u->id)
->whereMonth('fecha_solicitud', $month)
->whereYear('fecha_solicitud', $year)
->where('requiere_encuesta', 1)->pluck('id');
$encuesta_d = ServicioEncuestaDomestico::select('servicio_det_id')->whereIn('servicio_det_id',$servi)->groupBy('servicio_det_id')->get();
$encuesta_e = ServicioEncuestaEmpresarial::select('servicio_det_id')->whereIn('servicio_det_id',$servi)->groupBy('servicio_det_id')->get();
$total = count($encuesta_d) + count($encuesta_e);
$u->servicios_cantidad = $total.' Encuestas '.' de '.count($servi).' Servicios';
/*$u->servicios_cantidad = ServicioDet::where('servicios_det.operador_id', $u->id)
->whereMonth('fecha_solicitud', $month)
->whereYear('fecha_solicitud', $year)
->where('requiere_encuesta', 1)->count();*/
}
if($u->tipo_empleado_id == AUXILIAR_TECNICO_1 || $u->tipo_empleado_id == AUXILIAR_TECNICO_2){
$u->tipo_empleado = 'Auxiliar de Operaciones';
$servi = ServicioDet::select('id')
->whereMonth('fecha_solicitud', $month)
->whereYear('fecha_solicitud', $year)
->where(function($q) use ($u){
$q->where('servicios_det.auxiliar_1', $u->id)
->orWhere('servicios_det.auxiliar_2', $u->id);
})->pluck('id');
$encuesta_d = ServicioEncuestaDomestico::select('servicio_det_id')->whereIn('servicio_det_id',$servi)->groupBy('servicio_det_id')->get();
$encuesta_e = ServicioEncuestaEmpresarial::select('servicio_det_id')->whereIn('servicio_det_id',$servi)->groupBy('servicio_det_id')->get();
$total = count($encuesta_d) + count($encuesta_e);
$u->servicios_cantidad = $total.' Encuestas '. ' de '. count($servi).' Servicios';
}
}
$users = $data;
} else{
$data = $queryBuilder->get();
foreach ($data as $u){
if($u->tipo_empleado_id == ASESOR_OPERACIONES){
$u->tipo_empleado = 'Asesor de Operaciones';
$u->servicios_cantidad = ServicioDet::where('operador_id', $u->id)
->where('requiere_encuesta', 1)
->whereMonth('fecha_solicitud', $month)
->whereYear('fecha_solicitud', $year)
->count();
}
if($u->tipo_empleado_id == AUXILIAR_TECNICO_1 || $u->tipo_empleado_id == AUXILIAR_TECNICO_2){
$u->tipo_empleado = 'Auxiliar de Operaciones';
$u->servicios_cantidad = ServicioDet::whereMonth('fecha_solicitud', $month)
->whereYear('fecha_solicitud', $year)
->where(function($q) use ($u){
$q->where('servicios_det.auxiliar_1', $u->id)
->orWhere('servicios_det.auxiliar_2', $u->id);
})
->count();
}
}
$users = ['data'=>collect($data)->where('servicios_cantidad','<>',0)->values()];
}
return response()->success($users);
}
}

View File

@@ -0,0 +1,285 @@
<?php
namespace App\Http\Controllers\Reportes;
use const App\Http\Controllers\ASESOR_OPERACIONES;
use const App\Http\Controllers\ATENCION_CLIENTES;
use App\Models\TipoVehiculo;
use App\Models\CatEstatuServicio;
use App\Models\ServicioDet;
use App\Models\ServicioEnc;
use App\Models\User;
use Carbon\Carbon;
use App\Http\Controllers\Controller;
use DB;
use Log;
class MensualController extends Controller{
function getWeek($date){
$date = new \DateTime($date);
$week = $date->format("W");
return $week;
}
public function reportes(){
$mes_actual = Carbon::now()->format('m');
$currentWeek = $this->getWeek(date("Y-m-d"));
$firstDateOfMonth = date("Y").'-'.date("m").'-01';
$firstWeek = $this->getWeek($firstDateOfMonth);
$lastDateOfMonth = date("Y-m-t", strtotime($firstDateOfMonth));
$lastWeek = $this->getWeek($lastDateOfMonth);
$servicios_nombre_precios = $this->serviciosNombresPrecios($mes_actual);
$tipos_servicios = $this->tiposServicios($mes_actual);
$tipos_estados_servicio = $this->tipoEstadoServicio($mes_actual);
$tipos_origen = $this->tiposOrigen($mes_actual);
$atencion_cliente = $this->atencionCliente($mes_actual);
$operadores = $this->operadores($mes_actual);
$servicios_vehiculos_precios = $this->serviciosVehiculosPrecios($mes_actual);
$capacidad_aprovechada = $this->capacidadAprovechada($mes_actual, $firstWeek, $lastWeek);
return response()->success(compact('servicios_nombre_precios','tipos_servicios', 'tipos_estados_servicio', 'tipos_origen', 'atencion_cliente', 'operadores', 'servicios_vehiculos_precios', 'capacidad_aprovechada'));
}
public function serviciosNombresPrecios($mes_actual){
$servicios = ServicioDet::select('cat_servicios.nombre as name', DB::raw("SUM(servicios_det.costo_servicio) AS costo, count(servicios_det.servicio_id) as y"))
->join('cat_servicios', 'servicios_det.servicio_id', '=', 'cat_servicios.id')
->whereMonth('servicios_det.fecha_solicitud', $mes_actual)
->groupBy('cat_servicios.nombre')
->get();
$total_costo = (string)number_format(collect($servicios)->sum('costo'),2);
return compact('servicios', 'total_costo');
}
public function tiposServicios($mes_actual){
$sevicios = ServicioDet::select('cat_tipos_servicios.nombre as name', DB::raw("count(servicios_det.tipo_servicio_id) as y"))
->join('cat_tipos_servicios', 'servicios_det.tipo_servicio_id', '=', 'cat_tipos_servicios.id')
->whereMonth('servicios_det.fecha_solicitud', $mes_actual)
->groupBy('cat_tipos_servicios.nombre')
->get();
return $sevicios;
}
public function tipoEstadoServicio($mes_actual){
$sevicios = ServicioDet::select('cat_estatus_servicios.nombre as name', DB::raw("count(servicios_det.estatus_servicio_id) as y"))
->join('cat_estatus_servicios', 'servicios_det.estatus_servicio_id', '=', 'cat_estatus_servicios.id')
->whereMonth('servicios_det.fecha_solicitud', $mes_actual)
->groupBy('cat_estatus_servicios.nombre')
->get();
return $sevicios;
}
public function tiposOrigen($mes_actual){
$sevicios = ServicioEnc::select('cat_origenes.nombre as name', DB::raw("count(servicios_enc.origen_id) as y"))
->join('servicios_det', 'servicios_enc.id', '=', 'servicios_det.servicio_enc_id')
->join('cat_origenes', 'servicios_enc.origen_id', '=', 'cat_origenes.id')
->whereMonth('servicios_det.fecha_solicitud', $mes_actual)
->groupBy('cat_origenes.nombre')
->get();
return $sevicios;
}
public function atencionCliente($mes_actual){
$usuarios_series = [];
$estatus_series = [];
$estatus_servicio = CatEstatuServicio::get();
foreach ($estatus_servicio as $e){
$usuarios_series = [];
$valores_estatus = [];
$atencion_cliente = User::select('id', DB::raw("CONCAT(nombre, ' ',apellido_paterno) as nombre_atencion"))
->where('tipo_empleado_id', ATENCION_CLIENTES)
->get();
foreach ($atencion_cliente as $aC){
$total = ServicioEnc::join('servicios_det', 'servicios_enc.id', '=', 'servicios_det.servicio_enc_id')
->join('cat_estatus_servicios', 'servicios_det.estatus_servicio_id', '=', 'cat_estatus_servicios.id')
->where('servicios_enc.usuario_agenda_id',$aC->id)
->whereMonth('servicios_det.fecha_solicitud', $mes_actual);
$total_general = ($total->count() == 1)? " (".$total->count()." servicio)" : " (".$total->count()." servicios)";
$nombre = $aC->nombre_atencion.$total_general;
array_push($usuarios_series, $nombre);
$total_estatus = $total->where('servicios_det.estatus_servicio_id', $e->id)->count();
array_push($valores_estatus, $total_estatus);
}
$estatus_series[$e->nombre] = $valores_estatus;
}
$datos = [];
foreach ($estatus_series as $key => $e){
array_push($datos, ["name"=>$key, "data"=>$e]);
}
$result = ["usuarios"=>$usuarios_series, "datos"=>$datos];
return $result;
}
public function operadores($mes_actual){
$usuarios_series = [];
$estatus_series = [];
$estatus_servicio = CatEstatuServicio::get();
foreach ($estatus_servicio as $e){
$usuarios_series = [];
$valores_estatus = [];
$operadores = User::select('id', DB::raw("CONCAT(nombre, ' ',apellido_paterno) as nombre_atencion"))
->where('tipo_empleado_id', ASESOR_OPERACIONES)
->get();
foreach ($operadores as $o){
$total = ServicioDet::join('cat_estatus_servicios', 'servicios_det.estatus_servicio_id', '=', 'cat_estatus_servicios.id')
->where('servicios_det.operador_id',$o->id)
->whereMonth('servicios_det.fecha_solicitud', $mes_actual);
$total_general = ($total->count() == 1)? " (".$total->count()." servicio)" : " (".$total->count()." servicios)";
$nombre = $o->nombre_atencion.$total_general;
array_push($usuarios_series, $nombre);
$total_estatus = $total->where('servicios_det.estatus_servicio_id', $e->id)->count();
array_push($valores_estatus, $total_estatus);
}
$estatus_series[$e->nombre] = $valores_estatus;
}
$datos = [];
foreach ($estatus_series as $key => $e){
array_push($datos, ["name"=>$key, "data"=>$e]);
}
$result = ["usuarios"=>$usuarios_series, "datos"=>$datos];
return $result;
}
public function serviciosVehiculosPrecios($mes_actual){
$servicios = ServicioDet::select('cat_vehiculos.num_economico as name', DB::raw("SUM(servicios_det.costo_servicio) AS costo, count(servicios_det.servicio_id) as y"))
->join('cat_vehiculos', 'servicios_det.vehiculo_id', '=', 'cat_vehiculos.id')
->whereMonth('servicios_det.fecha_solicitud', $mes_actual)
->groupBy('cat_vehiculos.num_economico')
->get();
return $servicios;
}
public function capacidadAprovechada($mes_actual, $firstWeek, $lastWeek){
$respuesta = [];
$index = 0;
$tipos_vehiculo = TipoVehiculo::select(['id', 'nombre'])->orderBy('nombre')->get();
foreach ($tipos_vehiculo as $t){
$tmpId = $t->id;
$tmpNombre = $t->nombre;
$campos = [
'cat_vehiculos.tipo_vehiculo_id',
'cat_tipos_vehiculos.nombre AS tipo_vehiculo',
'cat_tipos_vehiculos.objetivo_mensual',
DB::raw("SEC_TO_TIME(SUM(TIME_TO_SEC(servicios_progreso.duracion))) AS 'total_duracion'"),
DB::raw("TRUNCATE(SUM((TIME_TO_SEC(TIME(servicios_progreso.duracion))/60)/60), 3) AS 'total_duracion_fracc'")
];
$objetivoSemanal = 0;
$objetivoMensual = 0;
$totalWeeks = 0;
$sumatoriaPorcentajes = 0.0;
$informacion = [];
for($i=$firstWeek;$i<=$lastWeek;$i++){
// execute this week
$datos = ServicioDet::select($campos)
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->join('cat_servicios', 'servicios_det.servicio_id', '=', 'cat_servicios.id')
->join('cat_tipos_servicios', 'servicios_det.tipo_servicio_id', '=', 'cat_tipos_servicios.id')
->join('cat_estatus_servicios','servicios_det.estatus_servicio_id','=','cat_estatus_servicios.id')
->join('cat_vehiculos', 'servicios_det.vehiculo_id', '=', 'cat_vehiculos.id')
->join('cat_tipos_vehiculos', 'cat_tipos_vehiculos.id', '=', 'cat_vehiculos.tipo_vehiculo_id')
->leftJoin('servicios_progreso', 'servicios_det.id', '=', 'servicios_progreso.servicio_det_id')
->join('cat_origenes', 'servicios_enc.origen_id', '=', 'cat_origenes.id')
->where('cat_vehiculos.tipo_vehiculo_id', $tmpId)
//->whereMonth('servicios_det.fecha_solicitud', $mes_actual)
->whereRaw("WEEKOFYEAR(DATE(servicios_det.fecha_solicitud))=?", $i)
->groupBy('cat_vehiculos.tipo_vehiculo_id', 'cat_tipos_vehiculos.nombre', 'cat_tipos_vehiculos.objetivo_mensual')
->first();
if($datos){
$sumatoriaPorcentajes = floatval($sumatoriaPorcentajes) + floatval($datos->total_duracion_fracc);
$objetivoMensual = $datos->objetivo_mensual;
array_push($informacion, [
'week_num'=>$i,
'total_duracion'=>$datos->total_duracion,
'total_duracion_fracc'=>$datos->total_duracion_fracc,
]);
}else{
array_push($informacion, [
'week_num'=>$i,
'total_duracion'=>null,
'total_duracion_fracc'=>null
]);
}
$totalWeeks++;
}
$respuesta[$index]['tipo_vehiculo_id'] = $tmpId;
$respuesta[$index]['tipo_vehiculo'] = $tmpNombre;
$respuesta[$index]['objetivo_mensual'] = $objetivoMensual;
$respuesta[$index]['objetivo_semanal'] = ($totalWeeks == 0) ? 0 : $objetivoMensual/($totalWeeks);
$respuesta[$index]['semanas'] = $totalWeeks;
$respuesta[$index]['total_cumplimiento'] = $sumatoriaPorcentajes;
$respuesta[$index]['datos'] = $informacion;
$index++;
}
return $respuesta;
}
function obtener_semana($date) {
$date2 = strtotime($date);
$inicio0 = strtotime('sunday this week -1 week', $date2);
$inicio=date('Y-m-d', $inicio0);
$dias = array();
for($i=1;$i<=7;$i++){
$dia = date("Y-m-d", strtotime("$inicio +$i day"));
array_push($dias,$dia);
}
return $dias;
}
}

View File

@@ -0,0 +1,408 @@
<?php
namespace App\Http\Controllers\Reportes;
use const App\Http\Controllers\ATENCION_CLIENTES;
use const App\Http\Controllers\DEFINIO_ATENCION_CLIENTE;
use const App\Http\Controllers\DEFINIO_CLIENTE;
use App\Http\Requests\Reportes\ConsultarAtencionClientesRequest;
use App\Http\Requests\Reportes\ProductividadAtencionClientesRequest;
use App\Models\ServicioDet;
use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB;
use Excel;
class ProductividadAtencionClientesController extends Controller
{
public function consultarAtencionClientes(ConsultarAtencionClientesRequest $request){
$sucursal = $request->input('sucursal');
$fecha_inicio = $request->input('fecha_inicio');
$fecha_final = $request->input('fecha_final');
$definio = $request->input('definio');
$orderBy = $request->input('sortBy','nombre');
$order = $request->input('order','asc');
$queryBuilder = User::select('id', 'nombre', 'apellido_paterno', 'apellido_materno')
->where('tipo_empleado_id', ATENCION_CLIENTES)
->where('sucursal_id', $sucursal)
->orderBy($orderBy,$order);
if($query = $request->get('query',false)){
$queryBuilder->where(function($q) use ($query){
$q->where('nombre','like','%' .$query.'%')
->orWhere('apellido_paterno','like','%' .$query.'%')
->orWhere('apellido_materno','like','%' .$query.'%');
});
}
if($perPage = $request->input('perPage',false)){
$data = $queryBuilder->paginate($perPage);
foreach ($data->items() as $u){
$count = ServicioDet::join('servicios_enc','servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->where('servicios_enc.usuario_agenda_id', $u->id)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final);
if($definio == DEFINIO_CLIENTE){
$count->where('servicios_det.definido_cliente', 1);
}
if($definio == DEFINIO_ATENCION_CLIENTE){
$count->where('servicios_det.definido_cliente', 0);
}
$u->servicios_cantidad = $count->count();
}
$users = $data;
}else{
$data = $queryBuilder->get();
foreach ($data as $u){
$count = ServicioDet::join('servicios_enc','servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->where('servicios_enc.usuario_agenda_id', $u->id)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final);
if($definio == DEFINIO_CLIENTE){
$count->where('servicios_det.definido_cliente', 1);
}
if($definio == DEFINIO_ATENCION_CLIENTE){
$count->where('servicios_det.definido_cliente', 0);
}
$u->servicios_cantidad = $count->count();
}
$users = ['data'=>$data];
}
return response()->success($users);
}
public function reportes(ProductividadAtencionClientesRequest $request){
$orderBy = $request->input('sortBy','servicios_enc.id');
$order = $request->input('order','asc');
$sucursal = $request->input('sucursal');
$fecha_inicio = $request->input('fecha_inicio');
$fecha_final = $request->input('fecha_final');
$usuario_id = $request->input('usuario_id');
$definio = $request->input('definio');
$campos = [
'servicios_enc.id as numero_solicitud',
DB::raw("DATE(servicios_det.fecha_solicitud) as 'fecha_servicio'"),
DB::raw("TIME(servicios_det.fecha_solicitud) as 'hora_servicio'"),
'cat_servicios.nombre as servicio',
'servicios_det.costo_servicio as costo',
'cat_tipos_servicios.nombre as tipo_servicio',
'cat_estatus_servicios.nombre as estatus_servicio',
'clientes.denominacion as nombre_cliente',
'clientes_domicilios.calle as calle_cliente',
'clientes_domicilios.entre_calles as entre_calles_cliente',
'clientes_domicilios.num_ext as num_ext_cliente',
'clientes_domicilios.num_int as num_int_cliente',
'clientes_domicilios.colonia as colonia_cliente',
'clientes_domicilios.ciudad as ciudad_cliente',
'clientes_domicilios.cp as cp_cliente',
'asesor.nombre as nombre_asesor',
'asesor.apellido_paterno as apellido_paterno_asesor',
'asesor.apellido_materno as apellido_materno_asesor',
'auxiliar.nombre as nombre_auxiliar',
'auxiliar.apellido_paterno as apellido_paterno_auxiliar',
'auxiliar.apellido_materno as apellido_materno_auxiliar',
'cat_vehiculos.num_economico as vehiculo',
'servicios_progreso.duracion as duracion_servicio'
];
$queryBuilder = ServicioDet::select($campos)
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->join('cat_servicios', 'servicios_det.servicio_id', '=', 'cat_servicios.id')
->join('cat_tipos_servicios', 'servicios_det.tipo_servicio_id', '=', 'cat_tipos_servicios.id')
->join('cat_estatus_servicios','servicios_det.estatus_servicio_id','=','cat_estatus_servicios.id')
->join('clientes','servicios_enc.cliente_id','=','clientes.id')
->join('clientes_domicilios','servicios_enc.cliente_domicilio_id','=','clientes_domicilios.id')
->join('users as asesor', 'servicios_det.operador_id', '=', 'asesor.id')
->leftJoin('users as auxiliar', 'servicios_det.auxiliar_1', '=', 'auxiliar.id')
->join('cat_vehiculos', 'servicios_det.vehiculo_id', '=', 'cat_vehiculos.id')
->leftJoin('servicios_progreso', 'servicios_det.id', '=', 'servicios_progreso.servicio_det_id')
->where('servicios_enc.sucursal_id', $sucursal)
->where('servicios_enc.usuario_agenda_id', $usuario_id)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->orderBy($orderBy,$order);
if($definio == DEFINIO_CLIENTE){
$queryBuilder->where('servicios_det.definido_cliente', 1);
}
if($definio == DEFINIO_ATENCION_CLIENTE){
$queryBuilder->where('servicios_det.definido_cliente', 0);
}
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 generarExcel(ProductividadAtencionClientesRequest $request){
$sucursal = $request->input('sucursal');
$fecha_inicio = $request->input('fecha_inicio');
$fecha_final = $request->input('fecha_final');
$usuario_id = $request->input('usuario_id');
$definio = $request->input('definio');
$campos = [
'servicios_enc.id as numero_solicitud',
DB::raw("DATE(servicios_det.fecha_solicitud) as 'fecha_servicio'"),
DB::raw("TIME(servicios_det.fecha_solicitud) as 'hora_servicio'"),
'cat_servicios.nombre as servicio',
'servicios_det.costo_servicio as costo',
'cat_tipos_servicios.nombre as tipo_servicio',
'cat_estatus_servicios.nombre as estatus_servicio',
'clientes.denominacion as nombre_cliente',
DB::raw("CONCAT(clientes_domicilios.calle,' ',clientes_domicilios.num_ext,' ', clientes_domicilios.colonia,' ',clientes_domicilios.cp,' ',clientes_domicilios.ciudad) as domicilio"),
DB::raw("CONCAT(asesor.nombre,' ',asesor.apellido_paterno,' ',asesor.apellido_materno) as asesor"),
DB::raw("CONCAT(auxiliar.nombre,' ',auxiliar.apellido_paterno,' ',auxiliar.apellido_materno) as auxiliar"),
'cat_vehiculos.num_economico as vehiculo',
'servicios_progreso.duracion as duracion_servicio'
];
$queryBuilder = ServicioDet::select($campos)
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->join('cat_servicios', 'servicios_det.servicio_id', '=', 'cat_servicios.id')
->join('cat_tipos_servicios', 'servicios_det.tipo_servicio_id', '=', 'cat_tipos_servicios.id')
->join('cat_estatus_servicios','servicios_det.estatus_servicio_id','=','cat_estatus_servicios.id')
->join('clientes','servicios_enc.cliente_id','=','clientes.id')
->join('clientes_domicilios','servicios_enc.cliente_domicilio_id','=','clientes_domicilios.id')
->join('users as asesor', 'servicios_det.operador_id', '=', 'asesor.id')
->leftJoin('users as auxiliar', 'servicios_det.auxiliar_1', '=', 'auxiliar.id')
->join('cat_vehiculos', 'servicios_det.vehiculo_id', '=', 'cat_vehiculos.id')
->leftJoin('servicios_progreso', 'servicios_det.id', '=', 'servicios_progreso.servicio_det_id')
->where('servicios_enc.sucursal_id', $sucursal)
->where('servicios_enc.usuario_agenda_id', $usuario_id)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->orderBy('servicios_enc.id','asc');
if($definio == DEFINIO_CLIENTE){
$queryBuilder->where('servicios_det.definido_cliente', 1);
}
if($definio == DEFINIO_ATENCION_CLIENTE){
$queryBuilder->where('servicios_det.definido_cliente', 0);
}
$servicios = $queryBuilder->get();
$total = $queryBuilder->count();
$nombre_usuario = User::where('id', $usuario_id)->first();
$titulo = "Reporte de Servicios Atención a Cliente ".$nombre_usuario->nombre." ".$nombre_usuario->apellido_paterno;
list($y_i, $m_i, $d_i) = explode("-", $fecha_inicio);
list($y_f, $m_f, $d_f) = explode("-", $fecha_final);
$f_i = $d_i."_".$m_i."_".$y_i;
$f_f = $d_f."_".$m_f."_".$y_f;
$nombre = "Reporte_Atención_Cliente_".$nombre_usuario->nombre."_".$nombre_usuario->apellido_paterno."_".$f_i."-".$f_f;
foreach ($servicios as $s){
$s->costo = floatval($s->costo);
list($y, $m, $d) = explode("-", $s->fecha_servicio);
$s->fecha_servicio = "$d/$m/$y";
$s->numero_solicitud = (int)$s->numero_solicitud;
}
Excel::create($nombre, function($excel) use($servicios, $titulo, $fecha_inicio, $fecha_final, $total){
// Set the title
$excel->setTitle('Reporte de Servicios Atención a Cliente');
// Chain the setters
$excel->setCreator('DRENAX')
->setCompany('DRENAX');
// Call them separately
$excel->setDescription('Reporte de Servicios Atención a Cliente');
$excel->sheet('Reporte_Servicios_AtnCliente', function ($sheet) use($servicios, $titulo, $fecha_inicio, $fecha_final, $total) {
$sheet->setColumnFormat(array(
'F' => '"$"#,##0.00_-',
'C' => 'd/m/y'
));
//Mostrar logo
$sheet->mergeCells('B2:D6');
$objDrawing = new \PHPExcel_Worksheet_Drawing;
$objDrawing->setPath(resource_path('assets/images/logos').'/logo_drenax.png');
$objDrawing->setWidth(95);
$objDrawing->setHeight(80);
$objDrawing->setCoordinates('B2');
$objDrawing->setOffsetX(9);
$objDrawing->setOffsetY(9);
$objDrawing->setWorksheet($sheet);
$sheet->mergeCells('I2:L6');
$sheet->cell('I2', function($cell) use($titulo, $fecha_inicio, $fecha_final, $total) {
$cell->setFontFamily('Aharoni');
$cell->setFontWeight('bold');
$cell->setAlignment('center');
$cell->setValignment('center');
$cell->setFontSize(20);
$cell->setValue($titulo);
});
$sheet->cell('J8', function($cell) use($fecha_inicio) {
list($y, $m, $d) = explode("-", $fecha_inicio);
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Del: '.$d.'/'.$m.'/'.$y);
});
$sheet->cell('K8', function($cell) use($fecha_final) {
list($y, $m, $d) = explode("-", $fecha_final);
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Al: '.$d.'/'.$m.'/'.$y);
});
$sheet->cell('M8', function($cell) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Total:');
});
$sheet->cell('N8', function($cell) use($total) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue($total.' Servicios');
});
//Mostar valores de consulta
$sheet->fromArray($servicios, null, 'B9', true);
//Formato en columnas de titulo
$sheet->cells('B9:N9', function ($cells) {
$cells->setBackground('#001870');
$cells->setFontColor('#ffffff');
$cells->setFontSize(13);
$cells->setFontFamily('Calibri');
$cells->setAlignment('left');
$cells->setFontWeight('bold');
});
$sheet->getStyle('B9:N9' , $sheet->getHighestRow())->getAlignment()->setWrapText(true);
//Titulos personalizados
$titulos_cell = [
['cell' => 'B9', 'titulo' => 'Número de solicitud'],
['cell' => 'C9', 'titulo' => 'Fecha del servicio'],
['cell' => 'D9', 'titulo' => 'Hora del servicio'],
['cell' => 'E9', 'titulo' => 'Servicio'],
['cell' => 'F9', 'titulo' => 'Costo de servicio'],
['cell' => 'G9', 'titulo' => 'Tipo de servicio'],
['cell' => 'H9', 'titulo' => 'Estatus de servicio'],
['cell' => 'I9', 'titulo' => 'Nombre del cliente'],
['cell' => 'J9', 'titulo' => 'Domicilio de servicio'],
['cell' => 'K9', 'titulo' => 'Asesor de operaciones'],
['cell' => 'L9', 'titulo' => 'Auxiliar de operaciones'],
['cell' => 'M9', 'titulo' => 'Vehiculo asignado'],
['cell' => 'N9', 'titulo' => 'Duración del servicio (cronómetro)']
];
foreach ($titulos_cell as $t){
$sheet->cell($t['cell'], function($cell) use($t) {
$cell->setValue($t['titulo']);
});
}
//Size a columnas indicadas
$columns_set = [
'B9', 'C9', 'D9', 'M9', 'N9'
];
foreach ($columns_set as $c){
$set_column = [
$c => [
'width' => ($c == 'N9')? 23: 14,
'height' => 40
]
];
$sheet->setSize($set_column);
}
//AutoSize en columnas indicadas
$columns_auto= [
'E','F','G','H','I','J','K','L'
];
foreach ($columns_auto as $c){
$sheet->getColumnDimension($c)->setAutoSize(true);
}
$sheet->setWidth(array(
'A' => 3,
));
//Borde
$columns_border= [
'B','C','D','E','F','G','H','I','J','K','L','M','N'
];
for ($i=0; $i<= $total; $i++){
$row = 9 + $i;
foreach ($columns_border as $cb){
$border = "$cb$row:$cb$row";
$sheet->cells($border, function ($cells) {
$cells->setBorder('thin', 'thin', 'thin', 'thin');
});
if($row != 9 && ($cb == 'C' || $cb == 'D' || $cb == 'F' || $cb == 'N')){
$sheet->cells("$cb$row", function ($cells) {
$cells->setAlignment('right');
});
}
}
}
});
})->store('xls', storage_path('app') . '/public/reportes/productividad_atencion_clientes/');
return response()->success(['nombre_archivo' => $nombre.'.xls?micro='.$this->getMicroSeconds()]);
}
}

View File

@@ -0,0 +1,272 @@
<?php
namespace App\Http\Controllers\Reportes;
use const App\Http\Controllers\ASESOR_OPERACIONES;
use const App\Http\Controllers\ATENCION_CLIENTES;
use App\Models\TipoVehiculo;
use App\Models\CatEstatuServicio;
use App\Models\ServicioDet;
use App\Models\ServicioEnc;
use App\Models\User;
use Carbon\Carbon;
use App\Http\Controllers\Controller;
use DB;
use Log;
class SemanalController extends Controller
{
function getWeek($date){
$date = new \DateTime($date);
$week = $date->format("W");
return $week;
}
public function reportes(){
$fecha_actual = Carbon::now()->format('Y-m-d');
$dias_semana = $this->obtener_semana($fecha_actual);
$currentWeek = $this->getWeek(date("Y-m-d"));
$firstDateOfMonth = date("Y").'-'.date("m").'-01';
$firstWeek = $this->getWeek($firstDateOfMonth);
$lastDateOfMonth = date("Y-m-t", strtotime($firstDateOfMonth));
$lastWeek = $this->getWeek($lastDateOfMonth);
$weeks = 0;
for($i=$firstWeek;$i<=$lastWeek;$i++) $weeks++;
$servicios_nombre_precios = $this->serviciosNombresPrecios($dias_semana);
$tipos_servicios = $this->tiposServicios($dias_semana);
$tipos_estados_servicio = $this->tipoEstadoServicio($dias_semana);
$tipos_origen = $this->tiposOrigen($dias_semana);
$atencion_cliente = $this->atencionCliente($dias_semana);
$operadores = $this->operadores($dias_semana);
$servicios_vehiculos_precios = $this->serviciosVehiculosPrecios($dias_semana);
$capacidad_aprovechada = $this->capacidadAprovechada($currentWeek, $weeks);
return response()->success(compact('servicios_nombre_precios','tipos_servicios', 'tipos_estados_servicio', 'tipos_origen', 'atencion_cliente', 'operadores', 'servicios_vehiculos_precios', 'capacidad_aprovechada'));
}
public function serviciosNombresPrecios($dias_semana){
$servicios = ServicioDet::select('cat_servicios.nombre as name', DB::raw("SUM(servicios_det.costo_servicio) AS costo, count(servicios_det.servicio_id) as y"))
->join('cat_servicios', 'servicios_det.servicio_id', '=', 'cat_servicios.id')
->whereIn(DB::raw("DATE(servicios_det.fecha_solicitud)"),$dias_semana)
->groupBy('cat_servicios.nombre')
->get();
$total_costo = (string)number_format(collect($servicios)->sum('costo'),2);
return compact('servicios', 'total_costo');
}
public function tiposServicios($dias_semana){
$servicios = ServicioDet::select('cat_tipos_servicios.nombre as name', DB::raw("count(servicios_det.tipo_servicio_id) as y"))
->join('cat_tipos_servicios', 'servicios_det.tipo_servicio_id', '=', 'cat_tipos_servicios.id')
->whereIn(DB::raw("DATE(servicios_det.fecha_solicitud)"),$dias_semana)
->groupBy('cat_tipos_servicios.nombre')
->get();
return $servicios;
}
public function tipoEstadoServicio($dias_semana){
$servicios = ServicioDet::select('cat_estatus_servicios.nombre as name', DB::raw("count(servicios_det.estatus_servicio_id) as y"))
->join('cat_estatus_servicios', 'servicios_det.estatus_servicio_id', '=', 'cat_estatus_servicios.id')
->whereIn(DB::raw("DATE(servicios_det.fecha_solicitud)"),$dias_semana)
->groupBy('cat_estatus_servicios.nombre')
->get();
return $servicios;
}
public function tiposOrigen($dias_semana){
$servicios = ServicioEnc::select('cat_origenes.nombre as name', DB::raw("count(servicios_enc.origen_id) as y"))
->join('servicios_det', 'servicios_enc.id', '=', 'servicios_det.servicio_enc_id')
->join('cat_origenes', 'servicios_enc.origen_id', '=', 'cat_origenes.id')
->whereIn(DB::raw("DATE(servicios_det.fecha_solicitud)"),$dias_semana)
->groupBy('cat_origenes.nombre')
->get();
return $servicios;
}
public function atencionCliente($dias_semana){
$usuarios_series = [];
$estatus_series = [];
$estatus_servicio = CatEstatuServicio::get();
foreach ($estatus_servicio as $e){
$usuarios_series = [];
$valores_estatus = [];
$atencion_cliente = User::select('id', DB::raw("CONCAT(nombre, ' ',apellido_paterno) as nombre_atencion"))
->where('tipo_empleado_id', ATENCION_CLIENTES)
->get();
foreach ($atencion_cliente as $aC){
$total = ServicioEnc::join('servicios_det', 'servicios_enc.id', '=', 'servicios_det.servicio_enc_id')
->join('cat_estatus_servicios', 'servicios_det.estatus_servicio_id', '=', 'cat_estatus_servicios.id')
->where('servicios_enc.usuario_agenda_id',$aC->id)
->whereIn(DB::raw("DATE(servicios_det.fecha_solicitud)"),$dias_semana);
$total_general = ($total->count() == 1)? " (".$total->count()." servicio)" : " (".$total->count()." servicios)";
$nombre = $aC->nombre_atencion.$total_general;
array_push($usuarios_series, $nombre);
$total_estatus = $total->where('servicios_det.estatus_servicio_id', $e->id)->count();
array_push($valores_estatus, $total_estatus);
}
$estatus_series[$e->nombre] = $valores_estatus;
}
$datos = [];
foreach ($estatus_series as $key => $e){
array_push($datos, ["name"=>$key, "data"=>$e]);
}
$result = ["usuarios"=>$usuarios_series, "datos"=>$datos];
return $result;
}
public function operadores($dias_semana){
$usuarios_series = [];
$estatus_series = [];
$estatus_servicio = CatEstatuServicio::get();
foreach ($estatus_servicio as $e){
$usuarios_series = [];
$valores_estatus = [];
$operadores = User::select('id', DB::raw("CONCAT(nombre, ' ',apellido_paterno) as nombre_atencion"))
->where('tipo_empleado_id', ASESOR_OPERACIONES)
->get();
foreach ($operadores as $o){
$total = ServicioDet::join('cat_estatus_servicios', 'servicios_det.estatus_servicio_id', '=', 'cat_estatus_servicios.id')
->where('servicios_det.operador_id',$o->id)
->whereIn(DB::raw("DATE(servicios_det.fecha_solicitud)"),$dias_semana);
$total_general = ($total->count() == 1)? " (".$total->count()." servicio)" : " (".$total->count()." servicios)";
$nombre = $o->nombre_atencion.$total_general;
array_push($usuarios_series, $nombre);
$total_estatus = $total->where('servicios_det.estatus_servicio_id', $e->id)->count();
array_push($valores_estatus, $total_estatus);
}
$estatus_series[$e->nombre] = $valores_estatus;
}
$datos = [];
foreach ($estatus_series as $key => $e){
array_push($datos, ["name"=>$key, "data"=>$e]);
}
$result = ["usuarios"=>$usuarios_series, "datos"=>$datos];
return $result;
}
public function serviciosVehiculosPrecios($dias_semana){
$servicios = ServicioDet::select('cat_vehiculos.num_economico as name', DB::raw("SUM(servicios_det.costo_servicio) AS costo, count(servicios_det.servicio_id) as y"))
->join('cat_vehiculos', 'servicios_det.vehiculo_id', '=', 'cat_vehiculos.id')
->whereIn(DB::raw("DATE(servicios_det.fecha_solicitud)"),$dias_semana)
->groupBy('cat_vehiculos.num_economico')
->get();
return $servicios;
}
public function capacidadAprovechada($semana_actual, $weeks=4){
$respuesta = [];
$tipos_vehiculo = TipoVehiculo::select(['id', 'nombre'])->orderBy('nombre')->get();
foreach ($tipos_vehiculo as $t){
$tmpId = $t->id;
$tmpNombre = $t->nombre;
$campos = [
'cat_vehiculos.tipo_vehiculo_id',
'cat_tipos_vehiculos.nombre AS tipo_vehiculo',
'cat_tipos_vehiculos.objetivo_mensual',
DB::raw("SEC_TO_TIME(SUM(TIME_TO_SEC(servicios_progreso.duracion))) AS 'total_duracion'"),
DB::raw("TRUNCATE(SUM((TIME_TO_SEC(TIME(servicios_progreso.duracion))/60)/60), 3) AS 'total_duracion_fracc'")
];
$datos = ServicioDet::select($campos)
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->join('cat_servicios', 'servicios_det.servicio_id', '=', 'cat_servicios.id')
->join('cat_tipos_servicios', 'servicios_det.tipo_servicio_id', '=', 'cat_tipos_servicios.id')
->join('cat_estatus_servicios','servicios_det.estatus_servicio_id','=','cat_estatus_servicios.id')
->join('cat_vehiculos', 'servicios_det.vehiculo_id', '=', 'cat_vehiculos.id')
->join('cat_tipos_vehiculos', 'cat_tipos_vehiculos.id', '=', 'cat_vehiculos.tipo_vehiculo_id')
->leftJoin('servicios_progreso', 'servicios_det.id', '=', 'servicios_progreso.servicio_det_id')
->join('cat_origenes', 'servicios_enc.origen_id', '=', 'cat_origenes.id')
->where('cat_vehiculos.tipo_vehiculo_id', $tmpId)
->whereRaw("WEEKOFYEAR(DATE(servicios_det.fecha_solicitud))=?", $semana_actual)
->groupBy('cat_vehiculos.tipo_vehiculo_id', 'cat_tipos_vehiculos.nombre', 'cat_tipos_vehiculos.objetivo_mensual')
->first();
if($datos){
array_push($respuesta, [
'tipo_vehiculo_id'=>$datos->tipo_vehiculo_id,
'tipo_vehiculo'=>$datos->tipo_vehiculo,
'objetivo_mensual'=>$datos->objetivo_mensual,
'objetivo_semanal'=>($weeks == 0) ? 0 : $datos->objetivo_mensual/($weeks),
'semanas'=>$weeks,
'total_duracion'=>$datos->total_duracion,
'total_duracion_fracc'=>$datos->total_duracion_fracc,
]);
}else{
array_push($respuesta, [
'tipo_vehiculo_id'=>$tmpId,
'tipo_vehiculo'=>$tmpNombre,
'objetivo_mensual'=>0,
'objetivo_semanal'=>0,
'semanas'=>$weeks,
'total_duracion'=>null,
'total_duracion_fracc'=>null
]);
}
}
return $respuesta;
}
function obtener_semana($date) {
$date2 = strtotime($date);
$inicio0 = strtotime('sunday this week -1 week', $date2);
$inicio=date('Y-m-d', $inicio0);
$dias = array();
for($i=1;$i<=7;$i++){
$dia = date("Y-m-d", strtotime("$inicio +$i day"));
array_push($dias,$dia);
}
return $dias;
}
}

View File

@@ -0,0 +1,444 @@
<?php
namespace App\Http\Controllers\Reportes;
use const App\Http\Controllers\ASESOR_OPERACIONES;
use const App\Http\Controllers\AUXILIAR_TECNICO_1;
use const App\Http\Controllers\AUXILIAR_TECNICO_2;
use App\Http\Requests\Reportes\ConsultarAsesoresRequest;
use App\Http\Requests\Reportes\ServiciosAsesoresRequest;
use App\Models\ServicioDet;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB;
use Excel;
use Log;
class ServiciosAsesoresController extends Controller
{
public function consultarAsesores(ConsultarAsesoresRequest $request){
$sucursal = $request->input('sucursal');
$fecha_inicio = $request->input('fecha_inicio');
$fecha_final = $request->input('fecha_final');
$orderBy = $request->input('sortBy','nombre');
$order = $request->input('order','asc');
$queryBuilder = User::select('id', 'nombre', 'apellido_paterno', 'apellido_materno', 'tipo_empleado_id')
->where('sucursal_id', $sucursal)
->whereIn('tipo_empleado_id', [ASESOR_OPERACIONES, AUXILIAR_TECNICO_1, AUXILIAR_TECNICO_2])
->orderBy($orderBy,$order);
if($query = $request->get('query',false)){
$queryBuilder->where(function($q) use ($query){
$q->where('nombre','like','%' .$query.'%')
->orWhere('apellido_paterno','like','%' .$query.'%')
->orWhere('apellido_materno','like','%' .$query.'%');
});
}
if($perPage = $request->input('perPage',false)){
$data = $queryBuilder->paginate($perPage);
foreach ($data->items() as $u){
if($u->tipo_empleado_id == ASESOR_OPERACIONES){
$u->tipo_empleado = 'Asesor de Operaciones';
$u->servicios_cantidad = ServicioDet::where('servicios_det.operador_id', $u->id)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->count();
}
if($u->tipo_empleado_id == AUXILIAR_TECNICO_1 || $u->tipo_empleado_id == AUXILIAR_TECNICO_2){
$u->tipo_empleado = 'Auxiliar de Operaciones';
$u->servicios_cantidad = ServicioDet::where(function($q) use ($u){
$q->where('servicios_det.auxiliar_1', $u->id)
->orWhere('servicios_det.auxiliar_2', $u->id);
})
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->count();
}
}
$users = $data;
}else{
$data = $queryBuilder->get();
foreach ($data as $u){
$u->servicios_cantidad = ServicioDet::where('servicios_det.operador_id', $u->id)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->count();
if($u->tipo_empleado_id == ASESOR_OPERACIONES){
$u->tipo_empleado = 'Asesor de Operaciones';
}
if($u->tipo_empleado_id == AUXILIAR_TECNICO_1 || $u->tipo_empleado_id == AUXILIAR_TECNICO_2){
$u->tipo_empleado = 'Auxiliar de Operaciones';
}
}
$users = ['data'=>$data];
}
return response()->success($users);
}
public function reportes(ServiciosAsesoresRequest $request){
$orderBy = $request->input('sortBy','servicios_enc.id');
$order = $request->input('order','asc');
$sucursal = $request->input('sucursal');
$fecha_inicio = $request->input('fecha_inicio');
$fecha_final = $request->input('fecha_final');
$usuario_id = $request->input('usuario_id');
$campos = [
'servicios_enc.id as numero_solicitud',
DB::raw("DATE(servicios_det.fecha_solicitud) as 'fecha_servicio'"),
DB::raw("TIME(servicios_det.fecha_solicitud) as 'hora_servicio'"),
'cat_servicios.nombre as servicio',
'servicios_det.costo_servicio as costo',
'cat_tipos_servicios.nombre as tipo_servicio',
'cat_estatus_servicios.nombre as estatus_servicio',
'clientes.denominacion as nombre_cliente',
'clientes_domicilios.calle as calle_cliente',
'clientes_domicilios.entre_calles as entre_calles_cliente',
'clientes_domicilios.num_ext as num_ext_cliente',
'clientes_domicilios.num_int as num_int_cliente',
'clientes_domicilios.colonia as colonia_cliente',
'clientes_domicilios.ciudad as ciudad_cliente',
'clientes_domicilios.cp as cp_cliente',
'auxiliar.nombre as nombre_auxiliar',
'auxiliar.apellido_paterno as apellido_paterno_auxiliar',
'auxiliar.apellido_materno as apellido_materno_auxiliar',
'cat_vehiculos.num_economico as vehiculo',
'servicios_progreso.duracion as duracion_servicio',
'servicios_progreso.litraje as litraje'
];
$queryBuilder = ServicioDet::select($campos)
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->join('cat_servicios', 'servicios_det.servicio_id', '=', 'cat_servicios.id')
->join('cat_tipos_servicios', 'servicios_det.tipo_servicio_id', '=', 'cat_tipos_servicios.id')
->join('cat_estatus_servicios','servicios_det.estatus_servicio_id','=','cat_estatus_servicios.id')
->join('clientes','servicios_enc.cliente_id','=','clientes.id')
->join('clientes_domicilios','servicios_enc.cliente_domicilio_id','=','clientes_domicilios.id')
->leftJoin('users as auxiliar', 'servicios_det.auxiliar_1', '=', 'auxiliar.id')
->join('cat_vehiculos', 'servicios_det.vehiculo_id', '=', 'cat_vehiculos.id')
->leftJoin('servicios_progreso', 'servicios_det.id', '=', 'servicios_progreso.servicio_det_id')
->where('servicios_enc.sucursal_id', $sucursal)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->orderBy($orderBy,$order);
$user = User::where('id', $usuario_id)->first();
if($user->tipo_empleado_id == ASESOR_OPERACIONES){
$queryBuilder->where('servicios_det.operador_id', $usuario_id);
}
if($user->tipo_empleado_id == AUXILIAR_TECNICO_1 || $user->tipo_empleado_id == AUXILIAR_TECNICO_2){
$queryBuilder->where(function($q) use ($usuario_id){
$q->where('servicios_det.auxiliar_1', $usuario_id)
->orWhere('servicios_det.auxiliar_2', $usuario_id);
});
}
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)->toArray();
}else{
$data = ['data'=>$queryBuilder->get()];
}
$total_duracion = $this->sumarTiempos($queryBuilder->pluck('duracion_servicio'));
list($h,$m,$s) = explode(':',$total_duracion);
$data['total_duracion'] = $h."hr ".$m."m ".$s."s";
return response()->success($data);
}
public function generarExcel(ServiciosAsesoresRequest $request){
$sucursal = $request->input('sucursal');
$fecha_inicio = $request->input('fecha_inicio');
$fecha_final = $request->input('fecha_final');
$usuario_id = $request->input('usuario_id');
$campos = [
'servicios_enc.id as numero_solicitud',
DB::raw("DATE(servicios_det.fecha_solicitud) as 'fecha_servicio'"),
DB::raw("TIME(servicios_det.fecha_solicitud) as 'hora_servicio'"),
'cat_servicios.nombre as servicio',
'servicios_det.costo_servicio as costo',
'cat_tipos_servicios.nombre as tipo_servicio',
'cat_estatus_servicios.nombre as estatus_servicio',
'clientes.denominacion as nombre_cliente',
DB::raw("CONCAT(clientes_domicilios.calle,' ',clientes_domicilios.num_ext,' ', clientes_domicilios.colonia,' ',clientes_domicilios.cp,' ',clientes_domicilios.ciudad) as domicilio"),
//DB::raw("CONCAT(auxiliar.nombre,' ',auxiliar.apellido_paterno,' ',auxiliar.apellido_materno) as auxiliar"),
'cat_vehiculos.num_economico as vehiculo',
'servicios_progreso.duracion as duracion_servicio',
'servicios_progreso.litraje as litraje'
];
$queryBuilder = ServicioDet::select($campos)
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->join('cat_servicios', 'servicios_det.servicio_id', '=', 'cat_servicios.id')
->join('cat_tipos_servicios', 'servicios_det.tipo_servicio_id', '=', 'cat_tipos_servicios.id')
->join('cat_estatus_servicios','servicios_det.estatus_servicio_id','=','cat_estatus_servicios.id')
->join('clientes','servicios_enc.cliente_id','=','clientes.id')
->join('clientes_domicilios','servicios_enc.cliente_domicilio_id','=','clientes_domicilios.id')
->leftJoin('users as auxiliar', 'servicios_det.auxiliar_1', '=', 'auxiliar.id')
->join('cat_vehiculos', 'servicios_det.vehiculo_id', '=', 'cat_vehiculos.id')
->leftJoin('servicios_progreso', 'servicios_det.id', '=', 'servicios_progreso.servicio_det_id')
->where('servicios_enc.sucursal_id', $sucursal)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->orderBy('servicios_enc.id','asc');
$user = User::where('id', $usuario_id)->first();
if($user->tipo_empleado_id == ASESOR_OPERACIONES){
$queryBuilder->where('servicios_det.operador_id', $usuario_id);
}
if($user->tipo_empleado_id == AUXILIAR_TECNICO_1 || $user->tipo_empleado_id == AUXILIAR_TECNICO_2){
$queryBuilder->where(function($q) use ($usuario_id){
$q->where('servicios_det.auxiliar_1', $usuario_id)
->orWhere('servicios_det.auxiliar_2', $usuario_id);
});
}
$servicios = $queryBuilder->get();
$total = $queryBuilder->count();
$total_duracion = $this->sumarTiempos($queryBuilder->pluck('duracion_servicio'));
list($h,$m,$s) = explode(':',$total_duracion);
$total_duracion = $h."hr ".$m."m ".$s."s";
$nombre_usuario = User::where('id', $usuario_id)->first();
$titulo = "Reporte de Servicios Otorgados ".$nombre_usuario->nombre." ".$nombre_usuario->apellido_paterno;
list($y_i, $m_i, $d_i) = explode("-", $fecha_inicio);
list($y_f, $m_f, $d_f) = explode("-", $fecha_final);
$f_i = $d_i."_".$m_i."_".$y_i;
$f_f = $d_f."_".$m_f."_".$y_f;
$nombre = "Reporte_Servicios_Otorgados_".$nombre_usuario->nombre."_".$nombre_usuario->apellido_paterno."_".$f_i."-".$f_f;
foreach ($servicios as $s){
$s->costo = floatval($s->costo);
list($y, $m, $d) = explode("-", $s->fecha_servicio);
$s->fecha_servicio = "$d/$m/$y";
$s->numero_solicitud = (int)$s->numero_solicitud;
}
Excel::create($nombre, function($excel) use($servicios, $titulo, $fecha_inicio, $fecha_final, $total, $total_duracion){
// Set the title
$excel->setTitle('Reporte de Servicios Otorgados');
// Chain the setters
$excel->setCreator('DRENAX')
->setCompany('DRENAX');
// Call them separately
$excel->setDescription('Reporte de Servicios Otorgados');
$excel->sheet('Reporte_Servicios_Asesor', function ($sheet) use($servicios, $titulo, $fecha_inicio, $fecha_final, $total, $total_duracion) {
$sheet->setColumnFormat(array(
'F' => '"$"#,##0.00_-',
'C' => 'd/m/y',
'M' => '#,#'
));
//Mostrar logo
$sheet->mergeCells('B2:D6');
$objDrawing = new \PHPExcel_Worksheet_Drawing;
$objDrawing->setPath(resource_path('assets/images/logos').'/logo_drenax.png');
$objDrawing->setWidth(95);
$objDrawing->setHeight(80);
$objDrawing->setCoordinates('B2');
$objDrawing->setOffsetX(9);
$objDrawing->setOffsetY(9);
$objDrawing->setWorksheet($sheet);
$sheet->mergeCells('G2:J6');
$sheet->cell('G2', function($cell) use($titulo) {
$cell->setFontFamily('Aharoni');
$cell->setFontWeight('bold');
$cell->setAlignment('center');
$cell->setValignment('center');
$cell->setFontSize(20);
$cell->setValue($titulo);
});
$sheet->cell('H8', function($cell) use($fecha_inicio) {
list($y, $m, $d) = explode("-", $fecha_inicio);
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Del: '.$d.'/'.$m.'/'.$y);
});
$sheet->cell('I8', function($cell) use($fecha_final) {
list($y, $m, $d) = explode("-", $fecha_final);
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Al: '.$d.'/'.$m.'/'.$y);
});
$sheet->cell('K7', function($cell) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Duración:');
});
$sheet->cell('K8', function($cell) use($total_duracion) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue($total_duracion);
});
$sheet->cell('L7', function($cell) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Total:');
});
$sheet->cell('L8', function($cell) use($total) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue($total.' Servicios');
});
//Mostar valores de consulta
$sheet->fromArray($servicios, null, 'B9', true);
//Formato en columnas de titulo
$sheet->cells('B9:M9', function ($cells) {
$cells->setBackground('#001870');
$cells->setFontColor('#ffffff');
$cells->setFontSize(13);
$cells->setFontFamily('Calibri');
$cells->setAlignment('left');
$cells->setFontWeight('bold');
});
$sheet->getStyle('B9:M9' , $sheet->getHighestRow())->getAlignment()->setWrapText(true);
//Titulos personalizados
$titulos_cell = [
['cell' => 'B9', 'titulo' => 'Número de solicitud'],
['cell' => 'C9', 'titulo' => 'Fecha del servicio'],
['cell' => 'D9', 'titulo' => 'Hora del servicio'],
['cell' => 'E9', 'titulo' => 'Servicio'],
['cell' => 'F9', 'titulo' => 'Costo de servicio'],
['cell' => 'G9', 'titulo' => 'Tipo de servicio'],
['cell' => 'H9', 'titulo' => 'Estatus de servicio'],
['cell' => 'I9', 'titulo' => 'Nombre del cliente'],
['cell' => 'J9', 'titulo' => 'Domicilio de servicio'],
['cell' => 'K9', 'titulo' => 'Vehiculo asignado'],
['cell' => 'L9', 'titulo' => 'Duración del servicio (cronómetro)'],
['cell' => 'M9', 'titulo' => 'Litraje']
];
foreach ($titulos_cell as $t){
$sheet->cell($t['cell'], function($cell) use($t) {
$cell->setValue($t['titulo']);
});
}
//Size a columnas indicadas
$columns_set = [
'B9', 'C9', 'D9', 'K9', 'L9'
];
foreach ($columns_set as $c){
$set_column = [
$c => [
'width' => ($c == 'L9' || $c == 'K9')? 23: 14,
'height' => 40
]
];
$sheet->setSize($set_column);
}
//AutoSize en columnas indicadas
$columns_auto= [
'E','F','G','H','I','J'
];
foreach ($columns_auto as $c){
$sheet->getColumnDimension($c)->setAutoSize(true);
}
$sheet->setWidth(array(
'A' => 3,
));
//Borde
$columns_border= [
'B','C','D','E','F','G','H','I','J','K','L','M'
];
for ($i=0; $i<= $total; $i++){
$row = 9 + $i;
foreach ($columns_border as $cb){
$border = "$cb$row:$cb$row";
$sheet->cells($border, function ($cells) {
$cells->setBorder('thin', 'thin', 'thin', 'thin');
});
if($row != 9 && ($cb == 'C' || $cb == 'D' || $cb == 'F' || $cb == 'L')){
$sheet->cells("$cb$row", function ($cells) {
$cells->setAlignment('right');
});
}
}
}
});
})->store('xls', storage_path('app') . '/public/reportes/servicios_asesores/');
return response()->success(['nombre_archivo' => $nombre.'.xls?micro='.$this->getMicroSeconds()]);
}
}

View File

@@ -0,0 +1,368 @@
<?php
namespace App\Http\Controllers\Reportes;
use App\Http\Requests\Reportes\ConsultarClientesRequest;
use App\Http\Requests\Reportes\ServiciosClientesRequest;
use App\Models\Cliente;
use App\Models\ServicioDet;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB;
use Excel;
class ServiciosClientesController extends Controller
{
public function consultarClientes(ConsultarClientesRequest $request){
$sucursal = $request->input('sucursal');
$fecha_inicio = $request->input('fecha_inicio');
$fecha_final = $request->input('fecha_final');
$orderBy = $request->input('sortBy','denominacion');
$order = $request->input('order','asc');
$queryBuilder = Cliente::select('clientes.id', 'clientes.denominacion')
->join('servicios_enc', 'clientes.id', '=', 'servicios_enc.cliente_id')
->join('servicios_det', 'servicios_enc.id', '=', 'servicios_det.servicio_enc_id')
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->where('clientes.sucursal_id', $sucursal)
->orderBy($orderBy,$order);
if($query = $request->get('query',false)){
$queryBuilder->where(function($q) use ($query){
$q->where('denominacion','like','%' .$query.'%');
});
}
$queryBuilder = $queryBuilder->groupBy(['clientes.id', 'clientes.denominacion']);
if($perPage = $request->input('perPage',false)){
$data = $queryBuilder->paginate($perPage);
foreach ($data->items() as $u){
$u->servicios_cantidad = ServicioDet::join('servicios_enc','servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->where('servicios_enc.cliente_id', $u->id)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->count();
}
$users = $data;
}else{
$data = $queryBuilder->get();
foreach ($data as $u){
$u->servicios_cantidad = ServicioDet::join('servicios_enc','servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->where('servicios_enc.cliente_id', $u->id)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->count();
}
$users = ['data'=>$data];
}
return response()->success($users);
}
public function reportes(ServiciosClientesRequest $request){
$orderBy = $request->input('sortBy','servicios_enc.id');
$order = $request->input('order','asc');
$sucursal = $request->input('sucursal');
$fecha_inicio = $request->input('fecha_inicio');
$fecha_final = $request->input('fecha_final');
$cliente_id = $request->input('cliente_id');
$campos = [
'servicios_enc.id as numero_solicitud',
DB::raw("DATE(servicios_det.fecha_solicitud) as 'fecha_servicio'"),
DB::raw("TIME(servicios_det.fecha_solicitud) as 'hora_servicio'"),
'cat_servicios.nombre as servicio',
'servicios_det.costo_servicio as costo',
'cat_tipos_servicios.nombre as tipo_servicio',
'cat_estatus_servicios.nombre as estatus_servicio',
'clientes_domicilios.calle as calle_cliente',
'clientes_domicilios.entre_calles as entre_calles_cliente',
'clientes_domicilios.num_ext as num_ext_cliente',
'clientes_domicilios.num_int as num_int_cliente',
'clientes_domicilios.colonia as colonia_cliente',
'clientes_domicilios.ciudad as ciudad_cliente',
'clientes_domicilios.cp as cp_cliente',
'asesor.nombre as nombre_asesor',
'asesor.apellido_paterno as apellido_paterno_asesor',
'asesor.apellido_materno as apellido_materno_asesor',
'auxiliar.nombre as nombre_auxiliar',
'auxiliar.apellido_paterno as apellido_paterno_auxiliar',
'auxiliar.apellido_materno as apellido_materno_auxiliar',
'cat_vehiculos.num_economico as vehiculo',
'servicios_progreso.duracion as duracion_servicio',
'servicios_progreso.litraje as litraje'
];
$queryBuilder = ServicioDet::select($campos)
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->join('cat_servicios', 'servicios_det.servicio_id', '=', 'cat_servicios.id')
->join('cat_tipos_servicios', 'servicios_det.tipo_servicio_id', '=', 'cat_tipos_servicios.id')
->join('cat_estatus_servicios','servicios_det.estatus_servicio_id','=','cat_estatus_servicios.id')
->join('clientes_domicilios','servicios_enc.cliente_domicilio_id','=','clientes_domicilios.id')
->join('users as asesor', 'servicios_det.operador_id', '=', 'asesor.id')
->leftJoin('users as auxiliar', 'servicios_det.auxiliar_1', '=', 'auxiliar.id')
->join('cat_vehiculos', 'servicios_det.vehiculo_id', '=', 'cat_vehiculos.id')
->leftJoin('servicios_progreso', 'servicios_det.id', '=', 'servicios_progreso.servicio_det_id')
->where('servicios_enc.sucursal_id', $sucursal)
->where('servicios_enc.cliente_id', $cliente_id)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->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 generarExcel(ServiciosClientesRequest $request){
$sucursal = $request->input('sucursal');
$fecha_inicio = $request->input('fecha_inicio');
$fecha_final = $request->input('fecha_final');
$cliente_id = $request->input('cliente_id');
$campos = [
'servicios_enc.id as numero_solicitud',
DB::raw("DATE(servicios_det.fecha_solicitud) as 'fecha_servicio'"),
DB::raw("TIME(servicios_det.fecha_solicitud) as 'hora_servicio'"),
'cat_servicios.nombre as servicio',
'servicios_det.costo_servicio as costo',
'cat_tipos_servicios.nombre as tipo_servicio',
'cat_estatus_servicios.nombre as estatus_servicio',
DB::raw("CONCAT(clientes_domicilios.calle,' ',clientes_domicilios.num_ext,' ', clientes_domicilios.colonia,' ',clientes_domicilios.cp,' ',clientes_domicilios.ciudad) as domicilio"),
DB::raw("CONCAT(asesor.nombre,' ',asesor.apellido_paterno,' ',asesor.apellido_materno) as asesor"),
DB::raw("CONCAT(auxiliar.nombre,' ',auxiliar.apellido_paterno,' ',auxiliar.apellido_materno) as auxiliar"),
'cat_vehiculos.num_economico as vehiculo',
'servicios_progreso.duracion as duracion_servicio',
'servicios_progreso.litraje as litraje'
];
$queryBuilder = ServicioDet::select($campos)
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->join('cat_servicios', 'servicios_det.servicio_id', '=', 'cat_servicios.id')
->join('cat_tipos_servicios', 'servicios_det.tipo_servicio_id', '=', 'cat_tipos_servicios.id')
->join('cat_estatus_servicios','servicios_det.estatus_servicio_id','=','cat_estatus_servicios.id')
->join('clientes_domicilios','servicios_enc.cliente_domicilio_id','=','clientes_domicilios.id')
->join('users as asesor', 'servicios_det.operador_id', '=', 'asesor.id')
->leftJoin('users as auxiliar', 'servicios_det.auxiliar_1', '=', 'auxiliar.id')
->join('cat_vehiculos', 'servicios_det.vehiculo_id', '=', 'cat_vehiculos.id')
->leftJoin('servicios_progreso', 'servicios_det.id', '=', 'servicios_progreso.servicio_det_id')
->where('servicios_enc.sucursal_id', $sucursal)
->where('servicios_enc.cliente_id', $cliente_id)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->orderBy('servicios_enc.id','asc');
$servicios = $queryBuilder->get();
$total = $queryBuilder->count();
$cliente = Cliente::where('id', $cliente_id)->first();
$titulo = "Reporte de Servicios de Cliente ".$cliente->denominacion;
list($y_i, $m_i, $d_i) = explode("-", $fecha_inicio);
list($y_f, $m_f, $d_f) = explode("-", $fecha_final);
$f_i = $d_i."_".$m_i."_".$y_i;
$f_f = $d_f."_".$m_f."_".$y_f;
$nombre = "Reporte_Servicios_Cliente_".$cliente->denominacion."_".$f_i."-".$f_f;
foreach ($servicios as $s){
$s->costo = floatval($s->costo);
list($y, $m, $d) = explode("-", $s->fecha_servicio);
$s->fecha_servicio = "$d/$m/$y";
$s->numero_solicitud = (int)$s->numero_solicitud;
}
Excel::create($nombre, function($excel) use($servicios, $titulo, $fecha_inicio, $fecha_final, $total){
// Set the title
$excel->setTitle('Reporte de Servicios de Cliente');
// Chain the setters
$excel->setCreator('DRENAX')
->setCompany('DRENAX');
// Call them separately
$excel->setDescription('Reporte de Servicios de Cliente');
$excel->sheet('Reporte_Servicios_Cliente', function ($sheet) use($servicios, $titulo, $fecha_inicio, $fecha_final, $total) {
$sheet->setColumnFormat(array(
'F' => '"$"#,##0.00_-',
'C' => 'd/m/y',
'N' => '#,#'
));
//Mostrar logo
$sheet->mergeCells('B2:D6');
$objDrawing = new \PHPExcel_Worksheet_Drawing;
$objDrawing->setPath(resource_path('assets/images/logos').'/logo_drenax.png');
$objDrawing->setWidth(95);
$objDrawing->setHeight(80);
$objDrawing->setCoordinates('B2');
$objDrawing->setOffsetX(9);
$objDrawing->setOffsetY(9);
$objDrawing->setWorksheet($sheet);
$sheet->mergeCells('H2:K6');
$sheet->cell('H2', function($cell) use($titulo, $fecha_inicio, $fecha_final, $total) {
$cell->setFontFamily('Aharoni');
$cell->setFontWeight('bold');
$cell->setAlignment('center');
$cell->setValignment('center');
$cell->setFontSize(20);
$cell->setValue($titulo);
});
$sheet->cell('I8', function($cell) use($fecha_inicio) {
list($y, $m, $d) = explode("-", $fecha_inicio);
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Del: '.$d.'/'.$m.'/'.$y);
});
$sheet->cell('J8', function($cell) use($fecha_final) {
list($y, $m, $d) = explode("-", $fecha_final);
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Al: '.$d.'/'.$m.'/'.$y);
});
$sheet->cell('L8', function($cell) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Total:');
});
$sheet->cell('M8', function($cell) use($total) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue($total.' Servicios');
});
//Mostar valores de consulta
$sheet->fromArray($servicios, null, 'B9', true);
//Formato en columnas de titulo
$sheet->cells('B9:N9', function ($cells) {
$cells->setBackground('#001870');
$cells->setFontColor('#ffffff');
$cells->setFontSize(13);
$cells->setFontFamily('Calibri');
$cells->setAlignment('left');
$cells->setFontWeight('bold');
});
$sheet->getStyle('B9:N9' , $sheet->getHighestRow())->getAlignment()->setWrapText(true);
//Titulos personalizados
$titulos_cell = [
['cell' => 'B9', 'titulo' => 'Número de solicitud'],
['cell' => 'C9', 'titulo' => 'Fecha del servicio'],
['cell' => 'D9', 'titulo' => 'Hora del servicio'],
['cell' => 'E9', 'titulo' => 'Servicio'],
['cell' => 'F9', 'titulo' => 'Costo de servicio'],
['cell' => 'G9', 'titulo' => 'Tipo de servicio'],
['cell' => 'H9', 'titulo' => 'Estatus de servicio'],
['cell' => 'I9', 'titulo' => 'Domicilio de servicio'],
['cell' => 'J9', 'titulo' => 'Asesor de operaciones'],
['cell' => 'K9', 'titulo' => 'Auxiliar de operaciones'],
['cell' => 'L9', 'titulo' => 'Vehiculo asignado'],
['cell' => 'M9', 'titulo' => 'Duración del servicio (cronómetro)'],
['cell' => 'N9', 'titulo' => 'Litraje']
];
foreach ($titulos_cell as $t){
$sheet->cell($t['cell'], function($cell) use($t) {
$cell->setValue($t['titulo']);
});
}
//Size a columnas indicadas
$columns_set = [
'B9', 'C9', 'D9', 'L9', 'M9'
];
foreach ($columns_set as $c){
$set_column = [
$c => [
'width' => ($c == 'N9')? 23: 14,
'height' => 50
]
];
$sheet->setSize($set_column);
}
//AutoSize en columnas indicadas
$columns_auto= [
'E','F','G','H','I','J','K'
];
foreach ($columns_auto as $c){
$sheet->getColumnDimension($c)->setAutoSize(true);
}
$sheet->setWidth(array(
'A' => 3,
));
//Borde
$columns_border= [
'B','C','D','E','F','G','H','I','J','K','L','M','N'
];
for ($i=0; $i<= $total; $i++){
$row = 9 + $i;
foreach ($columns_border as $cb){
$border = "$cb$row:$cb$row";
$sheet->cells($border, function ($cells) {
$cells->setBorder('thin', 'thin', 'thin', 'thin');
});
if($row != 9 && ($cb == 'C' || $cb == 'D' || $cb == 'F' || $cb == 'N')){
$sheet->cells("$cb$row", function ($cells) {
$cells->setAlignment('right');
});
}
}
}
});
})->store('xls', storage_path('app') . '/public/reportes/servicios_clientes/');
return response()->success(['nombre_archivo' => $nombre.'.xls?micro='.$this->getMicroSeconds()]);
}
}

View File

@@ -0,0 +1,429 @@
<?php
namespace App\Http\Controllers\Reportes;
use App\Http\Requests\Reportes\ServiciosRequest;
use App\Models\ServicioDet;
use App\Models\Sucursal;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Excel;
use Log;
class ServiciosController extends Controller
{
public function reportes(ServiciosRequest $request){
$orderBy = $request->input('sortBy','servicios_enc.id');
$order = $request->input('order','asc');
$sucursal = $request->input('sucursal');
$fecha_inicio = $request->input('fecha_inicio');
$fecha_final = $request->input('fecha_final');
$tipo_servicio = $request->input('tipo_servicio');
$estado_servicio = $request->input('estado_servicio');
$servicio = $request->input('servicio');
$origen = $request->input('origen');
$campos = [
'servicios_enc.id as numero_solicitud',
DB::raw("DATE(servicios_det.fecha_solicitud) as 'fecha_servicio'"),
DB::raw("TIME(servicios_det.fecha_solicitud) as 'hora_servicio'"),
'cat_servicios.nombre as servicio',
'servicios_det.costo_servicio as costo',
'cat_tipos_servicios.nombre as tipo_servicio',
'cat_estatus_servicios.nombre as estatus_servicio',
'clientes.denominacion as nombre_cliente',
'clientes_domicilios.calle as calle_cliente',
'clientes_domicilios.entre_calles as entre_calles_cliente',
'clientes_domicilios.num_ext as num_ext_cliente',
'clientes_domicilios.num_int as num_int_cliente',
'clientes_domicilios.colonia as colonia_cliente',
'clientes_domicilios.ciudad as ciudad_cliente',
'clientes_domicilios.cp as cp_cliente',
'asesor.nombre as nombre_asesor',
'asesor.apellido_paterno as apellido_paterno_asesor',
'asesor.apellido_materno as apellido_materno_asesor',
'auxiliar.nombre as nombre_auxiliar',
'auxiliar.apellido_paterno as apellido_paterno_auxiliar',
'auxiliar.apellido_materno as apellido_materno_auxiliar',
'cat_vehiculos.num_economico as vehiculo',
'servicios_progreso.duracion as duracion_servicio',
DB::raw("DATE(servicios_progreso.fecha_ini_servidor) as 'fecha_inicio_servicio'"),
DB::raw("TIME(servicios_progreso.fecha_ini_servidor) as 'hora_inicio_servicio'"),
DB::raw("TIME_FORMAT(TIMEDIFF(servicios_det.fecha_solicitud, servicios_progreso.fecha_ini_servidor),'%Hhr %im %ss') as diferencia"),
'cat_origenes.nombre as origen',
'servicios_progreso.litraje as litraje'
];
$queryBuilder = ServicioDet::select($campos)
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->join('cat_servicios', 'servicios_det.servicio_id', '=', 'cat_servicios.id')
->join('cat_tipos_servicios', 'servicios_det.tipo_servicio_id', '=', 'cat_tipos_servicios.id')
->join('cat_estatus_servicios','servicios_det.estatus_servicio_id','=','cat_estatus_servicios.id')
->join('clientes','servicios_enc.cliente_id','=','clientes.id')
->join('clientes_domicilios','servicios_enc.cliente_domicilio_id','=','clientes_domicilios.id')
->join('users as asesor', 'servicios_det.operador_id', '=', 'asesor.id')
->leftJoin('users as auxiliar', 'servicios_det.auxiliar_1', '=', 'auxiliar.id')
->join('cat_vehiculos', 'servicios_det.vehiculo_id', '=', 'cat_vehiculos.id')
->leftJoin('servicios_progreso', 'servicios_det.id', '=', 'servicios_progreso.servicio_det_id')
->join('cat_origenes', 'servicios_enc.origen_id', '=', 'cat_origenes.id')
->where('servicios_enc.sucursal_id', $sucursal)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->orderBy($orderBy,$order);
if($tipo_servicio != 0){
$queryBuilder->where('servicios_det.tipo_servicio_id', $tipo_servicio);
}
if($estado_servicio != 0){
$queryBuilder->where('servicios_det.estatus_servicio_id', $estado_servicio);
}
if($servicio != 0){
$queryBuilder->where('servicios_det.servicio_id', $servicio);
}
if($origen != 0){
$queryBuilder->where('servicios_enc.origen_id', $origen);
}
if($query = $request->get('query',false)){
$queryBuilder->where(function($q) use ($query){
//$q->where('nombre','like','%' .$query.'%');
});
}
$total_servicios = $queryBuilder->count();
$total_costo = $queryBuilder->sum('servicios_det.costo_servicio');
if($perPage = $request->input('perPage',false)){
$data = $queryBuilder->paginate($perPage)->toArray();
}else{
$data = ['data'=>$queryBuilder->get()];
}
$data['total_servicios'] = $total_servicios;
$data['total_costo'] = $total_costo;
return response()->success($data);
}
public function generarExcel(ServiciosRequest $request){
$sucursal = $request->input('sucursal');
$fecha_inicio = $request->input('fecha_inicio');
$fecha_final = $request->input('fecha_final');
$tipo_servicio = $request->input('tipo_servicio');
$estado_servicio = $request->input('estado_servicio');
$servicio = $request->input('servicio');
$origen = $request->input('origen');
$campos = [
'servicios_enc.id as numero_solicitud',
'servicios_enc.fecha_agenda',
'servicios_det.fecha_solicitud',
'servicios_det.fecha_solicitud as tiempo_atencion',
'cat_servicios.nombre as servicio',
'servicios_det.costo_servicio as costo',
'cat_tipos_servicios.nombre as tipo_servicio',
'cat_estatus_servicios.nombre as estatus_servicio',
'clientes.denominacion as nombre_cliente',
'clientes.email as email_cliente',
DB::raw("CONCAT(clientes_domicilios.calle,' ',clientes_domicilios.num_ext,' ', clientes_domicilios.colonia,' ',clientes_domicilios.cp,' ',clientes_domicilios.ciudad) as domicilio"),
'clientes_domicilios.email as email_domicilio',
DB::raw("CONCAT(asesor.nombre,' ',asesor.apellido_paterno,' ',asesor.apellido_materno) as asesor"),
DB::raw("CONCAT(auxiliar.nombre,' ',auxiliar.apellido_paterno,' ',auxiliar.apellido_materno) as auxiliar"),
'cat_vehiculos.num_economico as vehiculo',
'servicios_progreso.duracion as duracion_servicio',
DB::raw("TIME(servicios_progreso.fecha_ini_servidor) as 'hora_inicio_servicio'"),
DB::raw("TIME_FORMAT(TIMEDIFF(servicios_det.fecha_solicitud, servicios_progreso.fecha_ini_servidor),'%Hhr %im %ss') as diferencia"),
'cat_origenes.nombre as origen',
'servicios_progreso.litraje as litraje',
'servicios_det.facturado as facturado',
'cat_formas_pagos.nombre as forma_pago',
];
$queryBuilder = ServicioDet::select($campos)
->join('servicios_enc', 'servicios_det.servicio_enc_id', '=', 'servicios_enc.id')
->join('cat_servicios', 'servicios_det.servicio_id', '=', 'cat_servicios.id')
->join('cat_tipos_servicios', 'servicios_det.tipo_servicio_id', '=', 'cat_tipos_servicios.id')
->join('cat_estatus_servicios','servicios_det.estatus_servicio_id','=','cat_estatus_servicios.id')
->join('clientes','servicios_enc.cliente_id','=','clientes.id')
->join('clientes_domicilios','servicios_enc.cliente_domicilio_id','=','clientes_domicilios.id')
->join('users as asesor', 'servicios_det.operador_id', '=', 'asesor.id')
->join('cat_formas_pagos', 'cat_formas_pagos.id', '=', 'servicios_enc.forma_pago_id')
->leftJoin('users as auxiliar', 'servicios_det.auxiliar_1', '=', 'auxiliar.id')
->join('cat_vehiculos', 'servicios_det.vehiculo_id', '=', 'cat_vehiculos.id')
->leftJoin('servicios_progreso', 'servicios_det.id', '=', 'servicios_progreso.servicio_det_id')
->join('cat_origenes', 'servicios_enc.origen_id', '=', 'cat_origenes.id')
->where('servicios_enc.sucursal_id', $sucursal)
->whereDate('servicios_det.fecha_solicitud','>=',$fecha_inicio)
->whereDate('servicios_det.fecha_solicitud','<=',$fecha_final)
->orderBy('servicios_enc.id','asc');
if($tipo_servicio != 0){
$queryBuilder->where('servicios_det.tipo_servicio_id', $tipo_servicio);
}
if($estado_servicio != 0){
$queryBuilder->where('servicios_det.estatus_servicio_id', $estado_servicio);
}
if($servicio != 0){
$queryBuilder->where('servicios_det.servicio_id', $servicio);
}
if($origen != 0){
$queryBuilder->where('servicios_enc.origen_id', $origen);
}
$servicios = $queryBuilder->get();
$total = $queryBuilder->count();
$total_costo = $queryBuilder->sum('servicios_det.costo_servicio');
$total_litraje = $queryBuilder->sum('servicios_progreso.litraje');
$nombre_sucursal = Sucursal::where('id', $sucursal)->first();
$titulo = "Reporte de Servicios ".$nombre_sucursal->nombre;
list($y_i, $m_i, $d_i) = explode("-", $fecha_inicio);
list($y_f, $m_f, $d_f) = explode("-", $fecha_final);
$f_i = $d_i."_".$m_i."_".$y_i;
$f_f = $d_f."_".$m_f."_".$y_f;
$nombre = "Reporte_Servicios_".$nombre_sucursal->nombre."_".$f_i."-".$f_f;
foreach ($servicios as $s){
$s->costo = floatval($s->costo);
$s->numero_solicitud = (int)$s->numero_solicitud;
if($s->facturado > 0){
$s->facturado = "Facturado";
}else{
$s->facturado = "No facturado";
}
$s->tiempo_atencion = $this->diferenciaFechas($s->fecha_agenda, $s->fecha_solicitud);
$s->fecha_agenda = $this->formatearFechaHora($s->fecha_agenda);
$s->fecha_solicitud = $this->formatearFechaHora($s->fecha_solicitud);
}
Excel::create($nombre, function($excel) use($servicios, $titulo, $fecha_inicio, $fecha_final, $total, $total_costo, $total_litraje){
// Set the title
$excel->setTitle('Reporte de Servicios');
// Chain the setters
$excel->setCreator('DRENAX')
->setCompany('DRENAX');
// Call them separately
$excel->setDescription('Reporte de Servicios');
$excel->sheet('Reporte_Servicios_Sucursal', function ($sheet) use($servicios, $titulo, $fecha_inicio, $fecha_final, $total, $total_costo, $total_litraje) {
$sheet->setColumnFormat(array(
'G' => '"$"#,##0.00_-',
'C' => 'd/m/y',
'N8' => '"$"#,##0.00_-',
'S' => '#,#',
'P8' => '#,#'
));
//Mostrar logo
$sheet->mergeCells('B2:D6');
$objDrawing = new \PHPExcel_Worksheet_Drawing;
$objDrawing->setPath(resource_path('assets/images/logos').'/logo_drenax.png');
$objDrawing->setWidth(95);
$objDrawing->setHeight(80);
$objDrawing->setCoordinates('B2');
$objDrawing->setOffsetX(9);
$objDrawing->setOffsetY(9);
$objDrawing->setWorksheet($sheet);
$sheet->mergeCells('I2:L6');
$sheet->cell('I2', function($cell) use($titulo) {
$cell->setFontFamily('Aharoni');
$cell->setFontWeight('bold');
$cell->setAlignment('center');
$cell->setValignment('center');
$cell->setFontSize(20);
$cell->setValue($titulo);
});
$sheet->cell('K8', function($cell) use($fecha_inicio) {
list($y, $m, $d) = explode("-", $fecha_inicio);
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Del: '.$d.'/'.$m.'/'.$y);
});
$sheet->cell('L8', function($cell) use($fecha_final) {
list($y, $m, $d) = explode("-", $fecha_final);
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Al: '.$d.'/'.$m.'/'.$y);
});
$sheet->cell('N7', function($cell) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Costo:');
});
$sheet->cell('N8', function($cell) use ($total_costo) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('right');
$cell->setFontSize(12);
$cell->setValue($total_costo);
});
$sheet->cell('O7', function($cell) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Total:');
});
$sheet->cell('O8', function($cell) use($total) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue($total.' Servicios');
});
$sheet->cell('P7', function($cell) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue('Total litros:');
});
$sheet->cell('P8', function($cell) use($total_litraje) {
$cell->setFontFamily('Calibri');
$cell->setAlignment('left');
$cell->setFontSize(12);
$cell->setValue($total_litraje);
});
//Mostar valores de consulta
$sheet->fromArray($servicios, null, 'B9', true);
//Formato en columnas de titulo
$sheet->cells('B9:W9', function ($cells) {
$cells->setBackground('#001870');
$cells->setFontColor('#ffffff');
$cells->setFontSize(13);
$cells->setFontFamily('Calibri');
$cells->setAlignment('left');
$cells->setFontWeight('bold');
});
$sheet->getStyle('B9:R9' , $sheet->getHighestRow())->getAlignment()->setWrapText(true);
//Titulos personalizados
$titulos_cell = [
['cell' => 'B9', 'titulo' => 'Número de solicitud'],
['cell' => 'C9', 'titulo' => 'Fecha y hora de registro'],
['cell' => 'D9', 'titulo' => 'Fecha y hora programada'],
['cell' => 'E9', 'titulo' => 'Tiempo de atención'],
['cell' => 'F9', 'titulo' => 'Servicio'],
['cell' => 'G9', 'titulo' => 'Costo de servicio'],
['cell' => 'H9', 'titulo' => 'Tipo de servicio'],
['cell' => 'I9', 'titulo' => 'Estatus de servicio'],
['cell' => 'J9', 'titulo' => 'Nombre del cliente'],
['cell' => 'K9', 'titulo' => 'Email del cliente'],
['cell' => 'L9', 'titulo' => 'Domicilio de servicio'],
['cell' => 'M9', 'titulo' => 'Email de domicilio'],
['cell' => 'N9', 'titulo' => 'Asesor de operaciones'],
['cell' => 'O9', 'titulo' => 'Auxiliar de operaciones'],
['cell' => 'P9', 'titulo' => 'Vehículo asignado'],
['cell' => 'Q9', 'titulo' => 'Duración del servicio (cronómetro)'],
['cell' => 'R9', 'titulo' => 'Hora inicio'],
['cell' => 'S9', 'titulo' => 'Puntualidad'],
['cell' => 'T9', 'titulo' => 'Origen'],
['cell' => 'U9', 'titulo' => 'Litraje'],
['cell' => 'V9', 'titulo' => 'Facturado'],
['cell' => 'W9', 'titulo' => 'Forma de pago'],
];
foreach ($titulos_cell as $t){
$sheet->cell($t['cell'], function($cell) use($t) {
$cell->setValue($t['titulo']);
});
}
//Size a columnas indicadas
$columns_set = [
'B9', 'C9', 'D9', 'N9', 'O9', 'U9', 'V9', 'W9'
];
foreach ($columns_set as $c){
$set_column = [
$c => [
'width' => ($c == 'O9' || $c == 'Q9')? 23: ($c == 'B9') ? 14 : 20,
'height' => 40
]
];
$sheet->setSize($set_column);
}
//AutoSize en columnas indicadas
$columns_auto= [
'E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W'
];
foreach ($columns_auto as $c){
$sheet->getColumnDimension($c)->setAutoSize(true);
}
$sheet->setWidth(array(
'A' => 3,
));
//Borde
$columns_border= [
'B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W'
];
for ($i=0; $i<= $total; $i++){
$row = 9 + $i;
foreach ($columns_border as $cb){
$border = "$cb$row:$cb$row";
$sheet->cells($border, function ($cells) {
$cells->setBorder('thin', 'thin', 'thin', 'thin');
});
if($row != 9 && ($cb == 'C' || $cb == 'D' || $cb == 'G' || $cb == 'O' || $cb == 'P' || $cb == 'Q' || $cb == 'S' || $cb == 'T')){
$sheet->cells("$cb$row", function ($cells) {
$cells->setAlignment('right');
});
}
}
}
});
})->store('xls', storage_path('app') . '/public/reportes/servicios/');
return response()->success(['nombre_archivo' => $nombre.'.xls?micro='.$this->getMicroSeconds()]);
}
}