Esempio n. 1
0
    def handle_orderitem(cls, full_name, name, number_local, number_global,
                         date, remission, NDS, price_prev, price_post, order):
        from applications.good.service import GoodService
        from applications.commodity.service import CommodityService
        item = OrderItem()
        item.full_name = full_name,
        item.name = name
        item.number_local = number_local
        item.number_global = number_global
        item.date = date
        item.remission = remission
        item.NDS = float(NDS.replace("%", "").strip())
        item.price_prev = price_prev if price_prev else 0.0
        item.price_post = price_post if price_post else 0.0
        item.order = order

        res, comm = CommodityService.get_or_create_commodity(
            name=name)

        if res is False:
            if not number_local and not number_global:
                comm.numeric = False
            db.session.add(comm)
            db.session.flush()

        res, good = GoodService.get_or_create_commodity_numbers(
            comm.id, number_local, number_global)
        good.commodity = comm
        good.full_name = full_name
        item.good = good
        db.session.add(good)

        db.session.add(item)
Esempio n. 2
0
    def generate_price_stub_item(cls, invoiceitem):
        """
        Выдераем все данные из позиции накладной,
        чтобы выдать рекомендации по ценам, изменяемость цен.
        """
        from applications.commodity.service import CommodityService
        commodity = CommodityService.get_commodity(invoiceitem.name)
        price = PriceService.get_price_invoiceitem(invoiceitem)

        pricestub = PriceStub(
            id='',
            id_commodity=commodity.id,
            id_good=invoiceitem.good_id,
            full_name=invoiceitem.full_name,
            number_local=invoiceitem.number_local,
            number_global=invoiceitem.number_global,
            NDS=invoiceitem.rate_NDS,
            price_prev=invoiceitem.price_without_NDS,
            price_post=invoiceitem.price_with_NDS,
            price_retail=price.price_retail or '',
            price_gross=price.price_gross or '',
            price_retail_recommendation=cls.price_retail(
                float(invoiceitem.price_with_NDS)),
            price_gross_recommendation=cls.price_gross(
                float(invoiceitem.price_with_NDS)),
            is_change=price.is_change)
        return pricestub
Esempio n. 3
0
    def get_price_priceparish(cls, commodity_id, price_post, number_local=None,
                              number_global=None, date=None):
        """
        Ищем цену и цену прихода по номенклатуре, цене с НДС, номерам и дате.

        Генерирует NotFindPriceExc, PriceArgumentExc, NotFindPriceParishExc.
        """
        from applications.commodity.service import CommodityService
        try:
            priceparish = cls.get_priceparish(
                commodity_id, number_local, number_global, date)
        except NotFindPriceParishExc as exc:
            """
            Если сработало исключение, то и цены значит нет на данный товар.
            Поэтому генерируем соответствующее исключение.
            """
            raise NotFindPriceExc(unicode(exc))
        commodity = CommodityService.get_by_id(commodity_id)
        try:
            try:
                priceparish = priceparish.filter(
                    PriceParish.price_post == price_post)
                priceparish = priceparish.one()
            except MultipleResultsFound:
                priceparish = priceparish[0]
        except NoResultFound:
            raise NotFindPriceParishExc(
                u"Не найдено цены прихода для товара %s и ценой %s" % (
                    commodity.name, price_post))
        return priceparish.price, priceparish
Esempio n. 4
0
    def get_priceparish(cls, commodity_id, number_local=None,
                        number_global=None, date=None):
        """
        Получаем цену по номенклатуре, номерам и дате.
        """
        from applications.commodity.service import CommodityService
        commodity = CommodityService.get_by_id(commodity_id)
        if commodity.numeric:
            # ОБРАБОТКА НОМЕРНОЙ НОМЕНКЛАТУРЫ
            if not number_local and not number_global:
                raise PriceArgumentExc(
                    u"Для номерной номенклатуры нужно указать общий год и "
                    u"номер в пределах года")

            priceparish = PriceParish.query.filter(
                PriceParish.commodity_id == commodity_id,
                PriceParish.number_local_from <= number_local,
                PriceParish.number_global_from <= number_global
            ).order_by(desc(PriceParish.number_local_from),
                       desc(PriceParish.number_global_from))
            count = priceparish.count()

            if count == 0:
                raise NotFindPriceParishExc(
                    u"Не найдено цен для номенклатуры %s и номеров %s и %s" % (
                    commodity.name, number_local, number_global))

            return priceparish
        else:
            # ОБРАБОТКА БЕЗНОМЕРНОЙ НОМЕНКЛАТУРЫ
            if number_local or number_global:
                raise PriceArgumentExc(
                    u"Для безномерной номенклатуры номера должны быть пустыми.")
            priceparish = PriceParish.query.filter(
                PriceParish.commodity_id == commodity_id
            ).order_by(desc(PriceParish.date_from))
            if date:
                priceparish = priceparish.filter(PriceParish.date_from <= date)
            count = priceparish.count()
            if count == 0:
                raise NotFindPriceParishExc(
                    u"Не найдено цен для номенклатуры %s" % commodity.name)
            else:
                return priceparish
