emile 1 year ago
parent a6da681209
commit b4a8192c65

@ -3,11 +3,11 @@ from .models import *
# Register your models here. # Register your models here.
admin.site.register(RecurringCycle) admin.site.register(RecurringCycle)
admin.site.register(Service) admin.site.register(Item)
admin.site.register(ServicePayment) admin.site.register(Order)
admin.site.register(PaymentType) admin.site.register(OrderItem)
admin.site.register(Invoice) admin.site.register(Invoice)
admin.site.register(OrderPayment)
admin.site.register(PaymentType)
admin.site.register(Receipt) admin.site.register(Receipt)
admin.site.register(Charge)

@ -0,0 +1,24 @@
# Generated by Django 4.2.5 on 2024-04-09 19:06
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('osinacore', '0065_alter_customerprofile_status'),
('billing', '0014_servicepayment_comment'),
]
operations = [
migrations.CreateModel(
name='Order',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('status', models.CharField(choices=[('Completed', 'Completed'), ('Failed', 'Failed'), ('Cancelled', 'Cancelled'), ('Pending', 'Pending'), ('None', 'None')], default='None', max_length=200)),
('order_id', models.CharField(blank=True, max_length=100, null=True)),
('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osinacore.customerprofile')),
],
),
]

@ -0,0 +1,18 @@
# Generated by Django 4.2.5 on 2024-04-09 19:08
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('billing', '0015_order'),
]
operations = [
migrations.AlterField(
model_name='order',
name='status',
field=models.CharField(choices=[('Completed', 'Completed'), ('Failed', 'Failed'), ('Cancelled', 'Cancelled'), ('None', 'None')], default='Cancelled', max_length=200),
),
]

@ -0,0 +1,19 @@
# Generated by Django 4.2.5 on 2024-04-09 19:10
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('billing', '0016_alter_order_status'),
]
operations = [
migrations.AddField(
model_name='service',
name='order',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='billing.order'),
),
]

@ -0,0 +1,18 @@
# Generated by Django 4.2.5 on 2024-04-09 19:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('billing', '0017_service_order'),
]
operations = [
migrations.AlterField(
model_name='order',
name='status',
field=models.CharField(choices=[('Completed', 'Completed'), ('Failed', 'Failed'), ('Cancelled', 'Cancelled'), ('None', 'None')], default='None', max_length=200),
),
]

@ -0,0 +1,111 @@
# Generated by Django 4.2.5 on 2024-04-09 20:21
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('osinacore', '0065_alter_customerprofile_status'),
('billing', '0018_alter_order_status'),
]
operations = [
migrations.CreateModel(
name='Item',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=200)),
('description', models.TextField(blank=True)),
('amount', models.FloatField(null=True)),
('recurring', models.BooleanField(default=False)),
('created_at', models.DateField(blank=True, null=True)),
('cancelled_at', models.DateField(blank=True, null=True)),
('active', models.BooleanField(default=True, null=True)),
('project', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='osinacore.project')),
('recurring_cycle', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='billing.recurringcycle')),
('type', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='osinacore.projecttype')),
],
),
migrations.CreateModel(
name='OrderPayment',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('amount', models.DecimalField(decimal_places=3, max_digits=5)),
('date_paid', models.DateField()),
('comment', models.TextField(blank=True, null=True)),
],
),
migrations.RemoveField(
model_name='service',
name='customer',
),
migrations.RemoveField(
model_name='service',
name='order',
),
migrations.RemoveField(
model_name='service',
name='project',
),
migrations.RemoveField(
model_name='service',
name='recurring_cycle',
),
migrations.RemoveField(
model_name='service',
name='type',
),
migrations.RemoveField(
model_name='servicepayment',
name='charge',
),
migrations.RemoveField(
model_name='servicepayment',
name='type',
),
migrations.RemoveField(
model_name='invoice',
name='charge',
),
migrations.AddField(
model_name='invoice',
name='order',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='billing.order'),
),
migrations.AddField(
model_name='order',
name='due_date',
field=models.DateField(null=True),
),
migrations.AddField(
model_name='order',
name='paid',
field=models.BooleanField(default=False, null=True),
),
migrations.DeleteModel(
name='Charge',
),
migrations.DeleteModel(
name='Service',
),
migrations.DeleteModel(
name='ServicePayment',
),
migrations.AddField(
model_name='orderpayment',
name='order',
field=models.ManyToManyField(null=True, to='billing.order'),
),
migrations.AddField(
model_name='orderpayment',
name='type',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='billing.paymenttype'),
),
migrations.AlterField(
model_name='receipt',
name='payment',
field=models.ManyToManyField(to='billing.orderpayment'),
),
]

