> For the complete documentation index, see [llms.txt](https://docs.automaktab.uz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.automaktab.uz/readme.md).

# README

Auto Test CRM API uchun integratsiya qo‘llanmasi.

## Auto Test CRM API

Auto Drive avtomaktab boshqaruv tizimi uchun REST API.

**Base URL:** `https://autodrive-backend-production.up.railway.app`

### Tez boshlash

1. `POST /auth/login` orqali tizimga kiring.
2. Javobdagi tokenni saqlang yoki httpOnly cookie’dan foydalaning.
3. Himoyalangan so‘rovlarda `Authorization: Bearer <token>` yuboring.

{% hint style="info" %}
`POST /demo-requests`, `GET /blog-posts` va `GET /blog-posts/{slug}` ochiq endpointlardir. Qolgan endpointlar odatda JWT talab qiladi.
{% endhint %}

### Umumiy qoidalar

* Identifikatorlar satr ko‘rinishida uzatiladi. Ko‘p endpointlarda ular UUID hisoblanadi.
* Sahifalash parametrlari: `page` va `limit`.
* `page` sukut bo‘yicha `1`.
* `limit` maksimal qiymati `100`.
* Sana filtrlari `yyyy-mm-dd` formatida beriladi.
* `course_type`: `tezkor` yoki `avto_maktab`.
* To‘lov usuli: `naqd`, `karta` yoki `perechisleniya`.
* Foydalanuvchi rollari: `dev`, `owner`, `manager`, `operator`, `teacher`.

`company_id` parametri faqat `dev` roli uchun boshqa kompaniya kontekstini tanlaydi.

### Autentifikatsiya

#### Kirish

**POST** `/auth/login`

So‘rov maydonlari:

* `email` — foydalanuvchi emaili.
* `password` — parol.

Tizim httpOnly cookie va JSON token qaytaradi.

#### Joriy foydalanuvchi

**GET** `/auth/me`

Cookie yoki Bearer token orqali joriy foydalanuvchini qaytaradi.

#### Parolni yangilash

**POST** `/auth/change-password` · JWT talab qiladi

* `currentPassword` — amaldagi parol.
* `newPassword` — kamida 8 belgi. Unda katta harf va raqam bo‘lishi shart.

Javob yangi tokenni qaytaradi. Bu joriy sessiyani saqlaydi.

#### Sessiyani boshqarish

* **POST** `/auth/logout` — autentifikatsiya cookie’sini tozalaydi.
* **POST** `/auth/stop-impersonation` — impersonatsiyadan oldingi `dev` sessiyasiga qaytadi.

### Foydalanuvchilar

#### Ro‘yxat va yaratish

* **GET** `/users` — foydalanuvchilar ro‘yxati.
  * Filtrlar: `page`, `limit`, `role`, `branchId`, `search`, `isActive`, `company_id`.
  * `companyId` eskirgan alias. `company_id` dan foydalaning.
* **POST** `/users` — yangi foydalanuvchi yaratadi.
  * Majburiy: `fullName`, `password`, `specialization`, `role`.
  * Ixtiyoriy: `email`, `phone`, `branchId`.
  * `specialization`: `THEORY` yoki `PRACTICE`.

#### Bitta foydalanuvchi

* **GET** `/users/{id}` — foydalanuvchini oladi.
* **PATCH** `/users/{id}` — `fullName`, `phone`, `branchId` yoki `specialization` ni yangilaydi.
* **DELETE** `/users/{id}` — foydalanuvchini o‘chiradi.
* **PATCH** `/users/{id}/activate` — faollashtiradi.
* **PATCH** `/users/{id}/deactivate` — faolsizlantiradi.

Bu endpointlarning barchasi JWT talab qiladi.

### Filiallar va guruhlar

#### Filiallar

* **GET** `/branches` — filiallar ro‘yxati. `company_id` qabul qiladi.
* **POST** `/branches` — filial yaratadi.
  * Majburiy: `name`, `location`.
  * Ixtiyoriy: `phone`.
  * `company_id` yangi filial kompaniyasini tanlaydi. Faqat `dev` uchun.
* **GET** `/branches/{id}` — filialni oladi.
* **PATCH** `/branches/{id}` — `name`, `location`, `phone` maydonlarini yangilaydi.
* **DELETE** `/branches/{id}` — filialni o‘chiradi.

#### Guruhlar

* **GET** `/groups` — guruhlar ro‘yxati.
  * Filtrlar: `search`, `branch_id`, `course_type`, `company_id`.
* **POST** `/groups` — guruh yaratadi.
  * Majburiy: `name`, `branchId`.
  * Ixtiyoriy: `courseType`. Sukut bo‘yicha `avto_maktab`.
* **GET** `/groups/overview` — guruhlar bo‘yicha umumiy ma’lumot.
* **GET** `/groups/{id}` — guruhni oladi.
* **PATCH** `/groups/{id}` — guruh maydonlarini yangilaydi.
* **DELETE** `/groups/{id}` — guruhni o‘chiradi.

### O‘quvchilar

#### Ro‘yxat, qidiruv va import

* **GET** `/students` — o‘quvchilar ro‘yxati.
  * Sahifalash: `page`, `limit`.
  * Filtrlar: `course_type`, `branch_id`, `status`, `has_debt`, `search`.
  * Sana: `date_from`, `date_to`.
  * Tartiblash: `sort_by` (`first_name`, `last_name`, `total_price`, `debt`, `created_at`) va `sort_order` (`asc`, `desc`).
  * Qo‘shimcha: `operator_id`, `company_id`.
* **GET** `/students/search?q={query}` — ism yoki telefon bo‘yicha qidiradi.
* **POST** `/students/bulk-create` — CSV orqali ommaviy yaratadi.
  * `multipart/form-data` yuboring.
  * Majburiy: `file`.
  * Ixtiyoriy: `branch_id`.

#### O‘quvchi yaratish

**POST** `/students`

Majburiy maydonlar:

* `first_name`
* `last_name`
* `phone`
* `course_type`
* `total_price`

Ixtiyoriy maydonlar:

* To‘lov: `amount_paid`, `initial_payment`, `payment_method`.
* Biriktirish: `group_id`, `branch_id`, `registered_by`.
* Shartnoma: `completion_date`, `contract_number`.
* Holat: `status`, `result`, `o83`, `has_document`, `notes`.

`status` qiymatlari: `active`, `completed`, `dropped`, `suspended`.

`result` qiymatlari: `oqimoqda`, `topshirdi`, `yiqildi`.

#### Bitta o‘quvchi

* **GET** `/students/{id}` — o‘quvchi ma’lumotlari.
* **PATCH** `/students/{id}` — yaratishdagi ixtiyoriy maydonlarni yangilaydi.
* **DELETE** `/students/{id}` — o‘quvchini o‘chiradi.

### To‘lovlar

#### To‘lov yaratish

**POST** `/payments`

Majburiy maydonlar:

* `student_id`
* `amount`
* `payment_method`

`idempotency_key` ixtiyoriy UUID hisoblanadi. Bir forma yuborilishi uchun bitta kalitdan foydalaning. Takroriy so‘rov yangi to‘lov yaratmaydi.

#### To‘lovlar ro‘yxati

**GET** `/payments`

* Sahifalash: `page`, `limit`.
* Filtrlar: `branch_id`, `course_type`, `company_id`, `search`, `student_id`.
* Sana: `start_date`, `end_date`.
* Holat: `payment_status` (`paid`, `unpaid`).
* Usul: `payment_method`.
* Tartiblash: `sort_by` (`student_name`, `amount_paid`, `remaining_debt`, `date`) va `sort_order`.

`branchId`, `startDate`, `endDate`, `paymentStatus` va `payment_type` eskirgan parametrlardir.

#### Hisobot va tahrirlash

* **GET** `/payments/summary` — to‘lovlar jamlanmasi. Ro‘yxatdagi filtrlarni qabul qiladi.
* **GET** `/payments/snapshot?branch_id={id}` — bugungi, oylik va qarzdorlik ko‘rsatkichlari.
* **PATCH** `/payments/{id}` — `amount` yoki `payment_method` ni yangilaydi.
* **DELETE** `/payments/{id}` — to‘lovni o‘chiradi va o‘quvchi qarzini qayta hisoblaydi.

### Dashboard va audit

#### Dashboard

* **GET** `/dashboard/analytics` — asosiy dashboard ko‘rsatkichlari.
  * Filtrlar: `branch_id`, `course_type`, `company_id`.
* **GET** `/dashboard/teacher-analytics` — o‘qituvchi dashboardi.
* **GET** `/dashboard/company-overview` — daromad nazorati ko‘rinishi.
  * Filtrlar: `branch_id`, `course_type`, `company_id`, `from`, `to`, `granularity`.
  * `granularity`: `day` yoki `week`.

#### Audit jurnali

**GET** `/audit-logs`

Parametrlar: `entity`, `action`, `user_id`, `userId`, `start_date`, `startDate`, `end_date`, `endDate`, `page`, `limit`, `company_id`.

Owner va dev kompaniya miqyosidagi yozuvlarni ko‘radi. Manager faqat o‘z filiali yozuvlarini ko‘radi.

### Dars, davomat va jadval

#### Darslar va davomat

* **GET** `/lessons` — darslar ro‘yxati. `page`, `limit` qabul qiladi.
* **POST** `/lessons` — dars yaratadi.
  * Majburiy: `title`, `date`, `lessonType`, `groupId`.
  * `lessonType`: `theory` yoki `practice`.
* **GET** `/lessons/{id}` — darsni oladi.
* **DELETE** `/lessons/{id}` — darsni o‘chiradi.
* **GET** `/attendance?student_id={id}` — o‘quvchi davomat tarixi.
  * Ixtiyoriy: `limit`.
* **POST** `/attendance/batch` — bitta dars uchun davomatni ommaviy saqlaydi.
  * `lessonId` va `records` majburiy.
  * Har bir yozuv: `lessonId`, `studentId`, `status`, ixtiyoriy `notes`.
  * `status`: `present`, `absent`, `late`, `excused`.

#### Jadval

* **GET** `/schedule/templates` — jadval shablonlari.
* **POST** `/schedule/templates` — shablon yaratadi.
  * Majburiy: `groupId`, `dayOfWeek`, `startTime`, `endTime`, `lessonType`.
  * `dayOfWeek`: `1` — Dushanba, `7` — Yakshanba.
* **PATCH** `/schedule/templates/{id}` — shablonni yangilaydi.
* **DELETE** `/schedule/templates/{id}` — shablonni o‘chiradi.
* **POST** `/schedule/generate` — shablonlardan darslar yaratadi.
  * Majburiy: `weeks`.
  * Ixtiyoriy: `groupId`.
* **GET** `/schedule/calendar` — kalendar darslari.
  * Filtrlar: `date_from`, `date_to`.

### Imtihonlar

* **POST** `/exams` — imtihon natijasini yaratadi.
  * Majburiy: `studentId`, `examType`, `passed`.
  * Ixtiyoriy: `score`, `notes`.
  * `examType`: `THEORY` yoki `PRACTICE`.
* **GET** `/exams/student/{id}` — o‘quvchining imtihon tarixini qaytaradi.

### Qidiruv, Telegram va kompaniya sozlamalari

#### Qidiruv

**GET** `/search?q={query}`

O‘quvchilar, guruhlar va xodimlar bo‘yicha umumiy qidiruv.

#### Telegram

* **POST** `/telegram/link-token` — botga ulash uchun bir martalik deep-link yaratadi.
* **GET** `/telegram/link-status` — bog‘lanish va kundalik hisobot holati.
* **DELETE** `/telegram/link` — akkauntni botdan uzadi.
* **PATCH** `/telegram/daily-report` — kundalik hisobotni boshqaradi.
  * Majburiy: `enabled` (`true` yoki `false`).
  * Owner yoki manager ruxsati talab qilinadi.

#### Kompaniya Telegram chat’i

**PATCH** `/companies/me/telegram-chat`

`telegram_chat_id` ni yuboring. Bo‘sh qiymat bog‘lanishni uzadi. Bu chat yangi o‘quvchi va to‘lov bildirishnomalarini oladi.

### Platform boshqaruvi

Platform endpointlari JWT talab qiladi. Ular platforma administratorlari uchun mo‘ljallangan.

#### Kompaniyalar

* **GET** `/platform/companies` — kompaniyalar ro‘yxati.
  * Filtrlar: `page`, `limit`, `status`, `search`.
* **POST** `/platform/companies` — kompaniya yaratadi.
  * Majburiy: `name`.
  * Ixtiyoriy: `slug`, `status`, `contactPhone`, `contactEmail`.
  * `slug` berilmasa nomdan yaratiladi.
* **GET** `/platform/companies/{id}` — kompaniya va foydalanish statistikasi.
* **PATCH** `/platform/companies/{id}` — kompaniya maydonlarini yangilaydi.
* **DELETE** `/platform/companies/{id}` — soft delete bajaradi.
* **POST** `/platform/companies/{id}/approve` — holatni `active` qiladi.
* **POST** `/platform/companies/{id}/suspend` — holatni `suspended` qiladi.
* **POST** `/platform/companies/{id}/impersonate` — tanlangan kompaniya owner tokenini yaratadi.
* **POST** `/platform/companies/{id}/feature-flags` — feature flag’larni to‘liq almashtiradi.
  * Majburiy: `features` — qiymatlari boolean bo‘lgan obyekt.

Kompaniya holatlari: `pending`, `active`, `suspended`.

#### Platform foydalanuvchilari

* **GET** `/platform/users` — platforma foydalanuvchilari ro‘yxati.
  * Filtrlar: `page`, `limit`, `companyId`, `branchId`, `role`, `search`, `includeDeleted`.
* **POST** `/platform/users` — foydalanuvchi yaratadi.
  * Majburiy: `email`, `password`, `name`, `role`.
  * Ixtiyoriy: `phone`, `branchId`, `companyId`.
* **PATCH** `/platform/users/{id}` — foydalanuvchini yangilaydi.
* **DELETE** `/platform/users/{id}` — soft delete bajaradi.
* **POST** `/platform/users/{id}/reset-password` — parolni yangilaydi.
  * Majburiy: `password`.

#### Kompaniya ichidagi filiallar va foydalanuvchilar

* **GET** `/platform/companies/{companyId}/branches` — kompaniya filiallari.
* **POST** `/platform/companies/{companyId}/branches` — filial yaratadi.
* **PATCH** `/platform/companies/{companyId}/branches/{branchId}` — filialni yangilaydi.
* **DELETE** `/platform/companies/{companyId}/branches/{branchId}` — filialni soft delete qiladi.

Filiallar ro‘yxati `page`, `limit`, `search`, `includeDeleted` parametrlarini qabul qiladi.

* **GET** `/platform/companies/{companyId}/users` — kompaniya foydalanuvchilari.
* **POST** `/platform/companies/{companyId}/users` — kompaniya foydalanuvchisini yaratadi.
* **PATCH** `/platform/companies/{companyId}/users/{id}` — foydalanuvchini yangilaydi.
* **DELETE** `/platform/companies/{companyId}/users/{id}` — foydalanuvchini soft delete qiladi.
* **POST** `/platform/companies/{companyId}/users/{id}/reset-password` — parolni yangilaydi.

Kompaniya foydalanuvchilari ro‘yxati `page`, `limit`, `branchId`, `role`, `search`, `includeDeleted` parametrlarini qabul qiladi.

#### Platform analitikasi va konfiguratsiyasi

* **GET** `/platform/analytics` — barcha kompaniyalar bo‘yicha umumiy ko‘rsatkichlar.
* **GET** `/platform/analytics/usage` — kompaniyalarning kunlik foydalanish statistikasi.
  * `days`: `1` dan `90` gacha. Sukut bo‘yicha `14`.
* **GET** `/platform/health` — bog‘liqliklar va migratsiyalar holati.
* **GET** `/platform/audit-log` — platforma audit jurnali.
  * Filtrlar: `entity`, `action`, `user_id`, `company_id`, `start_date`, `end_date`, `page`, `limit`.
* **GET** `/platform/global-config` — standart kurslar va valyutalar.
* **PUT** `/platform/global-config` — konfiguratsiyani to‘liq almashtiradi.
  * Majburiy: `course_types`, `currencies`.

#### CSV import

* **POST** `/platform/import/companies` — kompaniyalarni CSV’dan import qiladi.
  * `multipart/form-data`: majburiy `file`, ixtiyoriy `dry_run`.
  * Ustunlar: `name`, `slug?`, `status?`, `contact_phone?`, `contact_email?`.
* **POST** `/platform/import/users` — foydalanuvchilarni CSV’dan import qiladi.
  * `multipart/form-data`: majburiy `file`, ixtiyoriy `dry_run`.
  * Ustunlar: `email`, `password`, `name`, `role`, `phone?`, `company_id|company_slug`, `branch_id?`.

### Blog va demo so‘rovlari

#### Demo so‘rovlari

* **POST** `/demo-requests` — ommaviy demo so‘rovi. So‘rovlar daqiqasiga `5` ta bilan cheklangan.
  * Majburiy: `full_name`, `phone`, `region`.
  * Ixtiyoriy: `center_name`, `student_count`, `note`.
  * `student_count`: `<50`, `50-150`, `150-300`, `300+`.
* **GET** `/demo-requests` — `dev` uchun demo so‘rovlari ro‘yxati.
  * Filtrlar: `status`, `page`, `limit`.
* **PATCH** `/demo-requests/{id}` — holatni yangilaydi.
  * Majburiy: `status`.
  * Qiymatlar: `new`, `contacted`, `archived`.

#### Blog postlari

* **GET** `/blog-posts` — e’lon qilingan postlar. Ochiq endpoint.
* **GET** `/blog-posts/{slug}` — slug orqali e’lon qilingan post. Ochiq endpoint.
* **GET** `/blog-posts/admin` — barcha holatdagi postlar. `dev` yoki `owner`.
* **GET** `/blog-posts/admin/{id}` — ID orqali post. `dev` yoki `owner`.
* **POST** `/blog-posts` — post yaratadi.
* **PATCH** `/blog-posts/{id}` — postni, jumladan holatini yangilaydi.
* **DELETE** `/blog-posts/{id}` — postni o‘chiradi.

Ro‘yxat endpointlari `page` va `limit` qabul qiladi. Admin ro‘yxati `status` filtrini ham qabul qiladi.

Yaratish uchun quyidagi maydonlar majburiy:

* `slug`
* `title_uz`, `title_ru`, `title_en`
* `excerpt_uz`, `excerpt_ru`, `excerpt_en`
* `body_uz`, `body_ru`, `body_en`

Ixtiyoriy maydonlar: `tags`, `status`, `cover_image_url`. `status`: `draft` yoki `published`.

### Sog‘liq va diagnostika

* **GET** `/health` — servis va ma’lumotlar bazasi tayyorligini tekshiradi.
* **GET** `/metrics` — Prometheus metrikalari.
  * JWT va `x-scraper-token` headeri talab qilinadi.
  * Header qiymati serverdagi `SCRAPER_TOKEN` bilan teng bo‘lishi kerak.
* **GET** `/admin/status` — admin muhit o‘zgaruvchilari mavjudligini tekshiradi.
  * `x-admin-key` yuboring yoki `dev` JWT bilan autentifikatsiyadan o‘ting.
  * Endpoint maxfiy qiymatlarni qaytarmaydi.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.automaktab.uz/readme.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
