Merge pull request #23 from xoliqberdiyev/test

Test
This commit is contained in:
xolikberdiyev
2025-10-25 18:26:50 +05:00
committed by GitHub
39 changed files with 393215 additions and 29 deletions

View 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")

View File

@@ -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")

View File

@@ -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")

View File

@@ -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),
),
]

View File

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

View File

@@ -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")

View 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 ✅"))

View 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")

View 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),
),
]

View File

@@ -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),
),
]

View File

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

View File

@@ -14,6 +14,7 @@ class Party(BaseModel):
('CANCELLED', 'bekor qilingan'),
('PURCHASED', 'sotib olinmoqda'),
('PROCESS', 'jarayonda'),
("RECIEVED", 'qabul qilingan'),
]
PAYMENT_STATUS = (
('PAID', "to'langan"),

View File

@@ -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"])

View 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

View 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")

View 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")

View 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")

View File

@@ -23,5 +23,4 @@ class SubFolder(BaseModel):
class Meta:
verbose_name = 'Sub Papka'
verbose_name_plural = 'Sub Papkalar'
verbose_name_plural = 'Sub Papkalar'

View File

@@ -1,47 +1,58 @@
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
queryset = Product.objects.all()
permission_classes = [HasRolePermission]
def post(self, request):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid(raise_exception=True):
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
)

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

File diff suppressed because it is too large Load Diff

View 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

File diff suppressed because it is too large Load Diff

46434
data/party/party2.json Normal file

File diff suppressed because it is too large Load Diff

44649
data/party/party3.json Normal file

File diff suppressed because it is too large Load Diff

43171
data/party/party4.json Normal file

File diff suppressed because it is too large Load Diff

38874
data/party/party5.json Normal file

File diff suppressed because it is too large Load Diff

35056
data/party/party6.json Normal file

File diff suppressed because it is too large Load Diff

35068
data/party/party7.json Normal file

File diff suppressed because it is too large Load Diff

35102
data/party/party8.json Normal file

File diff suppressed because it is too large Load Diff

15125
data/party/party9.json Normal file

File diff suppressed because it is too large Load Diff

32042
data/product.json Normal file

File diff suppressed because it is too large Load Diff

107
data/product_folder.json Normal file
View 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

File diff suppressed because it is too large Load Diff

224
data/user.json Normal file
View 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
View 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

File diff suppressed because it is too large Load Diff

View File

@@ -40,3 +40,4 @@ uritemplate==4.2.0
uvicorn==0.35.0
vine==5.1.0
wcwidth==0.2.13
requests