def status(cls, acceptance, status): from applications.point_sale.service import PointSaleService from applications.price.service import PriceService, DataToUpdatePrice debug(u"Смена статуса `прихода` id = '%s' с %s на %s." % ( acceptance.id, acceptance.status, StatusType[status])) if status == DRAFT: if acceptance.type == NEW: debug(u"Переход `прихода` id = '%s' в статус 'Черновик' и " u"типом 'Новая' сопровождается удалением накладной." % acceptance.id) acceptance.items.delete() acceptance.invoice.items.delete() db.session.delete(acceptance.invoice) if status == IN_PROG: if acceptance.type == MAIL: cls.initial_acceptance_from_mail(acceptance) elif acceptance.type == NEW: cls.initial_acceptance_from_custom(acceptance) if status == VALIDATED: if acceptance.type == MAIL: for item in acceptance.items: if item.fact_count: PointSaleService.sync_good_increment( acceptance.pointsale_id, item.good_id, item.fact_count) elif acceptance.type == NEW: invoice = acceptance.invoices[0] for item in invoice.items: good = item.good PriceService.create_or_update(good, DataToUpdatePrice( id_commodity=good.commodity_id, price_retail=item.price_retail, price_gross=item.price_gross, price_prev=None, price_post=item.price_with_NDS, NDS=None, number_local=good.number_local, number_global=good.number_global, invoice=invoice)) if item.fact_count: PointSaleService.sync_good_increment( acceptance.pointsale_id, item.good_id, item.fact_count) old_status = acceptance.status acceptance.status = status debug(u"Смена статуса `прихода` id = '%s' с %s на %s завершено." % ( acceptance.id, old_status, StatusType[status]))
def save_from_json(cls, date, items, provider_id=None, invoice=None): """ Сохраняем накладную с позициями. Для редактирования надо передать инстанс накладной в переменную invoice. """ from applications.price.service import DataToUpdatePrice, PriceService from applications.point_sale.service import PointSaleService try: if invoice: invmodel = invoice else: provider = ProviderService.get_by_id(provider_id) invmodel = InvoiceService.create_invoice( number=InvoiceService.generate_number(date), date=date, provider=provider, sum_without_NDS=None, sum_with_NDS=None, sum_NDS=None, weight=None, responsible=None) db.session.add(invmodel) if invoice: pointsale = invoice.acceptance.pointsale for item in invmodel.items: pointsale_item = PointSaleService.item_to_pointsale_good( pointsale.id, item.good_id) pointsale_item.count -= item.count db.session.add(pointsale_item) invmodel.items.delete() db.session.add(invmodel) for item in items: good = GoodService.get_good(item['good_id']) name = good.commodity.name number_local = good.number_local number_global = good.number_global full_name = GoodService.generate_name( name, number_local, number_global) invoice = invmodel count_order= None count_postorder = None count = item['count_invoice'] if 'count_invoice' in item \ else None price_without_NDS = item['price_pre'] if 'price_pre' in item \ else None price_with_NDS = item['price_post'] if 'price_post' in item \ else None sum_without_NDS = None sum_NDS = None rate_NDS = item['NDS'] if 'NDS' in item else None sum_with_NDS = None thematic = None count_whole_pack = None placer = None fact_count = None cls.handle_invoiceitem( 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, fact_count) if 'price_retail' in item or 'price_gross' in item: PriceService.create_or_update(good, DataToUpdatePrice( id_commodity=good.commodity_id, price_retail=item['price_retail'], price_gross=item['price_gross'], price_prev=item['price_prev'] if 'price_prev' in item else None, price_post=item['price_post'], NDS=item['NDS'] if 'NDS' in item else None, number_local=number_local, number_global=number_global, invoice=invmodel)) except Exception as exc: db.session.rollback() error(unicode(exc)) raise InvoiceService.InvoiceServiceException(unicode(exc)) else: db.session.commit() return invmodel