# -*- coding: utf-8 -*- from django.db import models from django.contrib.auth.models import User from project.customer.models import Client, BankAccount from . import managers from .. import consts class VeryBaseModel(models.Model): """Очень базовая абстрактная модель.""" created_at = models.DateTimeField(u'Создан', auto_now_add=True) updated_at = models.DateTimeField(u'Изменен', auto_now=True) class Meta: abstract = True app_label = 'docs' ordering = ('-created_at',) get_latest_by = 'created_at' # ----------------------------------------------------------------------------- class BaseModel(VeryBaseModel): """Абстрактная модель бух.формы.""" user = models.ForeignKey(User, related_name='+', verbose_name=u'Пользователь') doc_num = models.PositiveIntegerField(u'Номер') doc_date = models.DateField('Дата создания') client = models.ForeignKey(Client, related_name='+', verbose_name=u'Контрагент') objects = managers.BaseModelManager() class Meta(VeryBaseModel.Meta): abstract = True ordering = ('-doc_date',) def __unicode__(self): return u'%s № %s от %s' % (self._meta.verbose_name or '', self.doc_num, self.doc_date) class BaseNdsModel(BaseModel): """Расширение абстрактной модели бух.формы - НДС. Доп. поля под тип и ставку НДС. """ nds_value = models.PositiveSmallIntegerField(u'Ставка НДС', choices=consts.NDS_VALUE_CHOICES, default=consts.NDS_VALUE_0) class Meta(BaseModel.Meta): abstract = True def get_nds_as_number(self): """Значение НДС как число (без символа %).""" return consts.NDS_VALUE_NUMERIC.get(self.nds_value, 0) class BaseInvoiceModel(BaseNdsModel): """Расширение абстрактной модели бух.формы - по типу счета. Доп. поля под расчетный счет и дополнительные условия. """ bank_account = models.ForeignKey(BankAccount, related_name='+', verbose_name=u'Расчётный счёт') doc_text = models.TextField(u'Дополнительные условия', max_length=1000, blank=True, default='') class Meta(BaseNdsModel.Meta): abstract = True # ----------------------------------------------------------------------------- class BaseItemModel(VeryBaseModel): """Абстрактная модель табличной части бух.формы.""" name = models.CharField(u'Наименование', max_length=256) qty = models.DecimalField(u'Кол-во', max_digits=10, decimal_places=3) units = models.CharField(u'Ед. изм.', max_length=20) class Meta(VeryBaseModel.Meta): abstract = True ordering = ('created_at',) def __unicode__(self): return u'%s, %s %s' % (self.name[:30], self.qty, self.units) class BaseItemInvoiceModel(BaseItemModel): """Расширение абстрактной модели табл. части бух.формы - по типу счета. Доп. поля под цену и сумму. """ price = models.DecimalField(u'Цена', max_digits=10, decimal_places=2) total_price = models.DecimalField(u'Сумма', max_digits=10, decimal_places=2) class Meta(BaseItemModel.Meta): abstract = True def __unicode__(self): curr = consts.CURRENCY_CHOICES_DICT.get(getattr(self, 'currency', consts.CURR_RUB)) return u'%s, %s %s * %s = %s %s' % (self.name[:30], self.qty, self.units, self.price, self.total_price, curr) def save(self, *args, **kwargs): self.total_price = self.price * self.qty # пересчитать сумму super(BaseItemInvoiceModel, self).save(*args, **kwargs) class AbstractCatalog(models.Model): code = models.CharField(u'Код', max_length=200) name = models.CharField(u'Наименование', max_length=10) class Meta: abstract = True app_label="docs" def __unicode__(self): return self.name