byceps/byceps

View on GitHub
byceps/services/shop/order/actions/ticket.py

Summary

Maintainability
A
0 mins
Test Coverage
C
77%
"""
byceps.services.shop.order.actions.ticket
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

:Copyright: 2014-2024 Jochen Kupperschmidt
:License: Revised BSD (see `LICENSE` file for details)
"""

from collections.abc import Iterable
from typing import Any
from uuid import UUID

from byceps.services.shop.order import order_log_service, order_service
from byceps.services.shop.order.models.order import LineItem, Order, OrderID
from byceps.services.ticketing import (
    ticket_category_service,
    ticket_creation_service,
    ticket_revocation_service,
    ticket_service,
)
from byceps.services.ticketing.dbmodels.ticket import DbTicket
from byceps.services.ticketing.models.ticket import TicketCategoryID, TicketID
from byceps.services.user.models.user import User

from ._ticketing import create_tickets_sold_event, send_tickets_sold_event


def create_tickets(
    order: Order,
    line_item: LineItem,
    ticket_category_id: TicketCategoryID,
    initiator: User,
) -> None:
    """Create tickets."""
    owner = order.placed_by
    order_number = order.order_number
    ticket_quantity = line_item.quantity

    ticket_category = ticket_category_service.get_category(ticket_category_id)

    tickets = ticket_creation_service.create_tickets(
        ticket_category.party_id,
        ticket_category_id,
        owner,
        ticket_quantity,
        order_number=order_number,
        user=owner,
    )

    _create_creation_order_log_entries(order.id, tickets)

    data: dict[str, Any] = {
        'ticket_ids': list(sorted(str(ticket.id) for ticket in tickets))
    }
    order_service.update_line_item_processing_result(line_item.id, data)

    tickets_sold_event = create_tickets_sold_event(
        order.id, initiator, ticket_category_id, owner, ticket_quantity
    ).unwrap()
    send_tickets_sold_event(tickets_sold_event)


def _create_creation_order_log_entries(
    order_id: OrderID, tickets: Iterable[DbTicket]
) -> None:
    event_type = 'ticket-created'

    datas = [
        {
            'ticket_id': str(ticket.id),
            'ticket_code': ticket.code,
            'ticket_category_id': str(ticket.category_id),
            'ticket_owner_id': str(ticket.owned_by_id),
        }
        for ticket in tickets
    ]

    order_log_service.create_db_entries(event_type, order_id, datas)


def revoke_tickets(order: Order, line_item: LineItem, initiator: User) -> None:
    """Revoke all tickets related to the line item."""
    ticket_id_strs = line_item.processing_result['ticket_ids']
    ticket_ids = {
        TicketID(UUID(ticket_id_str)) for ticket_id_str in ticket_id_strs
    }
    tickets = ticket_service.get_tickets(ticket_ids)

    ticket_revocation_service.revoke_tickets(ticket_ids, initiator.id)

    _create_revocation_order_log_entries(order.id, tickets, initiator)


def _create_revocation_order_log_entries(
    order_id: OrderID, tickets: Iterable[DbTicket], initiator: User
) -> None:
    event_type = 'ticket-revoked'

    datas = [
        {
            'ticket_id': str(ticket.id),
            'ticket_code': ticket.code,
            'initiator_id': str(initiator.id),
        }
        for ticket in tickets
    ]

    order_log_service.create_db_entries(event_type, order_id, datas)