# ERPFlow — Asset & Inventory Management
## Business Logic, System Conformance Audit & End-to-End QA Manual Testing Guide

---

## ১. অ্যাসেট মডিউল কেন তৈরি করা হয়েছে এবং এর ব্যবসায়িক দর্শন (Business Logic & Core Philosophy)

### ১.১ কেন এই মডিউলটি প্রয়োজন হলো? (The "Why")
পূর্বে ERPFlow সিস্টেমে শুধুমাত্র Employee মডিউলের ভেতর একটি সাধারণ `employee_assets` টেবিল ছিল। সেটি ছিল মূলত একটি **HR Custody List**—অর্থাৎ কোন কর্মীকে কী ডিভাইস (যেমন: ল্যাপটপ বা হেডফোন) দেওয়া হয়েছে তা শুধু নাম ও কোড লিখে রাখা হতো।

**পূর্ববর্তী সিস্টেমের সীমাবদ্ধতা:**
1. কোনো সুনির্দিষ্ট আইটেম ক্যাটালগ বা ক্যাটাগরি ছিল না।
2. সিরিয়ালাইজড অ্যাসেট (মেশিনারি, আইটি ডিভাইস) এবং কোয়ান্টিটি ইনভেন্টরি (চেয়ার, স্টেশনারি, কেবল) আলাদা ট্র্যাক করা যেত না।
3. মাল্টি-লেভেল লোকেশন ট্র্যাকিং (ব্রাঞ্চ → ফ্লোর → রুম → স্টোর) ছিল না।
4. ব্যালেন্সের কোনো অপরিবর্তনীয় খতিয়ান (Immutable Stock Ledger) ছিল না, ফলে নেগেটিভ স্টক বা স্টক ম্যানিপুলেশন রোধ করা অসম্ভব ছিল।
5. সম্পদ গ্রহণ ও প্রদানের কোনো ডিজিটাল অ্যাকনলেজমেন্ট বা হ্যান্ডওভার প্রমাণ ছিল না।
6. ফিজিক্যাল অডিট বা স্টক কাউন্ট ভেরিফিকেশন সেশনের সুবিধা ছিল না।
7. স্থানান্তর (Transfer), বাতিল (Disposal), অপচয়/ক্ষতি (Write-off) বা স্টক সমন্বয়ের (Adjustment) জন্য মাল্টি-লেভেল অ্যাপ্রুভাল ওয়ার্কফ্লোর ব্যবস্থা ছিল না।
8. ওয়ারেন্টি, এএমসি (AMC) এবং সার্ভিস প্রোভাইডার ট্র্যাকিংয়ের কোনো ব্যবস্থা ছিল না।
9. ফিন্যান্স অ্যাকাউন্টিংয়ের জন্য কোনো অ্যাকুইজিশন, ডিসপোজাল বা রাইট-অফ কস্ট ফ্যাক্ট আউটবক্স ছিল না।

এই সব সীমাবদ্ধতা দূর করে এন্টারপ্রাইজ গ্রেড **Asset & Inventory Management System** হিসেবে নতুন `Asset` মডিউলটি আর্কিটেক্ট করা হয়েছে।

---

### ১.২ মডিউলের মূল আর্কিটেকচারাল কম্পোনেন্ট এবং কার কী কাজ

