Ejemplo n.º 1
0
 def asignar_pedido_a_camioneta(self, tipo_de_pizza, camioneta):
     simulacion = Simulacion()
     simulacion.camionetas[camioneta].pizzas.append(
         Pizza(tipo_de_pizza, simulacion.time))
     cliente0 = self.generar_cliente_en_rango()
     pedido0 = Pedido(cliente0, 10, simulacion.camionetas[camioneta],
                      tipo_de_pizza)
     simulacion.camionetas[camioneta].asignar_pedido(pedido0)
Ejemplo n.º 2
0
    def test_debe_retornar_distancia_recorrida_por_camionetas(self):
        simulacion = self.get_simulacion()
        cliente14 = self.generar_cliente_en_rango()

        camioneta14 = Camioneta()
        camioneta14.cargar_pizzas()

        pedido14 = Pedido(cliente14, 10, camioneta14,
                          camioneta14.pizzas[0].tipo)
        pedido14.hora_entrega = 15
        pedido14.pizza = camioneta14.pizzas[0]
        pedido14.entregado = True
        camioneta14.generar_evento_enviar_pedido(pedido14)

        simulacion.camionetas.append(camioneta14)
        distancia = simulacion.distacia_recorrida()

        self.assertEqual(distancia, 1999.6979771955564)
Ejemplo n.º 3
0
 def enviar_pedido(self, pedido: Pedido):
     self.distancia_recorrida += self.obtener_distancia(self.ubicacion, pedido.cliente.ubicacion)
     self.ubicacion = pedido.cliente.ubicacion
     if not self._tengo_pizzas_para_entregar(pedido):
         self.generar_evento_volver_a_restaurante(pedido)
     else:
         pedido.ubicacion_origen = self.ubicacion
         from Simulacion import Simulacion
         simulacion = Simulacion()
         simulacion.dispatch(EventType.ENTREGAR_PEDIDO, {'hora': simulacion.time + timedelta(minutes=simulacion.utils.tiempo_entrega()), 'pedido': pedido})
