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