Example #1
0
    def create_or_update(cls, good_model, data):
        """
        Создаем либо обновляем цену в товаре.

        Для начала нам нужно найти цену в системе по номенклатуре и цене с НДС(по сути из цены с НДС и складывается
        конечная стоимость продажи).

        Есть момент, что цен прихода может быть несколько. А вот цена продажи у них все равно единая.

        В случае отсутствия цены по условию выше, создаем новую цену со всеми переданными параметрами.

        Если находим, то корректируем у цены НДС, цены розницы и опта и дату действия цены.

        :argument good_model - инстанс Good
        :argument data - инстанс DataToUpdatePrice.

        :return инстанс Price

        """
        invoice = data.invoice
        if not data.price_retail and not data.price_gross:
            raise PriceArgumentExc(u"Нету розничной и оптовой цены")
        try:
            price, _ = cls.get_price_priceparish(
                commodity_id=data.id_commodity, price_post=data.price_post, number_local=data.number_local,
                number_global=data.number_global, date=invoice.date)
        except NotFindPriceExc:
            """
            Если не найдено цен вообще на номенклатуру, то создаем и цену прихода, и цену продажи.
            """
            price = Price(price_retail=data.price_retail, price_gross=data.price_gross)
            priceparish = PriceParish(commodity_id=data.id_commodity, number_local_from=data.number_local,
                                      number_global_from=data.number_global, NDS=data.NDS, price_prev=data.price_prev,
                                      price_post=data.price_post, date_from=invoice.date)
            priceparish.invoice = invoice
            priceparish.price = price
            db.session.add(price)
            db.session.add(priceparish)
            good_model.price = price
            db.session.add(good_model)

        except NotFindPriceParishExc as exc:
            """
            Если не найдена цена прихода с "ценой с НДС", надо найти в системе, есть ли цены продажи с указанными
            розничными и оптовыми ценами, и если такое есть, надо добавить новую цену прихода
            """
            price = cls.get_final_price_to_commodity_numbers_date(
                data.id_commodity, data.price_retail, data.price_gross, data.number_local, data.number_global,
                invoice.date)

            if not price:
                price = Price(price_retail=data.price_retail, price_gross=data.price_gross)
                db.session.add(price)

            priceparish = PriceParish(
                commodity_id=data.id_commodity, number_local_from=data.number_local,
                number_global_from=data.number_global, NDS=data.NDS, price_prev=data.price_prev,
                price_post=data.price_post, date_from=invoice.date)
            priceparish.invoice = invoice
            priceparish.price = price
            db.session.add(priceparish)
            good_model.price = price
            db.session.add(good_model)
        else:
            """
            иначе нашли цену и изменим ее
            """
            good_model.price = price
            price.price_retail = data.price_retail
            price.price_gross = data.price_gross

            db.session.add(good_model)
            db.session.add(price)
        return price