/** * Store a newly created resource in storage. * * @param Request $request * @return Response */ public function store(ReporteACPMRequest $request) { if ($request['respuesta'] != 'falso') { \App\ReporteACPM::create(['numeroReporteACPM' => $request['numeroReporteACPM'], 'fechaElaboracionReporteACPM' => $request['fechaElaboracionReporteACPM'], 'descripcionReporteACPM' => $request['descripcionReporteACPM'], 'Compania_idCompania' => \Session::get('idCompania')]); $reporteACPM = \App\ReporteACPM::All()->last(); $contadorDetalle = count($request['ordenReporteACPMDetalle']); for ($i = 0; $i < $contadorDetalle; $i++) { \App\ReporteACPMDetalle::create(['ReporteACPM_idReporteACPM' => $reporteACPM->idReporteACPM, 'ordenReporteACPMDetalle' => $request['ordenReporteACPMDetalle'][$i], 'fechaReporteACPMDetalle' => $request['fechaReporteACPMDetalle'][$i], 'Proceso_idProceso' => $request['Proceso_idProceso'][$i] == '' ? NULL : $request['Proceso_idProceso'][$i], 'Modulo_idModulo' => $request['Modulo_idModulo'][$i], 'tipoReporteACPMDetalle' => $request['tipoReporteACPMDetalle'][$i], 'descripcionReporteACPMDetalle' => $request['descripcionReporteACPMDetalle'][$i], 'analisisReporteACPMDetalle' => $request['analisisReporteACPMDetalle'][$i], 'correccionReporteACPMDetalle' => $request['correccionReporteACPMDetalle'][$i], 'Tercero_idResponsableCorrecion' => $request['Tercero_idResponsableCorrecion'][$i] == '' ? NULL : $request['Tercero_idResponsableCorrecion'][$i], 'planAccionReporteACPMDetalle' => $request['planAccionReporteACPMDetalle'][$i], 'Tercero_idResponsablePlanAccion' => $request['Tercero_idResponsablePlanAccion'][$i] == '' ? NULL : $request['Tercero_idResponsablePlanAccion'][$i], 'fechaEstimadaCierreReporteACPMDetalle' => $request['fechaEstimadaCierreReporteACPMDetalle'][$i], 'estadoActualReporteACPMDetalle' => $request['estadoActualReporteACPMDetalle'][$i], 'fechaCierreReporteACPMDetalle' => $request['fechaCierreReporteACPMDetalle'][$i], 'eficazReporteACPMDetalle' => $request['eficazReporteACPMDetalle'][$i]]); } return redirect('/reporteacpm'); } }
function calcularIndicadores($fecha) { //----------------------------------------------------- // CALCULO DE INDICADORES DEL CUADRO DE MANDO // los indicadores se deben calcular según la formula // creada en el cuadro de mando, adicionalmente, los vamos a // calcular con este proceso diariamente, lo que quiere // decir que se insertarán en la tabla con el valor acumulado // hasta la fecha y solo se insertara un nuevo valor despues // de que haya pasado su fecha de corte //----------------------------------------------------- // FRECUENCIA DE MEDICION // cada indicador tiene asociada una frecuencia, a pesar // de que se calcula cada dia, vamos a tener en cuanta la frecuencia // para saber hasta que dia calculamos el indicador con el acumulado // y apenas llegue a su corte, el siguiente dia creara un nuevo registro // para empezar a acumular de nuevo // TIPOS DE FRECUENCIAS // Semanal. Cortar los dias domingo // Quincenal. Corta cada 2 Domingos // Mensual. corta el ultimo dia del mes // los demas cortan cada X meses el ultimo dia del mes $fecha = strtotime($fecha); // guardamos la fecha de hoy para los indicadores Diarios $dia = date("Y-m-d", $fecha); // consultamos la fecha del proximo domingo //la semana tiene 7 dias, si tomamos 7 - dia actual tendremos los dias que faltan para domingo // luego sumamos a la fecha de hoy esos dias $dias = 7 - date("w", $fecha); $semanaFin = date('Y-m-d', strtotime("+ {$dias} day", $fecha)); $semanaIni = date('Y-m-d', strtotime("- 6 day", strtotime($semanaFin))); // consultamos la fecha de la proxima Quincena // por lo tanto asumimos que sera los dias 15 o el ultimo dia del mes // miramos cual es el mas cerca y tomamos ese // verificamos si la fecha actual es menor a 15, entonces tomamos 15, sino buscamos ultimo dia del mes $quincenaFin = date('Y-m', $fecha) . '-' . (date('d', $fecha) <= 15 ? '15' : date("t", strtotime(date("Y-m", $fecha)))); $quincenaIni = date('Y-m', strtotime($quincenaFin)) . '-' . (date('d', strtotime($quincenaFin)) <= 15 ? '01' : date("t", strtotime(date("Y-m", strtotime($quincenaFin))))); // Consultamos la fecha del ultimo dia del mes $mesFin = date('Y-m', $fecha) . '-' . date("t", strtotime(date("Y-m", $fecha))); $mesIni = date('Y-m', strtotime($mesFin)) . '-01'; // Para el bimestreFin verificamos si el mes actual es PAR, sino entonces le sumamos 1 al mes para obtenerlo if (intval(date('m', $fecha)) % 2 == 0) { $bimestreFin = date('Y-m', $fecha) . '-' . date("t", strtotime(date("Y-m", $fecha))); } else { $proximoMes = date('Y-m', strtotime("+ 1 month", $fecha)); $bimestreFin = date('Y-m', $fecha) . '-' . date("t", strtotime($proximoMes)); } $bimestreIni = date('Y-m', strtotime("- 2 months", strtotime($bimestreFin))) . '-01'; // Para el trimestreFin verificamos si el mes actual es multiplo de 3, sino entonces debemos llegar hasta el multiplo de 3 if (intval(date('m', $fecha)) % 3 == 0) { $trimestreFin = date('Y-m', $fecha) . '-' . date("t", strtotime(date("Y-m", $fecha))); } else { $numeroMes = date('m', $fecha); while (intval($numeroMes) % 3 != 0) { $numeroMes++; } $proximoMes = date('Y-' . $numeroMes, $fecha); $trimestreFin = date('Y-', $fecha) . str_pad($numeroMes, 2, '0', STR_PAD_LEFT) . '-' . date("t", strtotime($proximoMes)); } $trimestreIni = date('Y-m', strtotime("- 3 months", strtotime($trimestreFin))) . '-01'; // consultamos la fecha del proximo semestreFin // por lo tanto asumimos que sera en junio o Diciembre, miramos cual es el mas cerca y tomamos ese // verificamos si la fecha actual es menor a JUNIO, entonces tomamos ese, sino Tomamos Diciembre $semestreFin = date('Y-', $fecha) . (date('m', $fecha) <= 6 ? str_pad('6', 2, '0', STR_PAD_LEFT) . '-30' : str_pad('12', 2, '0', STR_PAD_LEFT) . '-31'); $semestreIni = date('Y-m', strtotime("- 6 months", strtotime($semestreFin))) . '-01'; // por ultimo la fecha del ultimo dia del año, que siempre sera fija $anioFin = date('Y-12-31', $fecha); $anioIni = date('Y-01-01', $fecha); // echo $dia.'<br>'; // echo $semanaIni.' - '.$semanaFin.'<br>'; // echo $quincenaIni.' - '.$quincenaFin.'<br>'; // echo $mesIni.' - '.$mesFin.'<br>'; // echo $bimestreIni.' - '.$bimestreFin.'<br>'; // echo $trimestreIni.' - '.$trimestreFin.'<br>'; // echo $semestreIni.' - '.$semestreFin.'<br>'; // echo $anioIni.' - '.$anioFin.'<br>'; $cuadroMandoObjeto = DB::table('cuadromando as CM')->leftJoin('frecuenciamedicion as FM', 'CM.FrecuenciaMedicion_idFrecuenciaMedicion', '=', 'FM.idFrecuenciaMedicion')->select(DB::raw('idCuadroMando, indicadorCuadroMando, formulaCuadroMando, valorFrecuenciaMedicion, unidadFrecuenciaMedicion, operadorMetaCuadroMando, valorMetaCuadroMando, tipoMetaCuadroMando, Proceso_idProceso'))->where('CM.Compania_idCompania', '=', \Session::get('idCompania'))->orderby('idCuadroMando')->get(); // por facilidad de manejo convierto el stdclass a tipo array con un cast (array) $CuadroMando = array(); foreach ($cuadroMandoObjeto as $key => $value) { $CuadroMando[] = (array) $value; } // recorremos cada indicador para calcularlo y almacenar su resultado en la tabla de indicadores for ($i = 0; $i < count($CuadroMando); $i++) { // echo $CuadroMando[$i]["idCuadroMando"].'<br>'; // verificamos la periodicidad del indicador para tomar la fecha de corte // este dato depende del valor y la unidad de frecuencia switch ($CuadroMando[$i]["unidadFrecuenciaMedicion"]) { case 'Dias': $fechaIni = $dia; $fechaCorte = $dia; break; case 'Semanas': switch ($CuadroMando[$i]["valorFrecuenciaMedicion"]) { case 1: $fechaIni = $semanaIni; $fechaCorte = $semanaFin; break; case 2: $fechaIni = $quincenaIni; $fechaCorte = $quincenaFin; break; default: $fechaIni = $semanaIni; $fechaCorte = $semanaFin; break; } break; case 'Meses': switch ($CuadroMando[$i]["valorFrecuenciaMedicion"]) { case 1: $fechaIni = $mesIni; $fechaCorte = $mesFin; break; case 2: $fechaIni = $bimestreIni; $fechaCorte = $bimestreFin; break; case 3: $fechaIni = $trimestreIni; $fechaCorte = $trimestreFin; break; case 6: $fechaIni = $semestreIni; $fechaCorte = $semestreFin; break; default: $fechaIni = $mesIni; $fechaCorte = $mesFin; break; } break; case 'Años': $fechaIni = $anioIni; $fechaCorte = $anioFin; break; default: $fechaIni = $dia; $fechaCorte = $dia; break; } $resultado = calcularFormula($CuadroMando[$i]["idCuadroMando"], $fechaIni, $fechaCorte); // Evaluamos si el resultado cumple con la meta del indicador siempre y cuando ya sea la fecha de su corte // si no cumple con la meta, insertamos un registro en el ACPM (Accion Correctiva) // Armamos una comparacion concatenada para luego ejecutarla con el evalecho $resp = ''; eval('$resp = (' . $resultado . ' ' . $CuadroMando[$i]["operadorMetaCuadroMando"] . ' ' . $CuadroMando[$i]["valorMetaCuadroMando"] . ' ? "Si" : "No");'); // echo $resp; if ($resp == 'No') { $reporteACPM = \App\ReporteACPM::All()->last(); \App\ReporteACPMDetalle::create(['ReporteACPM_idReporteACPM' => $reporteACPM->idReporteACPM, 'ordenReporteACPMDetalle' => 0, 'fechaReporteACPMDetalle' => date("Y-m-d"), 'Proceso_idProceso' => $CuadroMando[$i]['Proceso_idProceso'], 'Modulo_idModulo' => 1, 'tipoReporteACPMDetalle' => 'Correctiva', 'descripcionReporteACPMDetalle' => 'El indicador ' . $CuadroMando[$i]['indicadorCuadroMando'] . ' no cumple la meta (Valor ' . $resultado . ' Meta ' . $CuadroMando[$i]["operadorMetaCuadroMando"] . ' ' . $CuadroMando[$i]["valorMetaCuadroMando"] . ' ' . $CuadroMando[$i]["tipoMetaCuadroMando"] . ')', 'analisisReporteACPMDetalle' => '', 'correccionReporteACPMDetalle' => '', 'Tercero_idResponsableCorrecion' => NULL, 'planAccionReporteACPMDetalle' => '', 'Tercero_idResponsablePlanAccion' => NULL, 'fechaEstimadaCierreReporteACPMDetalle' => '0000-00-00', 'estadoActualReporteACPMDetalle' => '', 'fechaCierreReporteACPMDetalle' => '0000-00-00', 'eficazReporteACPMDetalle' => 0]); } // verificamos si el resultado hay que insertarlo o actualizarlo en la tabla de indicadores // esto depende de su periodicidad, por lo tanto la verificamos y tomamos la fecha del corte // siya existe en la tabla el idCuadroMando con la fecha de corte, y esta es igual tambien a // la fecha de calculao, entonces debemos Insertar uno nuevo, sino actulaizamos el existente $indice = array('CuadroMando_idCuadroMando' => $CuadroMando[$i]["idCuadroMando"], 'fechaCorteIndicador' => $fechaCorte); $data = array('fechaCalculoIndicador' => date("Y-m-d", $fecha), 'valorIndicador' => $resultado); $indicador = \App\Indicador::updateOrCreate($indice, $data); } return; }
public function guardarReporteACPM($fechaAccion, $idModulo, $tipoAccion, $descripcionAccion) { $reporteACPM = \App\ReporteACPM::All()->last(); \App\ReporteACPMDetalle::create(['ReporteACPM_idReporteACPM' => $reporteACPM->idReporteACPM, 'ordenReporteACPMDetalle' => 0, 'fechaReporteACPMDetalle' => $fechaAccion, 'Proceso_idProceso' => NULL, 'Modulo_idModulo' => $idModulo, 'tipoReporteACPMDetalle' => $tipoAccion, 'descripcionReporteACPMDetalle' => $descripcionAccion, 'analisisReporteACPMDetalle' => '', 'correccionReporteACPMDetalle' => '', 'Tercero_idResponsableCorrecion' => NULL, 'planAccionReporteACPMDetalle' => '', 'Tercero_idResponsablePlanAccion' => NULL, 'fechaEstimadaCierreReporteACPMDetalle' => '0000-00-00', 'estadoActualReporteACPMDetalle' => '', 'fechaCierreReporteACPMDetalle' => '0000-00-00', 'eficazReporteACPMDetalle' => 0]); }