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
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
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
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