| কম্পোনেন্ট | কী কাজ করে | কেন এটি গুরুত্বপূর্ণ |
|---|---|---|
| **১. Master Data (Catalog & Locations)** | ক্যাটাগরি, ইউনিট (UoM), কাস্টম অ্যাট্রিবিউট, আইটেম এবং লোকেশন ট্রির মাস্টার তৈরি করে। | আইটেম তৈরির সময় Tracking Mode (`SERIALIZED` বনাম `QUANTITY`) নির্ধারণ করে। একবার লেনদেন শুরু হলে ট্র্যাকিং মোড লক হয়ে যায়। |
| **২. Serialized Asset Registry** | প্রতিটি নির্দিষ্ট অ্যাসেটের লাইফসাইকেল ট্র্যাক করে (অ্যাসেট কোড, সিরিয়াল নম্বর, ক্রয়মূল্য, অবস্থা, বর্তমান লোকেশন)। | প্রতিটি মেশিনের জন্য আলাদা ডিজিটাল আইডেন্টিটি দেয়। স্ট্যাটাস: `IN_STOCK`, `ASSIGNED`, `UNDER_MAINTENANCE`, `DISPOSED`, `WRITTEN_OFF`, `LOST`। |
| **৩. Quantity Inventory Ledger** | বাল্ক গুদামজাত পণ্যের অপরিবর্তনীয় লেনদেন খতিয়ান (`inventory_transactions`) এবং বর্তমান স্টক প্রজেকশন (`inventory_balances`)। | **Negative Stock Hard-Block:** সিস্টেমে ব্যালেন্স না থাকলে ১ পিসও ইস্যু বা ট্রান্সফার করা যাবে না। Concurrency Safe Pessimistic Locking ব্যবহার করে। |
| **৪. QR & Barcode Tagging** | প্রতি অ্যাসেটের জন্য অনন্য ক্রিপ্টোগ্রাফিক টোকেন জেনারেট করে, কিউআর কোড লেবেল প্রিন্ট (Single & Bulk PDF) এবং অথেনটিকেটেড স্ক্যান সুবিধা দেয়। | মোবাইলে বা ওয়েবে স্ক্যান করলেই অনুমোদিত ব্যক্তি পুরো হিস্ট্রি দেখতে পায়। রোল অনুযায়ী ফিন্যান্সিয়াল কস্ট ফিল্ড স্বয়ংক্রিয়ভাবে গোপন থাকে। |
| **৫. Custody Assignment & Handover** | কর্মী বা ডিপার্টমেন্টে অ্যাসেট বরাদ্দ করা এবং ডিজিটাল রিসিপ্ট/হ্যান্ডওভার অ্যাকনলেজমেন্ট নেওয়া। | কোনো কর্মী অস্বীকার করতে পারে না। রিজাইন বা টার্মিনেশনের সময় `Exit Outstanding Assets` রিপোর্টে বকেয়া অ্যাসেটের তালিকা দেখা যায়। প্রক্সি অ্যাকনলেজমেন্টের সুবিধাও রয়েছে। |
| **৬. Physical Verification & Audit** | নির্দিষ্ট লোকেশন বা ক্যাটাগরির জন্য অডিট সেশন খুলে ফিজিক্যাল স্টক যাচাই করা। | **Golden Rule:** ভেরিফিকেশন সেশন চলাকালে বা শেষ হলেও সরাসরি স্টক পরিবর্তন হয় না! এটি কেবল একটি "Draft Adjustment" তৈরি করে, যা অ্যাপ্রুভ হওয়ার পরেই স্টক আপডেট হয়। |
| **৭. Platform Approval Engine** | ট্রান্সফার, ডিসপোজাল, রাইট-অফ এবং স্টক অ্যাডজাস্টমেন্টকে সেন্ট্রাল অ্যাপ্রুভাল গেটওয়ের মাধ্যমে এক্সিকিউট করে। | কোনো কর্মকর্তা এককভাবে কোনো অ্যাসেট ডিসপোজ বা স্টক কমাতে পারবে না। কোম্পানি সেটিংসে অ্যাপ্রুভাল অন/অফ করা যায়। |
| **৮. Warranty & AMC Contracts** | ভেন্ডর/সার্ভিস প্রোভাইডারদের সাথে ওয়ারেন্টি ও বার্ষিক সার্ভিস কন্ট্রাক্ট (AMC) লিংক করা এবং ডকুমেন্ট আপলোড করা। | এক্সপায়ারি রিপোর্ট দেখে সময়মতো সার্ভিস ও ওয়ারেন্টি নবায়ন নিশ্চিত করা যায়। |
| **৯. Finance Events Outbox** | ক্রয়মূল্য (Acquisition), বাতিল (Disposal) এবং অপচয় (Write-off) এর অপরিবর্তনীয় কস্ট ফ্যাক্ট রেকর্ড করে (`asset_finance_events`)। | ভবিষ্যতে ফিন্যান্স ও জিএল (General Ledger) মডিউলের জন্য সুরক্ষিত ডেটা সোর্স হিসেবে কাজ করে। |

---

## ২. ডকুমেন্টস বনাম সিস্টেম কনফরমেন্স অডিট (Documentation vs Implementation Audit)

আমরা `docs/asset-management/` ডিরেক্টরির সকল ডকুমেন্টস (Features Overview BN, Implementation Plan, WBS, Database Schema, Task Cards, Handoff Notes) পুঙ্খানুপুঙ্খ পর্যালোচনা করেছি এবং বর্তমান কোডবেস পরীক্ষা করেছি:

### ২.১ কনফরমেন্স সারাংশ
1. **ডাটাবেস স্কিমা (Schema Compliance):**
   - V1-এর জন্য নির্ধারিত সকল ৩৪টি মাইগ্রেশন টেবিল সফলভাবে বিদ্যমান।
   - অতিরিক্তভাবে পারফরম্যান্স টিউনিং মাইগ্রেশন `2026_10_18_000001_add_performance_indexes_to_asset_reports_tables.php` যুক্ত করা হয়েছে যা রিপোর্ট কুয়েরিকে অপ্টিমাইজ করেছে।
2. **লেগ্যাসি ডেটা ব্রিজ ও ফ্রিজ (Legacy Bridge Compliance):**
   - পুরানো `assets` এবং `employee_assets` টেবিলের সমান্তরাল ডুপ্লিকেট রাইট বন্ধ করা হয়েছে (Legacy batch writer is frozen)।
   - নতুন অ্যাসাইনমেন্ট তৈরি হলে তা স্বয়ংক্রিয়ভাবে লেগ্যাসি ভিউয়ারের সাথে সিঙ্ক হয়।
