diff --git a/apps/treasury/__init__.py b/apps/treasury/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/apps/treasury/api/__init__.py b/apps/treasury/api/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/apps/treasury/apps.py b/apps/treasury/apps.py new file mode 100644 index 0000000000000000000000000000000000000000..5f7f6dc9b9956fd1e8257eb0981ae3a47ebf85c7 --- /dev/null +++ b/apps/treasury/apps.py @@ -0,0 +1,11 @@ +# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django.apps import AppConfig +from django.db.models.signals import pre_save, post_save, post_delete +from django.utils.translation import gettext_lazy as _ + + +class TreasuryConfig(AppConfig): + name = 'treasury' + verbose_name = _('Treasury') diff --git a/apps/treasury/migrations/__init__.py b/apps/treasury/migrations/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/apps/treasury/models.py b/apps/treasury/models.py new file mode 100644 index 0000000000000000000000000000000000000000..51974ec0ad46f3eea088ed7548774c51da2bad7c --- /dev/null +++ b/apps/treasury/models.py @@ -0,0 +1,113 @@ +# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django.db import models +from django.utils.translation import gettext_lazy as _ + + +class Billing(models.Model): + id = models.PositiveIntegerField( + primary_key=True, + verbose_name=_("Billing identifier"), + ) + + subject = models.CharField( + max_length=255, + verbose_name=_("Subject"), + ) + + description = models.TextField( + verbose_name=_("Description") + ) + + name = models.CharField( + max_length=255, + verbose_name=_("Name"), + ) + + address = models.TextField( + verbose_name=_("Address"), + ) + + date = models.DateField( + auto_now_add=True, + verbose_name=_("Place"), + ) + + acquitted = models.BooleanField( + verbose_name=_("Acquitted"), + ) + + place = models.CharField( + max_length=255, + default="Cachan", + verbose_name=_("Place"), + ) + + my_name = models.CharField( + max_length=255, + default="BDE ENS Cachan", + verbose_name=_("My name"), + ) + + my_address_street = models.CharField( + max_length=255, + default="61 avenue du Président Wilson", + verbose_name=_("My street address"), + ) + + my_city = models.CharField( + max_length=255, + default="94230 Cachan", + verbose_name=_("My city"), + ) + + bank_code = models.IntegerField( + default=30003, + verbose_name=_("Bank code"), + ) + + desk_code = models.IntegerField( + default=3894, + verbose_name=_("Desk code"), + ) + + account_number = models.IntegerField( + default=37280662, + verbose_name=_("Account number"), + ) + + rib_key = models.SmallIntegerField( + default=14, + verbose_name=_("RIB Key") + ) + + bic = models.CharField( + max_length=16, + default="SOGEFRPP", + verbose_name=_("BIC Code") + ) + + +class Product(models.Model): + billing = models.ForeignKey( + Billing, + on_delete=models.PROTECT, + ) + + designation = models.CharField( + max_length=255, + verbose_name=_("Designation"), + ) + + quantity = models.PositiveIntegerField( + verbose_name=_("Quantity") + ) + + amount = models.PositiveIntegerField( + verbose_name=_("Unit price") + ) + + @property + def total(self): + return self.quantity * self.amount diff --git a/apps/treasury/tables.py b/apps/treasury/tables.py new file mode 100644 index 0000000000000000000000000000000000000000..b0b4f1db358f508dd2d481121926ceddf2bd457c --- /dev/null +++ b/apps/treasury/tables.py @@ -0,0 +1,20 @@ +# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django_tables2 import tables + +from .models import Billing + + +class BillingTable(tables.Table): + class Meta: + attrs = { + 'class': 'table table-condensed table-striped table-hover' + } + model = Billing + template_name = 'django_tables2/bootstrap4.html' + fields = ('id', 'name', 'subject', 'acquitted', ) + row_attrs = { + 'class': 'table-row', + 'data-href': lambda record: record.pk + } \ No newline at end of file diff --git a/apps/treasury/urls.py b/apps/treasury/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..7cd68ec0a033302d2a06267046565fc9880fbca1 --- /dev/null +++ b/apps/treasury/urls.py @@ -0,0 +1,11 @@ +# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django.urls import path + +from .views import BillingListView + +app_name = 'treasury' +urlpatterns = [ + path('billing/', BillingListView.as_view(), name='billing'), +] diff --git a/apps/treasury/views.py b/apps/treasury/views.py new file mode 100644 index 0000000000000000000000000000000000000000..435f8cdbb6921036ff8624ec49473986d213f83c --- /dev/null +++ b/apps/treasury/views.py @@ -0,0 +1,16 @@ +# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django.contrib.auth.mixins import LoginRequiredMixin +from django_tables2 import SingleTableView + +from .models import Billing +from .tables import BillingTable + + +class BillingListView(LoginRequiredMixin, SingleTableView): + """ + List existing Billings + """ + model = Billing + table_class = BillingTable diff --git a/note_kfet/settings/base.py b/note_kfet/settings/base.py index 0694390d778e3b65f33bfe3c191251bb844bb87e..d85071c59b3c8b95cee7e150b677f4a8de4ada4d 100644 --- a/note_kfet/settings/base.py +++ b/note_kfet/settings/base.py @@ -61,6 +61,7 @@ INSTALLED_APPS = [ 'activity', 'member', 'note', + 'treasury', 'api', 'logs', ] diff --git a/note_kfet/urls.py b/note_kfet/urls.py index da2f9d6c246833c3962b8b0727869a9585b5c4f9..80808bbe6b22992197c6ccae392345c69f1eed07 100644 --- a/note_kfet/urls.py +++ b/note_kfet/urls.py @@ -13,6 +13,7 @@ urlpatterns = [ # Include project routers path('note/', include('note.urls')), + path('treasury/', include('treasury.urls')), # Include Django Contrib and Core routers path('i18n/', include('django.conf.urls.i18n')), diff --git a/templates/base.html b/templates/base.html index d57dab8933ca1e51f182e73e66f28fedde1df727..88ad67f99f1685b5a1b7323798200e43885a4adf 100644 --- a/templates/base.html +++ b/templates/base.html @@ -81,6 +81,9 @@ SPDX-License-Identifier: GPL-3.0-or-later <li class="nav-item active"> <a class="nav-link" href="{% url 'note:transfer' %}"><i class="fa fa-exchange"></i>{% trans 'Transfer' %} </a> </li> + <li class="nav-item active"> + <a class="nav-link" href="{% url 'treasury:billing' %}"><i class="fa fa-money"></i>{% trans 'Treasury' %} </a> + </li> </ul> <ul class="navbar-nav ml-auto"> {% if user.is_authenticated %} diff --git a/templates/treasury/billing_list.html b/templates/treasury/billing_list.html new file mode 100644 index 0000000000000000000000000000000000000000..1cc473f11c3c0a950f6e2e05755967468e6f388d --- /dev/null +++ b/templates/treasury/billing_list.html @@ -0,0 +1,21 @@ +{% extends "base.html" %} +{% load render_table from django_tables2 %} +{% load i18n %} +{% block content %} + +{% render_table table %} + +<a class="btn btn-primary" href="{% url 'treasury:billing' %}">{% trans "New billing" %}</a> + +{% endblock %} +{% block extrajavascript %} +<script type="text/javascript"> + +$(document).ready(function($) { + $(".table-row").click(function() { + window.document.location = $(this).data("href"); + }); +}); + +</script> +{% endblock %}