def comunicacion():
    global dsgraph
    global mss_cnt
    global best_offer
    global num_respuestas
    if current_process().name != 'MainProcess':
        return

    message = request.args['content']
    gm = Graph()
    gm.parse(data=message)
    gr = None

    msgdic = get_message_properties(gm)
    if msgdic is None:
        gr = build_message(Graph(),
                           ACL['not-understood'],
                           sender=AgentUtil.Agents.AgenteCentroLogistico.uri,
                           msgcnt=mss_cnt)
    else:
        perf = msgdic['performative']

        # Se nos solicita que enviemos los lotes de cierta prioridad
        if perf == ACL.request:
            if 'content' in msgdic:
                content = msgdic['content']

                if 'enviar-lotes' in str(content):
                    prioridad = gm.value(subject=content,
                                         predicate=AB.prioridad)

                    # Enviamos los lotes del tipo que tocan
                    logger.info("[#] Percepcion - Enviar lotes de prioridad " +
                                prioridad)
                    enviar_lotes(prioridad)

            else:
                gr = build_message(
                    Graph(),
                    ACL['not-understood'],
                    sender=AgentUtil.Agents.AgenteCentroLogistico.uri,
                    msgcnt=mss_cnt)

        elif perf == ACL.inform:
            if 'content' in msgdic:
                content = msgdic['content']

                # Contra-oferta final
                if 'informar-oferta-final' in str(content):
                    oferta = Oferta()
                    oferta.id = gm.value(subject=content, predicate=AB.id)
                    oferta.precio = gm.value(subject=content,
                                             predicate=AB.precio)
                    oferta.transportista = gm.value(subject=content,
                                                    predicate=AB.transportista)

                    logger.info(
                        "[#] Percepcion - Transportista nos hace oferta final (%s) de %s euros"
                        % (oferta.id, oferta.precio))

                    nombre_transportista = 'SEUR' if msgdic['sender'] == AgentUtil.Agents.AgenteTransportista.uri \
                        else 'CORREOS'

                    if best_offer is None or best_offer.precio > oferta.precio:
                        logger.info(
                            "[#] Nueva mejor oferta | id: %s | precio: %s | transportista %s"
                            % (oferta.id, oferta.precio, nombre_transportista))
                        best_offer = oferta
                        best_offer.transportista = nombre_transportista

                    num_respuestas += 1
                    if num_respuestas == 2:
                        aceptar_oferta(best_offer.transportista)
                        notificar_envios(best_offer.transportista)
                        best_offer = None
                        num_respuestas = 0

                else:
                    # Recibimos un pedido
                    pedido = Pedido()
                    pedido.id = gm.value(subject=content, predicate=AB.id)
                    pedido.prioridad = gm.value(subject=content,
                                                predicate=AB.prioridad)
                    pedido.fecha_compra = gm.value(subject=content,
                                                   predicate=AB.direccion)
                    pedido.compuesto_por = gm.value(subject=content,
                                                    predicate=AB.compuesto_por)
                    pedido.peso_total = gm.value(subject=content,
                                                 predicate=AB.peso_total)
                    pedido.direccion = gm.value(subject=content,
                                                predicate=AB.direccion)
                    pedido.ciudad = gm.value(subject=content,
                                             predicate=AB.ciudad)

                    logger.info(
                        "[#] Percepcion - Organizar nuevo pedido (%s) " %
                        pedido.id)

                    prepare_shipping(pedido)

            gr = build_message(
                Graph(),
                ACL['inform-done'],
                sender=AgentUtil.Agents.AgenteCentroLogistico.uri,
                msgcnt=mss_cnt,
                receiver=msgdic['sender'],
            )

        # Un transportista nos ha propuesto una oferta
        elif perf == ACL.propose:
            if 'content' in msgdic:
                content = msgdic['content']
                oferta = Oferta()
                oferta.id = gm.value(subject=content, predicate=AB.id)
                oferta.precio = gm.value(subject=content, predicate=AB.precio)
                oferta.transportista = gm.value(subject=content,
                                                predicate=AB.transportista)

                logger.info("[#] Percepcion - Nueva oferta (%s)" % oferta.id)
                nombre_transportista = 'SEUR' if msgdic['sender'] == AgentUtil.Agents.AgenteTransportista.uri \
                    else 'CORREOS'

                if best_offer is None or best_offer.precio > oferta.precio:
                    logger.info(
                        "[#] Nueva mejor oferta | id: %s | precio: %s | transportista %s"
                        % (oferta.id, oferta.precio, nombre_transportista))
                    best_offer = oferta
                    best_offer.transportista = nombre_transportista

                proponer_oferta(oferta)

            else:
                gr = build_message(
                    Graph(),
                    ACL['inform-done'],
                    sender=AgentUtil.Agents.AgenteCentroLogistico.uri,
                    msgcnt=mss_cnt,
                    receiver=msgdic['sender'],
                )

        # Un transportista ha aceptado la contraoferta
        elif perf == ACL.accept_proposal:
            if 'content' in msgdic:
                content = msgdic['content']
                oferta = Oferta()
                oferta.id = gm.value(subject=content, predicate=AB.id)
                oferta.precio = gm.value(subject=content, predicate=AB.precio)
                oferta.transportista = gm.value(subject=content,
                                                predicate=AB.transportista)

                logger.info("[#] Percepcion - Contraoferta aceptada (%s)" %
                            oferta.id)

                nombre_transportista = 'SEUR' if msgdic['sender'] == AgentUtil.Agents.AgenteTransportista.uri \
                    else 'CORREOS'

                if best_offer is None or best_offer.precio > oferta.precio:
                    logger.info(
                        "[#] Nueva mejor oferta | id: %s | precio: %s | transportista %s"
                        % (oferta.id, oferta.precio, nombre_transportista))
                    best_offer = oferta
                    best_offer.transportista = nombre_transportista

                num_respuestas += 1
                if num_respuestas == 2:
                    aceptar_oferta(best_offer.transportista)
                    notificar_envios(best_offer.transportista)
                    best_offer = None
                    num_respuestas = 0

            else:
                gr = build_message(
                    Graph(),
                    ACL['inform-done'],
                    sender=AgentUtil.Agents.AgenteCentroLogistico.uri,
                    msgcnt=mss_cnt,
                    receiver=msgdic['sender'])

        # Un transportista nos ha negado la contraoferta
        elif perf == ACL.reject_proposal:
            if 'content' in msgdic:
                content = msgdic['content']
                num_respuestas += 1

                logger.info("[#] Percepcion - Contraoferta denegada :(")

                # 2 proposed agents
                if num_respuestas == 2:
                    aceptar_oferta(best_offer.transportista)
                    notificar_envios(best_offer.transportista)
                    num_respuestas = 0
                    best_offer = None

            else:
                gr = build_message(
                    Graph(),
                    ACL['inform-done'],
                    sender=AgentUtil.Agents.AgenteCentroLogistico.uri,
                    msgcnt=mss_cnt,
                    receiver=msgdic['sender'],
                )

        else:
            gr = build_message(
                Graph(),
                ACL['not-understood'],
                sender=AgentUtil.Agents.AgenteCentroLogistico.uri,
                msgcnt=mss_cnt)

    if gr is None:
        gr = build_message(Graph(),
                           ACL['inform-done'],
                           sender=AgentUtil.Agents.AgenteCentroLogistico.uri,
                           msgcnt=mss_cnt,
                           receiver=msgdic['sender'])

    mss_cnt += 1

    return gr.serialize(format='xml')
