Commit 05bd177a authored by Skia's avatar Skia

Migrate invoices and lot of eboutic improvements

parent 50c452c2
Pipeline #120 failed with stage
in 3 minutes and 9 seconds
......@@ -14,48 +14,56 @@
<thead>
<tr>
<td>{% trans %}Date{% endtrans %}</td>
<td>{% trans %}Counter{% endtrans %}</td>
<td>{% trans %}Barman{% endtrans %}</td>
<td>{% trans %}Amount{% endtrans %}</td>
<td>{% trans %}Payment method{% endtrans %}</td>
</tr>
</thead>
<tbody>
{% for i in customer.refillings.all() %}
{% for i in customer.refillings.order_by('-date').all() %}
<tr>
<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>{{ i.amount }}</td>
<td>{{ i.get_payment_method_display() }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% if customer.buyings.exists() %}
<h4>{% trans %}Buyings{% endtrans %}</h4>
<h4>{% trans %}Account buyings{% endtrans %}</h4>
<table>
<thead>
<tr>
<td>{% trans %}Date{% endtrans %}</td>
<td>{% trans %}Counter{% endtrans %}</td>
<td>{% trans %}Barman{% endtrans %}</td>
<td>{% trans %}Label{% endtrans %}</td>
<td>{% trans %}Quantity{% endtrans %}</td>
<td>{% trans %}Total{% endtrans %}</td>
<td>{% trans %}Payment method{% endtrans %}</td>
</tr>
</thead>
<tbody>
{% for i in customer.buyings.all() %}
{% for i in customer.buyings.order_by('-date').all() %}
<tr>
<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.quantity }}</td>
<td>{{ i.quantity * i.unit_price }}</td>
<td>{{ i.get_payment_method_display() }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% if customer.user.invoices.exists() %}
<h4>{% trans %}Invoices{% endtrans %}</h4>
<h4>{% trans %}Eboutic invoices{% endtrans %}</h4>
<table>
<thead>
<tr>
......@@ -65,7 +73,7 @@
</tr>
</thead>
<tbody>
{% for i in customer.user.invoices.all() %}
{% for i in customer.user.invoices.order_by('-date').all() %}
<tr>
<td>{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }}</td>
<td>
......
# -*- 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),
),
]
# -*- 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')]),
),
]
# -*- 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),
),
]
# -*- 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')]),
),
]
# -*- 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')]),
),
]
......@@ -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
......
......@@ -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
......
# -*- 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,
),
]
# -*- 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')]),
),
]
# -*- 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',
),
]
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'))
......
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}Eboutic{% endtrans %}
{% endblock %}
{% macro add_product(id, content) %}
<form method="post" action="{{ url('eboutic:main') }}" class="inline" style="display:inline">
{% csrf_token %}
......@@ -34,11 +38,14 @@
</form>
</div>
<div>
<p><strong>{% trans %}Products: {% endtrans %}</strong>
{% for p in eboutic.products.all() %}
{{ add_product(p.id, p.name) }}
{% for t in categories %}
{% if eboutic.products.filter(product_type=t).exists() %}
<h5>{{ t }}</h5>
{% for p in eboutic.products.filter(product_type=t).all() %}
{{ add_product(p.id, p.name) }}
{% endfor %}
{% endif %}
{% endfor %}
</p>
</div>
{% endblock %}
......
{% extends "core/base.jinja" %}
{% block title %}
{% trans %}Basket state{% endtrans %}
{% endblock %}
{% block content %}
<h3>{% trans %}Eboutic{% endtrans %}</h3>
......@@ -30,7 +34,7 @@
{% endfor %}
<input type="submit" value="{% trans %}Pay with credit card{% endtrans %}" />
</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>
{% else %}
<form method="post" action="{{ url('eboutic:pay_with_sith') }}">
......
......@@ -14,10 +14,9 @@ from django.db import transaction, DataError
from django.utils.translation import ugettext as _
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
# Create your views here.
class EbouticMain(TemplateView):
template_name = 'eboutic/eboutic_main.jinja'
......@@ -72,6 +71,7 @@ class EbouticMain(TemplateView):
kwargs = super(EbouticMain, self).get_context_data(**kwargs)
kwargs['basket'] = self.basket
kwargs['eboutic'] = Counter.objects.filter(type="EBOUTIC").first()
kwargs['categories'] = ProductType.objects.all()
return kwargs
class EbouticCommand(TemplateView):
......@@ -125,7 +125,7 @@ class EbouticPayWithSith(TemplateView):
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))
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))
c = Customer.objects.filter(user__id=b.user.id).first()
if c is None:
......@@ -134,14 +134,20 @@ class EbouticPayWithSith(TemplateView):
if c.amount < b.get_total():
raise DataError(_("You do not have enough money to buy the basket"))
else:
i = Invoice()
i.user = b.user
i.payment_method = "SITH_ACCOUNT"
i.save()
eboutic = Counter.objects.filter(type="EBOUTIC").first()
for it in b.items.all():
InvoiceItem(invoice=i, product_id=it.product_id, product_name=it.product_name, type=it.type,
product_unit_price=it.product_unit_price, quantity=it.quantity).save()
i.validate()
product = Product.objects.filter(id=it.product_id).first()
Selling(
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()
kwargs['not_enough'] = False
request.session.pop('basket_id', None)
......@@ -172,10 +178,10 @@ class EtransactionAutoAnswer(View):
return HttpResponse("Basket does not exists", status=400)
i = Invoice()
i.user = b.user
i.payment_method = "CREDIT_CARD"
i.payment_method = "CARD"
i.save()
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()
i.validate()
b.delete()
......
This diff is collapsed.
......@@ -20,6 +20,7 @@ from core.models import User, SithFile
from club.models import Club, Membership
from counter.models import Customer, Counter, Selling, Refilling, Product, ProductType
from subscription.models import Subscription, Subscriber
from eboutic.models import Invoice, InvoiceItem
db = MySQLdb.connect(
host="ae-db",
......@@ -142,7 +143,6 @@ def migrate_users():
except Exception as e:
print("FAIL for user %s: %s" % (u['id_utilisateur'], repr(e)))
c.close()
reset_index('core')
def migrate_profile_pict():
PROFILE_ROOT = "/data/matmatronch/"
......@@ -357,8 +357,8 @@ def migrate_refillings():
SELECT *
FROM cpt_rechargements
""")
Refilling.objects.all().delete()
print("Refillings deleted")
Refilling.objects.filter(payment_method="SITH_ACCOUNT").delete()
print("Sith account refillings deleted")
for c in Customer.objects.all():
c.amount = 0
c.save()
......@@ -386,11 +386,8 @@ def migrate_refillings():
operator=op or root_cust.user,
amount=r['montant_rech']/100,
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()
except Exception as 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']),
description=to_unicode(r['description_prod']),
code=to_unicode(r['cbarre_prod']),
purchase_price=r['prix_achat_prod'],
selling_price=r['prix_vente_prod'],
special_selling_price=r['prix_vente_barman_prod'],
purchase_price=r['prix_achat_prod']/100,
selling_price=r['prix_vente_prod']/100,
special_selling_price=r['prix_vente_barman_prod']/100,
club=club,
)
new.save()
......@@ -444,6 +441,62 @@ def migrate_products():
print("FAIL to migrate product %s: %s" % (r['nom_prod'], repr(e)))
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():
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
cur.execute("""
......@@ -453,8 +506,8 @@ def migrate_sellings():
ON ven.id_facture = fac.id_facture
WHERE fac.mode_paiement = 'AE'
""")
Selling.objects.all().delete()
print("Selling deleted")
Selling.objects.filter(payment_method="SITH_ACCOUNT").delete()
print("Sith account selling deleted")
for r in cur:
try:
product = Product.objects.filter(id=r['id_produit']).first()
......@@ -471,11 +524,9 @@ def migrate_sellings():
customer=customer,
unit_price=r['prix_unit']/100,
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()
except ValidationError as e:
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)))
cur.close()
def main():
# migrate_users()
# migrate_profile_pict()
......@@ -491,10 +543,13 @@ def main():
# migrate_subscriptions()
# update_customer_account()
# migrate_counters()
# migrate_typeproducts()
# migrate_products()
# migrate_products_to_counter()
migrate_invoices()