604 lines
34 KiB
JSON
604 lines
34 KiB
JSON
{
|
||
"tasks": [
|
||
{
|
||
"id": "EPIC-01-TASK-01",
|
||
"title": "Backend NestJS: HeroBanners, VetTestimonials & SmartAdvisorRules CMS Module",
|
||
"description": "Create NestJS backend module (controllers, services, DTOs) for full CRUD management of HeroBanners, VetTestimonials, and SmartAdvisorRules under /api/v1/admin/* and public endpoints.",
|
||
"architectural_layer": "business_logic",
|
||
"assigned_role": "05_dev_backend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 5,
|
||
"estimated_minutes": 30,
|
||
"dependency_task_ids": [],
|
||
"acceptance_criteria": [
|
||
"ایجاد سرویسها و کنترلرهای CMS برای بنرها، نظرات دامپزشکان و قوانین دستیار هوشمند",
|
||
"پشتیبانی کامل از CRUD در مسیرهای /api/v1/admin/* با احراز هویت ادمین"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "create_cms_dto", "description": "Create DTOs for HeroBanner, VetTestimonial, SmartAdvisorRule", "status": "done" },
|
||
{ "index": 2, "name": "create_cms_service", "description": "Implement CmsService in backend", "status": "done" },
|
||
{ "index": 3, "name": "create_cms_controller", "description": "Implement CmsController under /api/v1/admin/cms and /api/v1/cms", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-01-TASK-02",
|
||
"title": "Backend NestJS: B2B Wholesale Application & License Upload API",
|
||
"description": "Create endpoints for B2B wholesale license upload (/api/v1/wholesale/apply) and admin verification approval (/api/v1/admin/wholesale/requests) to upgrade user roles to User_Wholesale.",
|
||
"architectural_layer": "business_logic",
|
||
"assigned_role": "05_dev_backend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 4,
|
||
"estimated_minutes": 25,
|
||
"dependency_task_ids": ["EPIC-01-TASK-01"],
|
||
"acceptance_criteria": [
|
||
"ثبت درخواست همکاری عمدهفروشی و آپلود پروانه کلینیک/داروخانه",
|
||
"لیستگیری و تایید/رد درخواستها در کنترلر Admin و ارتقای نقش کاربر"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "create_wholesale_dto", "description": "Create WholesaleApplyDto", "status": "done" },
|
||
{ "index": 2, "name": "create_wholesale_service", "description": "Implement WholesaleService", "status": "done" },
|
||
{ "index": 3, "name": "create_wholesale_controller", "description": "Implement WholesaleController in backend", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-01-TASK-03",
|
||
"title": "Backend NestJS: Prescription Attachment & Rx Verification Module",
|
||
"description": "Create endpoints for attaching uploaded vet prescriptions to orders with requiresRx=true and admin prescription verification.",
|
||
"architectural_layer": "business_logic",
|
||
"assigned_role": "05_dev_backend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 3,
|
||
"estimated_minutes": 20,
|
||
"dependency_task_ids": ["EPIC-01-TASK-02"],
|
||
"acceptance_criteria": [
|
||
"پشتیبانی از آپلود نسخه دارویی سگ و گربه و ثبت در سفارشات نسخه دار",
|
||
"تایید نسخه پزشکی توسط مدیر سیستم"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "add_rx_field_to_order", "description": "Update Order model/DTO with prescriptionUrl", "status": "done" },
|
||
{ "index": 2, "name": "implement_rx_verification", "description": "Implement prescription verification in OrdersService", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-02-TASK-01",
|
||
"title": "Customer App Next.js: Dynamic Hero Slider & Vet Testimonials Integration",
|
||
"description": "Replace static arrays in Hero.tsx and VetGallery.tsx with dynamic API calls fetching live HeroBanner and VetTestimonial records from NestJS API.",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 4,
|
||
"estimated_minutes": 25,
|
||
"dependency_task_ids": ["EPIC-01-TASK-01"],
|
||
"acceptance_criteria": [
|
||
"دریافت پویا و بدون داده هاردکد بنرهای اصلی و نظرات دامپزشکان",
|
||
"استفاده از next/image و رعایت کامل قواعد Next.js"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "wire_hero_component", "description": "Wire Hero.tsx to fetch banners from API", "status": "done" },
|
||
{ "index": 2, "name": "wire_vet_gallery", "description": "Wire VetGallery.tsx to fetch vet testimonials from API", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-02-TASK-02",
|
||
"title": "Customer App Next.js: SmartAdvisor Dynamic Rules & Real Product Recommendations",
|
||
"description": "Wire SmartAdvisor.tsx to fetch live advisor rules and products dynamically from NestJS backend, displaying real medical rationales for recommended Canina products.",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 3,
|
||
"estimated_minutes": 25,
|
||
"dependency_task_ids": ["EPIC-02-TASK-01"],
|
||
"acceptance_criteria": [
|
||
"توصیه هوشمند محصولات کانینا بر اساس قوانین دیتابیس و علت تجویز پزشکی",
|
||
"محاسبه دوز دقیق دارویی بر اساس وزن بدن پت"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "connect_smart_advisor_api", "description": "Fetch SmartAdvisorRules from backend", "status": "done" },
|
||
{ "index": 2, "name": "render_medical_rationale", "description": "Render medical rationale and dosage calculation", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-02-TASK-03",
|
||
"title": "Customer App Next.js: B2B Wholesale Portal & Bulk Matrix Real Order Flow",
|
||
"description": "Connect B2BPortal.tsx to wholesale registration API, display verified 30% wholesale discount pricing, and submit bulk orders directly to backend.",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 4,
|
||
"estimated_minutes": 30,
|
||
"dependency_task_ids": ["EPIC-02-TASK-02"],
|
||
"acceptance_criteria": [
|
||
"ثبت درخواست ثبتنام کلینیک/داروخانه با آپلود پروانه کسب",
|
||
"ثبت مستقیم سفارش حجمی در دیتابیس با قیمتهای عمده همکار"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "wire_b2b_application_modal", "description": "Build B2B application modal in B2BPortal.tsx", "status": "done" },
|
||
{ "index": 2, "name": "wire_b2b_checkout", "description": "Connect bulk matrix submit to NestJS Orders API", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-02-TASK-04",
|
||
"title": "Customer App Next.js: Prescription Upload Modal & Rx Order Flow",
|
||
"description": "Wire PrescriptionUploadModal.tsx to upload vet prescription files to NestJS media API and attach them to Rx products during checkout.",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 3,
|
||
"estimated_minutes": 20,
|
||
"dependency_task_ids": ["EPIC-02-TASK-03"],
|
||
"acceptance_criteria": [
|
||
"آپلود نسخه دارویی برای محصولات دارای تگ نسخه پزشک (requiresRx)",
|
||
"اتصال نسخه به سبد خرید و سفارش آنلاین"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "wire_prescription_upload", "description": "Wire PrescriptionUploadModal to media service", "status": "done" },
|
||
{ "index": 2, "name": "attach_rx_to_cart", "description": "Attach uploaded prescription ID to cart store", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-03-TASK-01",
|
||
"title": "Admin Panel React/Vite: Hero Banners & Vet Testimonials Dynamic CMS Page",
|
||
"description": "Create CMS.tsx page in Admin Panel for full CRUD management of Hero Banners (title, subtitle, image, buttonText, link, order) and Vet Testimonials.",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 4,
|
||
"estimated_minutes": 30,
|
||
"dependency_task_ids": ["EPIC-02-TASK-04"],
|
||
"acceptance_criteria": [
|
||
"افزودن، ویرایش، حذف و تغییر ترتیب بنرهای صفحه اصلی",
|
||
"مدیریت نظرات و رتبهبندی دامپزشکان"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "create_cms_page", "description": "Create CMS.tsx in admin-panel/src/pages", "status": "done" },
|
||
{ "index": 2, "name": "add_cms_sidebar_link", "description": "Add CMS link to Admin Panel sidebar navigation", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-03-TASK-02",
|
||
"title": "Admin Panel React/Vite: Wholesale Applications & License Approval Page",
|
||
"description": "Create WholesaleApplications.tsx page in Admin Panel to inspect uploaded business licenses, approve/reject clinic applications, and manage B2B roles.",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 4,
|
||
"estimated_minutes": 25,
|
||
"dependency_task_ids": ["EPIC-03-TASK-01"],
|
||
"acceptance_criteria": [
|
||
"جدول کامل در خواستهای ثبتنام همکاران با امکان پیشنمایش مدارک",
|
||
"دکمه ارتقای نقش به User_Wholesale و ارسال هشدار وضعیت"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "create_wholesale_applications_page", "description": "Create WholesaleApplications.tsx page", "status": "done" },
|
||
{ "index": 2, "name": "wire_approval_actions", "description": "Connect approve/reject actions to backend API", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-04-TASK-01",
|
||
"title": "SEO & Content: Full On-Page & Schema.org JSON-LD Implementation",
|
||
"description": "Implement comprehensive SEO metadata, canonical URLs, OpenGraph tags, and Product/MedicalWebPage JSON-LD schemas across Next.js app, populated with real Canina Germany product data.",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "12_seo_content",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 5,
|
||
"estimated_minutes": 30,
|
||
"dependency_task_ids": ["EPIC-03-TASK-02"],
|
||
"acceptance_criteria": [
|
||
"پیادهسازی کامل متادیتای پویا و JSON-LD برای تمام صفحات محصولات، دستهها و دانشنامه علمی",
|
||
"تولید نقشه سایت XML پویا و فایل robots.txt"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "implement_product_jsonld", "description": "Add Product JSON-LD script component", "status": "done" },
|
||
{ "index": 2, "name": "implement_sitemap_xml", "description": "Generate dynamic XML sitemap route in Next.js", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-05-TASK-01",
|
||
"title": "Automated Testing & Build Verification Suite (Backend + Frontends)",
|
||
"description": "Write comprehensive Jest unit/integration tests for NestJS services/guards and React component integration tests for Cart, B2BPortal, and Admin Panel pages. Verify npm run build across all 3 apps.",
|
||
"architectural_layer": "testing",
|
||
"assigned_role": "07_qa_engineer",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 5,
|
||
"estimated_minutes": 30,
|
||
"dependency_task_ids": ["EPIC-04-TASK-01"],
|
||
"acceptance_criteria": [
|
||
"پوشش بالای ۸۰٪ تستهای واحد برای سرویسهای اصلی بکاند و فرانتاند",
|
||
"اجرای موفقیتآمیز npm run build بدون خطا در هر ۳ بخش پروژه"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "write_backend_jest_tests", "description": "Write NestJS integration tests", "status": "done" },
|
||
{ "index": 2, "name": "write_frontend_tests", "description": "Write React component tests", "status": "done" },
|
||
{ "index": 3, "name": "verify_all_builds", "description": "Run npm run build in backend, application, and admin-panel", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-07-TASK-01",
|
||
"title": "Backend NestJS & Test Suite Errors Resolution",
|
||
"description": "Fix backend spec test expectations and Prisma seed dynamic imports for 100% clean type compilation and build pass.",
|
||
"architectural_layer": "business_logic",
|
||
"assigned_role": "05_dev_backend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 6,
|
||
"estimated_minutes": 20,
|
||
"dependency_task_ids": ["EPIC-05-TASK-01"],
|
||
"acceptance_criteria": [
|
||
"حل تمام خطاهای کامپایل TypeScript و تستهای واحد سرویسهای سفارشات، پتها و دیتابیس بکاند",
|
||
"اجرای موفق npx tsc --noEmit و npm run build در بکاند"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "fix_seed_custom", "description": "Fix nameFa and nameEn fields in seed-custom.ts", "status": "done" },
|
||
{ "index": 2, "name": "fix_backend_spec_tests", "description": "Fix unit test mocks in orders, pets, and users spec files", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-07-TASK-02",
|
||
"title": "Single Source of Truth Auth & Profile Mismatch Resolution",
|
||
"description": "Fix user state sync across userStore, Header, CartDrawer, and ClientLayout so unauthenticated/guest state automatically resets stale wallet, address, and pet profile data.",
|
||
"architectural_layer": "state_management",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 4,
|
||
"estimated_minutes": 25,
|
||
"dependency_task_ids": ["EPIC-07-TASK-01"],
|
||
"acceptance_criteria": [
|
||
"بازنشانی کامل تمام دادههای پروفایل و کیف پول قبلی هنگام ورود مهمان یا انقضای توکن",
|
||
"هماهنگی ۱۰۰٪ دکمه ورود هدر، تیک تمدید سبد خرید و شناسنامه پت با وضعیت توکن لاگین"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "update_user_store_guest_reset", "description": "Reset profile to empty guest state in userStore on logout/unauthenticated", "status": "done" },
|
||
{ "index": 2, "name": "sync_client_layout_auth", "description": "Sync ClientLayout mount check with localStorage token state", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-08-TASK-01",
|
||
"title": "Axios 401/403 Global Automatic Token Expiry Interceptor",
|
||
"description": "Add response interceptor in api.ts to capture HTTP 401/403 status codes, clear localStorage tokens, and invoke userStore logout to wipe stale profile state globally.",
|
||
"architectural_layer": "network_communication",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 3,
|
||
"estimated_minutes": 20,
|
||
"dependency_task_ids": ["EPIC-07-TASK-02"],
|
||
"acceptance_criteria": [
|
||
"افزودن اینترسپتور پاسخ Axios برای تشخیص ۴۰۱ و ۴۰۳",
|
||
"پاکسازی انی و خودکار توکن و ریست پروفایل به حالت مهمان در صورت انقضای جلسه"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "add_axios_401_interceptor", "description": "Add 401/403 response interceptor to api.ts", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-08-TASK-02",
|
||
"title": "Charity Round-Up Exact Math Calculation Fix",
|
||
"description": "Fix charity round-up formula in CheckoutPage.tsx and cartStore.ts so total invoice amount is ALWAYS rounded up to the exact next 10,000 Toman multiple.",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 3,
|
||
"estimated_minutes": 20,
|
||
"dependency_task_ids": ["EPIC-08-TASK-01"],
|
||
"acceptance_criteria": [
|
||
"رند کردن دقیق و ریاضیات کامل مبلغ سفارش به اولین ۱۰,۰۰۰ تومان بعدی",
|
||
"تطابق ۱۰۰٪ مبلغ اهدایی محاسبهشده با کل فاکتور بدون ناهماهنگی ریاضی"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "fix_checkout_charity_formula", "description": "Fix round-up calculation in CheckoutPage.tsx and cartStore.ts", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-08-TASK-03",
|
||
"title": "Backend OrdersService Hardening & Error Inspection",
|
||
"description": "Audit OrdersService for edge case exceptions, invalid items handling, and ensure zero unhandled exceptions during order creation.",
|
||
"architectural_layer": "business_logic",
|
||
"assigned_role": "05_dev_backend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 3,
|
||
"estimated_minutes": 20,
|
||
"dependency_task_ids": ["EPIC-08-TASK-02"],
|
||
"acceptance_criteria": [
|
||
"بررسی کامل سرویس سفارشات بکاند و رفع خطاهای بالقوه در ثبت فاکتور و تخفیفها",
|
||
"اجرای موفق بیلد تولیدی بکاند"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "audit_orders_service", "description": "Audit and fix edge case handling in orders.service.ts", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-09-TASK-01",
|
||
"title": "Prisma Client Regeneration & isRefill Type Sync",
|
||
"description": "Regenerate Prisma Client in backend node_modules so OrderCreateInput type includes isRefill and refillIntervalDays without IDE type errors.",
|
||
"architectural_layer": "database_orm",
|
||
"assigned_role": "05_dev_backend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 3,
|
||
"estimated_minutes": 15,
|
||
"dependency_task_ids": ["EPIC-08-TASK-03"],
|
||
"acceptance_criteria": [
|
||
"تولید مجدد و صحیح Prisma Client بدون تداخل پروسهها",
|
||
"برطرف شدن کامل خطای TypeScript فیلد isRefill در orders.service.ts"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "regenerate_prisma_client", "description": "Run npx prisma generate after closing locked processes", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-09-TASK-02",
|
||
"title": "Admin Panel Configurable Charity Round-Up Step",
|
||
"description": "Add configurable charity_round_step setting in Admin Panel Settings page and connect CheckoutPage.tsx to use dynamic round step (10k, 50k, etc.) from SettingsStore.",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 4,
|
||
"estimated_minutes": 25,
|
||
"dependency_task_ids": ["EPIC-09-TASK-01"],
|
||
"acceptance_criteria": [
|
||
"امکان تنظیم پلههای رند کردن مبلغ اهدایی در پنل مدیریت (Settings.tsx)",
|
||
"اعمال پله دینامیک رند کردن در CheckoutPage.tsx و محاسبه لحظهای"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "add_round_step_setting", "description": "Add charity_round_step setting in Admin Settings", "status": "done" },
|
||
{ "index": 2, "name": "wire_dynamic_round_step", "description": "Connect CheckoutPage.tsx to dynamic round step", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-09-TASK-03",
|
||
"title": "Root Cause Multi-Store Auth Sync & Pet Profile Reset",
|
||
"description": "Root cause fix: reset usePetStore and all persisted local stores when user is unauthenticated so guest users NEVER see stale pet profiles, wallet, or address data.",
|
||
"architectural_layer": "state_management",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 5,
|
||
"estimated_minutes": 30,
|
||
"dependency_task_ids": ["EPIC-09-TASK-02"],
|
||
"acceptance_criteria": [
|
||
"ریست شدن همزمان usePetStore و تمام استورها هنگام خروج یا مهمان بودن کاربر",
|
||
"جلوگیری ریشهای از خوانده شدن اسم پت یا اطلاعات کاربر قبلی در حالت خروج"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "add_pet_store_reset", "description": "Add reset method in usePetStore and call on logout", "status": "done" },
|
||
{ "index": 2, "name": "enforce_auth_guard_on_pet_store", "description": "Enforce isLoggedIn check on getActivePet()", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-10-TASK-01",
|
||
"title": "Full-Stack Wallet Payment & Balance Deduction Persistence",
|
||
"description": "Add paymentMethod to CreateOrderDto and OrdersService.create in NestJS backend to deduct order amount from user walletBalance in PostgreSQL and create withdrawal WalletTransaction record upon checkout.",
|
||
"architectural_layer": "business_logic",
|
||
"assigned_role": "05_dev_backend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 5,
|
||
"estimated_minutes": 25,
|
||
"dependency_task_ids": ["EPIC-09-TASK-03"],
|
||
"acceptance_criteria": [
|
||
"کسر واقعی و دقیق مبلغ سفارش از کیف پول کاربر در دیتابیس PostgreSQL هنگام پرداخت با کیف پول",
|
||
"ثبت تراکنش کسر از کیف پول (withdrawal) در دیتابیس و بروزرسانی لحظهای پروفایل کاربر"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "add_payment_method_dto", "description": "Add paymentMethod field to CreateOrderDto", "status": "done" },
|
||
{ "index": 2, "name": "implement_wallet_deduction_in_orders_service", "description": "Deduct user walletBalance and create WalletTransaction in OrdersService.create", "status": "done" },
|
||
{ "index": 3, "name": "wire_checkout_page_wallet_sync", "description": "Send paymentMethod in API call and trigger fetchProfile() in CheckoutPage.tsx", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-11-TASK-01",
|
||
"title": "Pet Supplement Consumption Tracking & Depletion Monitor Fix",
|
||
"description": "Ensure updatePet and setPets in usePetStore update and preserve pet consumptions array locally upon order placement so AI depletion monitor displays remaining supplement levels for active pets.",
|
||
"architectural_layer": "state_management",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 4,
|
||
"estimated_minutes": 20,
|
||
"dependency_task_ids": ["EPIC-10-TASK-01"],
|
||
"acceptance_criteria": [
|
||
"ثبت واقعی میزان مکملهای خریدهشده در پایش موجودی پت (usePetStore)",
|
||
"نمایش لحظهای مکملهای خریدهشده، درصد باقیمانده و تخمین اتمام مصرف پت در پروفایل"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "update_pet_store_consumptions_persistence", "description": "Always update local pets array in updatePet and preserve consumptions in setPets", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-12-TASK-01",
|
||
"title": "Human-Readable Order Tracking ID Display Standard",
|
||
"description": "Replace raw UUID displays with clean tracking numbers (e.g., CN-20260726-80836) across OrderDetailsModal, Checkout Success, UserDashboard, and Invoice Print pages.",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 5,
|
||
"estimated_minutes": 20,
|
||
"dependency_task_ids": ["EPIC-11-TASK-01"],
|
||
"acceptance_criteria": [
|
||
"جایگزینی کد رهگیری ملموس و کوتاه (CN-...) به جای شناسه دیتابیس (UUID) در تمام صفحات فاکتور و جزئیات سفارش",
|
||
"تسهیل پیگیری تلفنی و پشتیبانی برای کاربر"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "replace_uuid_with_tracking_number", "description": "Use trackingNumber across order UI components", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-12-TASK-02",
|
||
"title": "Premium Canina Invoice PDF & Print Delay Fix",
|
||
"description": "Fix premature window.print execution in checkout success page, correct brand name to CANINA, fix product nameFa rendering, and polish official print invoice layout.",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 5,
|
||
"estimated_minutes": 25,
|
||
"dependency_task_ids": ["EPIC-12-TASK-01"],
|
||
"acceptance_criteria": [
|
||
"تاخیر در باز شدن پنجره پرینت تا لود کامل دیتا و تصاویر بدون سفید شدن صفحه",
|
||
"اصلاح برند فاکتور به CANINA و نمایش صحیح نام فارسی محصول (nameFa) و تصویر در جدول",
|
||
"طراحی شکیل و رسمی فاکتور خرید"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "fix_invoice_print_delay", "description": "Delay window.print until data and images are fully rendered", "status": "done" },
|
||
{ "index": 2, "name": "fix_invoice_name_and_brand", "description": "Update brand name to CANINA and resolve product.nameFa undefined error", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-12-TASK-03",
|
||
"title": "Detailed Payment & Financial Cost Breakdown Display",
|
||
"description": "Display order time alongside date, payment method, refill 5% discount, coupon discount, charity donation, and shipping in OrderDetailsModal, Dashboard, and Invoice.",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 5,
|
||
"estimated_minutes": 25,
|
||
"dependency_task_ids": ["EPIC-12-TASK-02"],
|
||
"acceptance_criteria": [
|
||
"نمایش کامل تاریخ و ساعت دقیق ثبت سفارش در تمامی بخشهای فاکتور و جزئیات",
|
||
"تفکیک کامل و شفاف روش پرداخت، تخفیف تمدید ۵٪، کد تخفیف، کمک اهداشده و مبلغ نهایی"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "add_order_time_and_financial_breakdown", "description": "Render order timestamp, payment method, discounts, and charity in OrderDetailsModal and invoice", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-13-TASK-01",
|
||
"title": "Unified Order Status Badge & Label Alignment",
|
||
"description": "Align order status badge labels in UserDashboard.tsx and OrderDetailsModal.tsx (processing -> در حال پردازش, shipped -> ارسال شده, delivered -> تحویل شده).",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 3,
|
||
"estimated_minutes": 15,
|
||
"dependency_task_ids": ["EPIC-12-TASK-03"],
|
||
"acceptance_criteria": [
|
||
"تطابق ۱۰۰٪ نشان وضعیت سفارش بین لیست تاریخچه و مدال جزئیات سفارش (در حال پردازش / ارسال شده / تحویل شده)"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "unify_order_status_badges", "description": "Unify status labels across UserDashboard and OrderDetailsModal", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-14-TASK-01",
|
||
"title": "Backend Admin Order Search, Includes & Tracking Number Support",
|
||
"description": "Expand getOrders query to include nested orderItems.product and user details, add multi-field search (trackingNumber, customer name, phone), and support updating trackingNumber in updateOrderStatus.",
|
||
"architectural_layer": "business_logic",
|
||
"assigned_role": "05_dev_backend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 3,
|
||
"estimated_minutes": 20,
|
||
"dependency_task_ids": ["EPIC-13-TASK-01"],
|
||
"acceptance_criteria": [
|
||
"پشتیبانی کامل بکاند از جستجوی شماره پیگیری، نام کاربر و تلفن",
|
||
"امکان بروزرسانی همزمان کد پیگیری پستی و وضعیت سفارش توسط ادمین"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "expand_admin_orders_backend", "description": "Update getOrders includes and add trackingNumber support to updateOrderStatus", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-14-TASK-02",
|
||
"title": "Admin Panel Order Details & Official Invoice Modal Overhaul",
|
||
"description": "Build comprehensive AdminOrderModal in Orders.tsx featuring customer details, status dropdown, tracking code editor, full product breakdown, financial summary, and print invoice button.",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 3,
|
||
"estimated_minutes": 25,
|
||
"dependency_task_ids": ["EPIC-14-TASK-01"],
|
||
"acceptance_criteria": [
|
||
"عملکرد ۱۰۰٪ دکمه مشاهده فاکتور و باز شدن مدال جامع جزئیات سفارش ادمین",
|
||
"امکان ویرایش و ثبت کد پیگیری پستی و تغییر مستقیم وضعیت سفارش از جدول و مدال",
|
||
"چاپ مستقیم فاکتور رسمی از داخل پنل مدیریت"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "build_admin_order_modal", "description": "Build AdminOrderModal with tracking editor, status changer, and invoice printer in Orders.tsx", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-15-TASK-01",
|
||
"title": "Refill & Payment Method State Mapping Persistence",
|
||
"description": "Map isRefill and paymentMethod in cartStore.ts addOrder and setOrders so refill status is preserved across application and backend syncing.",
|
||
"architectural_layer": "state_management",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 3,
|
||
"estimated_minutes": 15,
|
||
"dependency_task_ids": ["EPIC-14-TASK-02"],
|
||
"acceptance_criteria": [
|
||
"حفظ و نگهداری وضعیت isRefill در تمامی سفارشات دریافت شده از بکاند",
|
||
"نمایش دقیق تخفیف تمدید ۵٪ در محاسبات سبد خرید"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "map_refill_in_cart_store", "description": "Map isRefill and paymentMethod in cartStore addOrder and setOrders", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-15-TASK-02",
|
||
"title": "Refill UX & Loyalty Program Clarification",
|
||
"description": "Improve description and tooltip for Refill subscription in CheckoutPage.tsx explaining that Refill is a free loyalty subscription program providing automated re-orders and 5% lifetime discounts.",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 2,
|
||
"estimated_minutes": 15,
|
||
"dependency_task_ids": ["EPIC-15-TASK-01"],
|
||
"acceptance_criteria": [
|
||
"توضیح واضح و شفاف کارکرد سرویس تمدید خودکار (برنامه وفاداری رایگان با ۵٪ تخفیف دائم)",
|
||
"رفع ابهام کاربر در خصوص عدم وجود هزینه پنهان یا اضافی برای سرویس تمدید"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "clarify_refill_ux", "description": "Update Refill section text and tooltips in CheckoutPage.tsx", "status": "done" }
|
||
]
|
||
},
|
||
{
|
||
"id": "EPIC-15-TASK-03",
|
||
"title": "Full-Stack Refill Badge & Discount Breakdown Display",
|
||
"description": "Render Refill badge and explicit 5% discount line item across Checkout, OrderSuccess, UserDashboard, OrderDetailsModal, and Admin Panel Orders.",
|
||
"architectural_layer": "presentation_ui",
|
||
"assigned_role": "06_dev_frontend",
|
||
"priority": "HIGH",
|
||
"status": "completed",
|
||
"max_files_allowed": 5,
|
||
"estimated_minutes": 25,
|
||
"dependency_task_ids": ["EPIC-15-TASK-02"],
|
||
"acceptance_criteria": [
|
||
"نمایش نشان اختصاصی «تمدید خودکار ۵٪-» در تمام مدالها، لیستها، فاکتورها و پنل مدیریت ادمین",
|
||
"نمایش خط ردیف شفاف «تخفیف تمدید خودکار (۵٪)» در فاکتور نهایی"
|
||
],
|
||
"sub_steps": [
|
||
{ "index": 1, "name": "render_refill_badges_and_discounts", "description": "Add Refill badge and discount row in OrderSuccess, UserDashboard, OrderDetailsModal, and Admin Orders", "status": "done" }
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"total": 30,
|
||
"completed": 30,
|
||
"in_progress": 0,
|
||
"pending": 0,
|
||
"generated_at": "2026-07-27T11:40:00Z",
|
||
"decomposition_pass": 13
|
||
}
|
||
} |