public function getDatosProveedor()
 {
     $input = Request::createFromGlobals();
     $productos = [];
     $lista_productos = ProductoPrecio::select('id_producto')->with('producto')->whereIdProveedor($input->id)->groupBy('id_producto')->get();
     foreach ($lista_productos as $producto) {
         $productos[] = ['id_producto' => $producto->id_producto, 'codigo_producto' => $producto->producto->codigo, 'nombre_producto' => $producto->producto->nombre, 'id_proveedor' => $input->id, 'nombre_proveedor' => $input->nombre, 'ultimo_precio' => Producto::getUltimoPrecio($producto->id_producto, $input->id), 'precio_promedio' => Producto::getPrecioPromedio($producto->id_producto, $input->id)];
     }
     $ordenes_compra = OrdenCompra::whereIdProveedor($input->id)->with('lineas', 'proveedor')->get();
     return ['productos' => $productos, 'ordenes_compra' => $ordenes_compra];
 }
 public function getDatosProducto()
 {
     $input = Request::createFromGlobals();
     $proveedores = [];
     $lista_proveedores = ProductoPrecio::select('id_proveedor')->with('proveedor')->whereIdProducto($input->id)->groupBy('id_proveedor')->get();
     foreach ($lista_proveedores as $proveedor) {
         $proveedores[] = ['id_proveedor' => $proveedor->id_proveedor, 'codigo_proveedor' => $proveedor->proveedor->codigo, 'nombre_proveedor' => $proveedor->proveedor->nombre, 'id_producto' => $input->id, 'nombre_producto' => $input->nombre, 'ultimo_precio' => Producto::getUltimoPrecio($input->id, $proveedor->id_proveedor), 'precio_promedio' => Producto::getPrecioPromedio($input->id, $proveedor->id_proveedor)];
     }
     $requisiciones = RequisicionLinea::with('requisicion')->whereIdProducto($input->id)->get();
     $ordenes_compra = OrdenCompra::whereHas('lineas', function ($query) use($input) {
         $query->whereIdProducto($input->id);
     })->with(['lineas' => function ($query) use($input) {
         $query->whereIdProducto($input->id);
     }])->with('proveedor')->get();
     return ['proveedores' => $proveedores, 'requisiciones' => $requisiciones, 'ordenes_compra' => $ordenes_compra];
 }
Beispiel #3
0
 public function getEjecutadoAttribute()
 {
     $cc = $this->cc;
     $ordenes_compra = OrdenCompra::with(['lineas' => function ($query) use($cc) {
         return $query->with(['linea_requisicion' => function ($query) use($cc) {
             return $query->whereHas('requisicion', function ($query) use($cc) {
                 return $query->where('id_cc', $cc);
             });
         }]);
     }])->generada()->get();
     $total = 0;
     foreach ($ordenes_compra as $orden_compra) {
         foreach ($orden_compra->lineas as $linea) {
             $total += $linea->valor_total;
         }
     }
     return $total;
 }
 /**
  * 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 enviarCotizacion($contacto, $orden_compra)
 {
     $orden_compra = OrdenCompra::with('lineas')->find($orden_compra);
     $contacto = Contacto::with('proveedor')->find($contacto);
     $cotizacion = Cotizacion::create(['id_ordencompra' => $orden_compra->id, 'id_contacto' => $contacto->id, 'fecha_envio' => date('Y-m-d H:i:s'), 'moneda' => 'USD', 'estado' => 'E']);
     // Update token
     $token = bin2hex($cotizacion->id . '.' . $contacto->id . '.' . $orden_compra->id . '.' . date('Y-m-d'));
     $cotizacion->update(['token' => $token]);
     foreach ($orden_compra->lineas as $linea) {
         CotizacionLinea::create(['id_cotizacion' => $cotizacion->id, 'id_ordencompra_linea' => $linea->id, 'cantidad' => $linea->cantidad, 'valor' => 0]);
     }
     $cotizacion = Cotizacion::with('contacto.proveedor')->find($cotizacion->id);
     $this->enviarMailCotizacion($cotizacion);
 }
 public function getOrdenesCompraAjax()
 {
     $input = Request::createFromGlobals();
     $ordenes_compra = OrdenCompra::getOrdenesCompraParaRecepcion($input['ef_id']);
     return $ordenes_compra;
 }
 public function actualizarObservacion()
 {
     $input = Request::createFromGlobals();
     OrdenCompra::find($input->id)->update(['observacion_aprobador_cotizacion' => $input->observacion_aprobador_cotizacion]);
 }
Beispiel #8
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 generarOrdenCompraPDF($request_id)
 {
     $ordenes_compra = OrdenCompra::whereHas('lineas.linea_requisicion.requisicion', function ($query) use($request_id) {
         return $query->where('ef_id', $request_id);
     })->with(['proveedor', 'lineas.linea_requisicion.requisicion', 'lineas.producto'])->get();
     foreach ($ordenes_compra as $orden_compra) {
         $filename = APP_TMPPATH . 'requisicion.pdf';
         PDFController::generatePDF(view('Adquisiciones.PDF.orden_compra', ['orden_compra' => $orden_compra]), false, $filename);
         (new \AttachmentCore())->addAttachmentToRequest($request_id, \FlowSettingsCore::get(FLOW_ADQUISICIONES, 'ADQ_FILE_ORDENCOMPRA'), $filename, APP_ENVPATH, $_SESSION['user_id'], "Orden de Compra " . $orden_compra->id);
     }
 }
 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;
 }
Beispiel #11
0
 /**
  * Remove the specified resource from storage.
  *
  * @param  int  $id
  * @return Response
  */
 public function destroy($id)
 {
     $record = OrdenCompra::find($id)->delete();
     return new AjaxResponse('success', '');
 }