diff --git a/core/templates/core/user_account.jinja b/core/templates/core/user_account.jinja
index 50a4d8ab..ca5093f5 100644
--- a/core/templates/core/user_account.jinja
+++ b/core/templates/core/user_account.jinja
@@ -14,48 +14,56 @@
{% trans %}Date{% endtrans %}
+ {% trans %}Counter{% endtrans %}
{% trans %}Barman{% endtrans %}
{% trans %}Amount{% endtrans %}
+ {% trans %}Payment method{% endtrans %}
{% trans %}Date{% endtrans %} | +{% trans %}Counter{% endtrans %} | {% trans %}Barman{% endtrans %} | {% trans %}Label{% endtrans %} | {% trans %}Quantity{% endtrans %} | {% trans %}Total{% endtrans %} | +{% trans %}Payment method{% endtrans %} | |
{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }} | -{{ i.seller }} | +{{ i.counter }} | +{{ i.seller.get_display_name() }} | {{ i.label }} | {{ i.quantity }} | {{ i.quantity * i.unit_price }} € | +{{ i.get_payment_method_display() }} |
{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }} |
diff --git a/counter/migrations/0009_auto_20160818_1709.py b/counter/migrations/0009_auto_20160818_1709.py
new file mode 100644
index 00000000..f6c9ccbf
--- /dev/null
+++ b/counter/migrations/0009_auto_20160818_1709.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('counter', '0008_auto_20160818_0231'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='refilling',
+ name='payment_method',
+ field=models.CharField(verbose_name='payment method', default='CASH', choices=[('CHECK', 'Check'), ('CASH', 'Cash'), ('EBOUTIC', 'Eboutic')], max_length=255),
+ ),
+ ]
diff --git a/counter/migrations/0010_auto_20160818_1716.py b/counter/migrations/0010_auto_20160818_1716.py
new file mode 100644
index 00000000..cb92c366
--- /dev/null
+++ b/counter/migrations/0010_auto_20160818_1716.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('counter', '0009_auto_20160818_1709'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='refilling',
+ name='payment_method',
+ field=models.CharField(default='CASH', max_length=255, verbose_name='payment method', choices=[('CHECK', 'Check'), ('CASH', 'Cash'), ('CARD', 'Credit card')]),
+ ),
+ ]
diff --git a/counter/migrations/0011_auto_20160818_1722.py b/counter/migrations/0011_auto_20160818_1722.py
new file mode 100644
index 00000000..391f475d
--- /dev/null
+++ b/counter/migrations/0011_auto_20160818_1722.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+from django.conf import settings
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('counter', '0010_auto_20160818_1716'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='selling',
+ name='club',
+ field=models.ForeignKey(related_name='sellings', null=True, on_delete=django.db.models.deletion.SET_NULL, to='club.Club'),
+ ),
+ migrations.AlterField(
+ model_name='selling',
+ name='counter',
+ field=models.ForeignKey(related_name='sellings', null=True, on_delete=django.db.models.deletion.SET_NULL, to='counter.Counter'),
+ ),
+ migrations.AlterField(
+ model_name='selling',
+ name='customer',
+ field=models.ForeignKey(related_name='buyings', null=True, on_delete=django.db.models.deletion.SET_NULL, to='counter.Customer'),
+ ),
+ migrations.AlterField(
+ model_name='selling',
+ name='product',
+ field=models.ForeignKey(related_name='sellings', null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to='counter.Product'),
+ ),
+ migrations.AlterField(
+ model_name='selling',
+ name='seller',
+ field=models.ForeignKey(related_name='sellings_as_operator', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL),
+ ),
+ ]
diff --git a/counter/migrations/0012_selling_payment_method.py b/counter/migrations/0012_selling_payment_method.py
new file mode 100644
index 00000000..6f56d94e
--- /dev/null
+++ b/counter/migrations/0012_selling_payment_method.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('counter', '0011_auto_20160818_1722'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='selling',
+ name='payment_method',
+ field=models.CharField(default='SITH_ACCOUNT', max_length=255, verbose_name='payment method', choices=[('SITH_ACCOUNT', 'Compte AE'), ('CARD', 'Credit card')]),
+ ),
+ ]
diff --git a/counter/migrations/0013_auto_20160818_1736.py b/counter/migrations/0013_auto_20160818_1736.py
new file mode 100644
index 00000000..d509ec9d
--- /dev/null
+++ b/counter/migrations/0013_auto_20160818_1736.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('counter', '0012_selling_payment_method'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='selling',
+ name='payment_method',
+ field=models.CharField(max_length=255, default='SITH_ACCOUNT', verbose_name='payment method', choices=[('SITH_ACCOUNT', 'Sith account'), ('CARD', 'Credit card')]),
+ ),
+ ]
diff --git a/counter/models.py b/counter/models.py
index 7a76c1e3..066f6bbc 100644
--- a/counter/models.py
+++ b/counter/models.py
@@ -5,7 +5,8 @@ from django.conf import settings
from django.core.urlresolvers import reverse
from django.forms import ValidationError
-from datetime import timedelta
+from datetime import timedelta, datetime
+from pytz import timezone
import random
import string
@@ -206,7 +207,7 @@ class Refilling(models.Model):
amount = CurrencyField(_('amount'))
operator = models.ForeignKey(User, related_name="refillings_as_operator", blank=False)
customer = models.ForeignKey(Customer, related_name="refillings", blank=False)
- date = models.DateTimeField(_('date'), auto_now=True)
+ date = models.DateTimeField(_('date'))
payment_method = models.CharField(_('payment method'), max_length=255,
choices=settings.SITH_COUNTER_PAYMENT_METHOD, default='CASH')
bank = models.CharField(_('bank'), max_length=255,
@@ -223,6 +224,8 @@ class Refilling(models.Model):
# return reverse('counter:details', kwargs={'counter_id': self.id})
def save(self, *args, **kwargs):
+ if not self.date:
+ self.date = datetime.now().replace(tzinfo=timezone(settings.TIME_ZONE))
self.full_clean()
if not self.is_validated:
self.customer.amount += self.amount
@@ -235,14 +238,16 @@ class Selling(models.Model):
Handle the sellings
"""
label = models.CharField(_("label"), max_length=64)
- product = models.ForeignKey(Product, related_name="sellings", null=True, blank=True)
- counter = models.ForeignKey(Counter, related_name="sellings", blank=False)
- club = models.ForeignKey(Club, related_name="sellings", blank=False)
+ product = models.ForeignKey(Product, related_name="sellings", null=True, blank=True, on_delete=models.SET_NULL)
+ counter = models.ForeignKey(Counter, related_name="sellings", null=True, blank=False, on_delete=models.SET_NULL)
+ club = models.ForeignKey(Club, related_name="sellings", null=True, blank=False, on_delete=models.SET_NULL)
unit_price = CurrencyField(_('unit price'))
quantity = models.IntegerField(_('quantity'))
- seller = models.ForeignKey(User, related_name="sellings_as_operator", blank=False)
- customer = models.ForeignKey(Customer, related_name="buyings", blank=False)
- date = models.DateTimeField(_('date'), auto_now=True)
+ seller = models.ForeignKey(User, related_name="sellings_as_operator", null=True, blank=False, on_delete=models.SET_NULL)
+ customer = models.ForeignKey(Customer, related_name="buyings", null=True, blank=False, on_delete=models.SET_NULL)
+ date = models.DateTimeField(_('date'))
+ payment_method = models.CharField(_('payment method'), max_length=255,
+ choices=[('SITH_ACCOUNT', _('Sith account')), ('CARD', _('Credit card'))], default='SITH_ACCOUNT')
is_validated = models.BooleanField(_('is validated'), default=False)
class Meta:
@@ -253,6 +258,8 @@ class Selling(models.Model):
self.quantity*self.unit_price, self.customer.user.get_display_name())
def save(self, *args, **kwargs):
+ if not self.date:
+ self.date = datetime.now().replace(tzinfo=timezone(settings.TIME_ZONE))
self.full_clean()
if not self.is_validated:
self.customer.amount -= self.quantity * self.unit_price
diff --git a/counter/views.py b/counter/views.py
index 361e4833..f6298df0 100644
--- a/counter/views.py
+++ b/counter/views.py
@@ -44,7 +44,8 @@ class GetUserForm(forms.Form):
elif cleaned_data['id'] is not None:
cus = Customer.objects.filter(user=cleaned_data['id']).first()
sub = get_subscriber(cus.user) if cus is not None else None
- if cus is None or sub is None or (date.today() - sub.subscriptions.last().subscription_end) > timedelta(days=90):
+ if (cus is None or sub is None or not sub.subscriptions.last() or
+ (date.today() - sub.subscriptions.last().subscription_end) > timedelta(days=90)):
raise forms.ValidationError(_("User not found"))
cleaned_data['user_id'] = cus.user.id
cleaned_data['user'] = cus.user
diff --git a/eboutic/migrations/0002_auto_20160818_1635.py b/eboutic/migrations/0002_auto_20160818_1635.py
new file mode 100644
index 00000000..f1a52223
--- /dev/null
+++ b/eboutic/migrations/0002_auto_20160818_1635.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('eboutic', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='basketitem',
+ name='type',
+ ),
+ migrations.RemoveField(
+ model_name='invoiceitem',
+ name='type',
+ ),
+ migrations.AddField(
+ model_name='basketitem',
+ name='type_id',
+ field=models.IntegerField(default=1, verbose_name='product type id'),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name='invoiceitem',
+ name='type_id',
+ field=models.IntegerField(default=1, verbose_name='product type id'),
+ preserve_default=False,
+ ),
+ ]
diff --git a/eboutic/migrations/0003_auto_20160818_1738.py b/eboutic/migrations/0003_auto_20160818_1738.py
new file mode 100644
index 00000000..0b72703a
--- /dev/null
+++ b/eboutic/migrations/0003_auto_20160818_1738.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('eboutic', '0002_auto_20160818_1635'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='invoice',
+ name='payment_method',
+ field=models.CharField(verbose_name='payment method', max_length=20, choices=[('CARD', 'Credit card'), ('SITH_ACCOUNT', 'Sith account')]),
+ ),
+ ]
diff --git a/eboutic/migrations/0004_remove_invoice_payment_method.py b/eboutic/migrations/0004_remove_invoice_payment_method.py
new file mode 100644
index 00000000..27241c1e
--- /dev/null
+++ b/eboutic/migrations/0004_remove_invoice_payment_method.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('eboutic', '0003_auto_20160818_1738'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='invoice',
+ name='payment_method',
+ ),
+ ]
diff --git a/eboutic/models.py b/eboutic/models.py
index 58ee1063..2f4bc61b 100644
--- a/eboutic/models.py
+++ b/eboutic/models.py
@@ -1,8 +1,9 @@
from django.db import models, DataError
from django.utils.translation import ugettext_lazy as _
+from django.conf import settings
from accounting.models import CurrencyField
-from counter.models import Counter, Product, Customer
+from counter.models import Counter, Product, Customer, Selling, Refilling
from core.models import User
class Basket(models.Model):
@@ -15,7 +16,7 @@ class Basket(models.Model):
def add_product(self, p, q = 1):
item = self.items.filter(product_id=p.id).first()
if item is None:
- BasketItem(basket=self, product_id=p.id, product_name=p.name, type=p.product_type.name,
+ BasketItem(basket=self, product_id=p.id, product_name=p.name, type_id=p.product_type.id,
quantity=q, product_unit_price=p.selling_price).save()
else:
item.quantity += q
@@ -44,10 +45,11 @@ class Invoice(models.Model):
"""
user = models.ForeignKey(User, related_name='invoices', verbose_name=_('user'), blank=False)
date = models.DateTimeField(_('date'), auto_now=True)
- payment_method = models.CharField(choices=[('CREDIT_CARD', _('Credit card')), ('SITH_ACCOUNT', _('Sith account'))],
- max_length=20, verbose_name=_('payment method'))
validated = models.BooleanField(_("validated"), default=False)
+ def __str__(self):
+ return "%s - %s - %s" % (self.user, self.get_total(), self.date)
+
def get_total(self):
total = 0
for i in self.items.all():
@@ -59,23 +61,44 @@ class Invoice(models.Model):
raise DataError(_("Invoice already validated"))
from counter.models import Customer
if not Customer.objects.filter(user=self.user).exists():
- number = Customer.objects.last().account_id[:-1]
+ number = Customer.objects.count() + 1
Customer(user=self.user, account_id=Customer.generate_account_id(number), amount=0).save()
- if self.payment_method == "SITH_ACCOUNT":
- self.user.customer.amount -= self.get_total()
- self.user.customer.save()
- else:
- for i in self.items.filter(type="REFILLING").all():
- self.user.customer.amount += i.product_unit_price * i.quantity
- self.user.customer.save()
-
+ eboutic = Counter.objects.filter(type="EBOUTIC").first()
+ for i in self.items.all():
+ if i.type_id == settings.SITH_COUNTER_PRODUCTTYPE_REFILLING:
+ new = Refilling(
+ counter=eboutic,
+ customer=self.user.customer,
+ operator=self.user,
+ amount=i.product_unit_price * i.quantity,
+ payment_method="CARD",
+ bank="OTHER",
+ date=self.date,
+ )
+ new.save()
+ else:
+ product = Product.objects.filter(id=i.product_id).first()
+ new = Selling(
+ label=i.product_name,
+ counter=eboutic,
+ club=product.club,
+ product=product,
+ seller=self.user,
+ customer=self.user.customer,
+ unit_price=i.product_unit_price,
+ quantity=i.quantity,
+ payment_method="CARD",
+ is_validated=True,
+ date=self.date,
+ )
+ new.save()
self.validated = True
self.save()
class AbstractBaseItem(models.Model):
product_id = models.IntegerField(_('product id'))
product_name = models.CharField(_('product name'), max_length=255)
- type = models.CharField(_('product type'), max_length=255)
+ type_id = models.IntegerField(_('product type id'))
product_unit_price = CurrencyField(_('unit price'))
quantity = models.IntegerField(_('quantity'))
diff --git a/eboutic/templates/eboutic/eboutic_main.jinja b/eboutic/templates/eboutic/eboutic_main.jinja
index 68d4f7e8..cce2caf3 100644
--- a/eboutic/templates/eboutic/eboutic_main.jinja
+++ b/eboutic/templates/eboutic/eboutic_main.jinja
@@ -1,5 +1,9 @@
{% extends "core/base.jinja" %}
+{% block title %}
+{% trans %}Eboutic{% endtrans %}
+{% endblock %}
+
{% macro add_product(id, content) %}
-
{% endblock %}
diff --git a/eboutic/templates/eboutic/eboutic_makecommand.jinja b/eboutic/templates/eboutic/eboutic_makecommand.jinja
index 33e93a6c..f60986ce 100644
--- a/eboutic/templates/eboutic/eboutic_makecommand.jinja
+++ b/eboutic/templates/eboutic/eboutic_makecommand.jinja
@@ -1,5 +1,9 @@
{% extends "core/base.jinja" %}
+{% block title %}
+{% trans %}Basket state{% endtrans %}
+{% endblock %}
+
{% block content %}
{% trans %}Products: {% endtrans %} - {% for p in eboutic.products.all() %} - {{ add_product(p.id, p.name) }} + {% for t in categories %} + {% if eboutic.products.filter(product_type=t).exists() %} + {{ t }}+ {% for p in eboutic.products.filter(product_type=t).all() %} + {{ add_product(p.id, p.name) }} + {% endfor %} + {% endif %} {% endfor %} -{% trans %}Eboutic{% endtrans %}@@ -30,7 +34,7 @@ {% endfor %} - {% if basket.items.filter(type="REFILLING").exists() %} + {% if basket.items.filter(type_id=settings.SITH_COUNTER_PRODUCTTYPE_REFILLING).exists() %}{% trans %}AE account payment disabled because your basket contains refilling items.{% endtrans %} {% else %} |