# -*- coding: utf-8 -*- from django.db import models from django.db.models import Sum from django.conf import settings from pytils.numeral import choose_plural from docs.models.base_models import BaseInvoiceModel, BaseItemInvoiceModel from docs.models.linked_docs_mixin import LinkedDocsMixin from docs import consts class Invoice(BaseInvoiceModel, LinkedDocsMixin): """Счет.""" UNPAID = 1 PARTLY_PAID = 2 PAID = 3 PAID_CHOICES = ( (UNPAID, 'Нет'), (PARTLY_PAID, 'Частично'), (PAID, 'Да'), ) paid_status = models.PositiveSmallIntegerField( 'Оплачен?', choices=PAID_CHOICES, default=UNPAID ) closed_status = models.BooleanField('Закрыт?', choices=consts.BOOL_CHOICES, default=False) class Meta(BaseInvoiceModel.Meta): verbose_name = 'Счёт' verbose_name_plural = 'Счета' def to_string_for_json(self): # Счёт №Х от ХХ.ХХ.ХХ, Х позиций, на сумму ХХ. # import ipdb;ipdb.set_trace() date_format = settings.DATE_INPUT_FORMATS[0] count = self.invoice_items.count() str_date = self.doc_date.strftime(format=date_format) return '{name} № {number} от {date}, {count} {count_name}, на сумму {sum}'.format( name=self._meta.verbose_name or '', number=self.doc_num, date=str_date, count=count or '', count_name=choose_plural(count, (u"позиция", u"позиции", u"позиций")), sum=self.invoice_items.aggregate(Sum('total_price'))['total_price__sum'] ) def __str__(self): return self.to_string_for_json() class InvoiceItem(BaseItemInvoiceModel): """Табличная часть счета.""" parent = models.ForeignKey(Invoice, related_name='invoice_items') class Meta(BaseItemInvoiceModel.Meta): verbose_name = 'Табл. часть счета' verbose_name_plural = 'Табл. части счетов'