/**
  * Initialize data
  */
 public function getInitialData()
 {
     if (isset($this->task->task_request)) {
         $this->requisicion = Requisicion::findByEFID($this->task->task_request);
         $this->requisicion->lineas;
         foreach ($this->requisicion->lineas as $linea) {
             $linea->producto;
         }
     }
 }
Esempio n. 2
0
 /**
  * Devuelve el status de la solicitud de EF asociada a una requisición externa
  * @return type
  */
 public function ef_status($ext_id)
 {
     // Traer registro atado a ext id
     $requisicion = Requisicion::where('ext_id', $ext_id)->with('ef_request.open_tasks.step', 'ef_request.open_tasks.user')->first();
     if ($requisicion) {
         $task = $requisicion->ef_request->open_tasks[0];
     } else {
         return [];
     }
     return ['step_id' => $task->step->step_id, 'step_name' => $task->step->step_name, 'user_id' => $task->user->user_id, 'user_name' => $task->user->user_name];
 }
Esempio n. 3
0
function requisicionFinalizada($requestId)
{
    $messageArray = array("message_value" => "Solicitud finalizada con éxito!", "message_type" => "success");
    $request = Request::find($requestId);
    // Enviar mails
    $emails = [];
    $user = User::find(Request::find($requestId)->request_createdby);
    if ($user) {
        if (filter_var($user->user_email, FILTER_VALIDATE_EMAIL)) {
            $emails[] = ['email' => $user->user_email];
        }
    }
    $user = User::find(\RequestMetadataCore::get($requestId, "ADQ-APROBADOR-REQUISICION"));
    if ($user) {
        if (filter_var($user->user_email, FILTER_VALIDATE_EMAIL)) {
            $emails[] = ['email' => $user->user_email];
        }
    }
    $subject = "AVISO: Requisición finalizada";
    $requisicion = Requisicion::where('ef_id', $requestId)->first();
    MailController::sendGeneralMail($emails, $subject, view('Adquisiciones.Emails.requisicion_cancelada', compact('request', 'requisicion')));
    return $messageArray;
}
 /**
  * Consolida las requisiciones correspondientes y mueve las solicitudes en EF
  * @return Array
  */
 public function consolidarRequisiciones()
 {
     $returnArray = array('status' => true, 'message' => '');
     $input = Request::createFromGlobals();
     $requestCore = new \RequestCore();
     $flow = $_SESSION['user_flow'];
     $step = FlowSettings::get($_SESSION['user_flow'], 'ADQ_STEP_CONSOLIDATION');
     $requisiciones = Requisicion::getRequisicionesParaConsolidar();
     $ordenescompra = OrdenCompra::getOrdenesCompraParaConsolidar();
     // Tomar la tarea actual, si no está completada salir
     foreach ($requisiciones as $requisicion) {
         if ($requisicion->asignada_totalmente == 0) {
             $returnArray['status'] = false;
             $returnArray['message'] = 'La requisición ' . $requisicion->id . ' no se encuentra asignada por completo. No se puede continuar';
             return $returnArray;
         }
     }
     // Cambiar estado de las ordenes de compra cuyas requisiciones estén totalmente asignadas
     foreach ($ordenescompra as $ordencompra) {
         $ordencompra->estado = 'C';
         $ordencompra->save();
     }
     foreach ($requisiciones as $requisicion) {
         // Solo completar tareas de requisiciones asignadas totalmente
         if ($requisicion->asignada_totalmente == 1) {
             // Cambiar estado a 'C' (Consolidada)
             $requisicion->estado = 'C';
             $requisicion->save();
             $task = $requisicion->ef_request->open_tasks[0];
             // Completar tareas diferentes a la actual
             // (No se completa la actual porque EF lo hace por default)
             if ($task->task_id != $input->task_id) {
                 $requestCore->completeTask($task->task_request, $task->task_id, $input->flow_id, $input->step_id, $input->user_id, 'Requisición consolidada por el usuario ' . $_SESSION['user_id'], 'next');
             }
         }
     }
     return $returnArray;
 }
 public function procesarOrdenesCompra()
 {
     $input = Request::createFromGlobals();
     $returnArray = array('status' => true, 'message' => '');
     $requestCore = new \RequestCore();
     $arrayRequisiciones = [];
     // Traer ordenes de compra
     $ordenes_compra = $this->getOrdenesCompra($input->request_id);
     // Iterar las ordenes de compra
     foreach ($ordenes_compra as $orden_compra) {
         // Verificar solo las que tengan cotización seleccionada
         $seleccionada = false;
         $cotizaciones = $orden_compra->cotizaciones;
         foreach ($cotizaciones as $cotizacion) {
             if ($cotizacion->estado == 'S') {
                 $seleccionada = true;
                 break;
             }
         }
         if ($seleccionada) {
             // Actualizar cabecera de OC
             $orden_compra->update(['estado' => 'S']);
             // Llenar arreglo con número de requisiciones correspondientes
             foreach ($orden_compra->lineas as $linea) {
                 $arrayRequisiciones[] = $linea->linea_requisicion->requisicion->id;
             }
         }
     }
     // Mover ef_requests correspondientes
     $arrayRequisiciones = array_unique($arrayRequisiciones);
     foreach ($arrayRequisiciones as $id_requisicion) {
         $requisicion = Requisicion::find($id_requisicion);
         $task = $requisicion->ef_request->open_tasks[0];
         // Completar tareas diferentes a la actual
         // (No se completa la actual porque EF lo hace por default)
         if ($task->task_id != $input->task_id) {
             $requestCore->completeTask($task->task_request, $task->task_id, $input->flow_id, $input->step_id, $input->user_id, 'Proveedor seleccionado por el usuario ' . $_SESSION['user_id'], 'next');
         }
     }
     return $returnArray;
 }
