109 lines
3.8 KiB
Python
109 lines
3.8 KiB
Python
"""
|
|
Serializers for Billing Models
|
|
"""
|
|
from rest_framework import serializers
|
|
from .models import CreditTransaction, CreditUsageLog
|
|
from igny8_core.auth.models import Account
|
|
from igny8_core.business.billing.models import PaymentMethodConfig, Payment
|
|
|
|
|
|
class CreditTransactionSerializer(serializers.ModelSerializer):
|
|
transaction_type_display = serializers.CharField(source='get_transaction_type_display', read_only=True)
|
|
|
|
class Meta:
|
|
model = CreditTransaction
|
|
fields = [
|
|
'id', 'transaction_type', 'transaction_type_display', 'amount',
|
|
'balance_after', 'description', 'metadata', 'created_at'
|
|
]
|
|
read_only_fields = ['created_at', 'account']
|
|
|
|
|
|
class CreditUsageLogSerializer(serializers.ModelSerializer):
|
|
operation_type_display = serializers.CharField(source='get_operation_type_display', read_only=True)
|
|
|
|
class Meta:
|
|
model = CreditUsageLog
|
|
fields = [
|
|
'id', 'operation_type', 'operation_type_display', 'credits_used',
|
|
'cost_usd', 'model_used', 'tokens_input', 'tokens_output',
|
|
'related_object_type', 'related_object_id', 'metadata', 'created_at'
|
|
]
|
|
read_only_fields = ['created_at', 'account']
|
|
|
|
|
|
class CreditBalanceSerializer(serializers.Serializer):
|
|
"""Serializer for credit balance response"""
|
|
credits = serializers.IntegerField()
|
|
plan_credits_per_month = serializers.IntegerField()
|
|
credits_used_this_month = serializers.IntegerField()
|
|
credits_remaining = serializers.IntegerField()
|
|
|
|
|
|
class UsageSummarySerializer(serializers.Serializer):
|
|
"""Serializer for usage summary response"""
|
|
period = serializers.DictField()
|
|
total_credits_used = serializers.IntegerField()
|
|
total_cost_usd = serializers.DecimalField(max_digits=10, decimal_places=2)
|
|
by_operation = serializers.DictField()
|
|
by_model = serializers.DictField()
|
|
|
|
|
|
class PaymentMethodConfigSerializer(serializers.ModelSerializer):
|
|
"""Serializer for payment method configuration"""
|
|
payment_method_display = serializers.CharField(source='get_payment_method_display', read_only=True)
|
|
|
|
class Meta:
|
|
model = PaymentMethodConfig
|
|
fields = [
|
|
'id', 'country_code', 'payment_method', 'payment_method_display',
|
|
'is_enabled', 'display_name', 'instructions',
|
|
'bank_name', 'account_number', 'swift_code',
|
|
'wallet_type', 'wallet_id', 'sort_order'
|
|
]
|
|
read_only_fields = ['id']
|
|
|
|
|
|
class PaymentConfirmationSerializer(serializers.Serializer):
|
|
"""Serializer for manual payment confirmation"""
|
|
invoice_id = serializers.IntegerField(required=True)
|
|
payment_method = serializers.ChoiceField(
|
|
choices=['bank_transfer', 'local_wallet'],
|
|
required=True
|
|
)
|
|
manual_reference = serializers.CharField(
|
|
required=True,
|
|
max_length=255,
|
|
help_text="Transaction reference number"
|
|
)
|
|
manual_notes = serializers.CharField(
|
|
required=False,
|
|
allow_blank=True,
|
|
help_text="Additional notes about the payment"
|
|
)
|
|
amount = serializers.DecimalField(
|
|
max_digits=10,
|
|
decimal_places=2,
|
|
required=True
|
|
)
|
|
proof_url = serializers.URLField(
|
|
required=False,
|
|
allow_blank=True,
|
|
help_text="URL to receipt/proof of payment"
|
|
)
|
|
class LimitCardSerializer(serializers.Serializer):
|
|
"""Serializer for individual limit card"""
|
|
title = serializers.CharField()
|
|
limit = serializers.IntegerField()
|
|
used = serializers.IntegerField()
|
|
available = serializers.IntegerField()
|
|
unit = serializers.CharField()
|
|
category = serializers.CharField()
|
|
percentage = serializers.FloatField()
|
|
|
|
|
|
class UsageLimitsSerializer(serializers.Serializer):
|
|
"""Serializer for usage limits response"""
|
|
limits = LimitCardSerializer(many=True)
|
|
|