28
core/apps/accounts/management/commands/import_users.py
Normal file
28
core/apps/accounts/management/commands/import_users.py
Normal file
@@ -0,0 +1,28 @@
|
||||
import json
|
||||
|
||||
from django.core.management import BaseCommand
|
||||
|
||||
from core.apps.accounts.models import User
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument('file_path', type=str)
|
||||
|
||||
def handle(self, *args, **options):
|
||||
file_path = options['file_path']
|
||||
|
||||
with open(file_path, 'r') as f:
|
||||
data = json.load(f)
|
||||
|
||||
for item in data['data']['data']:
|
||||
User.objects.get_or_create(
|
||||
username=item['login'],
|
||||
defaults={
|
||||
'full_name': item['full_name'],
|
||||
'phone_number': item['phone'],
|
||||
'password': '12345678a0'
|
||||
}
|
||||
)
|
||||
|
||||
self.stdout.write("Users added")
|
||||
@@ -0,0 +1,32 @@
|
||||
import json
|
||||
from django.core.management import BaseCommand
|
||||
|
||||
from core.apps.counterparty.models import Counterparty
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument("file_path", type=str)
|
||||
|
||||
def handle(self, *args, **options):
|
||||
file_path = options['file_path']
|
||||
|
||||
with open(file_path, 'r') as f:
|
||||
data = json.load(f)
|
||||
|
||||
for item in data['data']['data']:
|
||||
Counterparty.objects.get_or_create(
|
||||
name=item['name'],
|
||||
defaults={
|
||||
'phone': item['person']['phone'],
|
||||
'inn': item['person']['tin'],
|
||||
'balance_currency': item['balances'][0]['currency']['symbol'].lower() if item['balances'] else 'uzs',
|
||||
'is_archived': item['is_archived'],
|
||||
'balance': item['total_amount'],
|
||||
'total_debit': item['debt_amount'],
|
||||
'total_kredit': item['credit_amount'],
|
||||
},
|
||||
)
|
||||
|
||||
self.stdout.write("Counterparties added")
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
import json
|
||||
from django.core.management import BaseCommand
|
||||
|
||||
from core.apps.counterparty.models import CounterpartyFolder
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument("file_path", type=str)
|
||||
|
||||
def handle(self, *args, **options):
|
||||
file_path = options['file_path']
|
||||
|
||||
with open(file_path, 'r') as f:
|
||||
data = json.load(f)
|
||||
|
||||
for item in data['data']:
|
||||
CounterpartyFolder.objects.get_or_create(
|
||||
name=item['name'],
|
||||
)
|
||||
|
||||
self.stdout.write("Counterparty Folders added")
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.2.4 on 2025-10-25 14:58
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('counterparty', '0006_rename_debit_counterparty_debit_usd_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='counterparty',
|
||||
name='balance',
|
||||
field=models.BigIntegerField(blank=True, null=True),
|
||||
),
|
||||
]
|
||||
@@ -41,7 +41,7 @@ class Counterparty(BaseModel):
|
||||
district = models.ForeignKey(
|
||||
District, on_delete=models.SET_NULL, null=True, blank=True, related_name='counterparties'
|
||||
)
|
||||
balance = models.PositiveBigIntegerField(null=True, blank=True)
|
||||
balance = models.BigIntegerField(null=True, blank=True)
|
||||
balance_currency = models.CharField(
|
||||
max_length=3, choices=[('usd', 'usd'), ('uzs', 'uzs')], null=True, blank=True
|
||||
)
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
import json
|
||||
from django.core.management import BaseCommand
|
||||
|
||||
from core.apps.finance.models import CashTransaction
|
||||
from core.apps.accounts.models import User
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument('file_path', type=str)
|
||||
|
||||
def handle(self, *args, **options):
|
||||
file_path = options['file_path']
|
||||
|
||||
with open(file_path, 'r') as f:
|
||||
data = json.load(f)
|
||||
|
||||
for item in data['data']['cashs']:
|
||||
users_data = item['users']
|
||||
users_full_name = []
|
||||
for user_data in users_data:
|
||||
users_full_name.append(user_data['full_name'])
|
||||
users = User.objects.filter(full_name__in=users_full_name)
|
||||
cash_tx, created = CashTransaction.objects.get_or_create(
|
||||
name=item['name']
|
||||
)
|
||||
|
||||
cash_tx.employees.set(users)
|
||||
cash_tx.save()
|
||||
|
||||
self.stdout.write("Cash Transactions added")
|
||||
58
core/apps/orders/management/commands/import_orders.py
Normal file
58
core/apps/orders/management/commands/import_orders.py
Normal file
@@ -0,0 +1,58 @@
|
||||
import json
|
||||
from datetime import datetime
|
||||
from django.core.management.base import BaseCommand
|
||||
|
||||
from core.apps.orders.models import Order
|
||||
from core.apps.products.models import Unity, Product
|
||||
from core.apps.projects.models import ProjectFolder
|
||||
from core.apps.wherehouse.models import WhereHouse
|
||||
from core.apps.accounts.models import User
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = "Import orders from JSON file"
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument("file_path", type=str, help="Path to JSON file")
|
||||
|
||||
def handle(self, *args, **options):
|
||||
file_path = options['file_path']
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
for item in data['data']['data']:
|
||||
product_name = item['product']['name']['uz']
|
||||
unit_name = item['unit']['name']['uz']
|
||||
warehouse_name = item['warehouse']['name']
|
||||
project_name = item.get('project').get('name') if item.get('project') else None
|
||||
creator_name = item['creator']['full_name']
|
||||
product = Product.objects.filter(name=product_name).first()
|
||||
unity = Unity.objects.filter(value=unit_name).first()
|
||||
wherehouse = WhereHouse.objects.filter(name=warehouse_name).first()
|
||||
project_folder = ProjectFolder.objects.filter(name=project_name).first()
|
||||
user = User.objects.filter(full_name=creator_name).first()
|
||||
|
||||
delivery_date = datetime.strptime(item['delivery_date'], "%d.%m.%Y").date()
|
||||
created_at = datetime.strptime(item['created_at'], "%d.%m.%Y %H:%M")
|
||||
if not product:
|
||||
product = Product.objects.create(
|
||||
name=product_name,
|
||||
product_code=item['product']['code'],
|
||||
type=item['product']['resource']['type'].upper(),
|
||||
unity=unity
|
||||
)
|
||||
Order.objects.update_or_create(
|
||||
status=item['status'].upper(),
|
||||
product=product,
|
||||
unity=unity,
|
||||
wherehouse=wherehouse,
|
||||
project_folder=project_folder,
|
||||
employee=user,
|
||||
quantity=item['quantity'],
|
||||
currency=item['currency']['symbol'].lower(),
|
||||
created_at=created_at,
|
||||
date=delivery_date
|
||||
)
|
||||
break
|
||||
|
||||
self.stdout.write(self.style.SUCCESS("Orders imported successfully ✅"))
|
||||
95
core/apps/orders/management/commands/import_party.py
Normal file
95
core/apps/orders/management/commands/import_party.py
Normal file
@@ -0,0 +1,95 @@
|
||||
import json, requests
|
||||
|
||||
from django.core.management import BaseCommand
|
||||
|
||||
from core.apps.orders.models import Order, Party, PartyAmount
|
||||
from core.apps.accounts.models import User
|
||||
from core.apps.products.models import Product, Unity
|
||||
from core.apps.counterparty.models import Counterparty
|
||||
from core.apps.wherehouse.models import WhereHouse
|
||||
from core.apps.projects.models import Project, ProjectFolder
|
||||
from core.apps.orders.utils.parse_date import parse_date
|
||||
|
||||
|
||||
token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2JhY2tlbmQuYXBwLnV5cXVyLnV6L21haW4vYXV0aC9sb2dpbiIsImlhdCI6MTc2MTI4NjcwMywiZXhwIjoxNzYxNjQ2NzAzLCJuYmYiOjE3NjEyODY3MDMsImp0aSI6IjRBNkh4aHI5WkRqOGxVMzUiLCJzdWIiOiIxMDQiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.O4NGZL_a3WIrjko5W2sEOBAbM5lv0miVgVa9tfYuyhM'
|
||||
|
||||
class Command(BaseCommand):
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument('file_path', type=str)
|
||||
|
||||
def handle(self, *args, **options):
|
||||
file_path = options['file_path']
|
||||
headers = {
|
||||
"Authorization": f"Bearer {token}"
|
||||
}
|
||||
|
||||
with open(file_path, 'r') as f:
|
||||
data = json.load(f)
|
||||
|
||||
for item in data['data']['data']:
|
||||
url = f'https://backend.app.uyqur.uz/main/supply/order-view?id={item['id']}'
|
||||
res = requests.get(url, headers=headers)
|
||||
data = res.json()['data']
|
||||
user = None
|
||||
if data.get('agent'):
|
||||
user = User.objects.filter(full_name=data['agent']['full_name']).first()
|
||||
if not user:
|
||||
continue
|
||||
party, created = Party.objects.get_or_create(
|
||||
number=data['id'],
|
||||
defaults={
|
||||
'mediator': user,
|
||||
'delivery_date': parse_date(data['delivery_date']),
|
||||
'closed_date': parse_date(data['recieved_date']),
|
||||
'order_date': parse_date(data['ordered_date']),
|
||||
'payment_date': parse_date(data['payment_date']) if parse_date(data['payment_date']) else parse_date(data['ordered_date']),
|
||||
'status': data['status'].upper(),
|
||||
'payment_percentage': data['payment_percent'],
|
||||
'process': data['percent'],
|
||||
}
|
||||
)
|
||||
orders = []
|
||||
total_price = 0
|
||||
paid_amount = 0
|
||||
calculated_amount = 0
|
||||
must_pay_amount = 0
|
||||
for i in data['warehouse_products']:
|
||||
product = Product.objects.filter(name__icontains=i['product']['name']['uz']).first()
|
||||
if not product:
|
||||
continue
|
||||
unit = Unity.objects.filter(value=i['unit']['name']['uz']).first()
|
||||
counterparty = Counterparty.objects.filter(name=i['company_person']['name']).first()
|
||||
wherehouse = None
|
||||
if i.get('warehouse'):
|
||||
wherehouse = WhereHouse.objects.filter(name=i.get('warehouse').get('name')).first()
|
||||
project_folder = None
|
||||
if i.get('project'):
|
||||
project_folder = ProjectFolder.objects.filter(name=i['project']['name']).first()
|
||||
|
||||
order, created = Order.objects.get_or_create(
|
||||
product=product,
|
||||
unity=unit,
|
||||
counterparty=counterparty,
|
||||
currency=i['currency']['symbol'].lower(),
|
||||
wherehouse=wherehouse,
|
||||
project_folder=project_folder,
|
||||
amount=i['amount'],
|
||||
total_price=i['total_amount'],
|
||||
quantity=i['quantity'],
|
||||
)
|
||||
total_price += i['total_amount']
|
||||
paid_amount += i['paid_amount']
|
||||
calculated_amount += i['calculated_amount']
|
||||
must_pay_amount += i['must_pay_amount']
|
||||
orders.append(order)
|
||||
party.orders.set(orders)
|
||||
PartyAmount.objects.get_or_create(
|
||||
party=party,
|
||||
defaults={
|
||||
"total_price": total_price,
|
||||
"calculated_amount": calculated_amount,
|
||||
"paid_amount": paid_amount,
|
||||
"payment_amount": must_pay_amount,
|
||||
}
|
||||
)
|
||||
self.stdout.write("Parties added")
|
||||
18
core/apps/orders/migrations/0029_alter_order_status.py
Normal file
18
core/apps/orders/migrations/0029_alter_order_status.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.2.4 on 2025-10-24 12:08
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('orders', '0028_alter_order_quantity'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='order',
|
||||
name='status',
|
||||
field=models.CharField(choices=[('NEW', 'yangi'), ('OPEN', 'ochiq'), ('CANCELLED', 'bekor qilindi'), ('ACCEPTED', 'qabul qilindi')], default='NEW', max_length=20),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,25 @@
|
||||
# Generated by Django 5.2.4 on 2025-10-25 16:24
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('orders', '0029_alter_order_status'),
|
||||
('wherehouse', '0017_wherehouse_users'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='order',
|
||||
name='wherehouse',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='orders', to='wherehouse.wherehouse'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='party',
|
||||
name='status',
|
||||
field=models.CharField(choices=[('NEW', 'yangi'), ('PARTY_IS_MADE', 'partiya qilingan'), ('EXPECTED', 'kutilmoqda'), ('DRAFT', 'qoralama'), ('CANCELLED', 'bekor qilingan'), ('PURCHASED', 'sotib olinmoqda'), ('PROCESS', 'jarayonda'), ('RECIEVED', 'qabul qilingan')], default='NEW', max_length=20),
|
||||
),
|
||||
]
|
||||
@@ -12,6 +12,7 @@ from core.apps.counterparty.models import Counterparty
|
||||
class Order(BaseModel):
|
||||
STATUS = (
|
||||
('NEW', 'yangi'),
|
||||
("OPEN", 'ochiq'),
|
||||
('CANCELLED', "bekor qilindi"),
|
||||
('ACCEPTED', 'qabul qilindi'),
|
||||
)
|
||||
@@ -29,7 +30,7 @@ class Order(BaseModel):
|
||||
Project, on_delete=models.SET_NULL, related_name='orders', null=True, blank=True
|
||||
)
|
||||
wherehouse = models.ForeignKey(
|
||||
WhereHouse, on_delete=models.CASCADE, related_name='orders'
|
||||
WhereHouse, on_delete=models.CASCADE, related_name='orders', null=True, blank=True
|
||||
)
|
||||
employee = models.ForeignKey(User, on_delete=models.CASCADE, related_name='orders', null=True)
|
||||
counterparty = models.ForeignKey(
|
||||
|
||||
@@ -14,6 +14,7 @@ class Party(BaseModel):
|
||||
('CANCELLED', 'bekor qilingan'),
|
||||
('PURCHASED', 'sotib olinmoqda'),
|
||||
('PROCESS', 'jarayonda'),
|
||||
("RECIEVED", 'qabul qilingan'),
|
||||
]
|
||||
PAYMENT_STATUS = (
|
||||
('PAID', "to'langan"),
|
||||
|
||||
@@ -6,7 +6,7 @@ from core.apps.orders.models import Party
|
||||
|
||||
@receiver(post_save, sender=Party)
|
||||
def set_party_number(sender, instance, created, **kwargs):
|
||||
if created:
|
||||
if created and not instance.number:
|
||||
last_party = Party.objects.order_by('number').last()
|
||||
instance.number = (last_party.number + 1) if last_party else 1
|
||||
instance.save(update_fields=["number"])
|
||||
12
core/apps/orders/utils/parse_date.py
Normal file
12
core/apps/orders/utils/parse_date.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from datetime import datetime
|
||||
|
||||
def parse_date(date_str):
|
||||
if not date_str:
|
||||
return None
|
||||
try:
|
||||
return datetime.strptime(date_str, '%d.%m.%Y').date()
|
||||
except ValueError:
|
||||
try:
|
||||
return datetime.strptime(date_str, '%Y-%m-%d').date()
|
||||
except ValueError:
|
||||
return None
|
||||
23
core/apps/products/management/commands/import_folder.py
Normal file
23
core/apps/products/management/commands/import_folder.py
Normal file
@@ -0,0 +1,23 @@
|
||||
import json
|
||||
|
||||
from django.core.management import BaseCommand
|
||||
|
||||
from core.apps.products.models import Folder
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument("file_path", type=str, help="Path to JSON file")
|
||||
|
||||
def handle(self, *args, **options):
|
||||
file_path = options['file_path']
|
||||
|
||||
with open(file_path, 'r') as f:
|
||||
data = json.load(f)
|
||||
|
||||
for item in data['data']:
|
||||
Folder.objects.get_or_create(
|
||||
name=item['name']['uz']
|
||||
)
|
||||
|
||||
self.stdout.write("Folderlar qoshildi")
|
||||
37
core/apps/products/management/commands/import_products.py
Normal file
37
core/apps/products/management/commands/import_products.py
Normal file
@@ -0,0 +1,37 @@
|
||||
import json
|
||||
from datetime import datetime
|
||||
|
||||
from django.core.management import BaseCommand
|
||||
|
||||
from core.apps.products.models import Product, Unity
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = "Import products from JSON file"
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument("file_path", type=str, help='Path to JSON file')
|
||||
|
||||
def handle(self, *args, **options):
|
||||
file_path = options['file_path']
|
||||
|
||||
with open(file_path, 'r') as f:
|
||||
data = json.load(f)
|
||||
|
||||
for item in data['data']['data']:
|
||||
name = item['name']['uz']
|
||||
code = item['code']
|
||||
type = str(item['resource']['type']).upper()
|
||||
unit_name = item['unit']['name']['uz']
|
||||
unit = Unity.objects.filter(value=unit_name).first()
|
||||
|
||||
Product.objects.get_or_create(
|
||||
name=name,
|
||||
defaults={
|
||||
"product_code": code,
|
||||
"type": type,
|
||||
"unity": unit
|
||||
}
|
||||
)
|
||||
|
||||
self.stdout.write("Products added")
|
||||
22
core/apps/products/management/commands/import_units.py
Normal file
22
core/apps/products/management/commands/import_units.py
Normal file
@@ -0,0 +1,22 @@
|
||||
import json
|
||||
|
||||
from django.core.management import BaseCommand
|
||||
|
||||
from core.apps.products.models import Unity
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument("file_path", type=str, help='Path to JSON file')
|
||||
|
||||
def handle(self, *args, **options):
|
||||
file_path = options['file_path']
|
||||
with open(file_path, 'r') as f:
|
||||
data = json.load(f)
|
||||
|
||||
for item in data['data']:
|
||||
Unity.objects.get_or_create(
|
||||
value=item['name']['uz']
|
||||
)
|
||||
|
||||
self.stdout.write("Units added")
|
||||
@@ -24,4 +24,3 @@ class SubFolder(BaseModel):
|
||||
class Meta:
|
||||
verbose_name = 'Sub Papka'
|
||||
verbose_name_plural = 'Sub Papkalar'
|
||||
|
||||
|
||||
@@ -1,22 +1,33 @@
|
||||
from django.db.models import Q
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
from rest_framework import generics, views
|
||||
from rest_framework.response import Response
|
||||
|
||||
from core.apps.accounts.permissions.permissions import HasRolePermission
|
||||
from core.apps.products.models import Product
|
||||
from core.apps.products.serializers import product as serializers
|
||||
from core.apps.accounts.permissions.permissions import HasRolePermission
|
||||
from core.apps.shared.paginations.custom import CustomPageNumberPagination
|
||||
|
||||
|
||||
class ProductListApiView(generics.ListAPIView):
|
||||
serializer_class = serializers.ProductListSerializer
|
||||
queryset = Product.objects.select_related('unity').only(
|
||||
'id', 'name', 'type', 'unity'
|
||||
queryset = Product.objects.select_related("unity").only(
|
||||
"id", "name", "type", "unity"
|
||||
)
|
||||
permission_classes = [HasRolePermission]
|
||||
pagination_class = CustomPageNumberPagination
|
||||
|
||||
def get(self, request):
|
||||
search = request.query_params.get("search")
|
||||
if search:
|
||||
self.queryset = self.queryset.filter(
|
||||
Q(name__istartswith=search) | Q(unity__value__istartswith=search)
|
||||
)
|
||||
page = self.paginate_queryset(self.queryset)
|
||||
if page is not None:
|
||||
serializer = self.serializer_class(page, many=True)
|
||||
return self.get_paginated_response(serializer.data)
|
||||
|
||||
|
||||
class ProductCreateApiView(generics.GenericAPIView):
|
||||
serializer_class = serializers.ProductSerializer
|
||||
@@ -29,19 +40,19 @@ class ProductCreateApiView(generics.GenericAPIView):
|
||||
data = serializer.save()
|
||||
return Response(
|
||||
{
|
||||
'success': True,
|
||||
'message': "product successfully created!",
|
||||
'product': serializers.ProductListSerializer(data).data
|
||||
"success": True,
|
||||
"message": "product successfully created!",
|
||||
"product": serializers.ProductListSerializer(data).data,
|
||||
},
|
||||
status=201
|
||||
status=201,
|
||||
)
|
||||
return Response(
|
||||
{
|
||||
"success": False,
|
||||
"message": "an error occurred while adding th product.",
|
||||
"error": serializer.errors
|
||||
"error": serializer.errors,
|
||||
},
|
||||
status=400
|
||||
status=400,
|
||||
)
|
||||
|
||||
|
||||
@@ -56,34 +67,36 @@ class ProductUpdateApiView(generics.GenericAPIView):
|
||||
if serializer.is_valid(raise_exception=True):
|
||||
serializer.save()
|
||||
return Response(
|
||||
{'success': True, 'message': 'product successfully updated!'},
|
||||
status=200
|
||||
{"success": True, "message": "product successfully updated!"},
|
||||
status=200,
|
||||
)
|
||||
return Response(
|
||||
{
|
||||
'success': False,
|
||||
'message': "an error occurred while updating the product.",
|
||||
"success": False,
|
||||
"message": "an error occurred while updating the product.",
|
||||
"error": serializer.errors,
|
||||
},
|
||||
status=400
|
||||
status=400,
|
||||
)
|
||||
|
||||
def patch(self, request, product_id):
|
||||
product = get_object_or_404(Product, id=product_id)
|
||||
serializer = self.serializer_class(data=request.data, instance=product, partial=True)
|
||||
serializer = self.serializer_class(
|
||||
data=request.data, instance=product, partial=True
|
||||
)
|
||||
if serializer.is_valid(raise_exception=True):
|
||||
serializer.save()
|
||||
return Response(
|
||||
{'success': True, "message": "product successfully updated!"},
|
||||
status=200
|
||||
{"success": True, "message": "product successfully updated!"},
|
||||
status=200,
|
||||
)
|
||||
return Response(
|
||||
{
|
||||
"successs": False,
|
||||
"message": "an error accurred while updating the product.",
|
||||
"error": serializer.errors
|
||||
"error": serializer.errors,
|
||||
},
|
||||
status=400
|
||||
status=400,
|
||||
)
|
||||
|
||||
|
||||
@@ -94,6 +107,5 @@ class ProductDeleteApiView(views.APIView):
|
||||
product = get_object_or_404(Product, id=product_id)
|
||||
product.delete()
|
||||
return Response(
|
||||
{'success': True, 'message': 'product successfully deleted!'},
|
||||
status=204
|
||||
{"success": True, "message": "product successfully deleted!"}, status=204
|
||||
)
|
||||
22
core/apps/wherehouse/management/commands/import_warehouse.py
Normal file
22
core/apps/wherehouse/management/commands/import_warehouse.py
Normal file
@@ -0,0 +1,22 @@
|
||||
import json
|
||||
from django.core.management import BaseCommand
|
||||
|
||||
from core.apps.wherehouse.models import WhereHouse
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument('file_path', type=str, help='Path to JSON file')
|
||||
|
||||
def handle(self, *args, **options):
|
||||
file_path = options['file_path']
|
||||
|
||||
with open(file_path, 'r') as f:
|
||||
data = json.load(f)
|
||||
|
||||
for item in data['data']['warehouses']:
|
||||
WhereHouse.objects.get_or_create(
|
||||
name=item['name']
|
||||
)
|
||||
|
||||
self.stdout.write("Warehouses added")
|
||||
128
data/cash_transaction.json
Normal file
128
data/cash_transaction.json
Normal file
@@ -0,0 +1,128 @@
|
||||
{
|
||||
"data": {
|
||||
"cashs": [
|
||||
{
|
||||
"id": 24,
|
||||
"name": "FARM NAQT",
|
||||
"status": "open",
|
||||
"users": [
|
||||
{
|
||||
"id": 109,
|
||||
"full_name": "Mirjonov Meronshox",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 25,
|
||||
"name": "FARM BUGHALTERIYA",
|
||||
"status": "open",
|
||||
"users": [
|
||||
{
|
||||
"id": 111,
|
||||
"full_name": "MARDONOVA DILAFRUZ",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 82,
|
||||
"name": "Yunusobod BUHGALTERIYA",
|
||||
"status": "open",
|
||||
"users": [
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 111,
|
||||
"full_name": "MARDONOVA DILAFRUZ",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 83,
|
||||
"name": "Yunusobod NAQT",
|
||||
"status": "open",
|
||||
"users": [
|
||||
{
|
||||
"id": 109,
|
||||
"full_name": "Mirjonov Meronshox",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"cash_folders": [
|
||||
{
|
||||
"id": 3,
|
||||
"name": "MARKETING",
|
||||
"color": null,
|
||||
"cashs_count": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"message": {
|
||||
"uz": "Muvaffaqiyatli!",
|
||||
"ru": "Успешно!",
|
||||
"en": "Success!",
|
||||
"tr": "Başarılı!"
|
||||
}
|
||||
}
|
||||
12209
data/counterparty.json
Normal file
12209
data/counterparty.json
Normal file
File diff suppressed because it is too large
Load Diff
52
data/counterparty_folder.json
Normal file
52
data/counterparty_folder.json
Normal file
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"id": 15,
|
||||
"name": "marketing",
|
||||
"color": null,
|
||||
"company_persons_count": 103
|
||||
},
|
||||
{
|
||||
"id": 16,
|
||||
"name": "Qurilish bozorlik",
|
||||
"color": null,
|
||||
"company_persons_count": 0
|
||||
},
|
||||
{
|
||||
"id": 23,
|
||||
"name": "Административные расходы",
|
||||
"color": null,
|
||||
"company_persons_count": 15
|
||||
},
|
||||
{
|
||||
"id": 32,
|
||||
"name": "Mavrid административные расходы",
|
||||
"color": null,
|
||||
"company_persons_count": 1
|
||||
},
|
||||
{
|
||||
"id": 34,
|
||||
"name": "Buxgalter",
|
||||
"color": null,
|
||||
"company_persons_count": 1
|
||||
},
|
||||
{
|
||||
"id": 36,
|
||||
"name": "dur",
|
||||
"color": null,
|
||||
"company_persons_count": 0
|
||||
},
|
||||
{
|
||||
"id": 44,
|
||||
"name": "A",
|
||||
"color": null,
|
||||
"company_persons_count": 0
|
||||
}
|
||||
],
|
||||
"message": {
|
||||
"uz": "Muvaffaqiyatli!",
|
||||
"ru": "Успешно!",
|
||||
"en": "Success!",
|
||||
"tr": "Başarılı!"
|
||||
}
|
||||
}
|
||||
45372
data/party/party.json
Normal file
45372
data/party/party.json
Normal file
File diff suppressed because it is too large
Load Diff
46434
data/party/party2.json
Normal file
46434
data/party/party2.json
Normal file
File diff suppressed because it is too large
Load Diff
44649
data/party/party3.json
Normal file
44649
data/party/party3.json
Normal file
File diff suppressed because it is too large
Load Diff
43171
data/party/party4.json
Normal file
43171
data/party/party4.json
Normal file
File diff suppressed because it is too large
Load Diff
38874
data/party/party5.json
Normal file
38874
data/party/party5.json
Normal file
File diff suppressed because it is too large
Load Diff
35056
data/party/party6.json
Normal file
35056
data/party/party6.json
Normal file
File diff suppressed because it is too large
Load Diff
35068
data/party/party7.json
Normal file
35068
data/party/party7.json
Normal file
File diff suppressed because it is too large
Load Diff
35102
data/party/party8.json
Normal file
35102
data/party/party8.json
Normal file
File diff suppressed because it is too large
Load Diff
15125
data/party/party9.json
Normal file
15125
data/party/party9.json
Normal file
File diff suppressed because it is too large
Load Diff
32042
data/product.json
Normal file
32042
data/product.json
Normal file
File diff suppressed because it is too large
Load Diff
107
data/product_folder.json
Normal file
107
data/product_folder.json
Normal file
@@ -0,0 +1,107 @@
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"id": 43,
|
||||
"name": {
|
||||
"ru": "Товарная база Узбекистана",
|
||||
"uz": "O'zbekiston mahsulotlar bazasi"
|
||||
},
|
||||
"color": null,
|
||||
"status": "active",
|
||||
"products_count": 2000
|
||||
},
|
||||
{
|
||||
"id": 44,
|
||||
"name": {
|
||||
"uz": "Marketing",
|
||||
"ru": "Marketing"
|
||||
},
|
||||
"color": null,
|
||||
"status": "active",
|
||||
"products_count": 208
|
||||
},
|
||||
{
|
||||
"id": 49,
|
||||
"name": {
|
||||
"uz": "Inventar",
|
||||
"en": "Inventar",
|
||||
"ru": "Inventar"
|
||||
},
|
||||
"color": null,
|
||||
"status": "active",
|
||||
"products_count": 82
|
||||
},
|
||||
{
|
||||
"id": 51,
|
||||
"name": {
|
||||
"ru": "административный расходы",
|
||||
"en": "административный расходы",
|
||||
"uz": "административный расходы"
|
||||
},
|
||||
"color": null,
|
||||
"status": "active",
|
||||
"products_count": 81
|
||||
},
|
||||
{
|
||||
"id": 55,
|
||||
"name": {
|
||||
"ru": "Qurilish montaj ishlari",
|
||||
"en": "Qurilish montaj ishlari",
|
||||
"uz": "Qurilish montaj ishlari"
|
||||
},
|
||||
"color": null,
|
||||
"status": "active",
|
||||
"products_count": 32
|
||||
},
|
||||
{
|
||||
"id": 78,
|
||||
"name": {
|
||||
"uz": "NARYAD",
|
||||
"en": "NARYAD",
|
||||
"ru": "NARYAD"
|
||||
},
|
||||
"color": null,
|
||||
"status": "active",
|
||||
"products_count": 7
|
||||
},
|
||||
{
|
||||
"id": 83,
|
||||
"name": {
|
||||
"uz": "OFIS INVENTARLARI",
|
||||
"en": "OFIS INVENTARLARI",
|
||||
"ru": "OFIS INVENTARLARI"
|
||||
},
|
||||
"color": null,
|
||||
"status": "active",
|
||||
"products_count": 105
|
||||
},
|
||||
{
|
||||
"id": 148,
|
||||
"name": {
|
||||
"uz": "Texnika xizmati",
|
||||
"en": "Texnika xizmati",
|
||||
"ru": "Texnika xizmati"
|
||||
},
|
||||
"color": "#1E90FF",
|
||||
"status": "active",
|
||||
"products_count": 7
|
||||
},
|
||||
{
|
||||
"id": 149,
|
||||
"name": {
|
||||
"uz": "Marketing xizmati",
|
||||
"en": "Marketing xizmati",
|
||||
"ru": "Marketing xizmati"
|
||||
},
|
||||
"color": "#1E90FF",
|
||||
"status": "active",
|
||||
"products_count": 5
|
||||
}
|
||||
],
|
||||
"message": {
|
||||
"uz": "Muvaffaqiyatli!",
|
||||
"ru": "Успешно!",
|
||||
"en": "Success!",
|
||||
"tr": "Başarılı!"
|
||||
}
|
||||
}
|
||||
1634
data/unit.json
Normal file
1634
data/unit.json
Normal file
File diff suppressed because it is too large
Load Diff
224
data/user.json
Normal file
224
data/user.json
Normal file
@@ -0,0 +1,224 @@
|
||||
{
|
||||
"data": {
|
||||
"current_page": 1,
|
||||
"total": 15,
|
||||
"data": [
|
||||
{
|
||||
"id": 104,
|
||||
"login": "SuperAdminIskander",
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp",
|
||||
"phone": "333333333",
|
||||
"status": "active",
|
||||
"role": {
|
||||
"id": 79,
|
||||
"name": "UYQUR_COMPANY_SUPER_ADMIN",
|
||||
"description": "Kompaniya uchun ruxsatlar to'plami",
|
||||
"status": "active"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 107,
|
||||
"login": "petka8000",
|
||||
"full_name": "Iskandarov Farrux",
|
||||
"image": null,
|
||||
"phone": "+998900858000",
|
||||
"status": "active",
|
||||
"role": {
|
||||
"id": 82,
|
||||
"name": "TA'MINOTCHI",
|
||||
"description": null,
|
||||
"status": "active"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 108,
|
||||
"login": "abu4440",
|
||||
"full_name": "Xudjaqulov Abbos",
|
||||
"image": null,
|
||||
"phone": "+998934344440",
|
||||
"status": "active",
|
||||
"role": {
|
||||
"id": 83,
|
||||
"name": "NACH UCHASTKA",
|
||||
"description": null,
|
||||
"status": "active"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 109,
|
||||
"login": "meron7037",
|
||||
"full_name": "Mirjonov Meronshox",
|
||||
"image": null,
|
||||
"phone": "+998991367037",
|
||||
"status": "active",
|
||||
"role": {
|
||||
"id": 84,
|
||||
"name": "KASSIR",
|
||||
"description": null,
|
||||
"status": "active"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 110,
|
||||
"login": "SHOX4004",
|
||||
"full_name": "Imomov Jasurbek",
|
||||
"image": null,
|
||||
"phone": "+998937148998",
|
||||
"status": "active",
|
||||
"role": {
|
||||
"id": 81,
|
||||
"name": "OMBOR MUDIRI",
|
||||
"description": null,
|
||||
"status": "active"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 111,
|
||||
"login": "DILYA2500",
|
||||
"full_name": "MARDONOVA DILAFRUZ",
|
||||
"image": null,
|
||||
"phone": "+998913352500",
|
||||
"status": "active",
|
||||
"role": {
|
||||
"id": 85,
|
||||
"name": "BUGHALTERIYA",
|
||||
"description": null,
|
||||
"status": "active"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 112,
|
||||
"login": "TEMUR1100",
|
||||
"full_name": "QIYOMOV TEMURBEK",
|
||||
"image": null,
|
||||
"phone": "+998947101100",
|
||||
"status": "active",
|
||||
"role": {
|
||||
"id": 85,
|
||||
"name": "BUGHALTERIYA",
|
||||
"description": null,
|
||||
"status": "active"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 113,
|
||||
"login": "Durdona0007",
|
||||
"full_name": "Durdona",
|
||||
"image": null,
|
||||
"phone": "+998909919639",
|
||||
"status": "active",
|
||||
"role": {
|
||||
"id": 86,
|
||||
"name": "Marketolog",
|
||||
"description": null,
|
||||
"status": "active"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"login": "БАРОТОВА",
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null,
|
||||
"phone": "+998936121821",
|
||||
"status": "active",
|
||||
"role": {
|
||||
"id": 104,
|
||||
"name": "MATERIALNIY BUHGALTER",
|
||||
"description": null,
|
||||
"status": "active"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 147,
|
||||
"login": "Shohruh4004",
|
||||
"full_name": "Rajabov Shohruh",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/W2XUDsHUUnr4E3mjfJIx.webp",
|
||||
"phone": "+998913304004",
|
||||
"status": "active",
|
||||
"role": {
|
||||
"id": 112,
|
||||
"name": "Shohruh",
|
||||
"description": null,
|
||||
"status": "active"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 202,
|
||||
"login": "s.mehriddin",
|
||||
"full_name": "Самадов Мехриддин",
|
||||
"image": null,
|
||||
"phone": "+998943739033",
|
||||
"status": "active",
|
||||
"role": {
|
||||
"id": 81,
|
||||
"name": "OMBOR MUDIRI",
|
||||
"description": null,
|
||||
"status": "active"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 211,
|
||||
"login": "r.sherzod37",
|
||||
"full_name": "Рустамов Шерзод",
|
||||
"image": null,
|
||||
"phone": "+998998803769",
|
||||
"status": "active",
|
||||
"role": {
|
||||
"id": 162,
|
||||
"name": "Prorab",
|
||||
"description": "Loyihalar bilan ishlash",
|
||||
"status": "active"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 219,
|
||||
"login": "Shahzoda2719",
|
||||
"full_name": "Тухтаева Шахзода",
|
||||
"image": null,
|
||||
"phone": "+998997542719",
|
||||
"status": "active",
|
||||
"role": {
|
||||
"id": 81,
|
||||
"name": "OMBOR MUDIRI",
|
||||
"description": null,
|
||||
"status": "active"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 221,
|
||||
"login": "Utkir1161",
|
||||
"full_name": "Жумаев Уткир",
|
||||
"image": null,
|
||||
"phone": "+998991561161",
|
||||
"status": "active",
|
||||
"role": {
|
||||
"id": 83,
|
||||
"name": "NACH UCHASTKA",
|
||||
"description": null,
|
||||
"status": "active"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"login": "iskander_visitor",
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null,
|
||||
"phone": "+998939897101",
|
||||
"status": "active",
|
||||
"role": {
|
||||
"id": 233,
|
||||
"name": "visitor",
|
||||
"description": "uyqur support admin",
|
||||
"status": "active"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"message": {
|
||||
"uz": "Muvaffaqiyatli!",
|
||||
"ru": "Успешно!",
|
||||
"en": "Success!",
|
||||
"tr": "Başarılı!"
|
||||
}
|
||||
}
|
||||
667
data/warehouse.json
Normal file
667
data/warehouse.json
Normal file
@@ -0,0 +1,667 @@
|
||||
{
|
||||
"data": {
|
||||
"warehouses": [
|
||||
{
|
||||
"id": 22,
|
||||
"name": "MAVRID (ФАРМ)",
|
||||
"users": [
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 110,
|
||||
"full_name": "Imomov Jasurbek",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 112,
|
||||
"full_name": "QIYOMOV TEMURBEK",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 111,
|
||||
"full_name": "MARDONOVA DILAFRUZ",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 113,
|
||||
"full_name": "Durdona",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 107,
|
||||
"full_name": "Iskandarov Farrux",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 108,
|
||||
"full_name": "Xudjaqulov Abbos",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 109,
|
||||
"full_name": "Mirjonov Meronshox",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 23,
|
||||
"name": "marketing",
|
||||
"users": [
|
||||
{
|
||||
"id": 113,
|
||||
"full_name": "Durdona",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 109,
|
||||
"full_name": "Mirjonov Meronshox",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 111,
|
||||
"full_name": "MARDONOVA DILAFRUZ",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 108,
|
||||
"full_name": "Xudjaqulov Abbos",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 49,
|
||||
"name": "Prorab qurilish MAVRID",
|
||||
"users": [
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 108,
|
||||
"full_name": "Xudjaqulov Abbos",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 211,
|
||||
"full_name": "Рустамов Шерзод",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 50,
|
||||
"name": "Yunusobod ombor",
|
||||
"users": [
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 202,
|
||||
"full_name": "Самадов Мехриддин",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 219,
|
||||
"full_name": "Тухтаева Шахзода",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 107,
|
||||
"full_name": "Iskandarov Farrux",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 51,
|
||||
"name": "Yunusobod marketing",
|
||||
"users": [
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 113,
|
||||
"full_name": "Durdona",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 62,
|
||||
"name": "Yunusobod sklad instrument",
|
||||
"users": [
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 219,
|
||||
"full_name": "Тухтаева Шахзода",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 63,
|
||||
"name": "Yunusobod adminstrativniy xarajatlar",
|
||||
"users": [
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 147,
|
||||
"full_name": "Rajabov Shohruh",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/W2XUDsHUUnr4E3mjfJIx.webp"
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 101,
|
||||
"name": "Офис",
|
||||
"users": [
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 109,
|
||||
"full_name": "Mirjonov Meronshox",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 108,
|
||||
"name": "Mavrid sklad instrument",
|
||||
"users": [
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 110,
|
||||
"full_name": "Imomov Jasurbek",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 109,
|
||||
"name": "Yunusobod sklad inventar",
|
||||
"users": [
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 219,
|
||||
"full_name": "Тухтаева Шахзода",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 110,
|
||||
"name": "Mavrid sklad inventar",
|
||||
"users": [
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 110,
|
||||
"full_name": "Imomov Jasurbek",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 111,
|
||||
"name": "Yunusobod Ofis",
|
||||
"users": [
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 109,
|
||||
"full_name": "Mirjonov Meronshox",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 107,
|
||||
"full_name": "Iskandarov Farrux",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 112,
|
||||
"name": "Mavrid Ofis",
|
||||
"users": [
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 109,
|
||||
"full_name": "Mirjonov Meronshox",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 114,
|
||||
"name": "Prorab Qurilish Yunusobod",
|
||||
"users": [
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 211,
|
||||
"full_name": "Рустамов Шерзод",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 120,
|
||||
"name": "МАВРИД АДМИНИСТРАТИВНЫЙ РАСХОД",
|
||||
"users": [
|
||||
{
|
||||
"id": 147,
|
||||
"full_name": "Rajabov Shohruh",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/W2XUDsHUUnr4E3mjfJIx.webp"
|
||||
},
|
||||
{
|
||||
"id": 104,
|
||||
"full_name": "SuperAdminIskander",
|
||||
"image": "https://backend.app.uyqur.uz/public/upload/image/neDbGZivNlWAz5nHopbl.webp"
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 121,
|
||||
"name": "МАВРИД КУХНЯ",
|
||||
"users": [
|
||||
{
|
||||
"id": 107,
|
||||
"full_name": "Iskandarov Farrux",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 110,
|
||||
"full_name": "Imomov Jasurbek",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 122,
|
||||
"name": "МАВРИД АПТЕКА",
|
||||
"users": [
|
||||
{
|
||||
"id": 107,
|
||||
"full_name": "Iskandarov Farrux",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 109,
|
||||
"full_name": "Mirjonov Meronshox",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 110,
|
||||
"full_name": "Imomov Jasurbek",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 123,
|
||||
"name": "МАВРИД КОНС ТОВАР",
|
||||
"users": [
|
||||
{
|
||||
"id": 107,
|
||||
"full_name": "Iskandarov Farrux",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 110,
|
||||
"full_name": "Imomov Jasurbek",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 124,
|
||||
"name": "ЮНУСОБОД КУХНЯ",
|
||||
"users": [
|
||||
{
|
||||
"id": 107,
|
||||
"full_name": "Iskandarov Farrux",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 219,
|
||||
"full_name": "Тухтаева Шахзода",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 125,
|
||||
"name": "ЮНУСОБОД АПТЕКА",
|
||||
"users": [
|
||||
{
|
||||
"id": 107,
|
||||
"full_name": "Iskandarov Farrux",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 219,
|
||||
"full_name": "Тухтаева Шахзода",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 126,
|
||||
"name": "ЮНУСОБОД КОНС ТОВАР",
|
||||
"users": [
|
||||
{
|
||||
"id": 107,
|
||||
"full_name": "Iskandarov Farrux",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 219,
|
||||
"full_name": "Тухтаева Шахзода",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"id": 158,
|
||||
"name": "МАВРИД ХИЗМАТЛАР",
|
||||
"users": [
|
||||
{
|
||||
"id": 110,
|
||||
"full_name": "Imomov Jasurbek",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 138,
|
||||
"full_name": "Baratova Zilola",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 107,
|
||||
"full_name": "Iskandarov Farrux",
|
||||
"image": null
|
||||
},
|
||||
{
|
||||
"id": 306,
|
||||
"full_name": "Uyqur Support",
|
||||
"image": null
|
||||
}
|
||||
],
|
||||
"status": "active"
|
||||
}
|
||||
],
|
||||
"warehouse_folders": []
|
||||
},
|
||||
"message": {
|
||||
"uz": "Muvaffaqiyatli!",
|
||||
"ru": "Успешно!",
|
||||
"en": "Success!",
|
||||
"tr": "Başarılı!"
|
||||
}
|
||||
}
|
||||
6814
order.json
Normal file
6814
order.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -40,3 +40,4 @@ uritemplate==4.2.0
|
||||
uvicorn==0.35.0
|
||||
vine==5.1.0
|
||||
wcwidth==0.2.13
|
||||
requests
|
||||
|
||||
Reference in New Issue
Block a user