Commit 8da149c9 authored by Skia's avatar Skia

Some refactoring between accounting and counter

parent e75da927
......@@ -2,6 +2,6 @@ db.sqlite3
*.pyc
*__pycache__*
.DS_Store
env_sith
env/
doc/html
data/
......@@ -6,7 +6,7 @@ To start working on the project, just run the following commands:
git clone https://ae-dev.utbm.fr/ae/Sith.git
cd Sith
virtualenv --clear --python=python3 env_sith
virtualenv --clear --python=python3 env
source env_sith/bin/activate
pip install -r requirements.txt
./manage.py setup
......
......@@ -3,9 +3,6 @@ from django.contrib import admin
from accounting.models import *
admin.site.register(Customer)
admin.site.register(ProductType)
admin.site.register(Product)
admin.site.register(BankAccount)
admin.site.register(ClubAccount)
admin.site.register(GeneralJournal)
......
......@@ -2,106 +2,65 @@
from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
import accounting.models
class Migration(migrations.Migration):
dependencies = [
('core', '0001_initial'),
('club', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='AccountingType',
fields=[
('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')),
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('code', models.CharField(max_length=16, verbose_name='code')),
('label', models.CharField(max_length=60, verbose_name='label')),
('movement_type', models.CharField(max_length=12, verbose_name='movement type', choices=[('credit', 'Credit'), ('debit', 'Debit'), ('neutral', 'Neutral')])),
('movement_type', models.CharField(choices=[('credit', 'Credit'), ('debit', 'Debit'), ('neutral', 'Neutral')], max_length=12, verbose_name='movement type')),
],
),
migrations.CreateModel(
name='BankAccount',
fields=[
('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')),
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('name', models.CharField(max_length=30, verbose_name='name')),
('rib', models.CharField(max_length=255, verbose_name='rib', blank=True)),
('number', models.CharField(max_length=255, verbose_name='account number', blank=True)),
('rib', models.CharField(blank=True, max_length=255, verbose_name='rib')),
('number', models.CharField(blank=True, max_length=255, verbose_name='account number')),
],
),
migrations.CreateModel(
name='ClubAccount',
fields=[
('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')),
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('name', models.CharField(max_length=30, verbose_name='name')),
('bank_account', models.ForeignKey(related_name='club_accounts', to='accounting.BankAccount')),
('club', models.OneToOneField(related_name='club_accounts', to='club.Club')),
('bank_account', models.ForeignKey(to='accounting.BankAccount', related_name='club_accounts')),
],
),
migrations.CreateModel(
name='Customer',
fields=[
('user', models.OneToOneField(to=settings.AUTH_USER_MODEL, primary_key=True, serialize=False)),
('account_id', models.CharField(max_length=10, verbose_name='account id', unique=True)),
],
options={
'verbose_name_plural': 'customers',
'verbose_name': 'customer',
},
),
migrations.CreateModel(
name='GeneralJournal',
fields=[
('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')),
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('start_date', models.DateField(verbose_name='start date')),
('end_date', models.DateField(null=True, default=None, verbose_name='end date', blank=True)),
('end_date', models.DateField(default=None, blank=True, verbose_name='end date', null=True)),
('name', models.CharField(max_length=30, verbose_name='name')),
('closed', models.BooleanField(default=False, verbose_name='is closed')),
('club_account', models.ForeignKey(related_name='journals', to='accounting.ClubAccount')),
('closed', models.BooleanField(verbose_name='is closed', default=False)),
('club_account', models.ForeignKey(to='accounting.ClubAccount', related_name='journals')),
],
),
migrations.CreateModel(
name='Operation',
fields=[
('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')),
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('amount', accounting.models.CurrencyField(max_digits=12, decimal_places=2, verbose_name='amount')),
('date', models.DateField(verbose_name='date')),
('remark', models.TextField(max_length=255, verbose_name='remark')),
('mode', models.CharField(max_length=255, verbose_name='payment method', choices=[('cheque', 'Chèque'), ('cash', 'Espèce'), ('transfert', 'Virement'), ('card', 'Carte banquaire')])),
('mode', models.CharField(choices=[('cheque', 'Chèque'), ('cash', 'Espèce'), ('transfert', 'Virement'), ('card', 'Carte banquaire')], max_length=255, verbose_name='payment method')),
('cheque_number', models.IntegerField(verbose_name='cheque number')),
('invoice', models.FileField(null=True, upload_to='invoices', blank=True)),
('done', models.BooleanField(default=False, verbose_name='is done')),
('journal', models.ForeignKey(related_name='invoices', to='accounting.GeneralJournal')),
('type', models.ForeignKey(related_name='operations', to='accounting.AccountingType')),
('invoice', models.FileField(blank=True, upload_to='invoices', null=True)),
('done', models.BooleanField(verbose_name='is done', default=False)),
('journal', models.ForeignKey(to='accounting.GeneralJournal', related_name='operations')),
('type', models.ForeignKey(to='accounting.AccountingType', related_name='operations')),
],
),
migrations.CreateModel(
name='Product',
fields=[
('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=30, verbose_name='name')),
('description', models.TextField(verbose_name='description', blank=True)),
('code', models.CharField(max_length=10, verbose_name='code')),
('purchase_price', accounting.models.CurrencyField(max_digits=12, decimal_places=2, verbose_name='purchase price')),
('selling_price', accounting.models.CurrencyField(max_digits=12, decimal_places=2, verbose_name='selling price')),
('special_selling_price', accounting.models.CurrencyField(max_digits=12, decimal_places=2, verbose_name='special selling price')),
('icon', models.ImageField(null=True, upload_to='products', blank=True)),
],
),
migrations.CreateModel(
name='ProductType',
fields=[
('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=30, verbose_name='name')),
('description', models.TextField(null=True, verbose_name='description', blank=True)),
('icon', models.ImageField(null=True, upload_to='products', blank=True)),
],
),
migrations.AddField(
model_name='product',
name='product_type',
field=models.ForeignKey(null=True, to='accounting.ProductType', related_name='products', blank=True),
),
]
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('accounting', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='operation',
name='journal',
field=models.ForeignKey(to='accounting.GeneralJournal', related_name='operations'),
),
]
......@@ -8,25 +8,18 @@ class Migration(migrations.Migration):
dependencies = [
('club', '0001_initial'),
('accounting', '0002_auto_20160502_0952'),
('accounting', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='bankaccount',
model_name='clubaccount',
name='club',
field=models.OneToOneField(to='club.Club', related_name='bank_accounts', default=1),
preserve_default=False,
field=models.OneToOneField(to='club.Club', related_name='club_account'),
),
migrations.AddField(
model_name='product',
name='club',
field=models.OneToOneField(to='club.Club', related_name='products', default=1),
preserve_default=False,
),
migrations.AlterField(
model_name='clubaccount',
model_name='bankaccount',
name='club',
field=models.OneToOneField(related_name='club_account', to='club.Club'),
field=models.ForeignKey(to='club.Club', related_name='bank_accounts'),
),
]
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('accounting', '0003_auto_20160509_0712'),
]
operations = [
migrations.AlterField(
model_name='product',
name='club',
field=models.ForeignKey(related_name='products', to='club.Club'),
),
]
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('accounting', '0004_auto_20160509_0715'),
]
operations = [
migrations.AlterField(
model_name='bankaccount',
name='club',
field=models.ForeignKey(related_name='bank_accounts', to='club.Club'),
),
]
......@@ -24,65 +24,6 @@ class CurrencyField(models.DecimalField):
except AttributeError:
return None
class Customer(models.Model):
"""
This class extends a user to make a customer. It adds some basic customers informations, such as the accound ID, and
is used by other accounting classes as reference to the customer, rather than using User
"""
user = models.OneToOneField(User, primary_key=True)
account_id = models.CharField(_('account id'), max_length=10, unique=True)
class Meta:
verbose_name = _('customer')
verbose_name_plural = _('customers')
def __str__(self):
return self.user.username
class ProductType(models.Model):
"""
This describes a product type
Useful only for categorizing, changes are made at the product level for now
"""
name = models.CharField(_('name'), max_length=30)
description = models.TextField(_('description'), null=True, blank=True)
icon = models.ImageField(upload_to='products', null=True, blank=True)
def is_owned_by(self, user):
"""
Method to see if that object can be edited by the given user
"""
if user.is_in_group(settings.SITH_GROUPS['accounting-admin']['name']):
return True
return False
def __str__(self):
return self.name
class Product(models.Model):
"""
This describes a product, with all its related informations
"""
name = models.CharField(_('name'), max_length=30)
description = models.TextField(_('description'), blank=True)
product_type = models.ForeignKey(ProductType, related_name='products', null=True, blank=True)
code = models.CharField(_('code'), max_length=10)
purchase_price = CurrencyField(_('purchase price'))
selling_price = CurrencyField(_('selling price'))
special_selling_price = CurrencyField(_('special selling price'))
icon = models.ImageField(upload_to='products', null=True, blank=True)
club = models.ForeignKey(Club, related_name="products")
def is_owned_by(self, user): # TODO do this for all models
"""
Method to see if that object can be edited by the given user
"""
if user.is_in_group(settings.SITH_GROUPS['accounting-admin']['name']):
return True
return False
def __str__(self):
return self.name
class BankAccount(models.Model):
name = models.CharField(_('name'), max_length=30)
......@@ -196,6 +137,7 @@ class Operation(models.Model):
An operation is a line in the journal, a debit or a credit
"""
journal = models.ForeignKey(GeneralJournal, related_name="operations", null=False)
amount = CurrencyField(_('amount'))
date = models.DateField(_('date'))
remark = models.TextField(_('remark'), max_length=255)
mode = models.CharField(_('payment method'), max_length=255, choices=settings.SITH_ACCOUNTING_PAYMENT_METHOD)
......
......@@ -17,24 +17,24 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='Club',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)),
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('name', models.CharField(max_length=30, verbose_name='name')),
('unix_name', models.CharField(unique=True, max_length=30, verbose_name='unix name', error_messages={'unique': 'A club with that unix name already exists.'}, validators=[django.core.validators.RegexValidator('^[a-z0-9][a-z0-9._-]*[a-z0-9]$', 'Enter a valid unix name. This value may contain only letters, numbers ./-/_ characters.')])),
('unix_name', models.CharField(validators=[django.core.validators.RegexValidator('^[a-z0-9][a-z0-9._-]*[a-z0-9]$', 'Enter a valid unix name. This value may contain only letters, numbers ./-/_ characters.')], unique=True, max_length=30, verbose_name='unix name', error_messages={'unique': 'A club with that unix name already exists.'})),
('address', models.CharField(max_length=254, verbose_name='address')),
('edit_groups', models.ManyToManyField(to='core.Group', blank=True, related_name='editable_club')),
('owner_group', models.ForeignKey(default=1, related_name='owned_club', to='core.Group')),
('parent', models.ForeignKey(blank=True, related_name='children', to='club.Club', null=True)),
('view_groups', models.ManyToManyField(to='core.Group', blank=True, related_name='viewable_club')),
('edit_groups', models.ManyToManyField(related_name='editable_club', to='core.Group', blank=True)),
('owner_group', models.ForeignKey(to='core.Group', related_name='owned_club', default=1)),
('parent', models.ForeignKey(to='club.Club', related_name='children', null=True, blank=True)),
('view_groups', models.ManyToManyField(related_name='viewable_club', to='core.Group', blank=True)),
],
),
migrations.CreateModel(
name='Membership',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)),
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('start_date', models.DateField(auto_now=True, verbose_name='start date')),
('end_date', models.DateField(blank=True, null=True, verbose_name='end date')),
('end_date', models.DateField(blank=True, verbose_name='end date', null=True)),
('role', models.IntegerField(choices=[(0, 'Curieux'), (1, 'Membre actif'), (2, 'Membre du bureau'), (3, 'Responsable info'), (4, 'Secrétaire'), (5, 'Responsable com'), (7, 'Trésorier'), (9, 'Vice-Président'), (10, 'Président')], verbose_name='role', default=0)),
('description', models.CharField(max_length=30, blank=True, verbose_name='description')),
('description', models.CharField(blank=True, max_length=30, verbose_name='description')),
('club', models.ForeignKey(to='club.Club', related_name='members')),
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='membership')),
],
......
......@@ -5,9 +5,10 @@ from django.conf import settings
from core.models import Group, User, Page, PageRev
from accounting.models import Customer, GeneralJournal, ProductType, Product, BankAccount, ClubAccount, Operation, AccountingType
from accounting.models import GeneralJournal, BankAccount, ClubAccount, Operation, AccountingType
from club.models import Club, Membership
from subscription.models import Subscription, Subscriber
from counter.models import Customer, ProductType, Product
class Command(BaseCommand):
help = "Populate a new instance of the Sith AE"
......
......@@ -4,11 +4,6 @@ from django.core.management import call_command
from django.conf import settings
from core.models import Group, User, Page, PageRev
from accounting.models import Customer, GeneralJournal, ProductType, Product
from club.models import Club
from subscription.models import Subscription, Subscriber
class Command(BaseCommand):
help = "Set up a new instance of the Sith AE"
......
......@@ -2,11 +2,11 @@
from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
import django.core.validators
import django.db.models.deletion
import core.models
import django.contrib.auth.models
from django.conf import settings
class Migration(migrations.Migration):
......@@ -19,23 +19,23 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(verbose_name='last login', null=True, blank=True)),
('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
('password', models.CharField(verbose_name='password', max_length=128)),
('last_login', models.DateTimeField(blank=True, verbose_name='last login', null=True)),
('is_superuser', models.BooleanField(verbose_name='superuser status', default=False, help_text='Designates that this user has all permissions without explicitly assigning them.')),
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, verbose_name='username', help_text='Required. 254 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True, validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.')], max_length=254)),
('first_name', models.CharField(max_length=30, verbose_name='first name')),
('last_name', models.CharField(max_length=30, verbose_name='last name')),
('email', models.EmailField(max_length=254, verbose_name='email address', unique=True)),
('username', models.CharField(verbose_name='username', max_length=254, error_messages={'unique': 'A user with that username already exists.'}, validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.')], help_text='Required. 254 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True)),
('first_name', models.CharField(verbose_name='first name', max_length=30)),
('last_name', models.CharField(verbose_name='last name', max_length=30)),
('email', models.EmailField(verbose_name='email address', max_length=254, unique=True)),
('date_of_birth', models.DateField(verbose_name='date of birth')),
('nick_name', models.CharField(max_length=30, blank=True)),
('nick_name', models.CharField(blank=True, max_length=30)),
('is_staff', models.BooleanField(verbose_name='staff status', default=False, help_text='Designates whether the user can log into this admin site.')),
('is_active', models.BooleanField(verbose_name='active', default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.')),
('date_joined', models.DateField(verbose_name='date joined', auto_now_add=True)),
],
options={
'verbose_name_plural': 'users',
'verbose_name': 'user',
'verbose_name_plural': 'users',
'permissions': (('change_prop_user', "Can change the user's properties (groups, ...)"), ('view_user', "Can view user's profile")),
},
managers=[
......@@ -45,21 +45,22 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='Group',
fields=[
('group_ptr', models.OneToOneField(to='auth.Group', auto_created=True, parent_link=True, primary_key=True, serialize=False)),
('group_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, to='auth.Group', serialize=False)),
('is_meta', models.BooleanField(verbose_name='meta group status', default=False, help_text='Whether a group is a meta group or not')),
('description', models.CharField(verbose_name='description', max_length=60)),
],
bases=('auth.group',),
),
migrations.CreateModel(
name='Page',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)),
('name', models.CharField(max_length=30, verbose_name='page name')),
('_full_name', models.CharField(verbose_name='page name', max_length=255, blank=True)),
('edit_groups', models.ManyToManyField(to='core.Group', blank=True, related_name='editable_page')),
('owner_group', models.ForeignKey(to='core.Group', default=1, related_name='owned_page')),
('parent', models.ForeignKey(to='core.Page', on_delete=django.db.models.deletion.SET_NULL, related_name='children', null=True, blank=True)),
('view_groups', models.ManyToManyField(to='core.Group', blank=True, related_name='viewable_page')),
('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
('name', models.CharField(verbose_name='page name', max_length=30)),
('_full_name', models.CharField(blank=True, verbose_name='page name', max_length=255)),
('edit_groups', models.ManyToManyField(blank=True, to='core.Group', related_name='editable_page')),
('owner_group', models.ForeignKey(default=1, related_name='owned_page', to='core.Group')),
('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.Page', related_name='children')),
('view_groups', models.ManyToManyField(blank=True, to='core.Group', related_name='viewable_page')),
],
options={
'permissions': (('change_prop_page', "Can change the page's properties (groups, ...)"), ('view_page', 'Can view the page')),
......@@ -68,12 +69,12 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='PageRev',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)),
('title', models.CharField(verbose_name='page title', max_length=255, blank=True)),
('content', models.TextField(verbose_name='page content', blank=True)),
('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
('title', models.CharField(blank=True, verbose_name='page title', max_length=255)),
('content', models.TextField(blank=True, verbose_name='page content')),
('date', models.DateTimeField(verbose_name='date', auto_now=True)),
('author', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='page_rev')),
('page', models.ForeignKey(to='core.Page', related_name='revisions')),
('author', models.ForeignKey(related_name='page_rev', to=settings.AUTH_USER_MODEL)),
('page', models.ForeignKey(related_name='revisions', to='core.Page')),
],
options={
'ordering': ['date'],
......@@ -82,27 +83,27 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='user',
name='edit_groups',
field=models.ManyToManyField(to='core.Group', blank=True, related_name='editable_user'),
field=models.ManyToManyField(blank=True, to='core.Group', related_name='editable_user'),
),
migrations.AddField(
model_name='user',
name='groups',
field=models.ManyToManyField(to='auth.Group', verbose_name='groups', help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_query_name='user', blank=True, related_name='user_set'),
field=models.ManyToManyField(blank=True, verbose_name='groups', related_name='user_set', related_query_name='user', to='auth.Group', help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.'),
),
migrations.AddField(
model_name='user',
name='owner_group',
field=models.ForeignKey(to='core.Group', default=1, related_name='owned_user'),
field=models.ForeignKey(default=1, related_name='owned_user', to='core.Group'),
),
migrations.AddField(
model_name='user',
name='user_permissions',
field=models.ManyToManyField(to='auth.Permission', verbose_name='user permissions', help_text='Specific permissions for this user.', related_query_name='user', blank=True, related_name='user_set'),
field=models.ManyToManyField(blank=True, verbose_name='user permissions', related_name='user_set', related_query_name='user', to='auth.Permission', help_text='Specific permissions for this user.'),
),
migrations.AddField(
model_name='user',
name='view_groups',
field=models.ManyToManyField(to='core.Group', blank=True, related_name='viewable_user'),
field=models.ManyToManyField(blank=True, to='core.Group', related_name='viewable_user'),
),
migrations.CreateModel(
name='MetaGroup',
......
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('core', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='group',
name='description',
field=models.CharField(max_length=60, verbose_name='description', default='guy'),
preserve_default=False,
),
]
......@@ -3,7 +3,6 @@ from django.views.generic import ListView
from django.core.urlresolvers import reverse_lazy
from core.models import RealGroup
from core.views.forms import GroupEditForm
from core.views import CanEditMixin
class GroupListView(CanEditMixin, ListView):
......
from django.contrib import admin
from counter.models import Counter
from counter.models import *
# Register your models here.
admin.site.register(Customer)
admin.site.register(ProductType)
admin.site.register(Product)
admin.site.register(Counter)
......@@ -2,6 +2,8 @@
from __future__ import unicode_literals
from django.db import migrations, models
import accounting.models
from django.conf import settings
class Migration(migrations.Migration):
......@@ -9,20 +11,66 @@ class Migration(migrations.Migration):
dependencies = [
('club', '0001_initial'),
('core', '0001_initial'),
('accounting', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Counter',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)),
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('name', models.CharField(max_length=30, verbose_name='name')),
('type', models.CharField(max_length=255, verbose_name='subscription type', choices=[('BAR', 'Bar'), ('OFFICE', 'Office')])),
('type', models.CharField(choices=[('BAR', 'Bar'), ('OFFICE', 'Office')], max_length=255, verbose_name='subscription type')),
('club', models.ForeignKey(to='club.Club', related_name='counters')),
('edit_groups', models.ManyToManyField(blank=True, related_name='editable_counters', to='core.Group')),
('products', models.ManyToManyField(blank=True, related_name='counters', to='accounting.Product')),
('view_groups', models.ManyToManyField(blank=True, related_name='viewable_counters', to='core.Group')),
('edit_groups', models.ManyToManyField(related_name='editable_counters', to='core.Group', blank=True)),
],
),
migrations.CreateModel(
name='Customer',
fields=[
('user', models.OneToOneField(to=settings.AUTH_USER_MODEL, primary_key=True, serialize=False)),
('account_id', models.CharField(unique=True, max_length=10, verbose_name='account id')),
],
options={
'verbose_name_plural': 'customers',
'verbose_name': 'customer',
},
),
migrations.CreateModel(
name='Product',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('name', models.CharField(max_length=30, verbose_name='name')),
('description', models.TextField(blank=True, verbose_name='description')),
('code', models.CharField(max_length=10, verbose_name='code')),
('purchase_price', accounting.models.CurrencyField(max_digits=12, decimal_places=2, verbose_name='purchase price')),
('selling_price', accounting.models.CurrencyField(max_digits=12, decimal_places=2, verbose_name='selling price')),
('special_selling_price', accounting.models.CurrencyField(max_digits=12, decimal_places=2, verbose_name='special selling price')),
('icon', models.ImageField(blank=True, upload_to='products', null=True)),
('club', models.ForeignKey(to='club.Club', related_name='products')),
],
),
migrations.CreateModel(
name='ProductType',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('name', models.CharField(max_length=30, verbose_name='name')),
('description', models.TextField(blank=True, verbose_name='description', null=True)),
('icon', models.ImageField(blank=True, upload_to='products', null=True)),
],
),
migrations.AddField(
model_name='product',
name='product_type',
field=models.ForeignKey(to='counter.ProductType', related_name='products', null=True, blank=True),
),
migrations.AddField(
model_name='counter',
name='products',
field=models.ManyToManyField(related_name='counters', to='counter.Product', blank=True),
),
migrations.AddField(
model_name='counter',
name='view_groups',
field=models.ManyToManyField(related_name='viewable_counters', to='core.Group', blank=True),
),
]
......@@ -7,10 +7,70 @@ from django.core.urlresolvers import reverse
from datetime import timedelta
from club.models import Club
from accounting.models import Product
from core.models import Group
from accounting.models import CurrencyField
from core.models import Group, User
from subscription.models import Subscriber
class Customer(models.Model):
"""