Ejemplo n.º 5
0
def browser_purchase():
    if request.method == 'POST':
        global mss_cnt
        peso_total = 0.0
        query = """
        prefix ab:<http://www.semanticweb.org/elenaalonso/ontologies/2018/4/OnlineShop#>
             
        SELECT ?id ?peso
        WHERE
        {
          %s
          ?Producto ab:id ?id .
          ?Producto ab:peso ?peso .
          }
          """ % AgentUtil.SPARQLHelper.filterSPARQLValues(
            "?id", request.form.getlist('items'), False)

        res = AgentUtil.SPARQLHelper.read_query(query)

        pedido = Pedido()
        pedido.id = random.randint(1, 99999999)  # TODO: Get latest id
        pedido.prioridad = request.form['prioridad']
        pedido.fecha_compra = datetime.now().strftime("%d/%m/%Y")
        pedido.direccion = request.form['direccion']
        pedido.ciudad = request.form['ciudad']

        for item in request.form.getlist('items'):
            pedido.compuesto_por.append(item)

        for p in res["results"]["bindings"]:
            peso_total += float(p["peso"]["value"])

        pedido.peso_total = peso_total

        query = """
        
        prefix ab:<http://www.semanticweb.org/elenaalonso/ontologies/2018/4/OnlineShop#>
             
        INSERT DATA {
             ab:Pedido%(id)s rdf:type ab:Pedido .
             ab:Pedido%(id)s ab:id %(id)s .
             ab:Pedido%(id)s ab:prioridad '%(prioridad)s' .
             ab:Pedido%(id)s ab:fecha_compra '%(fecha)s' .
             ab:Pedido%(id)s ab:direccion '%(dir)s' .
             ab:Pedido%(id)s ab:ciudad '%(ciudad)s' .
             ab:Pedido%(id)s ab:peso_total %(peso)s .
             ab:Pedido%(id)s ab:comprado_por '%(usuario)s' .
          
        """ % {
            'id': pedido.id,
            'prioridad': pedido.prioridad,
            'fecha': pedido.fecha_compra,
            'dir': pedido.direccion,
            'ciudad': pedido.ciudad,
            'peso': pedido.peso_total,
            'usuario': session['username']
        }

        for item in pedido.compuesto_por:
            query += "ab:Pedido%(id)s ab:compuesto_por %(item)s .\n" % {
                'id': pedido.id,
                'item': item
            }

        query += " }"

        res = AgentUtil.SPARQLHelper.update_query(query)

        query = """
        prefix ab:<http://www.semanticweb.org/elenaalonso/ontologies/2018/4/OnlineShop#>
        
        DELETE {
            ?Producto ab:estado ?estado
        }
        INSERT {
            ?Producto ab:estado 'Vendido'
        }
        WHERE {
            %s
            ?Producto ab:estado ?estado .
            ?Producto rdf:type ab:Producto .
            ?Producto ab:id ?id . }
        """ % AgentUtil.SPARQLHelper.filterSPARQLValues(
            "?id", pedido.compuesto_por, False)

        AgentUtil.SPARQLHelper.update_query(
            query)  # Los marcamos como vendidos para futuras busquedas

        logger.info("[#] Creado un nuevo pedido (%s) de productos: %s" %
                    (pedido.id, pedido.compuesto_por))

        gmess = Graph()
        gmess.bind('ab', AB)
        content = AB[AgentUtil.Agents.AgenteVendedor.name + '-preparar-pedido']
        gmess.add((content, RDF.type, AB.Pedido))
        gmess.add((content, AB.id, Literal(pedido.id)))
        gmess.add((content, AB.prioridad, Literal(pedido.prioridad)))
        gmess.add((content, AB.fecha_compra, Literal(pedido.fecha_compra)))
        gmess.add((content, AB.direccion, Literal(pedido.direccion)))
        gmess.add((content, AB.ciudad, Literal(pedido.ciudad)))
        for item in pedido.compuesto_por:
            gmess.add((content, AB.compuesto_por, Literal(item)))

        gmess.add((content, AB.peso_total, Literal(peso_total)))
        msg = build_message(
            gmess,
            perf=ACL.inform,
            sender=AgentUtil.Agents.AgenteVendedor.uri,
            receiver=AgentUtil.Agents.AgenteCentroLogistico.uri,
            content=content,
            msgcnt=mss_cnt)
        send_message(msg, AgentUtil.Agents.AgenteCentroLogistico.address)
        mss_cnt += 1

        return render_template('finished.html')