@ -0,0 +1,22 @@
# Generated by Django 4.2.5 on 2024-04-09 20:23
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('billing', '0019_item_orderpayment_remove_service_customer_and_more'),
]
operations = [
migrations.CreateModel(
name='OrderItem',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='billing.item')),
('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='billing.order')),
],
),
]

@ -0,0 +1,23 @@
# Generated by Django 4.2.5 on 2024-04-09 20:27
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('billing', '0020_orderitem'),
]
operations = [
migrations.RemoveField(
model_name='item',
name='recurring_cycle',
),
migrations.AddField(
model_name='orderitem',
name='recurring_cycle',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='billing.recurringcycle'),
),
]

@ -9,29 +9,58 @@ class RecurringCycle(models.Model):
return f"{self.months} months" return f"{self.months} months"
class Service(models.Model):
class Item(models.Model):
TYPE = (
('Product', 'Product'),
('Service', 'Service'),
)
title = models.CharField(max_length=200) title = models.CharField(max_length=200)
description = models.TextField(blank=True) description = models.TextField(blank=True)
customer = models.ForeignKey(CustomerProfile, on_delete=models.CASCADE)
project = models.ForeignKey(Project, blank=True, on_delete=models.CASCADE) project = models.ForeignKey(Project, blank=True, on_delete=models.CASCADE)
type = models.ForeignKey(ProjectType, on_delete=models.CASCADE, blank=True) type = models.ForeignKey(ProjectType, on_delete=models.CASCADE, blank=True)
amount = models.DecimalField(decimal_places=3, max_digits = 5) amount = models.FloatField(null=True)
recurring = models.BooleanField(default=False) recurring = models.BooleanField(default=False)
recurring_cycle = models.ForeignKey(RecurringCycle, on_delete=models.SET_NULL, null=True, blank=True) created_at = models.DateField(null=True, blank=True)
created_at = models.DateField(null=True)
cancelled_at = models.DateField(blank=True, null=True) cancelled_at = models.DateField(blank=True, null=True)
active = models.BooleanField(default=True, null=True) active = models.BooleanField(default=True, null=True)
def __str__(self): def __str__(self):
return self.title return self.title
class Charge(models.Model): class Order(models.Model):
service = models.ForeignKey(Service, on_delete=models.CASCADE) STATUS = (
amount = models.DecimalField(decimal_places=3, max_digits = 5, null=True) ('Completed', 'Completed'),
due_date = models.DateField() ('Failed', 'Failed'),
is_paid = models.BooleanField(default=False) ('Cancelled', 'Cancelled'),
('None', 'None'),
)
customer = models.ForeignKey(CustomerProfile, on_delete=models.CASCADE)
status = models.CharField(max_length=200, choices=STATUS, default='None')
order_id = models.CharField(max_length=100, null=True, blank=True)
due_date = models.DateField(null=True)
paid = models.BooleanField(null=True, default=False)
def save(self, *args, **kwargs):
if not self.order_id:
order_count = Order.objects.filter(customer=self.customer).count()
order_count_str = str(order_count).zfill(4)
self.order_id = f"{self.customer.customer_id}-{order_count_str}"
super(Order, self).save(*args, **kwargs)
class OrderItem(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE)
item = models.ForeignKey(Item, on_delete=models.CASCADE)
recurring_cycle = models.ForeignKey(RecurringCycle, on_delete=models.SET_NULL, null=True, blank=True)
class Invoice(models.Model):
invoice_number = models.CharField(max_length=100)
order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True)
date_created = models.DateField()
def __str__(self): def __str__(self):
return f"{self.service}'s charge due {self.due_date}" return self.invoice_number
class PaymentType(models.Model): class PaymentType(models.Model):
@ -40,27 +69,18 @@ class PaymentType(models.Model):
return self.name return self.name
class ServicePayment(models.Model): class OrderPayment(models.Model):
charge = models.ManyToManyField(Charge, null=True) order = models.ManyToManyField(Order, null=True)
amount = models.DecimalField(decimal_places=3, max_digits = 5) amount = models.DecimalField(decimal_places=3, max_digits = 5)
date_paid = models.DateField() date_paid = models.DateField()
type = models.ForeignKey(PaymentType, null=True, on_delete=models.SET_NULL) type = models.ForeignKey(PaymentType, null=True, on_delete=models.SET_NULL)
comment = models.TextField(null=True, blank=True) comment = models.TextField(null=True, blank=True)
def __str__(self): def __str__(self):
return f"Payment for {self.charge}" return f"Payment for {self.order}"
class Invoice(models.Model):
invoice_number = models.CharField(max_length=100)
charge = models.ManyToManyField(Charge)
date_created = models.DateField()
def __str__(self):
return self.invoice_number
class Receipt(models.Model): class Receipt(models.Model):
receipt_number = models.CharField(max_length=100) receipt_number = models.CharField(max_length=100)
payment = models.ManyToManyField(ServicePayment) payment = models.ManyToManyField(OrderPayment)
date_generated = models.DateField() date_generated = models.DateField()
def __str__(self): def __str__(self):
return self.receipt_number return self.receipt_number