3. **টেস্টিং কভারেজ ও সিস্টেম কোয়ালিটি:**
   - **Backend PHPUnit Tests:** **৫০৬টি টেস্ট এবং ২৩৩৪টি Assertion** শতভাগ পাস করেছে (০ টি ফেইলিউর)।
   - **Frontend Vitest Tests:** **১৮টি টেস্ট** শতভাগ পাস করেছে।
4. **ইমপোর্ট বনাম ম্যানুয়াল রিসিপ্ট আর্কিটেকচার:**
   - ওপেনিং ব্যালেন্স এক্সেল ইমপোর্ট স্টেজিং ফাউন্ডেশন (AST-1.8.2) প্রস্তুত আছে।
   - বর্তমানে সিস্টেমে সরাসরি ও নিরাপদ স্টক গ্রহণ ও সিরিয়ালাইজড অ্যাসেট ইন্টেক করার জন্য `Manual Receipt` (`/asset/receipts/manual`) ফিচারটি সম্পূর্ণ কার্যকর ও ইন্টিগ্রেটেড।

---

## ৩. স্টেপ-বাই-স্টেপ ম্যানুয়াল টেস্টিং গাইডলাইন (Step-by-Step QA Manual Testing Plan)

ওয়েবসাইটে সরাসরি গিয়ে টেস্ট করার জন্য **ডিপেন্ডেন্সি বা তৈরির ধারাবাহিকতা** অত্যন্ত গুরুত্বপূর্ণ। উদাহরণস্বরূপ: আগে ক্যাটাগরি ও ইউনিট তৈরি না করলে আইটেম তৈরি করা যাবে না; আবার আইটেম তৈরি না করলে অ্যাসেট বা স্টক তৈরি করা যাবে না।

নিচে একদম ক্রমানুসারে (Order of Execution) টেস্ট করার সুনির্দিষ্ট গাইডলাইন দেওয়া হলো:

```text
[Step 1: Configuration Masters]
  Units of Measure ──► Categories (with Attributes) ──► Asset Locations
                                │
                                ▼
                       [Step 2: Items Catalog]
               (Serialized Items & Quantity Items)
                                │
                                ▼
                       [Step 3: Stock Receipts]
                    (Manual Receipt Intake Engine)
                                │
            ┌───────────────────┴───────────────────┐
            ▼                                       ▼
 [Step 4A: Serialized Flow]             [Step 4B: Quantity Flow]
  • Asset Registry Inspection            • Stock by Location View
  • Tag Issue & Print Labels             • Location-to-Location Transfer
  • Employee Custody Assignment          • Negative Stock Prevention Check
  • Handover Acknowledge / Proxy
  • Warranty & AMC Linking
  • Service History Logging
            │                                       │
            └───────────────────┬───────────────────┘
                                ▼
         [Step 5: Physical Verification & Stock Count Audit]
          • Start Session for Location
          • Scan-to-Verify Serialized Assets
          • Physical Count for Quantity Items
          • Complete Session ──► Generates Draft Adjustment
                                │
                                ▼
                     [Step 6: Approval Engine]
          • Asset Transfer Approval
          • Asset Disposal / Write-Off Approval
          • Inventory Adjustment Approval (Posts Ledger)
                                │
                                ▼
                  [Step 7: Reports & Finance Check]
          • Inventory Movement & Variance Reports
          • Exit Outstanding Assets Report
          • Warranty / AMC Expiry Report
          • Acquisition Costs & Finance Outbox Check
```

---

### ধাপ ১: কনফিগারেশন মাস্টার্স তৈরি (Configuration Masters Setup)

#### ১.১ ইউনিট অব মেজার (Units of Measure - UoM)
- **কোথায় যাবেন:** সাইডবার মেনু → **Asset Management** → **Configuration** → **Units** ট্যাব (বা সরাসরি URL: `/asset/units`)
- **টেস্ট কেস ১ (পজিটিভ):**
  - **Action:** `+ Add Unit` বাটনে ক্লিক করুন।
  - **Inputs:**
    - Name: `Piece`
    - Code: `PCS`
    - Decimal Places: `0`
  - **Expected:** ইউনিট সফলভাবে তৈরি হবে এবং টেবিলে `PCS` প্রদর্শিত হবে।
- **টেস্ট কেস ২ (কোয়ান্টিটি আইটেমের জন্য ফ্র্যাকশনাল ইউনিট):**
  - **Inputs:** Name: `Kilogram`, Code: `KG`, Decimal Places: `2`
- **টেস্ট কেস ৩ (নেগেটিভ/ভ্যালিডেশন):**
  - একই কোড `PCS` পুনরায় তৈরি করার চেষ্টা করুন।
  - **Expected:** "The code has already been taken" ভ্যালিডেশন এরর আসবে।

---

#### ১.২ ক্যাটাগরি ও কাস্টম অ্যাট্রিবিউট (Categories & Dynamic Attributes)
- **কোথায় যাবেন:** **Asset Management** → **Configuration** → **Categories** ট্যাব (`/asset/categories`)
- **টেস্ট কেস ১ (প্যারেন্ট ক্যাটাগরি):**
  - **Inputs:**
    - Name: `IT Equipment`
    - Code: `CAT-IT`
    - Parent Category: *(None / Blank)*
  - **Expected:** সেভ হবে এবং টেবিলে আসবে।
