215 lines
8.5 KiB
PHP
215 lines
8.5 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Automation;
|
|
|
|
use App\Models\Product;
|
|
|
|
class AutomationCatalog
|
|
{
|
|
public const TRIGGER_SCHEDULE = 'schedule';
|
|
|
|
public const TRIGGER_EVENT = 'event';
|
|
|
|
public const TRIGGER_PRICE = 'price';
|
|
|
|
public const CHANNEL_SMS = 'sms';
|
|
|
|
public const CHANNEL_IN_APP = 'in_app';
|
|
|
|
public const EVENTS = [
|
|
['key' => 'customer.login', 'name' => 'ورود کاربر'],
|
|
['key' => 'order.buy_success', 'name' => 'خرید موفق'],
|
|
['key' => 'order.sell_success', 'name' => 'فروش موفق'],
|
|
['key' => 'wallet.rial_charge', 'name' => 'شارژ ریالی کیف'],
|
|
['key' => 'withdraw.request', 'name' => 'درخواست برداشت ریالی'],
|
|
];
|
|
|
|
/** @return array<string, mixed> */
|
|
public function toArray(): array
|
|
{
|
|
return [
|
|
'triggers' => [
|
|
['key' => self::TRIGGER_SCHEDULE, 'name' => 'زماندار (هر N روز)'],
|
|
['key' => self::TRIGGER_EVENT, 'name' => 'رویداد (سر ضرب / تأخیر)'],
|
|
['key' => self::TRIGGER_PRICE, 'name' => 'حرکت قیمت'],
|
|
],
|
|
'price_windows' => [
|
|
['key' => 'calendar_day', 'name' => 'در یک روز (از شروع امروز)'],
|
|
['key' => 'from_last', 'name' => 'از آخرین ارسال (پلهای)'],
|
|
],
|
|
'audience_modes' => [
|
|
['key' => 'all', 'name' => 'همه کاربران خانگی'],
|
|
['key' => 'filter', 'name' => 'با فیلتر شرط'],
|
|
],
|
|
'events' => self::EVENTS,
|
|
'channels' => [
|
|
['key' => self::CHANNEL_SMS, 'name' => 'پیامک'],
|
|
['key' => self::CHANNEL_IN_APP, 'name' => 'اعلان داخل اپ'],
|
|
],
|
|
'operators' => [
|
|
['key' => 'eq', 'name' => 'مساوی'],
|
|
['key' => 'gt', 'name' => 'بزرگتر'],
|
|
['key' => 'gte', 'name' => 'بزرگتر یا مساوی'],
|
|
['key' => 'lt', 'name' => 'کوچکتر'],
|
|
['key' => 'lte', 'name' => 'کوچکتر یا مساوی'],
|
|
['key' => 'not', 'name' => 'نامساوی'],
|
|
],
|
|
'fields' => $this->fields(),
|
|
'products' => Product::query()
|
|
->orderBy('id')
|
|
->get(['id', 'title'])
|
|
->map(fn ($p) => ['id' => (int) $p->id, 'name' => (string) ($p->title ?: ('#'.$p->id))])
|
|
->values()
|
|
->all(),
|
|
'hours' => collect(range(0, 23))->map(fn ($h) => [
|
|
'key' => $h,
|
|
'name' => str_pad((string) $h, 2, '0', STR_PAD_LEFT).':00',
|
|
])->all(),
|
|
];
|
|
}
|
|
|
|
/** @return list<array<string, mixed>> */
|
|
public function fields(): array
|
|
{
|
|
return [
|
|
[
|
|
'key' => 'never_login',
|
|
'group' => 'ورود و بازدید',
|
|
'name' => 'هرگز وارد اپ نشده',
|
|
'inputs' => [],
|
|
],
|
|
[
|
|
'key' => 'last_seen_older_days',
|
|
'group' => 'ورود و بازدید',
|
|
'name' => 'آخرین بازدید قدیمیتر از N روز',
|
|
'inputs' => [
|
|
['key' => 'value', 'type' => 'number', 'label' => 'تعداد روز'],
|
|
],
|
|
],
|
|
[
|
|
'key' => 'last_seen_within_days',
|
|
'group' => 'ورود و بازدید',
|
|
'name' => 'آخرین بازدید در N روز اخیر',
|
|
'inputs' => [
|
|
['key' => 'value', 'type' => 'number', 'label' => 'تعداد روز'],
|
|
],
|
|
],
|
|
[
|
|
'key' => 'is_legal',
|
|
'group' => 'حساب کاربر',
|
|
'name' => 'وضعیت احراز هویت',
|
|
'inputs' => [
|
|
['key' => 'value', 'type' => 'select', 'label' => 'وضعیت احراز', 'options' => [
|
|
['key' => 0, 'name' => 'احراز نشده'],
|
|
['key' => 1, 'name' => 'احراز خودکار'],
|
|
['key' => 2, 'name' => 'تأیید ادمین'],
|
|
]],
|
|
],
|
|
],
|
|
[
|
|
'key' => 'active',
|
|
'group' => 'حساب کاربر',
|
|
'name' => 'حساب فعال / غیرفعال',
|
|
'inputs' => [
|
|
['key' => 'value', 'type' => 'select', 'label' => 'وضعیت حساب', 'options' => [
|
|
['key' => 1, 'name' => 'فعال'],
|
|
['key' => 0, 'name' => 'غیرفعال'],
|
|
]],
|
|
],
|
|
],
|
|
[
|
|
'key' => 'registered_older_days',
|
|
'group' => 'حساب کاربر',
|
|
'name' => 'ثبتنام قدیمیتر از N روز',
|
|
'inputs' => [
|
|
['key' => 'value', 'type' => 'number', 'label' => 'تعداد روز'],
|
|
],
|
|
],
|
|
[
|
|
'key' => 'registered_within_days',
|
|
'group' => 'حساب کاربر',
|
|
'name' => 'ثبتنام در N روز اخیر',
|
|
'inputs' => [
|
|
['key' => 'value', 'type' => 'number', 'label' => 'تعداد روز'],
|
|
],
|
|
],
|
|
[
|
|
'key' => 'orders_count',
|
|
'group' => 'حساب کاربر',
|
|
'name' => 'تعداد سفارش',
|
|
'inputs' => [
|
|
['key' => 'op', 'type' => 'operator', 'label' => 'مقایسه'],
|
|
['key' => 'value', 'type' => 'number', 'label' => 'تعداد'],
|
|
],
|
|
],
|
|
[
|
|
'key' => 'wallet_cash',
|
|
'group' => 'کیف پول',
|
|
'name' => 'موجودی ریال کیف اصلی',
|
|
'inputs' => [
|
|
['key' => 'op', 'type' => 'operator', 'label' => 'مقایسه'],
|
|
['key' => 'value', 'type' => 'number', 'label' => 'مبلغ (ریال)'],
|
|
],
|
|
],
|
|
[
|
|
'key' => 'wallet_gold',
|
|
'group' => 'کیف پول',
|
|
'name' => 'موجودی طلا کیف اصلی',
|
|
'inputs' => [
|
|
['key' => 'op', 'type' => 'operator', 'label' => 'مقایسه'],
|
|
['key' => 'value', 'type' => 'number', 'label' => 'مقدار (گرم)'],
|
|
],
|
|
],
|
|
[
|
|
'key' => 'never_ordered',
|
|
'group' => 'خرید و فروش',
|
|
'name' => 'هرگز معامله موفق نداشته',
|
|
'inputs' => [],
|
|
],
|
|
[
|
|
'key' => 'has_buy_within_days',
|
|
'group' => 'خرید و فروش',
|
|
'name' => 'خرید موفق در N روز اخیر',
|
|
'inputs' => [
|
|
['key' => 'value', 'type' => 'number', 'label' => 'تعداد روز'],
|
|
],
|
|
],
|
|
[
|
|
'key' => 'has_sell_within_days',
|
|
'group' => 'خرید و فروش',
|
|
'name' => 'فروش موفق در N روز اخیر',
|
|
'inputs' => [
|
|
['key' => 'value', 'type' => 'number', 'label' => 'تعداد روز'],
|
|
],
|
|
],
|
|
[
|
|
'key' => 'last_order_older_days',
|
|
'group' => 'خرید و فروش',
|
|
'name' => 'آخرین معامله موفق قدیمیتر از N روز',
|
|
'inputs' => [
|
|
['key' => 'value', 'type' => 'number', 'label' => 'تعداد روز'],
|
|
],
|
|
],
|
|
[
|
|
'key' => 'has_deposit_within_days',
|
|
'group' => 'شارژ کیف',
|
|
'name' => 'شارژ ریالی در N روز اخیر',
|
|
'inputs' => [
|
|
['key' => 'value', 'type' => 'number', 'label' => 'تعداد روز'],
|
|
],
|
|
],
|
|
[
|
|
'key' => 'has_withdraw_pending',
|
|
'group' => 'برداشت',
|
|
'name' => 'برداشت در انتظار دارد',
|
|
'inputs' => [],
|
|
],
|
|
];
|
|
}
|
|
|
|
public function fieldKeys(): array
|
|
{
|
|
return array_column($this->fields(), 'key');
|
|
}
|
|
}
|