Esempio n. 6
0
 public function recibirOrdenCompra()
 {
     $input = Request::createFromGlobals();
     $handlerWebServiceCore = new WebServiceCore();
     $handlerRequestCore = new RequestCore();
     $requisicionesRecibidas = [];
     $recepcionesEfectivas = [];
     foreach ($input->lineas as $linea) {
         if ($linea['esta_recepcion'] > 0) {
             $linea_ordencompra = OrdenCompraLinea::with(['linea_requisicion.requisicion', 'producto'])->find($linea['id']);
             // Consumir Web Service de recepción haciendas
             if ($linea_ordencompra->linea_requisicion->requisicion->id_clase == 1) {
                 $wsdl = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_RECIBEOCHACIENDAS_WSDL");
                 $operation = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_RECIBEOCHACIENDAS_OPERATION");
                 $namespace = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_RECIBEOCHACIENDAS_NAMESPACE");
                 $soapAction = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_RECIBEOCHACIENDAS_SOAPACTION");
                 $params = ['Longvarchar' => json_encode(['HcHacId' => $linea_ordencompra->linea_requisicion->bodega_haciendas, 'Pro' => [['ProId' => $linea_ordencompra->producto->codigo, 'ProCan' => $linea['esta_recepcion']]]])];
                 $result = $handlerWebServiceCore->callWebService($wsdl, $operation, $namespace, $soapAction, $params, true);
                 if (!$result) {
                     return 'Error al consumir servicio de Kardex. Imposible continuar';
                 }
                 if ($result['Gx_msg'] != '') {
                     return $result['Gx_msg'];
                 }
             }
             $recepcion_efectiva = RecepcionEfectiva::create(['id_ordencompra' => $linea['id_ordencompra'], 'id_ordencompra_linea' => $linea['id'], 'fecha' => date('Y-m-d'), 'cantidad' => $linea['esta_recepcion']]);
             if ($input->tipo_factura == 'fisica') {
                 $recepcion_efectiva->update(['num_documento' => $input->num_factura]);
             } else {
                 $recepcion_efectiva->update(['id_documento' => $input->factura]);
             }
             $recepcionesEfectivas[] = $recepcion_efectiva;
             $requisicionesRecibidas[$linea_ordencompra->linea_requisicion->requisicion->id][] = ['producto' => $linea_ordencompra->producto->codigo . ' - ' . $linea_ordencompra->producto->nombre, 'observacion' => $linea_ordencompra->linea_requisicion->observacion_creador, 'cantidad' => $linea['esta_recepcion']];
         }
     }
     // Validar si la orden se ha recibido completamente y actualizar estado
     $ordencompra = OrdenCompra::with(['lineas', 'recepciones_efectivas'])->find($input->id_ordencompra);
     $estado = 'T';
     foreach ($ordencompra->lineas as $linea) {
         if ($linea->cantidad_recibida < $linea->cantidad) {
             $estado = 'P';
             break;
         }
     }
     $ordencompra->update(['estado' => $estado]);
     // Consumir web service de recepción bpcs
     $ordencompra->fresh();
     $wsdl = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_ESTADOSOC_WSDL");
     $operation = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_ESTADOSOC_OPERATION");
     $namespace = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_ESTADOSOC_NAMESPACE");
     $soapAction = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_ESTADOSOC_SOAPACTION");
     $params = ['Hph_phord' => $ordencompra->ext_id, 'Tipo' => 'UPOR', 'Estado' => $ordencompra->recibido_totalmente ? 3 : 2, 'Cantidad' => $ordencompra->cantidad_recibida];
     $result = $handlerWebServiceCore->callWebService($wsdl, $operation, $namespace, $soapAction, $params, true);
     if (!$result) {
         return 'Error al consumir servicio de actualización de estado BPCS. Imposible continuar';
     }
     if ($result['Mensaje'] != '') {
         return $result['Mensaje'];
     }
     foreach ($requisicionesRecibidas as $id_requisicion => $lineas_requisicion) {
         // Notificar a los usuarios
         $requisicion = Requisicion::find($id_requisicion);
         $usuario = User::find($requisicion->id_solicitante);
         $jefe = $usuario->boss;
         $users_email = [];
         $users_email[] = ['email' => $usuario->user_email];
         if ($jefe) {
             $users_email[] = ['email' => $jefe->user_email];
         }
         $users_email[] = ['email' => '*****@*****.**'];
         foreach ($users_email as $user) {
             MailController::sendGeneralMail([$user], 'Líneas de requisición ' . $requisicion->id . ' recibidas', view('Adquisiciones.Emails.lineas_requisicion_recibidas', compact('requisicion', 'usuario', 'lineas_requisicion')));
         }
     }
     // Generar PDF y adjuntar a requisiciones asociadas. Guardar el path del archivo en el campo description
     // de las recepciones para asociarlo
     $pdf = $this->generarPDFRecepcion($ordencompra);
     // Adjuntar a requisiciones
     foreach ($requisicionesRecibidas as $id_requisicion => $lineas) {
         $requisicion = Requisicion::find($id_requisicion);
         (new \AttachmentCore())->addAttachmentToRequest($requisicion['ef_id'], \FlowSettingsCore::get(FLOW_ADQUISICIONES, 'ADQ_FILE_CONTABILIDAD'), $pdf, APP_ENVPATH, $_SESSION['user_id'], "Documento de contabilidad");
     }
     // Si la orden de compra fue recibida completamente cerrar la solicitud / las solicitudes para la requisición
     $ef_requests = [];
     if ($ordencompra->estado == 'T') {
         $ordencompra = OrdenCompra::with('lineas.linea_requisicion.requisicion.ef_request')->find($ordencompra->id);
         foreach ($ordencompra->lineas as $linea_ordencompra) {
             $ef_requests[] = $linea_ordencompra->linea_requisicion->requisicion->ef_request->request_id;
         }
         $ef_requests = array_unique($ef_requests);
         foreach ($ef_requests as $request_id) {
             $requisicion_recibida = true;
             // Verificar si todas las líneas de la requisición asociada están recibidas
             $requisicion = Requisicion::where('ef_id', $request_id)->with('lineas.lineas_ordencompra')->first();
             foreach ($requisicion->lineas as $linea_requisicion) {
                 foreach ($linea_requisicion->lineas_ordencompra as $linea_ordencompra) {
                     if ($linea_ordencompra->cantidad_recibida < $linea_ordencompra->cantidad) {
                         $requisicion_recibida = false;
                     }
                 }
             }
             // Cerrar si la requisición está recibida
             if ($requisicion_recibida) {
                 $result = $handlerRequestCore->closeRequest($request_id, $_SESSION['user_id']);
             }
         }
     }
 }
 public function AprobarCotizacion()
 {
     $input = Request::createFromGlobals();
     $returnArray = array("status" => true, "message" => "");
     $requestCore = new \RequestCore();
     $arrayRequisiciones = [];
     // Traer ordenes de compra
     $ordenes_compra = $this->getCotizaciones($input->request_id);
     foreach ($ordenes_compra as $orden_compra) {
         // Iterar las cotizaciones
         foreach ($orden_compra->cotizaciones as $cotizacion) {
             if ($cotizacion->estado == "S") {
                 // Depende del siguiente paso:
                 // - Si es selección de proveedor cambiar el estado de OC a 'I' - Ingresada
                 // - Si es generación de OC cambiar el estado a 'A' - Aprobada. Copiar cantidades de Cotización
                 if ($input->step_id == FlowSettings::get($_SESSION['user_flow'], 'ADQ_STEP_SELECCIONPROV')) {
                     $cotizacion->ordencompra->update(['estado' => 'I']);
                 } else {
                     // Actualizar cabecera de OC
                     $cotizacion->ordencompra->update(['id_proveedor' => $cotizacion->contacto->id_proveedor, 'forma_pago' => $cotizacion->forma_pago, 'tiempo_entrega' => $cotizacion->tiempo_entrega, 'bodega' => FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_BODEGA_DEFAULT_OC"), 'id_aprobador_cotizacion' => $_SESSION['user_id'], 'id_aprobador_ordencompra' => $_SESSION['user_id'], 'estado' => 'A']);
                     // Actualizar líneas de OC
                     foreach ($cotizacion->lineas as $linea) {
                         $linea->linea_ordencompra->update(['cantidad' => $linea->cantidad, 'valor' => $linea->valor_unitario_final, 'observacion' => $linea->observacion, 'estado' => 'A']);
                     }
                 }
                 // Llenar arreglo con número de requisiciones correspondientes
                 foreach ($cotizacion->lineas as $linea) {
                     $arrayRequisiciones[] = $linea->linea_ordencompra->linea_requisicion->requisicion->id;
                 }
             }
         }
     }
     // Mover ef_requests correspondientes
     $arrayRequisiciones = array_unique($arrayRequisiciones);
     foreach ($arrayRequisiciones as $id_requisicion) {
         $requisicion = Requisicion::find($id_requisicion);
         $task = $requisicion->ef_request->open_tasks[0];
         // Completar tareas diferentes a la actual
         // (No se completa la actual porque EF lo hace por default)
         if ($task->task_id != $input->task_id) {
             // TODO: Este valor cambia de acuerdo al siguiente paso
             if ($input->step_id == FlowSettings::get($_SESSION['user_flow'], 'ADQ_STEP_SELECCIONPROV')) {
                 $description = 'Cotización no aprobada';
             } else {
                 $description = 'Cotización aprobada por el usuario ' . $_SESSION['user_id'];
             }
             $requestCore->completeTask($task->task_request, $task->task_id, $input->flow_id, $input->step_id, $input->user_id, $description, 'next');
         }
     }
     return $returnArray;
 }
 public function generarPDF()
 {
     $input = Request::createFromGlobals();
     $requisicion = Requisicion::findByEFID($input->request_id);
     $filename = APP_TMPPATH . 'requisicion.pdf';
     PDFController::generatePDF(view('Adquisiciones.PDF.requisicion', ['requisicion' => $requisicion]), false, $filename);
     (new \AttachmentCore())->addAttachmentToRequest($input->request_id, \FlowSettingsCore::get(FLOW_ADQUISICIONES, 'ADQ_FILE_REQUISICION'), $filename, APP_ENVPATH, $_SESSION['user_id'], "Requisición " . $requisicion->id);
     return array("status" => true, "message" => "");
 }
 public function generarOrdenCompra()
 {
     $input = Request::createFromGlobals();
     $returnArray = array("status" => true, "message" => "");
     $requestCore = new \RequestCore();
     $arrayRequisiciones = [];
     $ordenes_compra = $this->getOrdenesCompra($input->request_id);
     $handlerWebServiceCore = new WebServiceCore();
     foreach ($ordenes_compra as $orden_compra) {
         $clase = Clase::find($orden_compra->id_clase);
         if ($orden_compra->ext_id == '') {
             $wsdl = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_CREAOCHACIENDAS_WSDL");
             $operation = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_CREAOCHACIENDAS_OPERATION");
             $namespace = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_CREAOCHACIENDAS_NAMESPACE");
             $soapAction = FlowSettings::get(FLOW_ADQUISICIONES, "ADQ_WS_CREAOCHACIENDAS_SOAPACTION");
             $params = ['Tipo' => 'OCRE', 'Hph_phwhse' => $orden_compra->bodega, 'Hph_phvend' => $orden_compra->proveedor->codigo, 'Hph_phbamt' => $orden_compra->valor_total, 'Hpo_pprod' => $clase->bien_economico, 'Hpo_pqord' => $orden_compra->cantidad_total, 'Hpo_pecst' => $orden_compra->valor_total, 'Hpo_podesc' => 'Orden de compra BPM - ' . $orden_compra->id];
             $result = $handlerWebServiceCore->callWebService($wsdl, $operation, $namespace, $soapAction, $params, true);
             if (!$result) {
                 $returnArray['status'] = false;
                 $returnArray['message'] = 'No se pudo consumir el servicio web para creación de orden de compra';
                 return;
             }
             if ($result['Longvarchar'] != '') {
                 $returnArray['status'] = false;
                 $returnArray['message'] = 'Error BPCS: ' . $result['Longvarchar'];
                 return;
             }
             $numero_oc = $result['Hph_phord'];
             // Cambiar estado de orden de compra
             $orden_compra->update(['estado' => 'G', 'fecha_creacion_erp' => date('Y-m-d H:i:s'), 'id_creador' => $_SESSION['user_id'], 'ext_id' => $numero_oc]);
             // Agregar recepción planificada del total de OC
             RecepcionPlanificada::create(['id_ordencompra' => $orden_compra->id, 'fecha' => date('Y-m-d', strtotime('+' . $orden_compra->tiempo_entrega . ' day')), 'observacion' => 'Entrega total estimada de la orden de compra']);
             // Llenar arreglo con número de requisiciones correspondientes
             foreach ($orden_compra->lineas as $linea) {
                 $arrayRequisiciones[] = $linea->linea_requisicion->requisicion->id;
             }
             // Guardar registros de precio en la base de datos
             foreach ($orden_compra->lineas as $linea) {
                 ProductoPrecio::create(['id_producto' => $linea->id_producto, 'id_proveedor' => $orden_compra->id_proveedor, 'fecha' => date('Y-m-d H:i:s'), 'precio' => $linea->valor, 'tiempo' => $orden_compra->tiempo_entrega]);
             }
             // Notificar a responsable(s) de bodega
             $responsableArray = explode(',', $orden_compra->clase->responsable_bodegas);
             // Notificar a usuarios creadores de requisición
             foreach ($orden_compra->lineas as $linea) {
                 $responsableArray[] = $linea->linea_requisicion->requisicion->id_solicitante;
             }
             $responsableArray = array_unique($responsableArray);
             foreach ($responsableArray as $responsable) {
                 $usuario = User::find($responsable);
                 if ($usuario) {
                     MailController::sendGeneralMail([['email' => $usuario->user_email]], 'Nueva Orden de Compra generada - ' . $orden_compra->clase->nombre, view('Adquisiciones.Emails.orden_compra_interna', compact('usuario', 'orden_compra')));
                 }
             }
             // Notificar a proveedor
             // Consultar la cotización seleccionada para la OC
             $cotizacion_seleccionada = Cotizacion::with(['lineas.linea_ordencompra.producto', 'contacto.proveedor'])->whereEstado('S')->whereIdOrdencompra($orden_compra->id)->first();
             MailController::sendGeneralMail([['email' => $cotizacion_seleccionada->contacto->email]], 'Nueva orden de compra', view('Adquisiciones.Emails.orden_compra_proveedor', compact('orden_compra', 'cotizacion_seleccionada')));
         }
     }
     // Mover ef_requests correspondientes
     $arrayRequisiciones = array_unique($arrayRequisiciones);
     foreach ($arrayRequisiciones as $id_requisicion) {
         $requisicion = Requisicion::find($id_requisicion);
         $task = $requisicion->ef_request->open_tasks[0];
         $this->generarOrdenCompraPDF($task->task_request);
         // Completar tareas diferentes a la actual
         // (No se completa la actual porque EF lo hace por default)
         if ($task->task_id != $input->task_id) {
             $requestCore->completeTask($task->task_request, $task->task_id, $input->flow_id, $input->step_id, $input->user_id, 'Orden de compra generada en el ERP', 'next');
         }
         // Generar PDF de orden de compra y adjuntar a solicitud
         $this->generarOrdenCompraPDF($task->task_request);
     }
     return $returnArray;
 }
Esempio n. 10
0
 /**
  * Devuelve las requisiciones que cumplan con las siguientes características
  *  - Que su ef_request esté en el proceso de 'Adquisiciones'
  * 	- Que su ef_request esté en el paso de 'Aprobar requisición'
  * 	- Que su estado sea 'A' (Aprobado)
  *  - Que su origen y clase sea igual al origen de la requisición con $id_padre (opcional)
  * @param String $id_padre 
  * @return Requisiciones
  */
 public static function getRequisicionesParaConsolidar($id_padre = '')
 {
     // Filtro de estado
     $query = self::estado('A');
     // Filtro de clase
     $requisicion_padre = Requisicion::find($id_padre);
     if ($requisicion_padre) {
         $query->whereIdClase($requisicion_padre->id_clase);
     }
     // Filtro de status de solicitud EF
     $flow = FLOW_ADQUISICIONES;
     $step = FlowSettings::get($flow, 'ADQ_STEP_SELECCIONPROV');
     $query->whereHas('ef_request.open_tasks', function ($query) use($flow, $step) {
         $query->whereTaskFlow($flow)->whereTaskStep($step);
     });
     // Agregar relaciones
     $query->with(['ef_request.open_tasks', 'proveedor', 'clase'])->with(['lineas' => function ($query) {
         $query->with('producto')->where('estado', '!=', 'I');
     }]);
     return $query->get();
 }
 public static function ingresarRequisicionesYSolicitudes($datos_requisicion)
 {
     $handlerRequestCore = new \RequestCore();
     $handlerUserCore = new \UserCore();
     $handlerFlowCore = new \FlowCore();
     $handlerFlowSettingsCore = new \FlowSettingsCore();
     // Tomar cada una de las requisiciones del arreglo de entrada
     foreach ($datos_requisicion as $requisicion) {
         // Extraer datos de cabecera y líneas
         $cabecera = $requisicion['cabecera'];
         $lineas = $requisicion['lineas'];
         $clase = Clase::find($cabecera['id_clase']);
         // Validaciones
         $aprobadores = explode(',', $clase->aprobador_requisicion);
         if (count($aprobadores) == 0) {
             return 'No existen aprobadores para la clase "' . $clase->nombre . '". Imposible continuar';
         }
         // Si ya se estableció un solicitante y el valor no está vacío lo busco en EasyFlow
         // Si este último no existe en EF asignar el primer usuario aprobador como solicitante
         if (isset($cabecera['id_solicitante']) && !empty($cabecera['id_solicitante'])) {
             $solicitante = User::with('area')->find($cabecera['id_solicitante']);
         }
         if (!$solicitante) {
             return 'No existe el usuario en el BPM, imposible continuar';
         }
         // Paso personalizado para cada clase
         $flow = Flow::find(FLOW_ADQUISICIONES);
         $first_step = $flow->flow_first_step;
         if ($clase->primer_paso != null || $clase->primer_paso == '' || $clase->primer_paso != 0) {
             $step = Step::whereStepFlow($flow->flow_id)->whereStepId($clase->primer_paso)->first();
             if ($step) {
                 $first_step = $step->step_id;
             }
         }
         // Crear solicitud EF
         $request_flow = $flow->flow_id;
         $request_id = $handlerRequestCore->getLastGeneralRequestId() + 1;
         $inner_request_id = $handlerRequestCore->getLastGeneralRequestId($request_flow) + 1;
         if ($clase->id == 11) {
             $request_name = $request_description = 'Requisición - ' . $solicitante->user_name . ' - Hacienda: ' . ucwords(strtolower($cabecera['nombre_cc']));
         } else {
             $request_name = $request_description = 'Requisición - ' . $solicitante->user_name . ' - Departamento: ' . ucwords(strtolower($cabecera['nombre_cc']));
         }
         $request_createdby = $solicitante->user_id;
         // Si el aprobador de requisición está seteado como 'boss'
         if ($clase->aprobador_requisicion == 'boss') {
             // Si el usuario tiene seteado un aprobador
             if ($solicitante->user_reports_to != '') {
                 // Si este aprobador existe
                 $user_reports_to = User::find($solicitante->user_reports_to);
                 if ($user_reports_to) {
                     $request_assignedto = $user_reports_to->user_id;
                 } else {
                     $request_assignedto = $solicitante->user_id;
                 }
             } else {
                 $request_assignedto = $solicitante->user_id;
             }
         } else {
             $request_assignedto = $clase->aprobador_requisicion;
         }
         $request_start_step = $clase->primer_paso;
         $handlerRequestCore->createNewRequest($request_id, $inner_request_id, $request_flow, $request_name, $request_description, $request_createdby, $request_assignedto, $request_start_step);
         // Crear cabecera de requisición
         $requisicionCabecera = Requisicion::create(array('ef_id' => $request_id, 'ext_id' => isset($cabecera['ext_id']) ? $cabecera['ext_id'] : null, 'id_clase' => $clase->id, 'fecha_inicio' => date('Y-m-d H:i:s'), 'fecha_estimada_fin' => isset($cabecera['fecha_estimada_fin']) ? $cabecera['fecha_estimada_fin'] : null, 'fecha_fin' => null, 'id_solicitante' => $solicitante->user_id, 'nombre_solicitante' => $solicitante->user_name, 'id_cc' => isset($cabecera['id_cc']) ? $cabecera['id_cc'] : $solicitante->area->id, 'nombre_cc' => isset($cabecera['nombre_cc']) ? $cabecera['nombre_cc'] : $solicitante->area->nombre, 'descripcion' => isset($cabecera['descripcion']) ? $cabecera['descripcion'] : null, 'observaciones' => isset($cabecera['observaciones']) ? $cabecera['observaciones'] : null, 'prioridad' => isset($cabecera['prioridad']) ? $cabecera['prioridad'] : null, 'id_proveedor' => isset($cabecera['id_proveedor']) ? $cabecera['id_proveedor'] : null, 'estado' => 'I'));
         // Crear líneas de requisición
         foreach ($lineas as $linea) {
             RequisicionLinea::insert(array('id_requisicion' => $requisicionCabecera->id, 'ext_id' => isset($linea['ext_id']) ? $linea['ext_id'] : null, 'id_producto' => $linea['id_producto'], 'observacion_creador' => isset($linea['observacion_creador']) ? $linea['observacion_creador'] : null, 'cantidad' => $linea['cantidad'], 'estado' => 'I', 'bodega_haciendas' => isset($linea['bodega_haciendas']) ? $linea['bodega_haciendas'] : null, 'papel_cara' => isset($linea['papel_cara']) ? $linea['papel_cara'] : null, 'papel_laminas' => isset($linea['papel_laminas']) ? $linea['papel_laminas'] : null));
         }
         // Asignar variables de solicitud
         RequestMetadataCore::set($request_id, 'ADQ-CLASE', $clase->id);
         RequestMetadataCore::set($request_id, 'ADQ-ORIGEN', $clase->origen_requisicion);
         RequestMetadataCore::set($request_id, 'ADQ-TIPO', $clase->tipo);
         RequestMetadataCore::set($request_id, 'ADQ-RESPONSABLE-COMPRAS', $clase->responsable_compras);
         RequestMetadataCore::set($request_id, 'ADQ-RESPONSABLE-BODEGAS', $clase->responsable_bodegas);
         RequestMetadataCore::set($request_id, 'ADQ-APROBADOR-REQUISICION', $clase->aprobador_requisicion);
         RequestMetadataCore::set($request_id, 'ADQ-REQ-APROBADA', 'No');
         if ($clase->id == '1') {
             RequestMetadataCore::set($request_id, 'ADQ-APROBADOR-COTIZACION', $clase->aprobador_requisicion);
         } else {
             RequestMetadataCore::set($request_id, 'ADQ-APROBADOR-COTIZACION', $solicitante->user_id);
         }
         // Ruteo especial:
         // Papel: No requiere consolidación, sí requiere confirmación
         // Comerciales: No requiere consolidación, sí requiere confirmación
         $requiere_confirmacion = 'No';
         $requiere_consolidacion = 'Si';
         if ($requisicionCabecera->id_clase == 2) {
             $requiere_confirmacion = 'Si';
             $requiere_consolidacion = 'No';
         }
         if ($requisicionCabecera->id_clase == 3 || $requisicionCabecera->id_clase == 4 || $requisicionCabecera->id_clase == 5 || $requisicionCabecera->id_clase == 6) {
             $requiere_confirmacion = 'Si';
             $requiere_consolidacion = 'No';
         }
         RequestMetadataCore::set($request_id, 'ADQ-REQUIERE-CONFIRMACION', $requiere_confirmacion);
         RequestMetadataCore::set($request_id, 'ADQ-REQUIERE-CONSOLIDACION', $requiere_consolidacion);
         $requisicion = Requisicion::with('lineas.producto')->find($requisicionCabecera->id);
         // Establecer usuario responsable
         // Si son productos comerciales el responsable es el usuario creador
         if ($requisicion->id_clase == 3 || $requisicion->id_clase == 4 || $requisicion->id_clase == 5 || $requisicion->id_clase == 6) {
             $handlerRequestCore->updatePic($request_id, $solicitante->user_id);
         } else {
             $handlerRequestCore->updatePic($request_id, $clase->responsable_compras);
         }
         /*
         // Emitir aviso a aprobador si el usuario ha solicitado algún producto más de una vez en este mes 
         // (se excluyen haciendas)
         if($requisicion->id_clase != '1'){
         
             // Obtener los mails de los aprobadores
             $emails = [];
             $aprobadores_array = explode(',', $clase->aprobador_requisicion);
             foreach ($aprobadores_array as $id_aprobador) {
         
                 if($id_aprobador == 'boss') {
         
                     // Si el usuario tiene seteado un aprobador
                     if($solicitante->user_reports_to != ''){ 
         
                         // Si este aprobador existe
                         $user_reports_to = User::find($solicitante->user_reports_to);
                         if($user_reports_to) {
                             $id_aprobador = $user_reports_to->user_id;
                         } else {
                             $id_aprobador = $solicitante->user_id;
                         }
         
                     } else {
                         $id_aprobador = $solicitante->user_id;
                     }
         
                 }
         
                 $aprobador = User::find($id_aprobador);
                 $emails[] = ['email'=>$aprobador->user_email];
             }
         
         
             foreach ($requisicion->lineas as $linea) {
         
                 $lineas_producto = RequisicionLinea::whereHas('requisicion',function($query){
                                                         $curMonth = strtotime(date('Y-m'));
                                                         $query->where('fecha_inicio', '>=', date('Y-m', $curMonth))
                                                               ->where('fecha_inicio', '<', date('Y-m', strtotime('+ 1 month',$curMonth)));
                                                     })->where('id_producto', '=', $linea->id_producto)->count();
         
                 if($lineas_producto > 1){
                     $emailContentHtml =  'Estimado aprobador <br /><br />
                                      El usuario '.$solicitante->user_name.' ha creado la requisición '.$requisicion->id.', la cual contiene el producto '.$linea->producto->codigo.' - '.$linea->producto->nombre.'. Este producto
                                      ya ha sido solicitado previamente en este mes. Por favor realice la gestión adecuada para no comprar este producto de manera innecesaria.<br /><br />
                                      Atentamente <br />
                                      Novopan del Ecuador S.A.';
         
                     MailController::sendGeneralMail($emails, 'Requisición de producto repetido' , $emailContentHtml);
                 }
             }
         }
         */
     }
 }
 public function AprobarOrdenCompra()
 {
     $input = Request::createFromGlobals();
     $returnArray = array("status" => true, "message" => "");
     $requestCore = new \RequestCore();
     $arrayRequisiciones = [];
     // Traer ordenes de compra
     $ordenes_compra = OrdenCompra::getOrdenesCompraParaAprobacionOrdenCompra($input->request_id);
     foreach ($ordenes_compra as $orden_compra) {
         // Depende del siguiente paso:
         // - Si es selección de proveedor cambiar el estado de OC a 'C' - Consolidada
         // - Si es generación de OC cambiar el estado a 'O' - orden de compra aprobada. Copiar cantidades de Cotización
         if ($input->step_id == FlowSettings::get($_SESSION['user_flow'], 'ADQ_STEP_SELECCIONPROV')) {
             $orden_compra->update(['estado' => 'C']);
         } else {
             // Actualizar cabecera de OC
             $orden_compra->update(['id_aprobador_ordencompra' => $_SESSION['user_id'], 'estado' => 'O']);
             // Actualizar líneas de OC
             foreach ($orden_compra->lineas as $linea) {
                 $linea->update(['estado' => 'O']);
                 // Llenar arreglo con número de requisiciones correspondientes
                 $arrayRequisiciones[] = $linea->linea_requisicion->requisicion->id;
             }
         }
     }
     // Mover ef_requests correspondientes
     $arrayRequisiciones = array_unique($arrayRequisiciones);
     foreach ($arrayRequisiciones as $id_requisicion) {
         $requisicion = Requisicion::find($id_requisicion);
         $task = $requisicion->ef_request->open_tasks[0];
         // Completar tareas diferentes a la actual
         // (No se completa la actual porque EF lo hace por default)
         if ($task->task_id != $input->task_id) {
             // TODO: Este valor cambia de acuerdo al siguiente paso
             if ($input->step_id == FlowSettings::get($_SESSION['user_flow'], 'ADQ_STEP_SELECCIONPROV')) {
                 $description = 'Orden de Compra no aprobada';
             } else {
                 $description = 'Orden de Compra aprobada por el usuario ' . $_SESSION['user_id'];
             }
             $requestCore->completeTask($task->task_request, $task->task_id, $input->flow_id, $input->step_id, $input->user_id, $description, 'next');
         }
     }
     return $returnArray;
 }