- **টেস্ট কেস ২ (চাইল্ড/সাব-ক্যাটাগরি):**
  - **Inputs:**
    - Name: `Laptops`
    - Code: `CAT-LAP`
    - Parent Category: `IT Equipment`
  - **Expected:** হায়ারার্কি অনুযায়ী চাইল্ড ক্যাটাগরি হিসেবে যুক্ত হবে।
- **টেস্ট কেস ৩ (কাস্টম অ্যাট্রিবিউট যোগ করা):**
  - `Laptops` ক্যাটাগরির অ্যাকশন থেকে `Attributes` বাটনে ক্লিক করুন।
  - অ্যাট্রিবিউট ১: Name: `Brand`, Code: `attr_brand`, Type: `Text`, Required: `Yes`
  - অ্যাট্রিবিউট ২: Name: `RAM (GB)`, Code: `attr_ram`, Type: `Number`, Required: `No`
  - **Expected:** ক্যাটাগরির সাথে অ্যাট্রিবিউট সফলভাবে লিংক হবে।
- **টেস্ট কেস ৪ (নন-সিরিয়ালাইজড ক্যাটাগরি):**
  - Name: `Office Furniture`, Code: `CAT-FURN` তৈরি করুন।

---

#### ১.৩ লোকেশন ট্রি তৈরি (Asset Locations)
- **কোথায় যাবেন:** **Asset Management** → **Configuration** → **Locations** ট্যাব (`/asset/locations`)
- **টেস্ট কেস ১ (হেড অফিস লোকেশন):**
  - **Inputs:**
    - Name: `Dhaka Head Office`
    - Code: `LOC-DHK-HQ`
    - Work Location: ড্রপডাউন থেকে কোম্পানির বিদ্যমান একটি Work Location সিলেক্ট করুন।
    - Parent Location: *(None)*
  - **Expected:** রুট লোকেশন হিসেবে সেভ হবে।
- **টেস্ট কেস ২ (সাব-লোকেশন / ফ্লোর / স্টোর):**
  - সাব-লোকেশন ১: Name: `Server Room (4th Floor)`, Code: `LOC-SRV-4F`, Parent: `Dhaka Head Office`
  - সাব-লোকেশন ২: Name: `Central IT Store`, Code: `LOC-IT-STR`, Parent: `Dhaka Head Office`
  - সাব-লোকেশন ৩: Name: `Operations Floor`, Code: `LOC-OPS-FLR`, Parent: `Dhaka Head Office`
  - **Expected:** লোকেশন ট্রিতে সাব-নোডগুলো সঠিকভাবে দেখাবে।

---

### ধাপ ২: আইটেম ক্যাটালগ তৈরি (Items Catalog Setup)

- **কোথায় যাবেন:** **Asset Management** → **Configuration** → **Items** ট্যাব (`/asset/items`)
- **টেস্ট কেস ১ (SERIALIZED আইটেম তৈরি):**
  - `+ Add Item` বাটনে ক্লিক করুন।
  - **Inputs:**
    - Name: `MacBook Pro 16-inch M3`
    - Item Code: `ITM-MBP-16`
    - Category: `Laptops`
    - Unit: `PCS`
    - **Tracking Mode:** `SERIALIZED` *(অত্যন্ত গুরুত্বপূর্ণ!)*
  - **Expected:** আইটেম সেভ হবে। Tracking Mode ব্যাজ `SERIALIZED` দেখাবে।
- **টেস্ট কেস ২ (QUANTITY আইটেম তৈরি):**
  - **Inputs:**
    - Name: `Ergonomic Office Chair`
    - Item Code: `ITM-CHR-01`
    - Category: `Office Furniture`
    - Unit: `PCS`
    - **Tracking Mode:** `QUANTITY` *(বাল্ক ইনভেন্টরি)*
  - **Expected:** আইটেম সেভ হবে এবং Tracking Mode `QUANTITY` দেখাবে।

---

### ধাপ ৩: স্টক গ্রহণ ও অ্যাসেট ইনটেক (Manual Receipts Intake)

- **কোথায় যাবেন:** সাইডবার মেনু → **Asset Management** → **Manual Receipt** (`/asset/receipts/manual`)
- **টেস্ট কেস ১ (Serialized Assets Intake):**
  - **Inputs:**
    - Receipt Source / Reference: `PO-2026-101`
    - Item: `MacBook Pro 16-inch M3` (SERIALIZED)
    - Destination Location: `Central IT Store`
    - Quantity: `2`
    - Unit Cost: `250000` (আলাদা ফিন্যান্স কস্ট ট্র্যাকের জন্য)
    - Serial Numbers: `SN-MBP-001`, `SN-MBP-002`
  - **Submit:** ক্লিক করুন।
  - **Expected Result:**
    1. সাকসেস মেসেজ আসবে।
    2. অ্যাসেট রেজিস্ট্রি (`/asset/registry`) পেজে গেলে স্বয়ংক্রিয়ভাবে দুটি নতুন সিরিয়ালাইজড অ্যাসেট তৈরি হবে (`IN_STOCK` স্ট্যাটাসে)।
    3. ফিন্যান্স ইভেন্ট আউটবক্সে দুটি ক্রয়মূল্য (Acquisition Cost) ইভেন্ট রেকর্ড হবে।
