# Callback AGI این پروژه یک AGI برای Asterisk است که قبل از IVR، آخرین تماس خروجی ناموفق به مشتری را در یک ساعت گذشته پیدا می‌کند. رکورد با مقدار `target = 'pending'` به‌صورت اتمیک قفل می‌شود؛ در صورت پاسخ داخلی، مقدار آن به `callback_done` تغییر می‌کند و در غیر این صورت قفل آزاد شده و تماس به IVR می‌رود. ## ساخت و نصب ```bash ./mvnw package install -m 0755 scripts/callback-agi /var/lib/asterisk/agi-bin/callback-agi ``` مسیر JAR را با متغیر `CALLBACK_AGI_JAR` تنظیم کنید. اسکریپت باید در نقطه ورود تماس ورودی به‌عنوان AGI موجود نصب شود؛ خود پروژه نیازی به تغییر dialplan ندارد. برای اجرای محلی از ریشه پروژه، wrapper به‌صورت خودکار JAR داخل `target/` را پیدا می‌کند: ```bash ./mvnw clean package printf 'agi_callerid: 09121234567\nagi_dnid: 02112345678\n\n' | ./scripts/callback-agi ``` این برنامه یک AGI غیر وب است و بدون آرگومان اجرا می‌شود. برنامه ورودی AGI را از stdin می‌خواند و تنظیمات آن از `application.properties` خوانده می‌شوند. ```bash ./mvnw spring-boot:run ``` ## تنظیمات تمام تنظیمات در فایل [`CALLBACK-CONFIG.md`](CALLBACK-CONFIG.md) مستند شده‌اند. مقادیر را مستقیماً در `src/main/resources/application.properties` تغییر دهید. مقدار `agi_callerid` نرمال می‌شود؛ پیشوندهای `+98`، `0098` و صفر ابتدایی، فاصله و خط تیره حذف می‌شوند. `agi_dnid` برای ثبت رکورد لازم نیست و برای تطبیق callback عمداً استفاده نمی‌شود. ## نکات دیتابیس برای سرعت lookup، در صورت امکان migration زیر را اجرا کنید: ```sql CREATE INDEX IF NOT EXISTS idx_callback_lookup ON tbl_cdr (real_dst, calldate DESC) WHERE direction_call = 'outbound' AND disposition IN ('NO ANSWER', 'BUSY', 'FAILED'); ``` ستون `target` باید nullable باشد. نام و رمز عبور دیتابیس را در source code قرار ندهید.