/** * Remove the specified resource from storage. * * @param int $id * @return Response */ public function destroy($id) { $record = Requisicion::find($id)->delete(); return new AjaxResponse('success', ''); }
/** * Crea una orden de compra con el ID y líneas, o adjunta líneas a una OC * @param String $oc * @param String $lineas * @return void */ public function crearOrdenCompraAjax() { $input = Request::createFromGlobals(); $oc = $input->oc; $lineas = $input->lineas; // Validar que no se combinen líneas de requisición de un proveedor ya asignado con otro proveedor // o con líneas de requisición que no tengan proveedor $proveedoresArray = []; $lineasArray = explode(',', $lineas); foreach ($lineasArray as $idLinea) { $linea_requisicion = RequisicionLinea::with('requisicion')->find($idLinea); if ($linea_requisicion->requisicion->proveedor) { $proveedoresArray[] = $linea_requisicion->requisicion->id_proveedor; } else { $proveedoresArray[] = 0; } } $proveedoresArray = array_unique($proveedoresArray); if (count($proveedoresArray) > 1) { return array('status' => false, 'message' => 'Algunas de las líneas ya tienen proveedor asignado. No se pueden combinar con líneas no asignadas'); } $requisicion = Requisicion::find($input->id); if ($oc == 'nueva_oc') { $orden_compra = OrdenCompra::create(array('ext_id' => '', 'id_clase' => $requisicion->id_clase, 'moneda' => 'dolar', 'fecha_inicio' => date('Y-m-d H:i:s'), 'fecha_fin' => '', 'estado' => 'I')); if ($proveedoresArray[0] != 0) { $orden_compra->id_proveedor = $proveedoresArray[0]; $orden_compra->save(); } $id = $orden_compra->id; } else { $id = $oc; } foreach ($lineasArray as $idLinea) { $linea_requisicion = RequisicionLinea::with('requisicion')->find($idLinea); OrdenCompraLinea::create(array('id_ordencompra' => $id, 'id_linea_requisicion' => $idLinea, 'id_producto' => $linea_requisicion->id_producto, 'cantidad' => $linea_requisicion->cantidad, 'valor' => 0, 'observacion' => $linea_requisicion->requisicion->observacion_creador, 'estado' => 'I')); } return $this->getFormDataAjax(); }
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 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; }
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 procesarArchivo() { $input = Request::createFromGlobals(); $cabecera = []; $objPHPExcel = \PHPExcel_IOFactory::createReader('Excel2007')->load($input->archivo); $id_requisicion = $objPHPExcel->setActiveSheetIndex(0)->getCell('B2')->getValue(); $requisicion = Requisicion::find($id_requisicion); $requisicion = Requisicion::findByEFID($requisicion->ef_id); // Modificar datos cabecera // Modificar datos líneas $recordRow = 7; while ($objPHPExcel->setActiveSheetIndex(0)->getCell('D' . $recordRow)->getValue() != '') { foreach ($requisicion->lineas as &$linea) { if ($linea->id == $objPHPExcel->setActiveSheetIndex(0)->getCell('D' . $recordRow)->getValue()) { $linea->observacion_aprobador = $objPHPExcel->setActiveSheetIndex(0)->getCell('G' . $recordRow)->getValue(); $linea->cantidad = $objPHPExcel->setActiveSheetIndex(0)->getCell('H' . $recordRow)->getValue(); $linea->estado = $objPHPExcel->setActiveSheetIndex(0)->getCell('K' . $recordRow)->getValue() == 'Si' ? 'A' : 'I'; } $recordRow++; } } return ['status' => true, 'message' => '', 'requisicion' => $requisicion]; }
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; }
/** * 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 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; }