Skip to content

Policies

components.payment_gateway.subcomponents.cards.business_logic.policies.card_order_tracking

CardOrderTrackingPolicy

CardOrderTrackingPolicy()

This class is responsible for card order tracking.

It processes Adyen card order notifications.

Source code in components/payment_gateway/subcomponents/cards/business_logic/policies/card_order_tracking.py
def __init__(self) -> None:
    self.card_delivery_actions = CardDeliveryActions()

card_delivery_actions instance-attribute

card_delivery_actions = CardDeliveryActions()

on_card_order_created

on_card_order_created(data)
Source code in components/payment_gateway/subcomponents/cards/business_logic/policies/card_order_tracking.py
@obs.event_subscriber()
def on_card_order_created(self, data: "CardOrderItem") -> None:
    from components.payment_gateway.subcomponents.cards.adapters.adyen.helpers import (
        from_adyen_card_delivery_status,
    )

    assert data.card is not None
    delivery_status = (
        from_adyen_card_delivery_status(data.card.status)
        # Use "created" as fallback to ensure the card order is created in case we get updates later
        or CardDeliveryStatus.created
    )
    external_card_id = mandatory(data.paymentInstrumentId)
    shipping_method = mandatory(data.shippingMethod)
    self.card_delivery_actions.create_card_order(
        current_session,
        external_card_id=external_card_id,
        delivery_status=delivery_status,
        shipping_method=shipping_method,
        tracking_number=data.card.trackingNumber,
    )

on_card_order_updated

on_card_order_updated(data)
Source code in components/payment_gateway/subcomponents/cards/business_logic/policies/card_order_tracking.py
@obs.event_subscriber()
def on_card_order_updated(self, data: "CardOrderItem") -> None:
    from components.payment_gateway.subcomponents.cards.adapters.adyen.helpers import (
        from_adyen_card_delivery_status,
    )

    assert data.card is not None
    delivery_status = from_adyen_card_delivery_status(data.card.status)
    if delivery_status is None:
        # Ignore unknown statuses
        current_logger.warning(
            "Unknown Adyen delivery status, ignoring", status=data.card.status
        )
        return
    external_card_id = mandatory(data.paymentInstrumentId)
    self.card_delivery_actions.update_card_order(
        current_session,
        external_card_id=external_card_id,
        delivery_status=delivery_status,
        tracking_number=data.card.trackingNumber,
    )

components.payment_gateway.subcomponents.cards.business_logic.policies.card_status_handling

CardStatusHandlingPolicy

This class is responsible for the handling of card status changes.

It processes Adyen payment instruments status update notifications.

No need to process create events here as we only deal with cards that already exist on our platform. Also, given the immutable nature of payment instruments we don't expect anything to change other that their status.

on_payment_instrument_updated

on_payment_instrument_updated(data)
Source code in components/payment_gateway/subcomponents/cards/business_logic/policies/card_status_handling.py
@obs.event_subscriber()
def on_payment_instrument_updated(
    self, data: "PaymentInstrumentNotificationData"
) -> None:
    from components.payment_gateway.subcomponents.cards.adapters.adyen.helpers import (
        from_adyen_payment_instrument_status,
    )

    assert data.paymentInstrument is not None

    status = from_adyen_payment_instrument_status(data.paymentInstrument.status)
    if status is None:
        # Ignore unknown/unhandled statuses
        current_logger.warning(
            "Unhandled Adyen payment instrument status, ignoring",
            status=data.paymentInstrument.status,
        )
        return

    external_card_id = mandatory(data.paymentInstrument.id)
    with raise_if_card_not_found_for_external_id(external_card_id):
        card = CardModelBroker.get_card_by_external_id(
            current_session,
            provider=PaymentServiceProvider.adyen,
            external_id=external_card_id,
        )

    raise_on_terminated_card(card)

    if card.status == status:
        # Ignore status updates that don't change the status.
        return

    CardModelBroker.set_card_status(
        current_session,
        id=card.id,
        status=status,
    )
    current_logger.info(
        "Card status changed from Adyen",
        card_id=card.id,
        status=status,
    )