# معماری CalcGard

```mermaid
flowchart TD
    B[ربات فروش] -->|ساخت سفارش با API Key| P[پنل CalcGard]
    S[پیامک بانک مقصد] -->|RECEIVE_SMS| A[اپ اندروید]
    P -->|الگوهای فعال| A
    A -->|مبلغ + زمان + hash، با HMAC| P
    P -->|تطبیق دقیق| M{یک سفارش هم‌مبلغ؟}
    M -->|بله| W[وب‌هوک payment.paid]
    M -->|خیر یا چند مورد| R[بررسی دستی]
    W --> B
```

## مرز اعتماد

- ربات با API Key هر کسب‌وکار شناخته می‌شود.
- گوشی با token تصادفی و secret رمزنگاری‌شده جفت می‌شود.
- الگوها فقط از کسب‌وکار همان دستگاه دریافت می‌شوند.
- سرور متن خام پیامک را دریافت نمی‌کند؛ بنابراین در صورت نیاز به عیب‌یابی، مالک باید نمونه را آگاهانه در فرم آموزش وارد کند.
- وب‌هوک با راز جداگانه امضا می‌شود و ربات باید امضا و idempotency را کنترل کند.

## منطق تطبیق

1. سفارش باید هم‌مبلغ باشد و زمان دریافت SMS داخل پنجرهٔ سفارش قرار بگیرد.
2. اگر یک گزینه وجود داشته باشد، Payment و Transaction در یک تراکنش دیتابیس به هم متصل می‌شوند.
3. اگر هیچ گزینه‌ای نباشد، SMS به‌عنوان `received` باقی می‌ماند.
4. اگر چند گزینه وجود داشته باشد، وضعیت Transaction برابر `manual_review` می‌شود.
5. تطبیق دستی فقط سفارش هم‌مبلغ و هنوز pending را قبول می‌کند.

اگر گوشی موقتاً آفلاین باشد، زمان خود SMS ملاک قرار می‌گیرد؛ بنابراین رسیدن دیرهنگام صف به سرور، پرداختی را که در مهلت انجام شده از بین نمی‌برد. اختلاف ساعت دستگاه بیش از پنج دقیقه در لایهٔ امضای درخواست پذیرفته نمی‌شود.
