From 4745884b62b84a358cfb4f134dc98ca0fd5523b2 Mon Sep 17 00:00:00 2001 From: kj1352 Date: Fri, 22 Jul 2022 15:48:23 +0530 Subject: [PATCH] Expense model defined and ready to be reviewed along with exployee perks model --- employee/models.py | 26 ++++++++++++++++ expense/__init__.py | 0 expense/admin.py | 3 ++ expense/apps.py | 6 ++++ expense/models.py | 54 ++++++++++++++++++++++++++++++++++ expense/tests.py | 3 ++ expense/views.py | 3 ++ workx_backend/settings/base.py | 3 +- 8 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 expense/__init__.py create mode 100644 expense/admin.py create mode 100644 expense/apps.py create mode 100644 expense/models.py create mode 100644 expense/tests.py create mode 100644 expense/views.py diff --git a/employee/models.py b/employee/models.py index a367373..4122ea4 100644 --- a/employee/models.py +++ b/employee/models.py @@ -15,3 +15,29 @@ class Employee(models.Model): def __str__(self): return self.employee_id + + +class Perk(models.Model): + employee = models.OneToOneField(Employee, on_delete=models.CASCADE) + perk_per_month = models.DecimalField(max_digits=15, decimal_places=2) + + @property + def total_perk(self): + perks = self.perk_transactions.all() + total = 0 + for perk in perks: + if perk.type == 'INCOME': + total += perk.amount + else: + total -= perk.amount + return total + + +class PerkTransaction(models.Model): + TRANSACTION_TYPE = ( + ("INCOME", "INCOME"), + ("EXPENSE", "EXPENSE") + ) + type = models.CharField(choices=TRANSACTION_TYPE, default="INCOME", max_length=10) + amount = models.DecimalField(max_digits=15, decimal_places=2) + perk = models.ForeignKey(Perk, on_delete=models.CASCADE) diff --git a/expense/__init__.py b/expense/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/expense/admin.py b/expense/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/expense/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/expense/apps.py b/expense/apps.py new file mode 100644 index 0000000..ae52662 --- /dev/null +++ b/expense/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ExpenseConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'expense' diff --git a/expense/models.py b/expense/models.py new file mode 100644 index 0000000..5429723 --- /dev/null +++ b/expense/models.py @@ -0,0 +1,54 @@ +from django.db import models +from employee.models import Employee + + +class CompanyBankAccount(models.Model): + name = models.CharField(max_length=50) + logo = models.ImageField(upload_to='banks', null=True, blank=True) + + def __str__(self): + return self.name + + +class Category(models.Model): + name = models.CharField(max_length=30) + + def __str__(self): + return self.name + + +class Expense(models.Model): + PAYMENT_MODE = ( + ("REIMBURSE", "REIMBURSE"), + ("PERK", "PERK") + ) + title = models.CharField(max_length=50) + category = models.ForeignKey(Category, on_delete=models.CASCADE) + expense_id = models.CharField(max_length=15) + date_of_creation = models.DateField() + team_member = models.ForeignKey(Employee, on_delete=models.CASCADE) + company_bank_account = models.ForeignKey(CompanyBankAccount, on_delete=models.CASCADE) + repayment_mode = models.CharField(max_length=10, choices=PAYMENT_MODE, default="REIMBURSE") + + @property + def expense_total(self): + items = self.items.all() + total = 0 + for item in items: + total += item.item_total + return total + + +class Item(models.Model): + name = models.CharField(max_length=100) + rate = models.DecimalField(max_digits=15, decimal_places=2) + quantity = models.IntegerField() + expense = models.ForeignKey(Expense, on_delete=models.CASCADE) + attachment = models.ImageField(upload_to='expense_item') + + @property + def item_total(self): + return self.amount * self.quantity + + def __str__(self): + return self.name diff --git a/expense/tests.py b/expense/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/expense/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/expense/views.py b/expense/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/expense/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/workx_backend/settings/base.py b/workx_backend/settings/base.py index d956080..48cf5a5 100644 --- a/workx_backend/settings/base.py +++ b/workx_backend/settings/base.py @@ -29,7 +29,8 @@ INSTALLED_APPS = [ 'employee', 'invoice', 'project', - 'representative' + 'representative', + 'expense' ] PASSWORDLESS_AUTH = {