Migrate invoices and lot of eboutic improvements

This commit is contained in:
Skia 2016-08-18 19:52:20 +02:00
parent 50c452c287
commit 05bd177a9d
19 changed files with 470 additions and 156 deletions

View File

@ -14,48 +14,56 @@
<thead> <thead>
<tr> <tr>
<td>{% trans %}Date{% endtrans %}</td> <td>{% trans %}Date{% endtrans %}</td>
<td>{% trans %}Counter{% endtrans %}</td>
<td>{% trans %}Barman{% endtrans %}</td> <td>{% trans %}Barman{% endtrans %}</td>
<td>{% trans %}Amount{% endtrans %}</td> <td>{% trans %}Amount{% endtrans %}</td>
<td>{% trans %}Payment method{% endtrans %}</td>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for i in customer.refillings.all() %} {% for i in customer.refillings.order_by('-date').all() %}
<tr> <tr>
<td>{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }}</td> <td>{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }}</td>
<td>{{ i.counter }}</td>
<td><a href="{{ i.operator.get_absolute_url() }}">{{ i.operator.get_display_name() }}</a></td> <td><a href="{{ i.operator.get_absolute_url() }}">{{ i.operator.get_display_name() }}</a></td>
<td>{{ i.amount }} €</td> <td>{{ i.amount }} €</td>
<td>{{ i.get_payment_method_display() }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% endif %} {% endif %}
{% if customer.buyings.exists() %} {% if customer.buyings.exists() %}
<h4>{% trans %}Buyings{% endtrans %}</h4> <h4>{% trans %}Account buyings{% endtrans %}</h4>
<table> <table>
<thead> <thead>
<tr> <tr>
<td>{% trans %}Date{% endtrans %}</td> <td>{% trans %}Date{% endtrans %}</td>
<td>{% trans %}Counter{% endtrans %}</td>
<td>{% trans %}Barman{% endtrans %}</td> <td>{% trans %}Barman{% endtrans %}</td>
<td>{% trans %}Label{% endtrans %}</td> <td>{% trans %}Label{% endtrans %}</td>
<td>{% trans %}Quantity{% endtrans %}</td> <td>{% trans %}Quantity{% endtrans %}</td>
<td>{% trans %}Total{% endtrans %}</td> <td>{% trans %}Total{% endtrans %}</td>
<td>{% trans %}Payment method{% endtrans %}</td>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for i in customer.buyings.all() %} {% for i in customer.buyings.order_by('-date').all() %}
<tr> <tr>
<td>{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }}</td> <td>{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }}</td>
<td>{{ i.seller }}</td> <td>{{ i.counter }}</td>
<td><a href="{{ i.seller.get_absolute_url() }}">{{ i.seller.get_display_name() }}</a></td>
<td>{{ i.label }}</td> <td>{{ i.label }}</td>
<td>{{ i.quantity }}</td> <td>{{ i.quantity }}</td>
<td>{{ i.quantity * i.unit_price }} €</td> <td>{{ i.quantity * i.unit_price }} €</td>
<td>{{ i.get_payment_method_display() }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% endif %} {% endif %}
{% if customer.user.invoices.exists() %} {% if customer.user.invoices.exists() %}
<h4>{% trans %}Invoices{% endtrans %}</h4> <h4>{% trans %}Eboutic invoices{% endtrans %}</h4>
<table> <table>
<thead> <thead>
<tr> <tr>
@ -65,7 +73,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for i in customer.user.invoices.all() %} {% for i in customer.user.invoices.order_by('-date').all() %}
<tr> <tr>
<td>{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }}</td> <td>{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }}</td>
<td> <td>

View File

@ -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),
),
]

View File

@ -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')]),
),
]

View File

@ -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),
),
]

View File

@ -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')]),
),
]

View File

@ -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')]),
),
]

View File

@ -5,7 +5,8 @@ from django.conf import settings
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.forms import ValidationError from django.forms import ValidationError
from datetime import timedelta from datetime import timedelta, datetime
from pytz import timezone
import random import random
import string import string
@ -206,7 +207,7 @@ class Refilling(models.Model):
amount = CurrencyField(_('amount')) amount = CurrencyField(_('amount'))
operator = models.ForeignKey(User, related_name="refillings_as_operator", blank=False) operator = models.ForeignKey(User, related_name="refillings_as_operator", blank=False)
customer = models.ForeignKey(Customer, related_name="refillings", 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, payment_method = models.CharField(_('payment method'), max_length=255,
choices=settings.SITH_COUNTER_PAYMENT_METHOD, default='CASH') choices=settings.SITH_COUNTER_PAYMENT_METHOD, default='CASH')
bank = models.CharField(_('bank'), max_length=255, bank = models.CharField(_('bank'), max_length=255,
@ -223,6 +224,8 @@ class Refilling(models.Model):
# return reverse('counter:details', kwargs={'counter_id': self.id}) # return reverse('counter:details', kwargs={'counter_id': self.id})
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.date:
self.date = datetime.now().replace(tzinfo=timezone(settings.TIME_ZONE))
self.full_clean() self.full_clean()
if not self.is_validated: if not self.is_validated:
self.customer.amount += self.amount self.customer.amount += self.amount
@ -235,14 +238,16 @@ class Selling(models.Model):
Handle the sellings Handle the sellings
""" """
label = models.CharField(_("label"), max_length=64) label = models.CharField(_("label"), max_length=64)
product = models.ForeignKey(Product, related_name="sellings", null=True, blank=True) product = models.ForeignKey(Product, related_name="sellings", null=True, blank=True, on_delete=models.SET_NULL)
counter = models.ForeignKey(Counter, related_name="sellings", blank=False) counter = models.ForeignKey(Counter, related_name="sellings", null=True, blank=False, on_delete=models.SET_NULL)
club = models.ForeignKey(Club, related_name="sellings", blank=False) club = models.ForeignKey(Club, related_name="sellings", null=True, blank=False, on_delete=models.SET_NULL)
unit_price = CurrencyField(_('unit price')) unit_price = CurrencyField(_('unit price'))
quantity = models.IntegerField(_('quantity')) quantity = models.IntegerField(_('quantity'))
seller = models.ForeignKey(User, related_name="sellings_as_operator", blank=False) 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", blank=False) customer = models.ForeignKey(Customer, related_name="buyings", null=True, blank=False, on_delete=models.SET_NULL)
date = models.DateTimeField(_('date'), auto_now=True) 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) is_validated = models.BooleanField(_('is validated'), default=False)
class Meta: class Meta:
@ -253,6 +258,8 @@ class Selling(models.Model):
self.quantity*self.unit_price, self.customer.user.get_display_name()) self.quantity*self.unit_price, self.customer.user.get_display_name())
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.date:
self.date = datetime.now().replace(tzinfo=timezone(settings.TIME_ZONE))
self.full_clean() self.full_clean()
if not self.is_validated: if not self.is_validated:
self.customer.amount -= self.quantity * self.unit_price self.customer.amount -= self.quantity * self.unit_price

