You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
5.4 KiB
123 lines
5.4 KiB
from django.db.models.signals import post_save, pre_save
|
|
from django.dispatch import receiver
|
|
from django.db import transaction
|
|
|
|
from apps.transaction.models import TransactionParticipant
|
|
from apps.course.models import Participant
|
|
|
|
|
|
@receiver(pre_save, sender=TransactionParticipant)
|
|
def store_previous_status(sender, instance, **kwargs):
|
|
"""
|
|
Store the previous status before saving to compare with new status
|
|
"""
|
|
if instance.pk:
|
|
try:
|
|
previous_instance = TransactionParticipant.objects.get(pk=instance.pk)
|
|
instance._previous_status = previous_instance.status
|
|
except TransactionParticipant.DoesNotExist:
|
|
instance._previous_status = None
|
|
else:
|
|
instance._previous_status = None
|
|
|
|
|
|
@receiver(post_save, sender=TransactionParticipant)
|
|
def create_participant_on_success(sender, instance, created, **kwargs):
|
|
"""
|
|
Create course participant when transaction status changes to SUCCESS
|
|
"""
|
|
# اگر تراکنش جدید ایجاد شده و وضعیت آن SUCCESS است
|
|
if created and instance.status == TransactionParticipant.TransactionStatus.SUCCESS:
|
|
create_course_participant(instance)
|
|
|
|
# اگر تراکنش موجود بوده و وضعیت آن از حالت دیگری به SUCCESS تغییر کرده
|
|
elif not created and hasattr(instance, '_previous_status'):
|
|
if (instance._previous_status != TransactionParticipant.TransactionStatus.SUCCESS and
|
|
instance.status == TransactionParticipant.TransactionStatus.SUCCESS):
|
|
create_course_participant(instance)
|
|
|
|
|
|
def create_course_participant(transaction_instance):
|
|
"""
|
|
Create course participant for successful transaction
|
|
"""
|
|
try:
|
|
with transaction.atomic():
|
|
# بررسی اینکه آیا کاربر نقش student دارد یا نه
|
|
if not transaction_instance.user.has_role('student'):
|
|
transaction_instance.user.add_role('student')
|
|
|
|
# بررسی اینکه آیا قبلاً participant ایجاد شده یا نه
|
|
existing_participant = Participant.objects.filter(
|
|
student_id=transaction_instance.user.id,
|
|
course=transaction_instance.course
|
|
).first()
|
|
|
|
if not existing_participant:
|
|
# ایجاد participant جدید
|
|
participant = Participant.objects.create(
|
|
student=transaction_instance.user,
|
|
course=transaction_instance.course
|
|
)
|
|
print(f"Course participant created: {participant}")
|
|
else:
|
|
print(f"Course participant already exists: {existing_participant}")
|
|
|
|
except Exception as e:
|
|
print(f"Error creating course participant: {e}")
|
|
|
|
|
|
from apps.account.notification_service import create_and_send_notification
|
|
from apps.course.models.course import get_localized_field
|
|
|
|
@receiver(post_save, sender=TransactionParticipant)
|
|
def notify_transaction_status_changed(sender, instance, created, **kwargs):
|
|
"""
|
|
Send notifications when transaction status transitions to SUCCESS, FAILED, or REFUNDED.
|
|
"""
|
|
status_changed = False
|
|
|
|
if created:
|
|
status_changed = True
|
|
elif hasattr(instance, '_previous_status') and instance._previous_status != instance.status:
|
|
status_changed = True
|
|
|
|
if not status_changed:
|
|
return
|
|
|
|
course_title_en = get_localized_field('en', instance.course.title)
|
|
course_title_fa = get_localized_field('fa', instance.course.title)
|
|
|
|
# 1. SUCCESS
|
|
if instance.status == TransactionParticipant.TransactionStatus.SUCCESS:
|
|
create_and_send_notification(
|
|
user=instance.user,
|
|
title_en="Payment Successful",
|
|
body_en=f"Your payment for course '{course_title_en}' was successful.",
|
|
title_fa="پرداخت موفقیتآمیز",
|
|
body_fa=f"پرداخت شما برای دوره «{course_title_fa}» با موفقیت انجام شد.",
|
|
service='imam-javad',
|
|
data={'type': 'payment_successful', 'transaction_id': instance.id, 'course_id': instance.course.id}
|
|
)
|
|
# 2. FAILED
|
|
elif instance.status == TransactionParticipant.TransactionStatus.FAILED:
|
|
create_and_send_notification(
|
|
user=instance.user,
|
|
title_en="Payment Failed",
|
|
body_en=f"Your payment attempt for course '{course_title_en}' failed.",
|
|
title_fa="خطا در پرداخت",
|
|
body_fa=f"عملیات پرداخت شما برای دوره «{course_title_fa}» ناموفق بود.",
|
|
service='imam-javad',
|
|
data={'type': 'payment_failed', 'transaction_id': instance.id, 'course_id': instance.course.id}
|
|
)
|
|
# 3. REFUNDED
|
|
elif instance.status == TransactionParticipant.TransactionStatus.REFUNDED:
|
|
create_and_send_notification(
|
|
user=instance.user,
|
|
title_en="Refund Completed",
|
|
body_en=f"Your refund for course '{course_title_en}' has been processed.",
|
|
title_fa="بازگشت وجه انجام شد",
|
|
body_fa=f"مبلغ پرداختی شما برای دوره «{course_title_fa}» بازگردانده (ریفاند) شد.",
|
|
service='imam-javad',
|
|
data={'type': 'refund_completed', 'transaction_id': instance.id, 'course_id': instance.course.id}
|
|
)
|