This repository has been archived on 2026-10-23. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
kassa/apps/kassa/utils.py
T
2025-05-30 11:33:40 +02:00

118 lines
3.9 KiB
Python

import datetime
import logging
import phonenumbers
import requests
from django.conf import settings
logger = logging.getLogger(__name__)
galtinn_auth = {"Authorization": f"Token {settings.GALTINN_API_KEY}"}
tekstmelding_auth = {"Authorization": f"Token {settings.TEKSTMELDING_API_KEY}"}
def send_sms_activation_link(phone_number, transaction_id):
to = phone_number.replace("+", "")
code = transaction_id[:8]
activation_url = settings.GALTINN_ACTIVATION_URL.format(to=to, code=code)
message = settings.TEKSTMELDING_ACTIVATION_SMS_TEMPLATE.format(url=activation_url)
payload = {"to": to, "message": message}
if not settings.TEKSTMELDING_ENABLED:
logger.info(f"Tekstmelding disabled. Payload would be: {payload}")
return None
url = f"{settings.TEKSTMELDING_API_URL}send"
response = requests.post(url, json=payload, headers=tekstmelding_auth, timeout=10)
return response.json()
def get_card(card_number):
url = f"{settings.GALTINN_API_URL}cards/{card_number}/"
return requests.get(url, headers=galtinn_auth, timeout=10)
def get_order(order_uuid):
url = f"{settings.GALTINN_API_URL}orders/{order_uuid}/"
return requests.get(url, headers=galtinn_auth, timeout=10)
def get_latest_order_by_card(card_number):
url = f"{settings.GALTINN_API_URL}orders/"
payload = {"card_number": card_number}
orders = requests.get(url, params=payload, headers=galtinn_auth, timeout=10).json()
return orders.get("results")[0]
def get_latest_order_by_phone(phone_number):
url = f"{settings.GALTINN_API_URL}orders/"
payload = {"phone_number": phone_number}
orders = requests.get(url, params=payload, headers=galtinn_auth, timeout=10).json()
if orders.get("count"):
return orders.get("results")[0]
return None
def get_user(user_id):
url = f"{settings.GALTINN_API_URL}users/{user_id}/"
return requests.get(url, headers=galtinn_auth, timeout=10)
def get_user_by_phone(phone_number):
url = f"{settings.GALTINN_API_URL}users/"
payload = {"phone_number": phone_number}
users = requests.get(url, params=payload, headers=galtinn_auth, timeout=10).json()
if users.get("count") == 1:
return users.get("results")[0]
return None
def update_card(card_number, user_id=None, order_uuid=None, transaction_id=None):
if user_id and order_uuid:
raise ValueError("Cannot provide both user_id and order_uuid. Provide one or the other.")
url = f"{settings.GALTINN_API_URL}kassa/card/"
payload = {
"member_card": card_number,
"user": user_id,
"order": order_uuid,
"transaction_id": str(transaction_id) if transaction_id else None,
}
return requests.patch(url, json=payload, headers=galtinn_auth, timeout=10)
def update_membership(user=None, phone_number=None, card_number=None, membership_type=None, transaction_id=None):
if membership_type not in ("standard", "trial"):
raise ValueError("Invalid membership type provided. Must be 'standard' or 'trial'.")
url = f"{settings.GALTINN_API_URL}kassa/membership/"
payload = {
"user": user,
"phone_number": phone_number,
"member_card": card_number,
"membership_type": membership_type,
"transaction_id": transaction_id,
}
return requests.post(url, json=payload, headers=galtinn_auth, timeout=10)
def format_phone_number(number):
if len(number) == 0:
return number
try:
p = phonenumbers.parse(number, region="NO")
except phonenumbers.NumberParseException:
return number
if not phonenumbers.is_valid_number(p):
return number
return phonenumbers.format_number(p, phonenumbers.PhoneNumberFormat.E164)
def is_autumn():
today = datetime.datetime.now(tz=datetime.UTC).date()
_min = datetime.date(year=today.year, month=8, day=1)
_max = datetime.date(year=today.year + 1, month=1, day=1)
return _min <= today < _max