View File

@ -44,7 +44,8 @@ class GetUserForm(forms.Form):
elif cleaned_data['id'] is not None: elif cleaned_data['id'] is not None:
cus = Customer.objects.filter(user=cleaned_data['id']).first() cus = Customer.objects.filter(user=cleaned_data['id']).first()
sub = get_subscriber(cus.user) if cus is not None else None 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")) raise forms.ValidationError(_("User not found"))
cleaned_data['user_id'] = cus.user.id cleaned_data['user_id'] = cus.user.id
cleaned_data['user'] = cus.user cleaned_data['user'] = cus.user

View File

@ -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,
),
]

View File

@ -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')]),
),
]

View File

@ -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',
),
]

View File

@ -1,8 +1,9 @@
from django.db import models, DataError from django.db import models, DataError
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.conf import settings
from accounting.models import CurrencyField 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 from core.models import User
class Basket(models.Model): class Basket(models.Model):
@ -15,7 +16,7 @@ class Basket(models.Model):
def add_product(self, p, q = 1): def add_product(self, p, q = 1):
item = self.items.filter(product_id=p.id).first() item = self.items.filter(product_id=p.id).first()
if item is None: 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() quantity=q, product_unit_price=p.selling_price).save()
else: else:
item.quantity += q item.quantity += q
@ -44,10 +45,11 @@ class Invoice(models.Model):
""" """
user = models.ForeignKey(User, related_name='invoices', verbose_name=_('user'), blank=False) user = models.ForeignKey(User, related_name='invoices', verbose_name=_('user'), blank=False)
date = models.DateTimeField(_('date'), auto_now=True) 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) validated = models.BooleanField(_("validated"), default=False)
def __str__(self):
return "%s - %s - %s" % (self.user, self.get_total(), self.date)
def get_total(self): def get_total(self):
total = 0 total = 0
for i in self.items.all(): for i in self.items.all():
@ -59,23 +61,44 @@ class Invoice(models.Model):
raise DataError(_("Invoice already validated")) raise DataError(_("Invoice already validated"))
from counter.models import Customer from counter.models import Customer
if not Customer.objects.filter(user=self.user).exists(): 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() Customer(user=self.user, account_id=Customer.generate_account_id(number), amount=0).save()
if self.payment_method == "SITH_ACCOUNT": eboutic = Counter.objects.filter(type="EBOUTIC").first()
self.user.customer.amount -= self.get_total() for i in self.items.all():
self.user.customer.save() if i.type_id == settings.SITH_COUNTER_PRODUCTTYPE_REFILLING:
else: new = Refilling(
for i in self.items.filter(type="REFILLING").all(): counter=eboutic,
self.user.customer.amount += i.product_unit_price * i.quantity customer=self.user.customer,
self.user.customer.save() 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.validated = True
self.save() self.save()
class AbstractBaseItem(models.Model): class AbstractBaseItem(models.Model):
product_id = models.IntegerField(_('product id')) product_id = models.IntegerField(_('product id'))
product_name = models.CharField(_('product name'), max_length=255) 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')) product_unit_price = CurrencyField(_('unit price'))
quantity = models.IntegerField(_('quantity')) quantity = models.IntegerField(_('quantity'))

View File

@ -1,5 +1,9 @@
{% extends "core/base.jinja" %} {% extends "core/base.jinja" %}
{% block title %}
{% trans %}Eboutic{% endtrans %}
{% endblock %}
{% macro add_product(id, content) %} {% macro add_product(id, content) %}
<form method="post" action="{{ url('eboutic:main') }}" class="inline" style="display:inline"> <form method="post" action="{{ url('eboutic:main') }}" class="inline" style="display:inline">
{% csrf_token %} {% csrf_token %}
@ -34,11 +38,14 @@
</form> </form>
</div> </div>
<div> <div>
<p><strong>{% trans %}Products: {% endtrans %}</strong> {% for t in categories %}
{% for p in eboutic.products.all() %} {% if eboutic.products.filter(product_type=t).exists() %}
{{ add_product(p.id, p.name) }} <h5>{{ t }}</h5>
{% for p in eboutic.products.filter(product_type=t).all() %}
{{ add_product(p.id, p.name) }}
{% endfor %}
{% endif %}
{% endfor %} {% endfor %}
</p>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -1,5 +1,9 @@
{% extends "core/base.jinja" %} {% extends "core/base.jinja" %}
{% block title %}
{% trans %}Basket state{% endtrans %}
{% endblock %}
{% block content %} {% block content %}
<h3>{% trans %}Eboutic{% endtrans %}</h3> <h3>{% trans %}Eboutic{% endtrans %}</h3>
@ -30,7 +34,7 @@
{% endfor %} {% endfor %}
<input type="submit" value="{% trans %}Pay with credit card{% endtrans %}" /> <input type="submit" value="{% trans %}Pay with credit card{% endtrans %}" />
</form> </form>
{% if basket.items.filter(type="REFILLING").exists() %} {% if basket.items.filter(type_id=settings.SITH_COUNTER_PRODUCTTYPE_REFILLING).exists() %}
<p>{% trans %}AE account payment disabled because your basket contains refilling items.{% endtrans %}</p> <p>{% trans %}AE account payment disabled because your basket contains refilling items.{% endtrans %}</p>
{% else %} {% else %}
<form method="post" action="{{ url('eboutic:pay_with_sith') }}"> <form method="post" action="{{ url('eboutic:pay_with_sith') }}">

View File

@ -14,10 +14,9 @@ from django.db import transaction, DataError
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.conf import settings from django.conf import settings
from counter.models import Product, Customer, Counter from counter.models import Product, Customer, Counter, ProductType, Selling
from eboutic.models import Basket, Invoice, BasketItem, InvoiceItem from eboutic.models import Basket, Invoice, BasketItem, InvoiceItem
# Create your views here.
class EbouticMain(TemplateView): class EbouticMain(TemplateView):
template_name = 'eboutic/eboutic_main.jinja' template_name = 'eboutic/eboutic_main.jinja'
@ -72,6 +71,7 @@ class EbouticMain(TemplateView):
kwargs = super(EbouticMain, self).get_context_data(**kwargs) kwargs = super(EbouticMain, self).get_context_data(**kwargs)
kwargs['basket'] = self.basket kwargs['basket'] = self.basket
kwargs['eboutic'] = Counter.objects.filter(type="EBOUTIC").first() kwargs['eboutic'] = Counter.objects.filter(type="EBOUTIC").first()
kwargs['categories'] = ProductType.objects.all()
return kwargs return kwargs
class EbouticCommand(TemplateView): class EbouticCommand(TemplateView):
@ -125,7 +125,7 @@ class EbouticPayWithSith(TemplateView):
if 'basket_id' not in request.session.keys() or not request.user.is_authenticated(): if 'basket_id' not in request.session.keys() or not request.user.is_authenticated():
return HttpResponseRedirect(reverse_lazy('eboutic:main', args=self.args, kwargs=kwargs)) return HttpResponseRedirect(reverse_lazy('eboutic:main', args=self.args, kwargs=kwargs))
b = Basket.objects.filter(id=request.session['basket_id']).first() b = Basket.objects.filter(id=request.session['basket_id']).first()
if b is None or b.items.filter(type="REFILLING").exists(): if b is None or b.items.filter(type_id=settings.SITH_COUNTER_PRODUCTTYPE_REFILLING).exists():
return HttpResponseRedirect(reverse_lazy('eboutic:main', args=self.args, kwargs=kwargs)) return HttpResponseRedirect(reverse_lazy('eboutic:main', args=self.args, kwargs=kwargs))
c = Customer.objects.filter(user__id=b.user.id).first() c = Customer.objects.filter(user__id=b.user.id).first()
if c is None: if c is None:
@ -134,14 +134,20 @@ class EbouticPayWithSith(TemplateView):
if c.amount < b.get_total(): if c.amount < b.get_total():
raise DataError(_("You do not have enough money to buy the basket")) raise DataError(_("You do not have enough money to buy the basket"))
else: else:
i = Invoice() eboutic = Counter.objects.filter(type="EBOUTIC").first()
i.user = b.user
i.payment_method = "SITH_ACCOUNT"
i.save()
for it in b.items.all(): for it in b.items.all():
InvoiceItem(invoice=i, product_id=it.product_id, product_name=it.product_name, type=it.type, product = Product.objects.filter(id=it.product_id).first()
product_unit_price=it.product_unit_price, quantity=it.quantity).save() Selling(
i.validate() label=it.product_name,
counter=eboutic,
club=product.club,
product=product,
seller=c.user,
customer=c,
unit_price=it.product_unit_price,
quantity=it.quantity,
payment_method="SITH_ACCOUNT",
).save()
b.delete() b.delete()
kwargs['not_enough'] = False kwargs['not_enough'] = False
request.session.pop('basket_id', None) request.session.pop('basket_id', None)
@ -172,10 +178,10 @@ class EtransactionAutoAnswer(View):
return HttpResponse("Basket does not exists", status=400) return HttpResponse("Basket does not exists", status=400)
i = Invoice() i = Invoice()
i.user = b.user i.user = b.user
i.payment_method = "CREDIT_CARD" i.payment_method = "CARD"
i.save() i.save()
for it in b.items.all(): for it in b.items.all():
InvoiceItem(invoice=i, product_id=it.product_id, product_name=it.product_name, type=it.type, InvoiceItem(invoice=i, product_id=it.product_id, product_name=it.product_name, type_id=it.type_id,
product_unit_price=it.product_unit_price, quantity=it.quantity).save() product_unit_price=it.product_unit_price, quantity=it.quantity).save()
i.validate() i.validate()
b.delete() b.delete()

Binary file not shown.

View File

@ -6,7 +6,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-15 21:41+0200\n" "POT-Creation-Date: 2016-08-18 17:40+0200\n"
"PO-Revision-Date: 2016-07-18\n" "PO-Revision-Date: 2016-07-18\n"
"Last-Translator: Skia <skia@libskia.so>\n" "Last-Translator: Skia <skia@libskia.so>\n"
"Language-Team: AE info <ae.info@utbm.fr>\n" "Language-Team: AE info <ae.info@utbm.fr>\n"
@ -40,12 +40,12 @@ msgstr "numero de compte"
msgid "%(club_account)s on %(bank_account)s" msgid "%(club_account)s on %(bank_account)s"
msgstr "%(club_account)s sur %(bank_account)s" msgstr "%(club_account)s sur %(bank_account)s"
#: accounting/models.py:109 club/models.py:147 counter/models.py:268 #: accounting/models.py:109 club/models.py:147 counter/models.py:271
#: launderette/models.py:122 #: launderette/models.py:122
msgid "start date" msgid "start date"
msgstr "date de début" msgstr "date de début"
#: accounting/models.py:110 club/models.py:148 counter/models.py:269 #: accounting/models.py:110 club/models.py:148 counter/models.py:272
msgid "end date" msgid "end date"
msgstr "date de fin" msgstr "date de fin"
@ -67,8 +67,8 @@ msgid "number"
msgstr "numéro" msgstr "numéro"
#: accounting/models.py:154 core/models.py:404 core/models.py:680 #: accounting/models.py:154 core/models.py:404 core/models.py:680
#: counter/models.py:209 counter/models.py:244 eboutic/models.py:13 #: counter/models.py:209 counter/models.py:245 eboutic/models.py:14
#: eboutic/models.py:46 #: eboutic/models.py:47
msgid "date" msgid "date"
msgstr "date" msgstr "date"
@ -80,8 +80,8 @@ msgstr "intitulé"
msgid "remark" msgid "remark"
msgstr "remarque" msgstr "remarque"
#: accounting/models.py:157 counter/models.py:210 eboutic/models.py:48 #: accounting/models.py:157 counter/models.py:210 counter/models.py:247
#: subscription/models.py:34 #: eboutic/models.py:49 subscription/models.py:34
msgid "payment method" msgid "payment method"
msgstr "méthode de paiement" msgstr "méthode de paiement"
@ -89,7 +89,7 @@ msgstr "méthode de paiement"
msgid "cheque number" msgid "cheque number"
msgstr "numéro de chèque" msgstr "numéro de chèque"
#: accounting/models.py:159 eboutic/models.py:92 #: accounting/models.py:159 eboutic/models.py:119
msgid "invoice" msgid "invoice"
msgstr "facture" msgstr "facture"
@ -268,8 +268,8 @@ msgstr "Fin"
#: accounting/templates/accounting/club_account_details.jinja:20 #: accounting/templates/accounting/club_account_details.jinja:20
#: accounting/templates/accounting/journal_details.jinja:23 #: accounting/templates/accounting/journal_details.jinja:23
#: core/templates/core/user_account.jinja:18 #: core/templates/core/user_account.jinja:19
#: core/templates/core/user_account.jinja:64 #: core/templates/core/user_account.jinja:72
msgid "Amount" msgid "Amount"
msgstr "Montant" msgstr "Montant"
@ -324,13 +324,13 @@ msgstr "No"
#: accounting/templates/accounting/journal_details.jinja:21 #: accounting/templates/accounting/journal_details.jinja:21
#: core/templates/core/user_account.jinja:16 #: core/templates/core/user_account.jinja:16
#: core/templates/core/user_account.jinja:37 #: core/templates/core/user_account.jinja:41
#: core/templates/core/user_account.jinja:62 #: core/templates/core/user_account.jinja:70
msgid "Date" msgid "Date"
msgstr "Date" msgstr "Date"
#: accounting/templates/accounting/journal_details.jinja:22 #: accounting/templates/accounting/journal_details.jinja:22
#: core/templates/core/user_account.jinja:39 #: core/templates/core/user_account.jinja:44
msgid "Label" msgid "Label"
msgstr "Intitulé" msgstr "Intitulé"
@ -394,7 +394,7 @@ msgstr "Vous ne pouvez pas faire de boucles dans les clubs"
msgid "A club with that unix_name already exists" msgid "A club with that unix_name already exists"
msgstr "Un club avec ce nom UNIX existe déjà." msgstr "Un club avec ce nom UNIX existe déjà."
#: club/models.py:145 eboutic/models.py:12 eboutic/models.py:45 #: club/models.py:145 eboutic/models.py:13 eboutic/models.py:46
#: launderette/models.py:89 launderette/models.py:126 #: launderette/models.py:89 launderette/models.py:126
msgid "user" msgid "user"
msgstr "nom d'utilisateur" msgstr "nom d'utilisateur"
@ -447,7 +447,6 @@ msgstr "Éditer le club"
#: core/templates/core/create.jinja:12 core/templates/core/edit.jinja:12 #: core/templates/core/create.jinja:12 core/templates/core/edit.jinja:12
#: core/templates/core/file_edit.jinja:8 core/templates/core/page_prop.jinja:8 #: core/templates/core/file_edit.jinja:8 core/templates/core/page_prop.jinja:8
#: core/templates/core/pagerev_edit.jinja:24 #: core/templates/core/pagerev_edit.jinja:24
#: counter/templates/counter/counter_edit.jinja:8
#: subscription/templates/subscription/subscription.jinja:22 #: subscription/templates/subscription/subscription.jinja:22
msgid "Save" msgid "Save"
msgstr "Sauver" msgstr "Sauver"
@ -1234,31 +1233,43 @@ msgid "Refillings"
msgstr "Rechargements" msgstr "Rechargements"
#: core/templates/core/user_account.jinja:17 #: core/templates/core/user_account.jinja:17
#: core/templates/core/user_account.jinja:38 #: core/templates/core/user_account.jinja:42
#: counter/templates/counter/counter_click.jinja:24
msgid "Counter"
msgstr "Comptoir"
#: core/templates/core/user_account.jinja:18
#: core/templates/core/user_account.jinja:43
msgid "Barman" msgid "Barman"
msgstr "Barman" msgstr "Barman"
#: core/templates/core/user_account.jinja:33 #: core/templates/core/user_account.jinja:20
msgid "Buyings" #: core/templates/core/user_account.jinja:47
msgstr "Achats" #: core/templates/core/user_account.jinja:73
msgid "Payment method"
msgstr "Méthode de paiement"
#: core/templates/core/user_account.jinja:40 #: core/templates/core/user_account.jinja:37
msgid "Account buyings"
msgstr "Achat sur compte utilisateur"
#: core/templates/core/user_account.jinja:45
msgid "Quantity" msgid "Quantity"
msgstr "Quantité" msgstr "Quantité"
#: core/templates/core/user_account.jinja:41 #: core/templates/core/user_account.jinja:46
msgid "Total" msgid "Total"
msgstr "Total" msgstr "Total"
#: core/templates/core/user_account.jinja:58 #: core/templates/core/user_account.jinja:66
msgid "Invoices" msgid "Eboutic invoices"
msgstr "Factures" msgstr "Facture eboutic"
#: core/templates/core/user_account.jinja:63 #: core/templates/core/user_account.jinja:71
msgid "Items" msgid "Items"
msgstr "Articles" msgstr "Articles"
#: core/templates/core/user_account.jinja:85 #: core/templates/core/user_account.jinja:95
msgid "User has no account" msgid "User has no account"
msgstr "L'utilisateur n'a pas de compte" msgstr "L'utilisateur n'a pas de compte"
@ -1459,7 +1470,7 @@ msgstr "clients"
msgid "Not enough money" msgid "Not enough money"
msgstr "Solde insuffisant" msgstr "Solde insuffisant"
#: counter/models.py:57 eboutic/models.py:78 #: counter/models.py:57
msgid "product type" msgid "product type"
msgstr "type du produit" msgstr "type du produit"
@ -1491,8 +1502,9 @@ msgstr "Bar"
msgid "Office" msgid "Office"
msgstr "Bureau" msgstr "Bureau"
#: counter/models.py:110 eboutic/templates/eboutic/eboutic_main.jinja:20 #: counter/models.py:110 eboutic/templates/eboutic/eboutic_main.jinja:4
#: eboutic/templates/eboutic/eboutic_makecommand.jinja:4 #: eboutic/templates/eboutic/eboutic_main.jinja:24
#: eboutic/templates/eboutic/eboutic_makecommand.jinja:8
#: eboutic/templates/eboutic/eboutic_payment_result.jinja:4 #: eboutic/templates/eboutic/eboutic_payment_result.jinja:4
#: sith/settings.py:279 sith/settings_sample.py:265 #: sith/settings.py:279 sith/settings_sample.py:265
msgid "Eboutic" msgid "Eboutic"
@ -1510,7 +1522,7 @@ msgstr "comptoir"
msgid "bank" msgid "bank"
msgstr "banque" msgstr "banque"
#: counter/models.py:214 counter/models.py:245 #: counter/models.py:214 counter/models.py:246
msgid "is validated" msgid "is validated"
msgstr "est validé" msgstr "est validé"
@ -1518,26 +1530,32 @@ msgstr "est validé"
msgid "refilling" msgid "refilling"
msgstr "rechargement" msgstr "rechargement"
#: counter/models.py:240 eboutic/models.py:79 #: counter/models.py:241 eboutic/models.py:106
msgid "unit price" msgid "unit price"
msgstr "prix unitaire" msgstr "prix unitaire"
#: counter/models.py:241 eboutic/models.py:80 #: counter/models.py:242 eboutic/models.py:107
msgid "quantity" msgid "quantity"
msgstr "quantité" msgstr "quantité"
#: counter/models.py:248 #: counter/models.py:248 eboutic/models.py:48
msgid "Sith account"
msgstr "Compte utilisateur"
#: counter/models.py:248 eboutic/models.py:48 sith/settings.py:272
#: sith/settings.py:277 sith/settings.py:298 sith/settings_sample.py:258
#: sith/settings_sample.py:263 sith/settings_sample.py:284
msgid "Credit card"
msgstr "Carte banquaire"
#: counter/models.py:251
msgid "selling" msgid "selling"
msgstr "vente" msgstr "vente"
#: counter/models.py:272 #: counter/models.py:275
msgid "permanency" msgid "permanency"
msgstr "permanence" msgstr "permanence"
#: counter/templates/counter/counter_click.jinja:24
msgid "Counter"
msgstr "Comptoir"
#: counter/templates/counter/counter_click.jinja:26 #: counter/templates/counter/counter_click.jinja:26
msgid "Club: " msgid "Club: "
msgstr "Club : " msgstr "Club : "
@ -1563,14 +1581,14 @@ msgid "Selling"
msgstr "Vente" msgstr "Vente"
#: counter/templates/counter/counter_click.jinja:54 #: counter/templates/counter/counter_click.jinja:54
#: eboutic/templates/eboutic/eboutic_main.jinja:23 #: eboutic/templates/eboutic/eboutic_main.jinja:27
#: eboutic/templates/eboutic/eboutic_makecommand.jinja:7 #: eboutic/templates/eboutic/eboutic_makecommand.jinja:11
msgid "Basket: " msgid "Basket: "
msgstr "Panier : " msgstr "Panier : "
#: counter/templates/counter/counter_click.jinja:62 #: counter/templates/counter/counter_click.jinja:62
#: counter/templates/counter/counter_main.jinja:24 #: counter/templates/counter/counter_main.jinja:24
#: eboutic/templates/eboutic/eboutic_main.jinja:30 #: eboutic/templates/eboutic/eboutic_main.jinja:34
msgid "Total: " msgid "Total: "
msgstr "Total : " msgstr "Total : "
@ -1579,14 +1597,10 @@ msgid "Finish"
msgstr "Terminer" msgstr "Terminer"
#: counter/templates/counter/counter_click.jinja:73 #: counter/templates/counter/counter_click.jinja:73
#: eboutic/templates/eboutic/eboutic_main.jinja:37 #: eboutic/templates/eboutic/eboutic_main.jinja:41
msgid "Products: " msgid "Products: "
msgstr "Produits : " msgstr "Produits : "
#: counter/templates/counter/counter_edit.jinja:4
msgid "Edit counter"
msgstr "Éditer le comptoir"
#: counter/templates/counter/counter_list.jinja:4 #: counter/templates/counter/counter_list.jinja:4
#: counter/templates/counter/counter_list.jinja:10 #: counter/templates/counter/counter_list.jinja:10
msgid "Counter admin list" msgid "Counter admin list"
@ -1664,67 +1678,66 @@ msgstr "Nouveau type de produit"
msgid "There is no product types in this website." msgid "There is no product types in this website."
msgstr "Il n'y a pas de types de produit dans ce site web." msgstr "Il n'y a pas de types de produit dans ce site web."
#: counter/views.py:48 #: counter/views.py:49
msgid "User not found" msgid "User not found"
msgstr "Utilisateur non trouvé" msgstr "Utilisateur non trouvé"
#: counter/views.py:211 #: counter/views.py:212
msgid "END" msgid "END"
msgstr "FIN" msgstr "FIN"
#: counter/views.py:213 #: counter/views.py:214
msgid "CAN" msgid "CAN"
msgstr "ANN" msgstr "ANN"
#: counter/views.py:243 #: counter/views.py:244
msgid "You have not enough money to buy all the basket" msgid "You have not enough money to buy all the basket"
msgstr "Vous n'avez pas assez d'argent pour acheter le panier" msgstr "Vous n'avez pas assez d'argent pour acheter le panier"
#: eboutic/models.py:47 sith/settings.py:272 sith/settings.py:277 #: eboutic/models.py:50
#: sith/settings_sample.py:258 sith/settings_sample.py:263
msgid "Credit card"
msgstr "Carte banquaire"
#: eboutic/models.py:47
msgid "Sith account"
msgstr "Compte utilisateur"
#: eboutic/models.py:49
msgid "validated" msgid "validated"
msgstr "validé" msgstr "validé"
#: eboutic/models.py:59 #: eboutic/models.py:60
msgid "Invoice already validated" msgid "Invoice already validated"
msgstr "Facture déjà validée" msgstr "Facture déjà validée"
#: eboutic/models.py:76 #: eboutic/models.py:103
msgid "product id" msgid "product id"
msgstr "ID du produit" msgstr "ID du produit"
#: eboutic/models.py:77 #: eboutic/models.py:104
msgid "product name" msgid "product name"
msgstr "nom du produit" msgstr "nom du produit"
#: eboutic/models.py:89 #: eboutic/models.py:105
msgid "product type id"
msgstr "id du type du produit"
#: eboutic/models.py:116
msgid "basket" msgid "basket"
msgstr "panier" msgstr "panier"
#: eboutic/templates/eboutic/eboutic_main.jinja:33 #: eboutic/templates/eboutic/eboutic_main.jinja:37
msgid "Proceed to command" msgid "Proceed to command"
msgstr "Procéder à la commande" msgstr "Procéder à la commande"
#: eboutic/templates/eboutic/eboutic_makecommand.jinja:31 #: eboutic/templates/eboutic/eboutic_makecommand.jinja:4
msgid "Basket state"
msgstr "État du panier"
#: eboutic/templates/eboutic/eboutic_makecommand.jinja:35
msgid "Pay with credit card" msgid "Pay with credit card"
msgstr "Payer avec une carte banquaire" msgstr "Payer avec une carte banquaire"
#: eboutic/templates/eboutic/eboutic_makecommand.jinja:34 #: eboutic/templates/eboutic/eboutic_makecommand.jinja:38
msgid "" msgid ""
"AE account payment disabled because your basket contains refilling items." "AE account payment disabled because your basket contains refilling items."
msgstr "" msgstr ""
"Paiement par compte AE désactivé parce que votre panier contient des bons de " "Paiement par compte AE désactivé parce que votre panier contient des bons de "
"rechargement." "rechargement."
#: eboutic/templates/eboutic/eboutic_makecommand.jinja:39 #: eboutic/templates/eboutic/eboutic_makecommand.jinja:43
msgid "Pay with Sith account" msgid "Pay with Sith account"
msgstr "Payer avec un compte AE" msgstr "Payer avec un compte AE"
@ -1829,12 +1842,12 @@ msgid "Washing and drying"
msgstr "Lavage et séchage" msgstr "Lavage et séchage"
#: launderette/templates/launderette/launderette_book.jinja:26 #: launderette/templates/launderette/launderette_book.jinja:26
#: sith/settings.py:398 sith/settings_sample.py:384 #: sith/settings.py:408 sith/settings_sample.py:394
msgid "Washing" msgid "Washing"
msgstr "Lavage" msgstr "Lavage"
#: launderette/templates/launderette/launderette_book.jinja:30 #: launderette/templates/launderette/launderette_book.jinja:30
#: sith/settings.py:398 sith/settings_sample.py:384 #: sith/settings.py:408 sith/settings_sample.py:394
msgid "Drying" msgid "Drying"
msgstr "Séchage" msgstr "Séchage"
@ -1917,80 +1930,80 @@ msgstr "Sevenans"
msgid "Montbéliard" msgid "Montbéliard"
msgstr "Montbéliard" msgstr "Montbéliard"
#: sith/settings.py:311 sith/settings_sample.py:297 #: sith/settings.py:321 sith/settings_sample.py:307
msgid "One semester" msgid "One semester"
msgstr "Un semestre" msgstr "Un semestre"
#: sith/settings.py:316 sith/settings_sample.py:302 #: sith/settings.py:326 sith/settings_sample.py:312
msgid "Two semesters" msgid "Two semesters"
msgstr "Deux semestres" msgstr "Deux semestres"
#: sith/settings.py:321 sith/settings_sample.py:307 #: sith/settings.py:331 sith/settings_sample.py:317
msgid "Common core cursus" msgid "Common core cursus"
msgstr "Cursus tronc commun" msgstr "Cursus tronc commun"
#: sith/settings.py:326 sith/settings.py:331 sith/settings_sample.py:312 #: sith/settings.py:336 sith/settings.py:341 sith/settings_sample.py:322
#: sith/settings_sample.py:317 #: sith/settings_sample.py:327
msgid "Branch cursus" msgid "Branch cursus"
msgstr "Cursus branche" msgstr "Cursus branche"
#: sith/settings.py:336 sith/settings_sample.py:322 #: sith/settings.py:346 sith/settings_sample.py:332
msgid "Honorary member" msgid "Honorary member"
msgstr "Membre honoraire" msgstr "Membre honoraire"
#: sith/settings.py:341 sith/settings_sample.py:327 #: sith/settings.py:351 sith/settings_sample.py:337
msgid "Assidu member" msgid "Assidu member"
msgstr "Membre d'Assidu" msgstr "Membre d'Assidu"
#: sith/settings.py:346 sith/settings_sample.py:332 #: sith/settings.py:356 sith/settings_sample.py:342
msgid "Amicale/DOCEO member" msgid "Amicale/DOCEO member"
msgstr "Membre de l'Amicale/DOCEO" msgstr "Membre de l'Amicale/DOCEO"
#: sith/settings.py:351 sith/settings_sample.py:337 #: sith/settings.py:361 sith/settings_sample.py:347
msgid "UT network member" msgid "UT network member"
msgstr "Cotisant du réseau UT" msgstr "Cotisant du réseau UT"
#: sith/settings.py:356 sith/settings_sample.py:342 #: sith/settings.py:366 sith/settings_sample.py:352
msgid "CROUS member" msgid "CROUS member"
msgstr "Membres du CROUS" msgstr "Membres du CROUS"
#: sith/settings.py:361 sith/settings_sample.py:347 #: sith/settings.py:371 sith/settings_sample.py:357
msgid "Sbarro/ESTA member" msgid "Sbarro/ESTA member"
msgstr "Membre de Sbarro ou de l'ESTA" msgstr "Membre de Sbarro ou de l'ESTA"
#: sith/settings.py:369 sith/settings_sample.py:355 #: sith/settings.py:379 sith/settings_sample.py:365
msgid "President" msgid "President"
msgstr "Président" msgstr "Président"
#: sith/settings.py:370 sith/settings_sample.py:356 #: sith/settings.py:380 sith/settings_sample.py:366
msgid "Vice-President" msgid "Vice-President"
msgstr "Vice-Président" msgstr "Vice-Président"
#: sith/settings.py:371 sith/settings_sample.py:357 #: sith/settings.py:381 sith/settings_sample.py:367
msgid "Treasurer" msgid "Treasurer"
msgstr "Trésorier" msgstr "Trésorier"
#: sith/settings.py:372 sith/settings_sample.py:358 #: sith/settings.py:382 sith/settings_sample.py:368
msgid "Communication supervisor" msgid "Communication supervisor"
msgstr "Responsable com" msgstr "Responsable com"
#: sith/settings.py:373 sith/settings_sample.py:359 #: sith/settings.py:383 sith/settings_sample.py:369
msgid "Secretary" msgid "Secretary"
msgstr "Secrétaire" msgstr "Secrétaire"
#: sith/settings.py:374 sith/settings_sample.py:360 #: sith/settings.py:384 sith/settings_sample.py:370
msgid "IT supervisor" msgid "IT supervisor"
msgstr "Responsable info" msgstr "Responsable info"
#: sith/settings.py:375 sith/settings_sample.py:361 #: sith/settings.py:385 sith/settings_sample.py:371
msgid "Board member" msgid "Board member"
msgstr "Membre du bureau" msgstr "Membre du bureau"
#: sith/settings.py:376 sith/settings_sample.py:362 #: sith/settings.py:386 sith/settings_sample.py:372
msgid "Active member" msgid "Active member"
msgstr "Membre actif" msgstr "Membre actif"
#: sith/settings.py:377 sith/settings_sample.py:363 #: sith/settings.py:387 sith/settings_sample.py:373
msgid "Curious" msgid "Curious"
msgstr "Curieux" msgstr "Curieux"
@ -2035,5 +2048,3 @@ msgid "You must either choose an existing user or create a new one properly"
msgstr "" msgstr ""
"Vous devez soit choisir un utilisateur existant, ou en créer un proprement." "Vous devez soit choisir un utilisateur existant, ou en créer un proprement."
#~ msgid "User Profile"
#~ msgstr "Profil de l'utilisateur"

View File

@ -20,6 +20,7 @@ from core.models import User, SithFile
from club.models import Club, Membership from club.models import Club, Membership
from counter.models import Customer, Counter, Selling, Refilling, Product, ProductType from counter.models import Customer, Counter, Selling, Refilling, Product, ProductType
from subscription.models import Subscription, Subscriber from subscription.models import Subscription, Subscriber
from eboutic.models import Invoice, InvoiceItem
db = MySQLdb.connect( db = MySQLdb.connect(
host="ae-db", host="ae-db",
@ -142,7 +143,6 @@ def migrate_users():
except Exception as e: except Exception as e:
print("FAIL for user %s: %s" % (u['id_utilisateur'], repr(e))) print("FAIL for user %s: %s" % (u['id_utilisateur'], repr(e)))
c.close() c.close()
reset_index('core')
def migrate_profile_pict(): def migrate_profile_pict():
PROFILE_ROOT = "/data/matmatronch/" PROFILE_ROOT = "/data/matmatronch/"
@ -357,8 +357,8 @@ def migrate_refillings():
SELECT * SELECT *
FROM cpt_rechargements FROM cpt_rechargements
""") """)
Refilling.objects.all().delete() Refilling.objects.filter(payment_method="SITH_ACCOUNT").delete()
print("Refillings deleted") print("Sith account refillings deleted")
for c in Customer.objects.all(): for c in Customer.objects.all():
c.amount = 0 c.amount = 0
c.save() c.save()
@ -386,11 +386,8 @@ def migrate_refillings():
operator=op or root_cust.user, operator=op or root_cust.user,
amount=r['montant_rech']/100, amount=r['montant_rech']/100,
bank=BANK[r['banque_rech']], bank=BANK[r['banque_rech']],
date=r['date_rech'].replace(tzinfo=timezone('Europe/Paris')),
) )
for f in new._meta.local_fields:
if f.name == "date":
f.auto_now = False
new.date = r['date_rech'].replace(tzinfo=timezone('Europe/Paris'))
new.save() new.save()
except Exception as e: except Exception as e:
print("FAIL to migrate refilling %s for %s: %s" % (r['id_rechargement'], r['id_utilisateur'], repr(e))) print("FAIL to migrate refilling %s for %s: %s" % (r['id_rechargement'], r['id_utilisateur'], repr(e)))
@ -434,9 +431,9 @@ def migrate_products():
name=to_unicode(r['nom_prod']), name=to_unicode(r['nom_prod']),
description=to_unicode(r['description_prod']), description=to_unicode(r['description_prod']),
code=to_unicode(r['cbarre_prod']), code=to_unicode(r['cbarre_prod']),
purchase_price=r['prix_achat_prod'], purchase_price=r['prix_achat_prod']/100,
selling_price=r['prix_vente_prod'], selling_price=r['prix_vente_prod']/100,
special_selling_price=r['prix_vente_barman_prod'], special_selling_price=r['prix_vente_barman_prod']/100,
club=club, club=club,
) )
new.save() new.save()
@ -444,6 +441,62 @@ def migrate_products():
print("FAIL to migrate product %s: %s" % (r['nom_prod'], repr(e))) print("FAIL to migrate product %s: %s" % (r['nom_prod'], repr(e)))
cur.close() cur.close()
def migrate_products_to_counter():
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
cur.execute("""
SELECT *
FROM cpt_mise_en_vente
""")
for r in cur:
try:
product = Product.objects.filter(id=r['id_produit']).first()
counter = Counter.objects.filter(id=r['id_comptoir']).first()
counter.products.add(product)
counter.save()
except Exception as e:
print("FAIL to set product %s in counter %s: %s" % (product, counter, repr(e)))
cur.close()
def migrate_invoices():
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
cur.execute("""
SELECT *
FROM cpt_vendu ven
LEFT JOIN cpt_debitfacture fac
ON ven.id_facture = fac.id_facture
WHERE fac.mode_paiement = 'SG'
""")
Invoice.objects.all().delete()
print("Invoices deleted")
Refilling.objects.filter(payment_method="CARD").delete()
print("Card refillings deleted")
Selling.objects.filter(payment_method="CARD").delete()
print("Card sellings deleted")
root = User.objects.filter(id=0).first()
for r in cur:
try:
product = Product.objects.filter(id=r['id_produit']).first()
user = User.objects.filter(id=r['id_utilisateur_client']).first()
i = Invoice.objects.filter(id=r['id_facture']).first() or Invoice(id=r['id_facture'])
i.user = user or root
for f in i._meta.local_fields:
if f.name == "date":
f.auto_now = False
i.date = r['date_facture'].replace(tzinfo=timezone('Europe/Paris'))
i.save()
InvoiceItem(invoice=i, product_id=product.id, product_name=product.name, type_id=product.product_type.id,
product_unit_price=r['prix_unit']/100, quantity=r['quantite']).save()
except ValidationError as e:
print(repr(e) + " for %s (%s)" % (customer, customer.user.id))
except Exception as e:
print("FAIL to migrate invoice %s: %s" % (r['id_facture'], repr(e)))
cur.close()
for i in Invoice.objects.all():
for f in i._meta.local_fields:
if f.name == "date":
f.auto_now = False
i.validate()
def migrate_sellings(): def migrate_sellings():
cur = db.cursor(MySQLdb.cursors.SSDictCursor) cur = db.cursor(MySQLdb.cursors.SSDictCursor)
cur.execute(""" cur.execute("""
@ -453,8 +506,8 @@ def migrate_sellings():
ON ven.id_facture = fac.id_facture ON ven.id_facture = fac.id_facture
WHERE fac.mode_paiement = 'AE' WHERE fac.mode_paiement = 'AE'
""") """)
Selling.objects.all().delete() Selling.objects.filter(payment_method="SITH_ACCOUNT").delete()
print("Selling deleted") print("Sith account selling deleted")
for r in cur: for r in cur:
try: try:
product = Product.objects.filter(id=r['id_produit']).first() product = Product.objects.filter(id=r['id_produit']).first()
@ -471,11 +524,9 @@ def migrate_sellings():
customer=customer, customer=customer,
unit_price=r['prix_unit']/100, unit_price=r['prix_unit']/100,
quantity=r['quantite'], quantity=r['quantite'],
payment_method="SITH_ACCOUNT",
date=r['date_facture'].replace(tzinfo=timezone('Europe/Paris')),
) )
for f in new._meta.local_fields:
if f.name == "date":
f.auto_now = False
new.date = r['date_facture'].replace(tzinfo=timezone('Europe/Paris'))
new.save() new.save()
except ValidationError as e: except ValidationError as e:
print(repr(e) + " for %s (%s)" % (customer, customer.user.id)) print(repr(e) + " for %s (%s)" % (customer, customer.user.id))
@ -483,6 +534,7 @@ def migrate_sellings():
print("FAIL to migrate selling %s: %s" % (r['id_facture'], repr(e))) print("FAIL to migrate selling %s: %s" % (r['id_facture'], repr(e)))
cur.close() cur.close()
def main(): def main():
# migrate_users() # migrate_users()
# migrate_profile_pict() # migrate_profile_pict()
@ -491,10 +543,13 @@ def main():
# migrate_subscriptions() # migrate_subscriptions()
# update_customer_account() # update_customer_account()
# migrate_counters() # migrate_counters()
# migrate_typeproducts()
# migrate_products()
# migrate_products_to_counter()
migrate_invoices()
migrate_refillings() migrate_refillings()
migrate_typeproducts()
migrate_products()
migrate_sellings() migrate_sellings()
reset_index('core', 'counter')
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@ -281,6 +281,7 @@ SITH_COUNTER_BARS = [
SITH_COUNTER_PAYMENT_METHOD = [ SITH_COUNTER_PAYMENT_METHOD = [
('CHECK', _('Check')), ('CHECK', _('Check')),
('CASH', _('Cash')), ('CASH', _('Cash')),
('CARD', _('Credit card')),
] ]
SITH_COUNTER_BANK = [ SITH_COUNTER_BANK = [
@ -296,6 +297,9 @@ SITH_COUNTER_BANK = [
('LA-POSTE', 'La Poste'), ('LA-POSTE', 'La Poste'),
] ]
# Defines which product type is the refilling type, and thus increases the account amount
SITH_COUNTER_PRODUCTTYPE_REFILLING = 11
# Subscription durations are in semestres # Subscription durations are in semestres
# Be careful, modifying this parameter will need a migration to be applied # Be careful, modifying this parameter will need a migration to be applied
SITH_SUBSCRIPTIONS = { SITH_SUBSCRIPTIONS = {