- **টেস্ট কেস ২ (Quantity Inventory Intake):**
  - **Inputs:**
    - Receipt Source / Reference: `PO-2026-102`
    - Item: `Ergonomic Office Chair` (QUANTITY)
    - Destination Location: `Central IT Store`
    - Quantity: `50`
    - Unit Cost: `12000`
  - **Submit:** ক্লিক করুন।
  - **Expected Result:**
    1. কোয়ান্টিটি ব্যালেন্স পেজে (`/asset/inventory/balances`) `Central IT Store` লোকেশনে এই আইটেমের ব্যালেন্স ৫০ দেখাবে।
    2. `inventory_transactions` লেজারে একটি পজিটিভ RECEIPT ট্রানজ্যাকশন পড়বে।

---

### ধাপ ৪: সিরিয়ালাইজড অ্যাসেট পরিচালনা (Tags, Custody & Handover)

#### ৪.১ কিউআর ট্যাগ ইস্যু ও লেবেল প্রিন্ট
- **কোথায় যাবেন:** **Asset Management** → **Asset Registry** (`/asset/registry`)
- **টেস্ট কেস ১ (ট্যাগ ইস্যু):**
  - `SN-MBP-001` অ্যাসেটটির সারিতে ক্লিক করে বিস্তারিত ড্রয়ার ওপেন করুন।
  - `Issue Tag` বাটনে ক্লিক করুন।
  - **Expected:** একটি ইউনিক আলফানিউমেরিক ট্যাগ টোকেন তৈরি হবে এবং স্ট্যাটাস `Active` দেখাবে।
- **টেস্ট কেস ২ (লেবেল প্রিন্ট):**
  - `Print QR Label` বাটনে ক্লিক করুন।
  - **Expected:** মোডালে উচ্চ রেজোলিউশনের কিউআর কোডসহ অ্যাসেটের নাম, কোড ও সিরিয়াল প্রিভিউ হবে এবং প্রিন্ট ডায়লগ ওপেন হবে।
- **টেস্ট কেস ৩ (স্ক্যান পেজ ভেরিফিকেশন):**
  - সাইডবার থেকে **Scan Asset** (`/asset/scan`) পেজে যান।
  - ট্যাগ টোকেন বা কোড ইনপুট দিন / স্ক্যান করুন।
  - **Expected:** তাৎক্ষণিকভাবে সম্পূর্ণ অ্যাসেট প্রোফাইল প্রদর্শিত হবে। (লগইন করা ইউজারের ফাইন্যান্স পারমিশন না থাকলে ক্রয়মূল্য গোপন থাকবে)।

#### ৪.২ এমপ্লয়ি কাস্টডি অ্যাসাইনমেন্ট ও হ্যান্ডওভার অ্যাকনলেজমেন্ট
- **কোথায় যাবেন:** **Asset Registry** (`/asset/registry`) অথবা **Assignments** (`/asset/assignments`)
- **টেস্ট কেস ১ (অ্যাসাইন করা):**
  - `SN-MBP-001` ল্যাপটপটির জন্য `Assign Asset` বাটনে ক্লিক করুন।
  - **Inputs:**
    - Assignee Type: `Employee`
    - Employee: যেকোনো একজন সক্রিয় কর্মীকে সিলেক্ট করুন।
    - Assigned Location: `Operations Floor`
    - Handover Condition: `Brand New / Excellent`
  - **Submit:** ক্লিক করুন।
  - **Expected Result:**
    1. অ্যাসেটের স্ট্যাটাস পরিবর্তন হয়ে `ASSIGNED` হবে।
    2. একটি পেন্ডিং হ্যান্ডওভার রেকর্ড তৈরি হবে (`Pending Acknowledgment`)।
    3. Employee মডিউলের প্রোফাইল ট্যাবে লেগ্যাসি ভিউয়ার আপডেট হবে।
- **টেস্ট কেস ২ (হ্যান্ডওভার অ্যাকনলেজমেন্ট):**
  - উক্ত কর্মীর অ্যাকাউন্টে লগইন করে অথবা অ্যাসাইনমেন্ট পেজ থেকে:
  - `Acknowledge Handover` বাটনে ক্লিক করে কনফার্ম করুন।
  - **Expected:** হ্যান্ডওভার স্ট্যাটাস `Acknowledged` হবে এবং টাইমস্ট্যাম্প ও অ্যাকনলেজড বাই ইউজার রেকর্ড হবে।
- **টেস্ট কেস ৩ (প্রক্সি অ্যাকনলেজমেন্ট):**
  - অন্য কোনো কর্মী যদি রিমোটে থাকে, তাহলে Authorized Admin হিসেবে `Proxy Acknowledge` বাটনে ক্লিক করুন এবং প্রক্সি রিমার্কস দিন।
  - **Expected:** প্রক্সি ইউজার হিসেবে অ্যাডমিনের নাম ও কারণ সংরক্ষিত হবে।
