المخططات · 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 من المستلم