/
statik2002
/
TorgServer
Обзор
Документация
Войти
/
statik2002
/
TorgServer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main/tasks.py
146 строк
6 KB
statik2002
Add Yandex feed file
09 авг 2026, 10:09
09 авг 2026, 10:09
1745015
Код
Авторство
О чём код?
from django.core.exceptions import ObjectDoesNotExist from django.tasks import task from main.models import OKSFile, WorkingShift, ReceiptInShift, ProductInCatalog, Product, Leftovers, Catalog, YandexFeed @task def fetching_oks(): oks_file, created = OKSFile.objects.get_or_create(pk=1) last_elapsed_seconds = oks_file.last_change_elapsed new_elapsed_seconds = oks_file.get_file_last_time_change() if last_elapsed_seconds <= new_elapsed_seconds: # Изменилось время изменения файла, значит что-то новое появилось. Разгребаем. oks_file.last_change_elapsed = new_elapsed_seconds oks_file.save() fetching_file_result = oks_file.fetch_oks_file() if not fetching_file_result: return 'Error fetching oks file' current_shift_stat = oks_file.get_data_current_shift() if not current_shift_stat: return 'Cant get current shift from file' # Если такая смена есть, то обновляем иначе создаем эту смену shift, created = WorkingShift.objects.update_or_create( document_id=current_shift_stat.get('document_id'), shift_id=current_shift_stat.get('shift_id'), shift_date=current_shift_stat.get('shift_date'), shift_start_time=current_shift_stat.get('shift_start_time') ) current_shift_receipts = oks_file.parse_oks_file() # Идем по чекам и добавляем в смену те, которых нет в смене for receipt in current_shift_receipts: try: # Если есть такой чаек в смене, то проверяем внеснен ли он, если внесен, то пропускаем receipt_in_shift = ReceiptInShift.objects.get(receipt_id=receipt.get('receipt_id')) # На случай если чек есть но не внесен в смену if not shift.receipts.filter(pk=receipt_in_shift.pk): shift.receipts.add(receipt_in_shift) continue except ObjectDoesNotExist: # Чека нет в смене, добавляем receipt_in_shift = ReceiptInShift.objects.create( discount=receipt.get('discount'), is_complete=receipt.get('is_complete'), payment_type=receipt.get('payment_type'), receipt_discount=receipt.get('receipt_discount'), receipt_id=receipt.get('receipt_id'), receipt_time=receipt.get('receipt_time'), total_payment=receipt.get('total_payment'), total_without_discount=receipt.get('total_without_discount') ) shift.receipts.add(receipt_in_shift) # Добавляем в чек товары из чека for product in receipt.get('products_in_receipt'): product_in_catalog = ProductInCatalog.objects.get(code1c=product.get('code1c')) product_in_receipt = Product.objects.create( code1c=product.get('code1c'), discount=product.get('discount'), price=product.get('price'), quantity=product.get('quantity'), total=product.get('total'), name=product_in_catalog.name ) receipt_in_shift.products_in_receipt.add(product_in_receipt) receipt_in_shift.save() shift.save() return 0 return 'Timestamp oks file not changed' @task def fetch_leftovers(): leftovers, created = Leftovers.objects.get_or_create(pk=2) last_elapsed_seconds = leftovers.last_change_elapsed new_elapsed_seconds = leftovers.get_file_last_time_change() if last_elapsed_seconds <= new_elapsed_seconds: leftovers.last_change_elapsed = new_elapsed_seconds leftovers.save() fetching_file_result = leftovers.fetch_leftovers_file() if not fetching_file_result: return 'Error fetching oks file' catalogs, products = leftovers.parse_leftovers() # Update catalog bulk_catalogs = [] for catalog in catalogs: bulk_catalogs.append( Catalog( code1c=catalog.get('code_1c'), name=catalog.get('name'), parent=catalog.get('parent') ) ) Catalog.objects.bulk_create( bulk_catalogs, update_conflicts=True, update_fields=['name', 'parent'], unique_fields=['code1c'] ) # Update products bulk_products = [] sending_products = [] for product in products: bulk_products.append(ProductInCatalog( code1c=product.get('code1c'), name=product.get('name'), receipt_name=product.get('receipt_name'), price=product.get('price'), quantity=product.get('quantity'), parent=product.get('parent') ) ) sending_products.append( { 'code_1c': product.get('code1c'), 'name': product.get('receipt_name'), 'price': product.get('price'), 'quantity': product.get('quantity'), 'catalog': 1 } ) ProductInCatalog.objects.bulk_create( bulk_products, update_conflicts=True, update_fields=['name', 'receipt_name', 'price', 'quantity', 'parent'], unique_fields=['code1c'] ) return 'Timestamp leftovers file not changed' @task def create_yml_file(): yml_file, created = YandexFeed.objects.get_or_create(pk=1) yml_file.create_feed_file()