- **টেস্ট কেস ৪ (রিটার্ন অ্যাসেট):**
  - অ্যাসেটটি ফেরত এলে `Return Asset` বাটনে ক্লিক করুন। কন্ডিশন সিলেক্ট করুন (যেমন: `Good`)।
  - **Expected:** অ্যাসেটের স্ট্যাটাস পুনরায় `IN_STOCK` এ চলে আসবে এবং অ্যাসাইনমেন্ট ক্লোজ হবে।

---

### ধাপ ৫: কোয়ান্টিটি ইনভেন্টরি ও লোকেশন ট্রান্সফার (Quantity Inventory Flow)

- **কোথায় যাবেন:** **Asset Management** → **Stock by Location** (`/asset/inventory/balances`)
- **টেস্ট কেস ১ (স্টক ব্যালেন্স যাচাই):**
  - ফিল্টার করুন: Location = `Central IT Store`, Item = `Ergonomic Office Chair`।
  - **Expected:** বর্তমান ব্যালেন্স ৫০ টি চেয়ার দেখাবে।
- **টেস্ট কেস ২ (লোকেশন ট্রান্সফার - পজিটিভ):**
  - `Transfer Inventory` বাটনে ক্লিক করুন।
  - From Location: `Central IT Store` (বর্তমান স্টক: ৫০)
  - To Location: `Operations Floor`
  - Quantity: `10`
  - **Submit:** ক্লিক করুন।
  - **Expected:**
    - `Central IT Store` এ স্টক কমে ৪০ হবে।
    - `Operations Floor` এ স্টক বেড়ে ১০ হবে।
    - ট্রানজ্যাকশন লেজারে একটি TRANSFER_OUT এবং একটি TRANSFER_IN জোড়া এন্ট্রি তৈরি হবে।
- **টেস্ট কেস ৩ (নেগেটিভ স্টক প্রিভেনশন - নেগেটিভ টেস্ট):**
  - পুনরায় `Central IT Store` থেকে ৬০ টি চেয়ার ট্রান্সফার করার চেষ্টা করুন (যেখানে মজুদ আছে মাত্র ৪০ টি)।
  - **Expected:** সিস্টেম কঠোরভাবে আটকে দেবে: "Insufficient stock balance. Cannot proceed."। ব্যালেন্স অপরিবর্তিত থাকবে।

---

### ধাপ ৬: ওয়ারেন্টি, এএমসি ও সার্ভিস হিস্ট্রি (Warranty & Service Contracts)

- **কোথায় যাবেন:** সাইডবার → **Asset Management** → **Contracts & Warranties** (`/asset/contracts`)
- **টেস্ট কেস ১ (সার্ভিস প্রোভাইডার তৈরি):**
  - Providers ট্যাবে গিয়ে `+ Add Provider` দিন।
  - Name: `Dell Bangladesh Service Center`, Code: `SP-DELL-01`, Contact: `support@dell.com`
  - **Expected:** প্রোভাইডার সেভ হবে।
- **টেস্ট কেস ২ (ওয়ারেন্টি রেজিস্টার করা):**
  - Warranties ট্যাবে গিয়ে `+ Add Warranty` ক্লিক করুন।
  - Asset: `SN-MBP-001`, Provider: `Dell Bangladesh`, Starts: আজকের তারিখ, Ends: ১ বছর পরের তারিখ, Coverage Details: `Hardware & Screen Replacement`।
  - ফাইল আপলোড: একটি স্যাম্পল PDF ইনভয়েস আপলোড করুন।
  - **Expected:** ওয়ারেন্টি সেভ হবে। অ্যাসেটের ড্রয়ারে গেলে ওয়ারেন্টির স্ট্যাটাস `Active` দেখাবে।
- **টেস্ট কেস ৩ (সার্ভিস ইভেন্ট লগ):**
  - অ্যাসেট রেজিস্ট্রি থেকে `SN-MBP-001` ওপেন করে `Service History` ট্যাবে যান।
  - `+ Log Service Event` দিন (Summary: `Battery Health Checkup`, Service Date: আজকের তারিখ, Cost: `1500`)।
  - **Expected:** সার্ভিস লগ সেভ হবে এবং অ্যাসেটের লাইফসাইকেল হিস্ট্রিতে দৃশ্যমান হবে।

---

### ধাপ ৭: ফিজিক্যাল ভেরিফিকেশন ও স্টক কাউন্ট অডিট (Physical Verification Audit)

*এই ধাপটি সিস্টেমের অন্যতম শক্তিশালী কন্ট্রোল ফিচার।*