Ejemplo n.º 6
0
 def _enviar_pedido(self, pedido: Pedido):
     pedido.ubicacion_origen = self.ubicacion
     from Simulacion import Simulacion
     simulacion = Simulacion()
     simulacion.dispatch(EventType.ENTREGAR_PEDIDO, {'hora': simulacion.time + timedelta(minutes=simulacion.utils.tiempo_entrega()), 'pedido': pedido})
Ejemplo n.º 7
0
    def test_debe_retornar_pedidos_perdidos(self):
        simulacion = self.get_simulacion()
        cliente13 = self.generar_cliente_en_rango()

        camioneta13 = Camioneta()
        camioneta13.cargar_pizzas()

        pedido13 = Pedido(cliente13, 10, camioneta13,
                          camioneta13.pizzas[0].tipo)
        pedido13.hora_entrega = 15
        pedido13.pizza = camioneta13.pizzas[0]
        pedido13.entregado = True
        simulacion.pedidos.append(pedido13)

        pedido23 = Pedido(cliente13, 10, camioneta13,
                          camioneta13.pizzas[1].tipo)
        pedido23.hora_entrega = 15
        pedido23.pizza = camioneta13.pizzas[1]
        pedido23.entregado = True
        simulacion.pedidos.append(pedido23)

        pedido33 = Pedido(cliente13, 10, camioneta13,
                          camioneta13.pizzas[2].tipo)
        pedido33.hora_entrega = 15
        pedido33.pizza = camioneta13.pizzas[2]
        pedido33.entregado = False
        simulacion.pedidos.append(pedido33)

        pedido43 = Pedido(cliente13, 10, camioneta13,
                          camioneta13.pizzas[3].tipo)
        pedido43.hora_entrega = 15
        pedido43.pizza = camioneta13.pizzas[3]
        pedido43.entregado = False
        simulacion.pedidos.append(pedido43)

        pedido53 = Pedido(cliente13, 10, camioneta13,
                          camioneta13.pizzas[4].tipo)
        pedido53.hora_entrega = 15
        pedido53.pizza = camioneta13.pizzas[4]
        pedido53.entregado = False
        simulacion.pedidos.append(pedido53)

        pedidos = simulacion.pedidos_perdidos()

        self.assertEqual(len(pedidos), 3)
