31 KiB
استودیوی طراحی و چاپ برچسب بارکد حسابیکس
وضعیت سند: زنده (Living Document) — پس از هر مرحله طراحی/پیادهسازی بهروز میشود.
تاریخ ایجاد: ۲۰۲۶-۰۸-۰۶
آخرین بهروزرسانی: ۲۰۲۶-۰۸-۰۶
کد افزونه:barcode_label_studio
دسته marketplace:product_management
۰) فهرست پیشرفت کلی
| فاز | عنوان | طراحی | پیادهسازی | تست/پذیرش |
|---|---|---|---|---|
| — | سناریوی محصول و قواعد کسبوکار | ✅ | — | — |
| A | ستون فقرات (مدل، API، رندر PDF، گیت افزونه) | ✅ | ✅ | ❌ |
| B | استودیو WYSIWYG (canvas، DnD، کیبورد، اسکیل) | ✅ | ✅ | ❌ |
| C | اتصال عملیات (کالاها، چاپ گروهی، اکسل، سریال) | ✅ | ✅ | ❌ |
| D | چاپ پیشرفته سیستم و رولی | ✅ | ✅ | ❌ |
راهنمای علائم: ✅ انجام شده · 🟡 در حال انجام · ❌ نشده · — موضوعیت ندارد
جزئیات چکلیست هر فاز در بخش همان فاز آمده است.
۱) خلاصه اجرایی
افزونهٔ طراحی و چاپ برچسب بارکد یک محصول کامل داخل حسابیکس است که:
- محیط استودیوی حرفهای با موس و کیبورد برای طراحی برچسب دارد.
- امکان تعریف چند طرح برای هر کسبوکار، انتخاب طرح پیشفرض، و انتخاب طرح موقع چاپ را میدهد.
- با بخش کالاها و خدمات هماهنگ است.
- خروجی استاندارد همه پلتفرمها PDF با مختصات میلیمتر واقعی است.
- چاپ مستقیم سیستم/رولی لایهٔ جدا (فاز D) است و شرط تکمیل فازهای A–C نیست.
چاپ سادهٔ فعلی کالاها (Code128/QR، ذخیره PDF) بهعنوان قابلیت هستهٔ رایگان باقی میماند. امکانات استودیو، چندطرح، اکسل سریالی و چاپ پیشرفته پشت لایسنس افزونه قرار میگیرند.
۲) وضعیت فعلی حسابیکس (مبنای کار)
موجود
| بخش | مسیر/نکته |
|---|---|
| چاپ برچسب ساده کالا | hesabixUI/.../product_label_print_dialog.dart — کلاینت PDF، بدون قالب ذخیرهشونده |
| ورود از کالاها | products_page.dart — چاپ بارکد عمومی و برچسب واحد یونیک |
| مدل بارکد کالا | general_barcodes + بارکد/سریال product_instances |
| الگوی افزونه | marketplace_plugins_seed.py + BusinessPlugin + *PluginGate |
| الگوی قالب چاپ | report_templates (draft/publish/default/version) — نزدیکترین آنالوگ |
| الگوی canvas | workflow_canvas.dart — InteractiveViewer، zoom، undo، shortcuts |
| اکسل کالا | product_import_dialog.dart + API openpyxl |
| پکیجها | pdf, barcode, printing, desktop_drop, file_picker |
شکافها
- هیچ طرح ذخیرهشونده برای بارکد کالا وجود ندارد.
- استودیوی آزاد با مختصات mm وجود ندارد.
- دیالوگ چاپ سیستم / چاپگر رولی برای لیبل وجود ندارد.
- انواع بارکد محدود به Code128 و QR است.
۳) سناریوی محصول (کامل)
۳.۱ اهداف
- طراحی برچسب با Drag & Drop، موس، کیبورد، zoom، snap، undo/redo.
- اسکیل واقعی میلیمتر؛ خروجی قابل اسکن.
- چند طرح per business + پیشفرض + انتخاب موقع چاپ.
- اتصال به لیست کالا / واحد یونیک / اکسل / چاپ سریالی و تعدادی.
- پشتیبانی symbology: Code128, Code39, Code93, EAN8, EAN13, CodaBar, DataMatrix, QR.
- چند متن، چند بارکد، چند تصویر در یک برچسب؛ چینش سطر/ستون روی کاغذ.
- سازگاری با چاپگرهای لیزری/رنگی/سوزنی از مسیر PDF+درایور OS؛ رولی در فاز D.
۳.۲ غیرهدفها (عمداً خارج)
- جایگزینی کامل موتور قالب فاکتور (
report_templatesعمومی). - وعدهٔ چاپ مستقیم USB/raw روی وب.
- ادیتور موبایل گوشی کوچک بهعنوان تجربهٔ اصلی طراحی (اندروید برای چاپ و ویرایش سبک).
۳.۳ پرسونا و جریانها
طراح عملیات: استودیو → ساخت/ویرایش طرح → Publish → Set default.
اپراتور چاپ: کالاها → انتخاب → طرح (پیشفرض یا دستی) → تعداد → پیشنمایش → PDF/چاپ.
مدیر: خرید افزونه از بازار، تعیین دسترسی design / print.
۳.۴ معماری اطلاعات UI
بازار افزونهها → barcode_label_studio
منو (پس از فعالسازی):
برچسب و بارکد
├─ طرحهای من
├─ استودیو (new / :id)
├─ چاپ از کالاها (میانبر)
└─ چاپ از اکسل / سریال
کالاها و خدمات:
├─ چاپ با طرح پیشفرض
├─ چاپ با انتخاب طرح
└─ از فرم کالا: چاپ این کالا
۳.۵ استراتژی پلتفرم
| قابلیت | وب | ویندوز | اندروید |
|---|---|---|---|
| استودیو + طرحها + PDF | ✅ | ✅ (بهترین UX) | ✅ (تبلت/landscape) |
| چاپ از کالا / اکسل | ✅ | ✅ | ✅ |
| دیالوگ چاپ سیستم | محدود (مرورگر) | ✅ اولویت | ✅ در حد OS |
| چاپ رولی/خام | ❌ وعده داده نشود | ✅ فاز D | ✅ فاز D |
۳.۶ معیار پذیرش محصول کامل
- ساخت طرح جدید بدون تغییر کد.
- چند published + یک default پایدار.
- تعویض طرح موقع چاپ + پیشنمایش صحیح.
- موس + کیبورد + zoom/snap/undo در سطح editor واقعی.
- مختصات mm و PDF قابل اسکن برای symbologyهای پشتیبانیشده.
- چاپ گروهی از کالا و اکسل با تعداد مشخص.
- گیت لایسنس روی همه مسیرها.
- draft / publish / تاریخچه نسخه.
۴) فاز A — ستون فقرات (طراحی ✅ · پیادهسازی ❌)
۴.۱ هدف فاز
زیربنای داده، API، گیت افزونه، و یک موتور رندر PDF واحد از JSON طوری که preview ≡ چاپ.
۴.۲ مدل داده
جدول label_templates
| ستون | نوع | توضیح |
|---|---|---|
| id | PK | |
| business_id | FK businesses | CASCADE |
| name | varchar(160) | |
| description | varchar(512) nullable | |
| status | draft | published | archived | index |
| is_default | bool | فقط یکی published per business |
| version | int | bump روی تغییر محتوا |
| schema_version | int | مثلاً 1 |
| design_json | JSON | سند label_design_v1 |
| sheet_json | JSON | کاغذ مادر، سطر/ستون، حاشیه (ممکن است داخل design هم باشد؛ sheet جدا برای override چاپ) |
| thumbnail_png | bytes/nullable یا file_id | اختیاری |
| created_by | FK users | |
| created_at / updated_at | datetime | |
| published_at | datetime nullable |
ایندکس یکتا جزئی پیشنهادی: حداکثر یک is_default=true برای (business_id) بین ردیفهای status=published (در سرویس enforce + در DB در صورت پشتیبانی partial unique).
جدول label_template_revisions
| ستون | نوع | توضیح |
|---|---|---|
| id | PK | |
| template_id | FK | CASCADE |
| version_no | int | |
| design_json | JSON | snapshot |
| sheet_json | JSON | |
| changelog | varchar nullable | |
| created_by | FK users | |
| created_at | datetime |
تنظیمات کسبوکار (اختیاری)
- فیلد/ردیف settings:
default_label_template_id— یا فقط ازis_defaultروی جدول طرحها.
دارایی تصویر
- ترجیح فاز A: ارجاع
file_storage_idاز ماژول storage باmodule_context=barcode_labels. - مسیر سریع: data-URI داخل design برای لوگوهای کوچک (سقف حجم در validation).
۴.۳ Schema سند طراحی — label_design_v1
{
"schema_version": 1,
"canvas": {
"width_mm": 50,
"height_mm": 30,
"grid_mm": 1,
"snap_to_grid": true,
"guides_mm": { "vertical": [], "horizontal": [] },
"dpi": 300
},
"elements": [
{
"id": "el_1",
"type": "text",
"name": "نام کالا",
"x_mm": 2,
"y_mm": 2,
"w_mm": 46,
"h_mm": 6,
"rotation_deg": 0,
"z_index": 1,
"locked": false,
"visible": true,
"props": {
"content_mode": "binding",
"text": "",
"binding": "product.name",
"font_family": "YekanBakhFaNum",
"font_size_pt": 9,
"font_weight": "normal",
"align": "center",
"valign": "middle",
"color": "#000000",
"rtl": true,
"wrap": true
}
},
{
"id": "el_2",
"type": "barcode",
"name": "بارکد اصلی",
"x_mm": 4,
"y_mm": 10,
"w_mm": 42,
"h_mm": 14,
"rotation_deg": 0,
"z_index": 2,
"locked": false,
"visible": true,
"props": {
"symbology": "code128",
"content_mode": "binding",
"value": "",
"binding": "product.general_barcode",
"show_text": true,
"text_size_pt": 7,
"quiet_zone_mm": 1
}
}
]
}
انواع المان (type)
| type | props کلیدی |
|---|---|
text |
content_mode fixed|binding، text، binding، font_*، align، color، rtl، wrap |
barcode |
symbology: code128|code39|code93|ean8|ean13|codabar، value/binding، show_text، quiet_zone |
qr |
ecc L|M|Q|H، value/binding، quiet_zone |
datamatrix |
value/binding |
image |
source: upload|product.image|business.logo، file_id یا data_uri، fit contain|cover|fill، opacity |
shape |
shape rect|ellipse|line، stroke، fill، stroke_width_mm |
line |
میتواند زیرمجموعه shape باشد |
Bindingهای استاندارد فاز A
product.name,product.code,product.price,product.sale_priceproduct.general_barcode(اولین توکن)،product.general_barcode[n]instance.serial,instance.barcodewarehouse.name,business.nameprint.counter,print.copy_indexfixedاز طریق content_mode
sheet_json (چینش روی کاغذ)
{
"paper": "A4",
"orientation": "portrait",
"custom_paper_mm": null,
"margin_mm": { "top": 5, "right": 5, "bottom": 5, "left": 5 },
"columns": 3,
"rows": 8,
"gap_mm": { "x": 2, "y": 2 },
"label_from_canvas": true
}
۴.۴ قرارداد API
Base: /api/v1/barcode-labels/business/{business_id}
همه endpointها پشت require_barcode_label_plugin_active + permission.
| Method | Path | توضیح |
|---|---|---|
| GET | /templates |
لیست (فیلتر status) |
| POST | /templates |
ساخت draft |
| GET | /templates/{id} |
جزئیات + design |
| PUT | /templates/{id} |
بهروزرسانی محتوا (version++) |
| POST | /templates/{id}/publish |
draft→published |
| POST | /templates/{id}/archive |
archive |
| POST | /templates/{id}/duplicate |
کپی |
| POST | /templates/set-default |
{ template_id } فقط published |
| GET | /templates/default |
resolve پیشفرض |
| POST | /templates/{id}/preview |
PDF یک برچسب با sample payload |
| POST | /print |
job چاپ → PDF |
| GET | /presets |
گالری preset سیستمی |
| POST | /templates/from-preset |
ساخت از preset |
POST /print body
{
"template_id": 12,
"source": "products",
"items": [
{ "product_id": 1, "instance_id": null, "qty": 2, "overrides": {} }
],
"sheet_override": null
}
پاسخ: application/pdf یا { file_token } مطابق الگوی سایر PDFهای حسابیکس.
۴.۵ موتور رندر
- ورودی:
design_json+sheet_json+ لیست context آیتمها. - خروجی: PDF چندصفحهای با کاشیکاری لیبلها.
- اعتبارسنجی قبل از رندر: طول EAN، خالی نبودن binding اجباری، المان خارج از canvas، حداقل ارتفاع بارکد.
- کتابخانه پیشنهادی سمت کلاینت فعلی:
pdf+barcode؛ در فاز A تصمیم قطعی:
تصمیم طراحی فاز A: رندر سمت کلاینت برای preview استودیو و چاپ (همراستا با ProductLabelPrintDialog فعلی) + امکان preview سرور اختیاری بعداً. قرارداد JSON واحد است تا بعداً سرور هم همان schema را رندر کند.
فایلهای هدف پیشنهادی:
hesabixAPI/
adapters/db/models/label_template.py
adapters/db/models/label_template_revision.py
migrations/versions/YYYYMMDD_label_templates.py
adapters/api/v1/barcode_labels.py
adapters/api/v1/schema_models/barcode_label.py
app/services/barcode_label_service.py
app/services/barcode_label_design_validator.py
app/core/barcode_label_plugin_dependency.py
adapters/db/seed_data/marketplace_plugins_seed.py # افزودن seed
hesabixUI/hesabix_ui/lib/
services/barcode_label_service.dart
models/barcode_label/
label_design_v1.dart
label_template.dart
label_sheet.dart
widgets/barcode_label/render/label_pdf_renderer.dart
widgets/marketplace/barcode_label_plugin_gate.dart
۴.۶ افزونه marketplace
code: barcode_label_studio
name: طراحی و چاپ برچسب بارکد
category: product_management
trial_days: 14
trial_allowed: true
plans: monthly / yearly / lifetime (مبالغ در پیادهسازی نهایی با محصول)
Permissions پیشنهادی:
barcode_labels.viewbarcode_labels.designbarcode_labels.print
۴.۷ Presetهای سیستمی (حداقل)
| کد | اندازه | کاربرد |
|---|---|---|
shelf_50x30 |
۵۰×۳۰ mm | قفسه |
shelf_40x30 |
۴۰×۳۰ mm | فشرده |
price_70x40 |
۷۰×۴۰ mm | برچسب قیمت |
a4_grid_code128 |
canvas ۵۰×۳۰ روی A4 | ورقی چندتایی |
۴.۸ چکلیست فاز A
طراحی
- مدل جداول
- schema
label_design_v1 - قرارداد API
- تصمیم موتور رندر
- seed افزونه و permissions
- لیست preset
پیادهسازی
- Migration جداول
- ORM + service + validator
- API router + dependency افزونه
- Seed marketplace
- مدلهای Dart + service کلاینت
LabelPdfRendererاز JSONBarcodeLabelPluginGate- صفحه لیست طرحها (CRUD ساده بدون canvas کامل)
- i18n FA/EN کلیدهای پایه
تست/پذیرش
- ساخت/ویرایش/publish/default از API
- رندر PDF از preset با داده نمونه قابل اسکن
- 403 بدون لایسنس
۵) فاز B — استودیو WYSIWYG (طراحی ✅ · پیادهسازی ❌)
۵.۱ هدف فاز
محیط استودیوی حرفهای با موس، کیبورد، مقیاس mm، DnD، لایهها، inspector، پیشنمایش PDF.
۵.۲ چیدمان صفحه استودیو
مسیر: barcode-labels/studio/new و barcode-labels/studio/:template_id
┌ Header: نام | ذخیره | پیشنمایش PDF | انتشار | پیشفرض | Undo/Redo | Zoom% | بستن
├──────┬──────────────────────────────┬─────────────┐
│Tool │ Ruler H │ Inspector │
│box ├──────────────────────────────┤ Properties │
│+Layer│ RulerV │ CANVAS │ Binding │
│s │ │ (InteractiveViewer│ Align │
│ │ │ + grid + guides) │ Lock │
└──────┴──────────────────────────────┴─────────────┘
└ Status: X/Y/W/H mm | angle | snap | selection count
مرجع تعاملی: workflow_canvas.dart + تاریخچه command مانند workflow_history.dart.
۵.۳ سیستم مختصات و اسکیل
| مفهوم | قاعده |
|---|---|
| منبع حقیقت | mm در design_json |
| نمایش | px = mm * (dpi/25.4) * zoom با dpi منطقی UI جدا از dpi چاپ (مثلاً UI 96 منطقی، چاپ 300) |
| Zoom | 0.25 … 4.0 ؛ Ctrl+Wheel ؛ Ctrl+0 fit ؛ Ctrl+1 صددرصد |
| Grid | 1 / 2 / 5 mm |
| Snap | grid، لبه المانها، راهنماها، مرکز canvas |
| Pan | Space+drag، mid-button، InteractiveViewer |
قانون طلایی: هیچ layout چاپی نباید از مختصات پیکسل UI مشتق شود؛ همیشه mm → PDF.
۵.۴ تعامل موس
- Drag از toolbox → ایجاد المان در نقطه drop
- Select / multi-select (Ctrl) / marquee
- Move، resize با 8 handle؛ Shift = حفظ نسبت
- Rotate handle (زاویه با Shift قفل ۱۵°)
- Double-click متن → ویرایش inline
- Context menu: کپی، duplicate، قفل، ترتیب لایه، حذف، تبدیل به binding
- Drop فایل تصویر روی canvas
۵.۵ میانبرهای کیبورد
| کلید | عمل |
|---|---|
| Ctrl+Z / Ctrl+Y یا Ctrl+Shift+Z | Undo / Redo (حداقل ۵۰ فرمان) |
| Ctrl+S | ذخیره |
| Ctrl+C / X / V / D | کپی / برش / چسباندن / duplicate |
| Delete | حذف |
| Ctrl+A | انتخاب همه |
| Arrows | ۱ mm |
| Shift+Arrows | ۵ mm |
| Ctrl+Arrows | یک قدم grid |
Ctrl+] [ |
لایه |
| Ctrl+L | قفل |
| Esc | لغو / deselect |
| V T B Q I | ابزارها |
| Ctrl+P | پیشنمایش PDF |
Focus: canvas با Focus/CallbackShortcuts؛ وقتی Inspector text field فوکوس دارد، فلشها برای متن کار کنند نه جابهجایی المان.
۵.۶ Command pattern (Undo)
فرمانهای atomic:
AddElement,RemoveElements,MoveElements,ResizeElement,RotateElementUpdateElementProps,ReorderZ,ToggleLock,ToggleVisibleUpdateCanvas,UpdateSheet
هر فرمان: apply / revert روی LabelDesignDocument.
۵.۷ Inspector و Toolbox
Toolbox: Text, Barcode, QR, DataMatrix, Image, Rect, Line + presets سریع.
Layers: لیست z-order، چشم، قفل، rename.
Inspector: بسته به type — فونت، symbology، binding picker از کاتالوگ فیلدها، رنگ، fit تصویر.
۵.۸ اعتبارسنجی زنده در استودیو
- هشدار زرد: quiet zone کم، فونت خیلی کوچک، بارکد فشرده
- خطای قرمز: EAN نامعتبر در حالت fixed، المان خارج بوم، تداخل اجباری برای publish
- Publish فقط وقتی خطاهای قرمز صفر باشند
۵.۹ ساختار فایل UI پیشنهادی
lib/pages/business/barcode_labels/
label_templates_page.dart
label_studio_page.dart
label_print_page.dart
lib/widgets/barcode_label/studio/
label_studio_shell.dart
label_canvas.dart
label_canvas_painter.dart
label_element_widget.dart
label_toolbox.dart
label_layers_panel.dart
label_inspector.dart
label_rulers.dart
label_studio_shortcuts.dart
label_studio_history.dart
lib/models/barcode_label/studio/
label_studio_state.dart
label_studio_commands.dart
۵.۱۰ چکلیست فاز B
طراحی
- چیدمان استودیو
- قواعد اسکیل/zoom/snap
- موس و کیبورد
- Undo command list
- ساختار فایلها
- قوانین validation استودیو
پیادهسازی
- Shell استودیو + route + منو
- Canvas + grid + zoom/pan (InteractiveViewer، مختصات mm)
- Toolbox + ایجاد المانها (کلیک ابزار)
- Selection + drag move + snap به grid
- Resize handles / rotate handle
- Inspector + binding picker + symbology
- Layers panel
- Shortcuts پایه + Undo/Redo (Ctrl+Z/Y)
- History undo/redo
- Preview PDF از همان renderer فاز A
- ذخیره / publish از استودیو
- نشانگر تغییرات ذخیرهنشده (dirty)
- Unsaved changes guard روی خروج route
- خطکش mm
تست/پذیرش
- ساخت طرح ۵۰×۳۰ با متن+بارکد+لوگو و چاپ قابل اسکن
- Undo پس از ۱۰ عمل متوالی درست برمیگردد
- Zoom fit و ۱۰۰٪ مختصات mm را خراب نمیکند
۶) فاز C — اتصال عملیات (طراحی ✅ · پیادهسازی ❌)
۶.۱ هدف فاز
مصرف واقعی طرحها از کالاها، تعدادی/گروهی، اکسل، سریال؛ جایگزینی تدریجی flow چاپ پیشرفته پشت گیت افزونه.
۶.۲ نقاط ورود کالاها
در products_page.dart (و فرم کالا):
| ورود | رفتار با افزونه فعال | بدون افزونه |
|---|---|---|
| چاپ بارکد عمومی | دیالوگ پیشرفته با انتخاب طرح | دیالوگ ساده فعلی |
| چاپ واحد یونیک | همان | ساده فعلی |
| چاپ از فرم کالا | دیالوگ برای همان کالا | ساده/مخفی پیشرفته |
دیالوگ پیشرفته (LabelPrintJobDialog):
- انتخاب طرح (پیشفرض از قبل selected)
- Thumbnail + نام طرح
- جدول آیتمها: نام، کد، بارکد، qty
- Override موقت sheet (اختیاری)
- پیشنمایش صفحه اول
- خروجی PDF / اشتراک / (فاز D) چاپ
۶.۳ منابع داده چاپ
| source | توضیح |
|---|---|
products |
کالاهای انتخابشده؛ general barcode |
instances |
واحدهای یونیک |
excel |
ردیف فایل |
serial_range |
از–تا + prefix/suffix |
۶.۴ اکسل
قالب ستونها (حداقلی):
| ستون | اجباری | توضیح |
|---|---|---|
| code | خیر* | match کالا |
| barcode | خیر* | مقدار بارکد |
| name | خیر | override نام |
| qty | بله | تعداد چاپ |
| price | خیر | |
| serial | خیر | |
| custom_1..n | خیر | برای bindingهای سفارشی بعدی |
* حداقل یکی از code یا barcode لازم است مگر حالت «داده خام».
Flow: دانلود قالب → انتخاب فایل → dry-run → تأیید → ساخت job → PDF.
Shell مشترک: excel_import_dialog_shell.dart.
۶.۵ چاپ سریالی
- prefix + start + end + pad length + suffix
- qty per value
- پیشنمایش ۱۰ مقدار اول
- محدودیت سقف تعداد برچسب در یک job (مثلاً ۱۰٬۰۰۰) با پیام واضح
۶.۶ همگامسازی با موجودی ساده هسته
- هسته:
ProductLabelPrintDialogبدون طرح میماند. - افزونه: مسیر جدید؛ دکمه/منوی «چاپ پیشرفته برچسب» واضح برچسبگذاری شود تا کاربر سردرگم نشود.
- اگر default تعریف نشده: اجبار به انتخاب طرح یا پیشنهاد ساخت از preset.
۶.۷ چکلیست فاز C
طراحی
- نقاط ورود کالا
- دیالوگ job چاپ
- اکسل و سریال
- سیاست همزیستی با چاپ ساده
پیادهسازی
LabelPrintJobDialog+ اتصال renderer- اتصال
products_pagebulk actions (منوی چاپ حرفهای) - چاپ از فرم کالا (اختیاری باقیمانده)
- صفحه/دیالوگ اکسل
- صفحه/دیالوگ سریال
- resolve default template در UI
- پیامها و empty states وقتی طرحی نیست
تست/پذیرش
- چاپ ۲۰ کالا با qty متفاوت روی A4
- اکسل dry-run خطاها را نشان میدهد
- بدون افزونه مسیر ساده Intact بماند
۷) فاز D — چاپ پیشرفته (طراحی ✅ · پیادهسازی ✅)
۷.۱ اهداف
- چاپ سیستم از PDF لیبل (
Printing.layoutPdf) - پروفایل چاپگر رولی / حرارتی / Zebra (native)
- دکمه چاپ با طرح در فرم تککالا
۷.۲ چاپ سیستم
- ویندوز/اندروید: دیالوگ OS
- وب: ذخیره PDF + راهنما
۷.۳ پروفایل رولی (native-only)
مسیر پایدار: pdf_spooler با صفحه به اندازه بوم.
ZPL آزمایشی (TCP بدون پکیج جدید) طبق design/adr_roll_printer.md.
۷.۴ چکلیست فاز D
طراحی
- قرارداد چاپ سیستم
- مدل پروفایل رولی
پیادهسازی
- دکمه Print با
layoutPdfروی ویندوز/اندروید (و راهنمای وب) - اسپایک پکیج رولی و ADR (
adr_roll_printer.md— بدون dependency جدید) - CRUD پروفایل چاپگر (
barcode-labels/printers+ API settings) - ارسال job به پروفایل (pdf_spooler کامل؛ ZPL TCP آزمایشی)
- دکمه چاپ با طرح داخل فرم تککالا
- مستند کاربر: محدودیت پلتفرمها (hint وب در UI)
تست/پذیرش
- چاپ ورقی از ویندوز روی لیزری واقعی
- (اختیاری) یک چاپگر رولی نمونه
۸) توالی پیادهسازی پیشنهادی
A1 seed+migration+API CRUD
A2 validator + Dart models
A3 LabelPdfRenderer + preset render
A4 لیست طرحها + set-default + gate
B1 studio shell + canvas mm
B2 elements DnD + inspector
B3 shortcuts + undo
B4 preview/publish integration
C1 print job dialog + products hooks
C2 excel + serial
D1 system print
D2 roll printer profiles + product form button
هر زیرمرحله پس از اتمام، چکلیست همین سند تیک میخورد و در بخش ۹ ثبت میشود.
۹) گزارش پیشرفت اجرا (لاگ)
| تاریخ | رویداد | نتیجه |
|---|---|---|
| ۲۰۲۶-۰۸-۰۶ | نگارش سناریوی کامل در سند اصلی | سناریو ✅ |
| ۲۰۲۶-۰۸-۰۶ | طراحی فاز A–D + فایلهای design/* | طراحی ✅ |
| ۲۰۲۶-۰۸-۰۶ | پیادهسازی A: migration، ORM، API، seed، gate، لیست طرحها، renderer | A عمدتاً ✅ |
| ۲۰۲۶-۰۸-۰۶ | تکمیل B: undo/redo، resize/rotate، rulers، exit guard | B ✅ |
| ۲۰۲۶-۰۸-۰۶ | تکمیل C: LabelPrintJobDialog، اتصال کالاها، اکسل، سریال | C ✅ |
| ۲۰۲۶-۰۸-۰۶ | تکمیل D1: Printing.layoutPdf + hint وب | D جزئی 🟡 (رولی مانده) |
| ۲۰۲۶-۰۸-۰۶ | تکمیل D2: پروفایل رولی/Zebra، roll PDF، دکمه فرم کالا | D ✅ |
۱۰) تصمیمهای قفلشده
- افزونه marketplace با کد
barcode_label_studio— نه قابلیت رایگان هسته برای استودیو. - چاپ ساده فعلی کالا باقی میماند.
- مختصات طراحی و چاپ: میلیمتر.
- یک schema نسخه دار:
label_design_v1. - چند طرح + یک default + انتخاب موقع چاپ.
- استودیو روی وب/ویندوز/اندروید؛ چاپ رولی فقط native.
- رندر فاز A–C: کلاینت PDF از JSON (همخوان با کدبیس فعلی لیبل).
- الگوی UX canvas نزدیک workflow editor؛ الگوی lifecycle نزدیک report templates.
۱۱) تصمیمهای باز (باید قبل/حین پیادهسازی بسته شوند)
| # | موضوع | گزینهها | وضعیت |
|---|---|---|---|
| 1 | قیمت پلنهای افزونه | همتراز HScript / Warranty | باز — محصول |
| 2 | سقف المان/تصویر/برچسب در یک job | پیشنهاد: ۵۰ المان، ۲MB/تصویر، ۱۰k برچسب | پیشنهاد شده |
| 3 | گروه المان (Group) | فاز B یا بعد | بعد از MVP استودیو |
| 4 | رندر سرور WeasyPrint علاوه بر کلاینت | اختیاری آینده | باز |
| 5 | پکیج چاپ رولی نهایی | ADR ثبت شد؛ تأیید سختافزار باز | 🟡 ADR |
۱۲) ارجاعات کدبیس
hesabixUI/hesabix_ui/lib/widgets/product/product_label_print_dialog.darthesabixUI/hesabix_ui/lib/pages/business/products_page.darthesabixUI/hesabix_ui/lib/widgets/workflow/workflow_canvas.darthesabixUI/hesabix_ui/lib/pages/business/report_template_studio_page.darthesabixAPI/adapters/db/models/report_template.pyhesabixAPI/adapters/db/seed_data/marketplace_plugins_seed.pyhesabixAPI/app/services/warehouse_postal_label_service.py
۱۳) فایلهای مرتبط این پوشه
| فایل | نقش | وضعیت |
|---|---|---|
BARCODE_LABEL_STUDIO.md |
سند اصلی زنده (همین فایل) | ✅ |
README.md |
فهرست ورود سریع | ✅ |
design/label_design_v1.schema.json |
JSON Schema رسمی سند طراحی | ✅ طراحی |
design/api_contract.md |
قرارداد API فاز A | ✅ طراحی |
design/studio_ux.md |
UX استودیو فاز B | ✅ طراحی |
design/print_job_ux.md |
UX چاپ/اکسل/سریال فاز C | ✅ طراحی |
design/phase_d_printing.md |
چاپ سیستم و رولی فاز D | ✅ طراحی |
design/adr_roll_printer.md |
ADR اسپایک چاپگر رولی | ✅ |
۱۴) قدم بعدی پیشنهادی
- اجرای migrationهای
20260806_000001و20260806_000002و فعالسازی trial افزونه - Smoke تست: preset → استودیو → publish → پروفایل رولی → چاپ از کالاها / فرم کالا
- (اختیاری) تست سختافزاری Zebra LAN برای تأیید کامل ZPL
پس از هر تست/تکمیل، چکلیست و لاگ همین سند را بهروز کنید.