- **কোথায় যাবেন:** সাইডবার → **Asset Management** → **Verification** (`/asset/verification`)
- **টেস্ট কেস ১ (অডিট সেশন শুরু করা):**
  - `+ Start Verification Session` বাটনে ক্লিক করুন।
  - Session Name: `Q4 Store Audit - Central Store`
  - Target Location: `Central IT Store`
  - Mode: `ALL` (Serialized এবং Quantity উভয়ই)
  - **Submit:** ক্লিক করুন।
  - **Expected Result:**
    - সেশনের স্ট্যাটাস হবে `IN_PROGRESS`।
    - উক্ত লোকেশনে যে সমস্ত সিরিয়ালাইজড অ্যাসেট ও কোয়ান্টিটি আইটেম থাকার কথা ছিল, তাদের একটি অপরিবর্তনীয় স্ন্যাপশট (Expected Snapshot) তৈরি হবে।
- **টেস্ট কেস ২ (স্ক্যান-টু-ভেরিফাই - Serialized):**
  - সেশনের ভেতর `Scan & Verify` অপশনে যান।
  - বিদ্যমান ল্যাপটপের ট্যাগ টোকেন স্ক্যান/ইনপুট দিন।
  - **Expected:** উক্ত লাইনটি তাৎক্ষণিকভাবে `Pending` থেকে `Found` হয়ে যাবে।
- **টেস্ট কেস ৩ (কোয়ান্টিটি কাউন্ট ও ভ্যারিয়েন্স রেকর্ড):**
  - কোয়ান্টিটি লাইনে `Ergonomic Office Chair` এর পাশে `Count` বাটনে ক্লিক করুন।
  - সিস্টেমে Expected ছিল: `40`
  - আপনি Physical Count ইনপুট দিন: `38` (অর্থাৎ বাস্তব গণনায় ২টি কম পাওয়া গেছে)।
  - **Expected:** ভ্যারিয়েন্স (Variance) হিসেবে `-2` প্রদর্শিত হবে।
- **টেস্ট কেস ৪ (সেশন কমপ্লিট করা - The Golden Rule Check):**
  - `Complete Session` বাটনে ক্লিক করুন।
  - **Expected Result:**
    1. সেশনটি `COMPLETED` হবে।
    2. **স্টক ব্যালেন্স পেজে যান:** দেখতে পাবেন `Central IT Store` এ চেয়ার এখনো ৪০ টিই আছে! (সরাসরি স্টক কমেনি)।
    3. ভেরিফিকেশন সেশনটি স্বয়ংক্রিয়ভাবে একটি **Draft Inventory Adjustment** তৈরি করে রেখেছে অনুমোদনের জন্য।

---

### ধাপ ৮: মাল্টি-লেভেল অ্যাপ্রুভাল ইঞ্জিন টেস্টিং (Approval Engine Integration)

- **কোথায় যাবেন:** সাইডবার → **Asset Management** → **Approval Requests** (`/asset/requests`)
- **টেস্ট কেস ১ (স্টক অ্যাডজাস্টমেন্ট অ্যাপ্রুভাল):**
  - অ্যাডজাস্টমেন্ট লিস্টে ধাপ ৭ এ তৈরি হওয়া খসড়া অ্যাডজাস্টমেন্ট রিকোয়েস্টটি দেখুন (Quantity: `-2`)।
  - `Submit for Approval` বাটনে ক্লিক করুন।
  - অ্যাপ্রুভার/অ্যাডমিন অ্যাকাউন্ট থেকে রিকোয়েস্ট ডিটেইলে গিয়ে `Approve` বাটনে ক্লিক করুন।
  - **Expected Result:**
    1. অ্যাপ্রুভাল এক্সিকিউটর চালিত হবে।
    2. স্ট্যাটাস হবে `APPROVED` / `APPLIED`।
    3. এখন স্টক ব্যালেন্সে গিয়ে চেক করুন: চেয়ারের ব্যালেন্স ৪০ থেকে কমে ৩৮ হয়ে গেছে!
    4. লেজারে একটি `ADJUSTMENT_DOWN` ট্রানজ্যাকশন জমা হয়েছে।
- **টেস্ট কেস ২ (অ্যাসেট রাইট-অফ / ডিসপোজাল অ্যাপ্রুভাল):**
  - একটি নষ্ট অ্যাসেট সিলেক্ট করে `Write-off` রিকোয়েস্ট সাবমিট করুন (Reason: `Water Damage / Beyond Repair`)।
  - অ্যাপ্রুভ হওয়ার পর:
    - অ্যাসেটের স্ট্যাটাস হবে `WRITTEN_OFF`।
    - ফিন্যান্স ইভেন্ট আউটবক্সে একটি `WRITE_OFF` ফ্যাক্ট তৈরি হবে।

---

### ধাপ ৯: রিপোর্ট ও ফিন্যান্সিয়াল আউটবক্স ভেরিফিকেশন (Reports & Finance Outbox)