Esempio n. 5
0
    def handle_returnitem(cls, full_name, name, number_local, number_global,
                          date, date_to, price_without_NDS, price_with_NDS,
                          remission, count_delivery, count_rem, return_inst):
        from applications.commodity.service import CommodityService
        from applications.good.service import GoodService
        item = ReturnItem()
        item.full_name = full_name
        item.name = name
        item.number_local = number_local
        item.number_global = number_global
        item.date = date
        item.date_to = date_to
        item.price_without_NDS = price_without_NDS
        item.price_with_NDS = price_with_NDS
        item.remission = remission
        item.count_delivery = count_delivery
        item.count_rem = count_rem
        item.return_item = return_inst

        res, comm = CommodityService.get_or_create_commodity(
            name=name)

        if res is False:
            if not number_local and not number_global:
                comm.numeric = False
            db.session.add(comm)
            db.session.flush()

        try:
            res, good = GoodService.get_or_create_commodity_numbers(
                comm.id, number_local, number_global)
        except GoodArgumentExc as exc:
            error(u"При обработке позиций возврата возникла "
                  u"ошибка. " + unicode(exc))
            raise

        good.commodity = comm
        good.full_name = full_name
        item.good = good
        db.session.add(good)

        db.session.add(item)
Esempio n. 6
0
    def pre_save(self, obj, data):
        from applications.commodity.service import CommodityService
        obj.number_local = str(obj.number_local) if obj.number_local else None
        obj.number_global = str(obj.number_global) if obj.number_global \
            else None
        if obj.commodity_id is None:
            raise GoodResourceCanon.GoodResourceException(
                u"Нельзя сохранить товар без номенклатуры.")

        commodity = CommodityService.get_by_id(obj.commodity_id)
        try:
            res, good = GoodService.get_or_create_commodity_numbers(
                obj.commodity_id, obj.number_local, obj.number_global, obj.id)
        except GoodServiceException as exc:
            raise GoodResourceCanon.GoodResourceException(unicode(exc))

        if res is False:
            good.commodity = commodity
            price_id = data.get('price_id')
            if price_id:
                good.price_id = price_id
            if not data.get('full_name'):
                full_name = GoodService.full_name(good)
            else:
                full_name = obj.full_name
            good.full_name = full_name

        if res is True:
            if commodity.numeric:
                message = u"В системе уже есть товар с наименованием %s и " \
                          u"№%s(%s)" % (
                    commodity.name, obj.number_local, obj.number_global)
            else:
                message = u"В системе уже есть безномерной товар с " \
                          u"наименованием %s" % commodity.name
            raise GoodResourceCanon.GoodResourceException(message)

        good = super(GoodResourceCanon, self).pre_save(good, data)

        return good
Esempio n. 7
0
    def get_or_create_commodity_numbers(
            cls, commodity_id, number_local=None, number_global=None, id=None):
        from applications.commodity.service import CommodityService
        commodity = CommodityService.get_by_id(commodity_id)

        if commodity.numeric:
            if not number_local and not number_global:
                raise GoodArgumentExc(
                    u"Для номерного товара '%s' не указаны номера" %
                    unicode(commodity.name))

        if commodity.numeric is False:
            if number_local or number_global:
                raise GoodArgumentExc(
                    u"Для безномерного товара '%s' нельзя указывать номера" %
                    unicode(commodity.name))

        try:
            if id:
                good = Good.query.filter(
                    Good.commodity_id == commodity_id,
                    Good.number_local == number_local,
                    Good.number_global == number_global,
                    not_(Good.id == id)).one()
            else:
                good = Good.query.filter(
                    Good.commodity_id == commodity_id,
                    Good.number_local == number_local,
                    Good.number_global == number_global).one()
        except NoResultFound:
            if id:
                return False, Good.query.get(id)
            else:
                return False, Good(commodity_id=commodity_id,
                                   number_local=number_local,
                                   number_global=number_global)
        else:
            return True, good
Esempio n. 8
0
    def handle_invoiceitem(
            cls, full_name, name, number_local, number_global, invoice,
            count_order, count_postorder, count, price_without_NDS,
            price_with_NDS, sum_without_NDS, sum_NDS, rate_NDS, sum_with_NDS,
            thematic, count_whole_pack, placer, good=None, fact_count=None,
            price_retail=None, price_gross=None):
        """
        Обработка позиции накладной.

        Сохраняем в БД позицию.
        Создаем товар в системе.
        """
        from applications.commodity.service import CommodityService
        invitem = InvoiceItem()

        invitem.full_name = full_name
        invitem.count_order = count_order
        invitem.count_postorder = count_postorder
        invitem.count = count
        invitem.price_without_NDS = price_without_NDS
        invitem.price_with_NDS = price_with_NDS
        invitem.sum_without_NDS = sum_without_NDS
        invitem.sum_with_NDS = sum_with_NDS
        invitem.sum_NDS = sum_NDS
        invitem.rate_NDS = rate_NDS
        invitem.count_whole_pack = count_whole_pack
        invitem.placer = placer
        invitem.invoice = invoice
        invitem.price_gross = price_gross
        invitem.price_retail = price_retail

        if good:
            invitem.good = good
            invitem.name = good.commodity.name
            invitem.number_local = good.number_local
            invitem.number_global = good.number_global
            invitem.thematic=good.commodity.thematic
            if fact_count:
                invitem.fact_count = fact_count
        else:
            invitem.name=name
            invitem.number_local=number_local
            invitem.number_global=number_global
            invitem.thematic=thematic
            res, comm = CommodityService.get_or_create_commodity(
                name=name, thematic=thematic)

            if res is False:
                if not number_local and not number_global:
                    comm.numeric = False
                db.session.add(comm)
                db.session.flush()
            try:
                res, good = GoodService.get_or_create_commodity_numbers(
                    comm.id, number_local, number_global)
            except GoodArgumentExc as exc:
                error(u"При обработке позиций накладной возникла ошибка. " +
                      unicode(exc))
                raise

            good.commodity = comm
            good.full_name = full_name
            invitem.good = good
            db.session.add(good)

        db.session.add(invitem)