arc/docs/WARRANTY_ACTIVATION_PROCESS.md
2026-04-14 19:34:55 +03:30

278 lines
12 KiB
Markdown
Executable file

# فرآیند فعال‌سازی گارانتی - گزارش بررسی
این سند فرآیند کامل فعال‌سازی گارانتی یک محصول را در سیستم شرح می‌دهد.
## مراحل کلی فرآیند
### مرحله 1: تولید کدهای گارانتی (پیش از فعال‌سازی)
قبل از اینکه مشتری بتواند گارانتی را فعال کند، کسب و کار باید کدهای گارانتی را تولید کند:
**Endpoint**: `POST /api/v1/warranty/business/{business_id}/generate`
**پارامترهای مورد نیاز**:
- `product_id`: شناسه کالا
- `quantity`: تعداد کدهای مورد نیاز
- `warranty_duration_days`: مدت گارانتی به روز (مثلاً 365 روز)
- `code_format`: فرمت کد (random, sequential, custom)
- `serial_format`: فرمت سریال (random, custom)
- `custom_codes`: لیست کدهای دلخواه (در صورت استفاده از فرمت custom)
- `custom_serials`: لیست سریال‌های دلخواه (در صورت استفاده از فرمت custom)
**نتیجه**: لیستی از کدهای گارانتی تولید شده با:
- `code`: کد گارانتی (مثلاً WR-ABC12345)
- `warranty_serial`: سریال گارانتی (مثلاً XYZ789012)
- `status`: وضعیت که در ابتدا `generated` است
- `expires_at`: تاریخ انقضا
---
### مرحله 2: فعال‌سازی گارانتی توسط مشتری
مشتری می‌تواند گارانتی را از طریق endpoint عمومی فعال کند.
## روش فعال‌سازی
### از طریق UI (فرانت‌اند)
**مسیر**: صفحه عمومی فعال‌سازی گارانتی
**فرم فعال‌سازی شامل فیلدهای زیر است**:
#### فیلدهای الزامی:
1. **کد گارانتی** (`warranty_code`): کد تولید شده در مرحله قبل
2. **سریال گارانتی** (`warranty_serial`): سریال تولید شده در مرحله قبل
3. **نام مشتری** (`customer_name`)
4. **شماره تماس** (`customer_phone`)
#### فیلدهای اختیاری:
5. **ایمیل مشتری** (`customer_email`)
6. **سریال کالا** (`product_serial`): در صورتی که نیاز به تأیید سریال کالا باشد
### از طریق API
**Endpoint**: `POST /api/v1/warranty/public/activate`
**مشخصات**:
- عمومی است (نیازی به احراز هویت ندارد)
- IP آدرس و User Agent خودکار ثبت می‌شود
**Request Body**:
```json
{
"warranty_code": "WR-ABC12345",
"warranty_serial": "XYZ789012",
"customer_name": "علی احمدی",
"customer_phone": "09123456789",
"customer_email": "ali@example.com", // اختیاری
"product_serial": "PROD-SERIAL-123" // اختیاری
}
```
## بررسی‌های انجام شده در فرآیند فعال‌سازی
### 1. بررسی وجود کد گارانتی
- سیستم کد گارانتی را در دیتابیس جستجو می‌کند
- در صورت عدم یافتن: خطای `WARRANTY_CODE_NOT_FOUND`
### 2. بررسی فعال بودن پلاگین
- بررسی می‌کند که پلاگین گارانتی برای کسب و کار فعال باشد
- در صورت غیرفعال بودن: خطای `PLUGIN_NOT_ACTIVE`
### 3. بررسی صحت سریال گارانتی
- سریال وارد شده باید با سریال ثبت شده در دیتابیس مطابقت داشته باشد
- در صورت عدم تطابق: خطای `INVALID_WARRANTY_SERIAL`
### 4. بررسی وضعیت گارانتی
گارانتی باید در وضعیت `generated` باشد:
- اگر قبلاً فعال شده: خطای `WARRANTY_ALREADY_ACTIVATED`
- اگر منقضی شده: خطای `WARRANTY_EXPIRED`
- اگر لغو شده: خطای `WARRANTY_REVOKED`
- اگر وضعیت نامعتبر: خطای `INVALID_WARRANTY_STATUS`
### 5. بررسی تاریخ انقضا
- اگر `expires_at` وجود داشته باشد و تاریخ گذشته باشد، گارانتی منقضی می‌شود
- در صورت انقضا: خطای `WARRANTY_EXPIRED`
### 6. بررسی محدودیت تلاش‌های فعال‌سازی
- سیستم تعداد تلاش‌های ناموفق را در cache نگه می‌دارد
- اگر تعداد تلاش‌ها بیش از حد مجاز باشد، کاربر قفل می‌شود
- در صورت قفل: خطای `TOO_MANY_ATTEMPTS` با مدت زمان قفل
### 7. بررسی نیاز به تأیید سریال کالا (شرطی)
اگر در تنظیمات گارانتی (`require_serial_verification` یا `require_product_instance_match`) فعال باشد:
- سریال کالا باید وارد شود
- سیستم `ProductInstance` را جستجو می‌کند
- در صورت عدم یافتن: خطای `PRODUCT_SERIAL_NOT_FOUND`
## فرآیند فعال‌سازی پس از بررسی‌ها
### 1. اتصال به Person (در صورت فعال بودن)
- اگر `auto_link_to_person` در تنظیمات فعال باشد:
- سیستم بر اساس شماره تماس، Person را در سیستم جستجو می‌کند
- اگر Person یافت شود، به گارانتی متصل می‌شود
### 2. به‌روزرسانی وضعیت گارانتی
```python
warranty_code.status = "activated"
warranty_code.activated_at = datetime.utcnow()
warranty_code.activated_by_person_id = person.id if person else None
```
### 3. ثبت اطلاعات مشتری
- اگر Person یافت نشد، اطلاعات مشتری در `activated_by_customer_info` ذخیره می‌شود
- شامل: نام، تلفن، ایمیل
### 4. اتصال به ProductInstance (در صورت وجود)
- اگر سریال کالا تأیید شد، `product_instance_id` تنظیم می‌شود
### 5. ایجاد لینک رهگیری (در صورت فعال بودن)
اگر `enable_tracking_link` در تنظیمات فعال باشد و Person وجود داشته باشد:
- یک کد یکتا برای لینک رهگیری تولید می‌شود
- لینک رهگیری با تاریخ انقضا (در صورت تنظیم) ایجاد می‌شود
- کد لینک در `tracking_link_code` ذخیره می‌شود
### 6. ثبت سابقه فعال‌سازی
- یک رکورد در جدول `warranty_activations` ایجاد می‌شود
- شامل تمام اطلاعات ورودی، IP، User Agent، و روش تأیید
### 7. ثبت رویداد رهگیری
- یک رویداد از نوع `activation` در جدول `warranty_tracking` ثبت می‌شود
- برای تاریخچه تغییرات گارانتی
### 8. پاک کردن تلاش‌های ناموفق
- پس از موفقیت، تعداد تلاش‌های ناموفق از cache پاک می‌شود
## پاسخ API
پس از فعال‌سازی موفق، پاسخ شامل موارد زیر است:
```json
{
"id": 123,
"code": "WR-ABC12345",
"warranty_serial": "XYZ789012",
"status": "activated",
"activated_at": "2024-01-20T10:30:00Z",
"expires_at": "2025-01-20T10:30:00Z",
"tracking_link_code": "TRACK-CODE-123456", // در صورت وجود
"person_id": 456 // در صورت اتصال به Person
}
```
## تنظیمات موثر در فرآیند فعال‌سازی
### تنظیمات کسب و کار (WarrantySettings):
1. **require_serial_verification**: نیاز به تأیید سریال کالا
2. **require_product_instance_match**: نیاز به تطابق با ProductInstance
3. **max_activation_attempts**: حداکثر تلاش برای فعال‌سازی
4. **activation_lockout_duration_minutes**: مدت قفل شدن پس از تلاش‌های ناموفق
5. **auto_link_to_person**: اتصال خودکار به Person
6. **enable_tracking_link**: فعال‌سازی لینک رهگیری
7. **tracking_link_expires_days**: مدت اعتبار لینک رهگیری
## مثال کامل فرآیند
### سناریو 1: فعال‌سازی ساده
1. **تولید کد گارانتی** (توسط کسب و کار):
```
POST /api/v1/warranty/business/1/generate
{
"product_id": 100,
"quantity": 1,
"warranty_duration_days": 365
}
```
نتیجه:
- `code`: "WR-ABC12345"
- `warranty_serial`: "XYZ789012"
2. **فعال‌سازی** (توسط مشتری):
```
POST /api/v1/warranty/public/activate
{
"warranty_code": "WR-ABC12345",
"warranty_serial": "XYZ789012",
"customer_name": "علی احمدی",
"customer_phone": "09123456789"
}
```
نتیجه: گارانتی با موفقیت فعال می‌شود
### سناریو 2: فعال‌سازی با تأیید سریال
1. در تنظیمات گارانتی: `require_serial_verification = true`
2. مشتری باید علاوه بر کد و سریال گارانتی، سریال کالا را هم وارد کند:
```json
{
"warranty_code": "WR-ABC12345",
"warranty_serial": "XYZ789012",
"product_serial": "PROD-SERIAL-123",
"customer_name": "علی احمدی",
"customer_phone": "09123456789"
}
```
3. سیستم سریال کالا را در `ProductInstance` جستجو می‌کند
4. در صورت تطابق، فعال‌سازی انجام می‌شود
### سناریو 3: فعال‌سازی با Person موجود
1. در تنظیمات: `auto_link_to_person = true`
2. مشتری با شماره تماسی که در سیستم به عنوان Person ثبت شده است فعال‌سازی می‌کند
3. سیستم به صورت خودکار:
- Person را پیدا می‌کند
- گارانتی را به Person متصل می‌کند
- در صورت فعال بودن tracking link، لینک رهگیری ایجاد می‌کند
## نکات مهم
1. **امنیت**:
- Endpoint فعال‌سازی عمومی است اما محدودیت تلاش دارد
- IP و User Agent ثبت می‌شود
- بررسی‌های امنیتی متعددی انجام می‌شود
2. **تاریخچه**:
- تمام فعال‌سازی‌ها در `warranty_activations` ثبت می‌شود
- رویدادها در `warranty_tracking` ثبت می‌شود
3. **انعطاف‌پذیری**:
- تنظیمات کسب و کار می‌تواند فرآیند را سفارشی کند
- می‌تواند ساده یا پیچیده باشد
4. **یکتایی**:
- هر کد گارانتی فقط یکبار قابل فعال‌سازی است
- سریال گارانتی یکتا است
## خطاهای ممکن
| خطا | کد | توضیح |
|-----|-----|-------|
| کد گارانتی یافت نشد | `WARRANTY_CODE_NOT_FOUND` | کد وارد شده در دیتابیس وجود ندارد |
| پلاگین فعال نیست | `PLUGIN_NOT_ACTIVE` | پلاگین گارانتی برای کسب و کار فعال نیست |
| سریال نامعتبر | `INVALID_WARRANTY_SERIAL` | سریال با کد گارانتی مطابقت ندارد |
| قبلاً فعال شده | `WARRANTY_ALREADY_ACTIVATED` | این گارانتی قبلاً فعال شده است |
| منقضی شده | `WARRANTY_EXPIRED` | تاریخ انقضای گارانتی گذشته است |
| لغو شده | `WARRANTY_REVOKED` | گارانتی توسط کسب و کار لغو شده است |
| سریال کالا الزامی | `PRODUCT_SERIAL_REQUIRED` | در تنظیمات نیاز به سریال کالا است |
| سریال کالا یافت نشد | `PRODUCT_SERIAL_NOT_FOUND` | سریال کالا در سیستم ثبت نشده است |
| تلاش بیش از حد | `TOO_MANY_ATTEMPTS` | تعداد تلاش‌های ناموفق بیش از حد مجاز است |
## خلاصه
فرآیند فعال‌سازی گارانتی شامل مراحل زیر است:
1. ✅ تولید کد گارانتی (پیش از فعال‌سازی)
2. ✅ ورود اطلاعات توسط مشتری (کد، سریال، اطلاعات مشتری)
3. ✅ انجام بررسی‌های امنیتی و اعتبارسنجی
4. ✅ به‌روزرسانی وضعیت گارانتی به `activated`
5. ✅ ثبت اطلاعات و ایجاد سوابق
6. ✅ ایجاد لینک رهگیری (در صورت نیاز)
7. ✅ بازگرداندن نتیجه به مشتری
این فرآیند از طریق UI (صفحه عمومی) یا مستقیماً از طریق API قابل انجام است.