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,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()]);
}
}