from django.shortcuts import render, get_object_or_404 from django.contrib.auth.decorators import login_required from django.http import JsonResponse import requests from .decorators import * from billing.models import * import base64 # Create your views here. @customer_login_required def customer_invoices(request, *args, **kwargs): context = { } return render(request, 'listing_pages/customer-invoices.html', context) @customer_login_required def all_products(request, *args, **kwargs): context = { } return render(request, 'listing_pages/products.html', context) @customer_login_required def customer_orders(request, *args, **kwargs): customer = request.user.customerprofile orders = Order.objects.filter(customer=customer, status='Completed') context = { 'orders': orders, } return render(request, 'listing_pages/customer-orders.html', context) # PRODUCTS @customer_login_required def osimenu_plans(request, *args, **kwargs): osimenu_basic = Item.objects.filter(title='OSIMENU BASIC').first() osimenu_standard = Item.objects.filter(title='OSIMENU STANDARD').first() osimenu_premium = Item.objects.filter(title='OSIMENU PREMIUM').first() context = { 'osimenu_basic': osimenu_basic, 'osimenu_standard': osimenu_standard, 'osimenu_premium': osimenu_premium, } return render(request, 'products/osimenu-plans.html', context) @customer_login_required def shared_hosting_plans(request, *args, **kwargs): context = { } return render(request, 'products/shared-hosting-plans.html', context) @customer_login_required def cloud_vps_hosting_plans(request, *args, **kwargs): context = { } return render(request, 'products/cloud-vps-hosting-plans.html', context) @customer_login_required def payment(request, item_id): item = get_object_or_404(Item, id=item_id) context = { 'item' : item, } return render(request, 'payment.html', context) def basic_auth_header(username, password): credentials = f"merchant.{username}:{password}" encoded_credentials = base64.b64encode(credentials.encode('utf-8')).decode('utf-8') return f"Basic {encoded_credentials}" @customer_login_required def initiate_checkout(request): api_username = 'merchant.TEST06127800' api_password = '37846250a67c70e7fe9f82cf6ca81f93' merchant_id = 'TEST06127800' merchant_name = 'Ositcom Sal' customer = request.user.customerprofile item_id = request.headers.get('X-Item-ID') item = Item.objects.get(id=item_id) order = Order.objects.create(status='None', customer=customer) order.save() order_id = order.order_id order_item = OrderItem.objects.create(order=order, item=item) order_item.save() payload = { 'apiOperation': 'INITIATE_CHECKOUT', 'apiUsername': api_username, 'apiPassword': api_password, 'merchant': merchant_id, 'interaction.operation': 'PURCHASE', 'interaction.merchant.name': merchant_name, 'order.id': order_id, 'order.amount': '100.00', 'order.currency': 'USD', 'order.description': 'description_of_order', 'order.notificationUrl' : 'https://newosina.osinode.com/webhooks/', 'interaction.returnUrl' : f"https://newosina.osinode.com/check-order-status/{merchant_id}/{order_id}/" } try: response = requests.post('https://creditlibanais-netcommerce.gateway.mastercard.com/api/nvp/version/78', data=payload) print('Response Content:', response.text) if response.status_code == 200: response_data = response.text parsed_data = dict(item.split('=') for item in response_data.split('&')) session_id = parsed_data.get('session.id') return JsonResponse({'session_id': session_id}, status=200) else: print('Response Status Code:', response.status_code) return JsonResponse({'error': 'Failed to initiate checkout'}, status=500) except Exception as e: print('Exception:', e) return JsonResponse({'error': 'Internal Server Error'}, status=500) def check_order_status(request, merchant_id, order_id): api_password = '37846250a67c70e7fe9f82cf6ca81f93' url = f"https://creditlibanais-netcommerce.gateway.mastercard.com/api/rest/version/78/merchant/{merchant_id}/order/{order_id}" order = Order.objects.get(order_id=order_id) headers = { 'Content-Type': 'application/json', 'Authorization': basic_auth_header(merchant_id, api_password) } try: response = requests.get(url, headers=headers) if response.status_code == 200: order_details = response.json() if order_details.get('result') == 'SUCCESS': order.status = 'Completed' order.save() order_items = OrderItem.objects.filter(order=order) for order_item in order_items: order_item.purchased_at = datetime.now() recurring_cycle = 30 due_date = order_item.purchased_at + timedelta(days=recurring_cycle) order_item.due_at = due_date order_item.save() return redirect('orders') error_message = 'Failed to retrieve order details: ' + response.text return JsonResponse({'error': error_message}, status=500) except Exception as e: error_message = 'Exception: ' + str(e) return JsonResponse({'error': error_message}, status=500)