Skip to main contentA-REX Core

المخططات · 02

دورة حياة الدفعة

كيف تنشأ الدفعة وتتحرك وتغيّر حالتها وتصبح دفعات أخرى وتغادر دفتر الأستاذ. والحالتان الثابتتان الوحيدتان هما 0 (ACTIVE) و255 (RETIRED، نهائية)؛ وكل ما بينهما تحدده جهة الإصدار.

الحالات والانتقالات

stateDiagram-v2
    [*] --> ACTIVE : createBatch (ISSUER_ROLE)
    [*] --> ACTIVE : مخرج transform
    ACTIVE --> ACTIVE : safeTransferFrom · burn · forcedTransfer
    ACTIVE --> Custom : setBatchStatus(1..254) (STATUS_ROLE)
    Custom --> Custom : setBatchStatus (STATUS_ROLE)
    Custom --> ACTIVE : setBatchStatus(0)
    ACTIVE --> RETIRED : setBatchStatus(255, reason)
    Custom --> RETIRED : setBatchStatus(255, reason)
    RETIRED --> RETIRED : burn فقط
    RETIRED --> [*] : totalSupply == 0
    note right of RETIRED
        حالة نهائية. لا سك ولا تحويل ولا تحويل تصنيعي.
        يظل الحرق ممكنًا (الشطب، التسليم).
    end note

من ما قبل الحصاد إلى سلعة معالَجة

timeline
    title دفعة قمح واحدة، من العقد الآجل إلى الدقيق
    ما قبل الحصاد : createBatch مع producedAt = 0 (عقد آجل أو مستحقات محصولية)
                : قد يمنع ExpiryHook التحويلات حتى الحصاد (allowPreHarvest = false)
    الحصاد : setBatchMetadata مع تجزئة مستند الحصاد
            : تُضبط producedAt عبر transform لإعادة تكوين الدفعة أو عند الإنشاء
    التخزين : يشترط AttestationHook إفادة إيصال المستودع
            : setFrozenTokens لحق امتياز؛ وforcedTransfer عند التعثر
    المعالجة : transform([قمح], [60 طن]) → [دقيق] (45 طن) بواسطة TRANSFORMER_ROLE
               : حدث BatchTransformed = حدث TransformationEvent في EPCIS
    التسليم : يقفل DeliveryHook الكميات؛ والتسوية هي التحويل مع data = deliveryId
             : setBatchStatus(255, "DELIVERED") أو burn من المستلم