- **৯.১ Stock by Location Report:** `/asset/inventory/balances` এ ফিল্টার করে সকল লোকেশনের মোট ব্যালেন্স দেখুন এবং `Export CSV` দিন। ডেটা নিখুঁতভাবে এক্সপোর্ট হবে।
- **৯.২ Inventory Movement Report:** `/asset/reports/inventory` এ গিয়ে সকল IN/OUT/TRANSFER/ADJUSTMENT এর অডিট ট্রেইল ফিল্টার করুন।
- **৯.৩ Exit Outstanding Assets Report:** `/asset/reports/exit-outstanding` পেজে যান। কোনো কর্মীর স্ট্যাটাস যদি Resigned বা Terminated হয়, তাদের কাছে কী কী ল্যাপটপ বা সম্পদ এখনো জমা আছে তা রেড অ্যালার্টে দেখতে পাবেন।
- **৯.৪ Warranty / AMC Expiry Report:** `/asset/reports/warranty-amc-expiry` পেজে যান। ৩০, ৬০ বা ৯০ দিনের মধ্যে যেসব ওয়ারেন্টি বা চুক্তি শেষ হয়ে যাবে তাদের তালিকা ও সামারি কার্ড ফিল্টার করুন।
- **৯.৫ Acquisition Cost Report:** `/asset/reports/acquisition-costs` পেজে গিয়ে মোট ক্রয়কৃত সম্পদের ফিন্যান্সিয়াল সামারি দেখুন।

---

## ৪. বাগ হান্টিং ও সিকিউরিটি চেকিস্ট (Bug-Hunting & Security Cheatsheet for QA)

ম্যানুয়াল টেস্টিং করার সময় কোনো সম্ভাব্য বাগ বা ফাঁকফোকর আছে কিনা তা খুঁজে পেতে নিচের টেস্টগুলো চালান:

| টেস্ট সিনারিও | টেস্ট মেথড | সিস্টেমের সঠিক আচরণ (Expected Pass) |
|---|---|---|
| **১. Negative Stock Bypass** | স্টকে ১০টি আইটেম রেখে ১৫টি ট্রান্সফার করার চেষ্টা করুন। | সিস্টেম ব্লক করবে; কোনো ব্যালেন্স নেগেটিভ হতে দেবে না। |
| **২. Tracking Mode Mutation** | একবার লেনদেন ঘটা কোনো আইটেমের ট্র্যাকিং মোড `SERIALIZED` থেকে `QUANTITY` তে এডিট করার চেষ্টা করুন। | ড্রপডাউন লক থাকবে অথবা সার্ভার থেকে ৪২২ আনপ্রসেসেবল এরর আসবে। |
| **৩. Duplicate Serial Numbers** | একই কোম্পানিতে একই সিরিয়াল নম্বর দিয়ে দুটি ভিন্ন অ্যাসেট তৈরি করার চেষ্টা করুন। | ডাটাবেস ইউনিক কনস্ট্রেইন্ট ব্লক করবে; ডুপ্লিকেট সিরিয়াল তৈরি হবে না। |
| **৪. Double Assignment** | যে অ্যাসেটের স্ট্যাটাস ইতিমধ্যে `ASSIGNED`, সেটিকে পুনরায় অন্য কর্মীকে অ্যাসাইন করার চেষ্টা করুন। | অ্যাসাইন বাটন নিষ্ক্রিয় থাকবে বা এরর দেবে। আগে রিটার্ন করতে হবে। |
| **৫. Category Hierarchy Cycle** | ক্যাটাগরি A এর প্যারেন্ট B, এবং B এর প্যারেন্ট A বানানোর চেষ্টা করুন। | সাইকেল ডিটেকশন অ্যালগরিদম সার্কুলার রেফারেন্স আটকে দেবে। |
| **৬. Cost Field Data Leak (IDOR / RBAC)** | ফিন্যান্স পারমিশন নেই এমন সাধারণ ইউজার দিয়ে অ্যাসেট ডিটেইল API বা Scan API কল করে রেসপন্স চেক করুন। | JSON রেসপন্সে `acquisition_cost` ফিল্ডটি `null` থাকবে। |
| **৭. Unapproved Stock Tamper** | ভেরিফিকেশন সেশনে কোনো আইটেম মিসিং হলে অ্যাপ্রুভাল ছাড়া ব্যালেন্স কমেছে কিনা দেখুন। | ব্যালেন্স কমবে না। অ্যাডজাস্টমেন্ট ড্রাফট আকারে অ্যাপ্রুভালের অপেক্ষায় থাকবে। |
| **৮. Location Delete with Children** | যেসব লোকেশনের আন্ডারে সাব-লোকেশন বা অ্যাসেট রয়েছে, তা ডিলিট করার চেষ্টা করুন। | সিস্টেম ফরেন কি প্রোটেকশনের কারণে ডিলিট করতে দেবে না। |

---

## ৫. সংক্ষেপ ও পরবর্তী পদক্ষেপ

সিস্টেমের ব্যাকএন্ড (৫০৬টি টেস্ট) এবং ফ্রন্টএন্ড (১৮টি টেস্ট) আর্কিটেকচারাল স্পেসিফিকেশন অনুযায়ী সম্পূর্ণ কার্যকর ও পাস করেছে। আপনি উপরের ধাপ ১ থেকে ধাপ ৯ পর্যন্ত ক্রমানুসারে ব্রাউজারে গিয়ে সরাসরি টেস্ট সম্পন্ন করতে পারেন।