Ejemplo n.º 8
0
    def test_debe_retornar_el_tiempo_promedio_de_espera(self):
        simulacion = self.get_simulacion()
        cliente12 = self.generar_cliente_en_rango()

        camioneta12 = Camioneta()
        camioneta12.cargar_pizzas()

        pedido12 = Pedido(cliente12, simulacion.time, camioneta12,
                          camioneta12.pizzas[0].tipo)
        pedido12.hora_entrega = simulacion.time + timedelta(minutes=15)
        pedido12.pizza = camioneta12.pizzas[0]
        pedido12.entregado = True
        simulacion.pedidos.append(pedido12)

        pedido22 = Pedido(cliente12, simulacion.time, camioneta12,
                          camioneta12.pizzas[1].tipo)
        pedido22.hora_entrega = simulacion.time + timedelta(minutes=15)
        pedido22.pizza = camioneta12.pizzas[1]
        pedido22.entregado = True
        simulacion.pedidos.append(pedido22)

        pedido32 = Pedido(cliente12, simulacion.time, camioneta12,
                          camioneta12.pizzas[2].tipo)
        pedido32.hora_entrega = simulacion.time + timedelta(minutes=15)
        pedido32.pizza = camioneta12.pizzas[2]
        simulacion.pedidos.append(pedido32)

        pedido42 = Pedido(cliente12, simulacion.time, camioneta12,
                          camioneta12.pizzas[3].tipo)
        pedido42.hora_entrega = simulacion.time + timedelta(minutes=15)
        pedido42.pizza = camioneta12.pizzas[3]
        simulacion.pedidos.append(pedido42)

        pedido52 = Pedido(cliente12, simulacion.time, camioneta12,
                          camioneta12.pizzas[4].tipo)
        pedido52.hora_entrega = simulacion.time + timedelta(minutes=15)
        pedido52.pizza = camioneta12.pizzas[4]
        simulacion.pedidos.append(pedido52)

        tiempo_espera = simulacion.tiempo_espera()

        self.assertEqual(tiempo_espera, 15)
Ejemplo n.º 9
0
    def test_debe_retornar_la_cantidad_de_pizzas_vendidas_segun_tipo(self):
        simulacion = self.get_simulacion()

        cliente1 = self.generar_cliente_en_rango()

        camioneta1 = Camioneta()
        camioneta1.cargar_pizzas()

        pedido1 = Pedido(cliente1, 10, camioneta1, camioneta1.pizzas[0].tipo)
        pedido1.pizza = camioneta1.pizzas[0]
        pedido1.entregado = True
        simulacion.pedidos.append(pedido1)

        pedido2 = Pedido(cliente1, 10, camioneta1, camioneta1.pizzas[1].tipo)
        pedido2.pizza = camioneta1.pizzas[1]
        pedido2.entregado = True
        simulacion.pedidos.append(pedido2)

        pedido3 = Pedido(cliente1, 10, camioneta1, camioneta1.pizzas[2].tipo)
        pedido3.pizza = camioneta1.pizzas[2]
        pedido3.entregado = True
        simulacion.pedidos.append(pedido3)

        pedido4 = Pedido(cliente1, 10, camioneta1, camioneta1.pizzas[3].tipo)
        pedido4.pizza = camioneta1.pizzas[3]
        pedido4.entregado = True
        simulacion.pedidos.append(pedido4)

        pedido5 = Pedido(cliente1, 10, camioneta1, camioneta1.pizzas[4].tipo)
        pedido5.pizza = camioneta1.pizzas[4]
        pedido5.entregado = True
        simulacion.pedidos.append(pedido5)

        cantidad_de_pizzas_por_tipo = simulacion.pizzas_pedidas_por_tipo()

        self.assertIsInstance(cantidad_de_pizzas_por_tipo, dict)