@ -3,6 +3,7 @@ from django.contrib.auth.decorators import login_required
from django.http import JsonResponse from django.http import JsonResponse
import requests import requests
from .decorators import * from .decorators import *
from billing.models import *
import uuid import uuid
import base64 import base64
@ -56,9 +57,10 @@ def initiate_checkout(request):
merchant_id = 'TEST06127800' merchant_id = 'TEST06127800'
merchant_name = 'Ositcom Sal' merchant_name = 'Ositcom Sal'
order_id = str(uuid.uuid4())[:8] customer = request.user.customerprofile
order = Order.objects.create(status='None', customer=customer)
order.save()
order_id = order.order_id
payload = { payload = {
'apiOperation': 'INITIATE_CHECKOUT', 'apiOperation': 'INITIATE_CHECKOUT',
@ -98,6 +100,7 @@ def initiate_checkout(request):
def check_order_status(request, merchant_id, order_id): def check_order_status(request, merchant_id, order_id):
api_password = '37846250a67c70e7fe9f82cf6ca81f93' api_password = '37846250a67c70e7fe9f82cf6ca81f93'
url = f"https://creditlibanais-netcommerce.gateway.mastercard.com/api/rest/version/78/merchant/{merchant_id}/order/{order_id}" 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 = { headers = {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
@ -109,6 +112,9 @@ def check_order_status(request, merchant_id, order_id):
if response.status_code == 200: if response.status_code == 200:
order_details = response.json() order_details = response.json()
if order_details.get('result') == 'SUCCESS':
order.status = 'Completed'
order.save()
return JsonResponse(order_details) return JsonResponse(order_details)
else: else:
error_message = 'Failed to retrieve order details: ' + response.text error_message = 'Failed to retrieve order details: ' + response.text

Binary file not shown.
Loading…
Cancel
Save