@tardigrada

Гибкая система возврата платёжных методов (laravel api -> vue checkout page)?

Как лучше организовать/реализовать следующую систему:
1) В filament админ панели пользователь сможет создавать платёжные методы
2) В админ панели пользователь может создавать много различных правил связанных с каждой платёжной системой (куча секций и чекбоксов, страница где можно выбрать платёжные методы (один или несколько), страны (в которых действует/работает данная платёжная система) (тоже один или несколько), валюты (один или несколько)) + минимальная и максимальная сумма платежа
То есть, могут быть самые разные варианты:
1. Кредитная карта / Испания / Евро
2. Кредитная карта / США и Австралия / Доллары
3. Paypal / США и Испания / Евро и Доллары
и т.д.
То есть комбинаций: метод оплаты * количество стран * количество валют
Сделал такие модели пока:
class PaymentMethodRule extends Model
{
    protected $fillable = [
        'payment_method_id',
        'country_id',
        'currency_id',
        'type',
        'min_amount',
        'max_amount',
        'priority'
    ];

и
<?php

namespace App\Models;

use App\Models\PaymentMethodRule;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class PaymentMethod extends Model
{
    use HasFactory;

    protected $fillable = ['name', 'code', 'image_url', 'status'];

    public function rules(): HasMany
    {
        return $this->hasMany(PaymentMethodRule::class);
    }
}


Но естественно будет много записей и в ListPaymentMethodRules (главная страничка с записями в filament будет много записей) как это всё можно группировать и правильно отображать на странице редактирования и как лучше хранить это всё (в одной записи countries = JSON, currencies = JSON, но как тогда проходить по ним потом и показывать только уникальные записи), то есть, я думаю:
Если в таблице:
1. Кредитная карта / Испания / Евро
2. Кредитная карта / США и Австралия / Доллары
3. Paypal / США и Испания / Евро и Доллары
и потом кто-то добавил:
4. Кредитная карта / Зимбабве / Доллары
То можно показывать пользователю не 4 записи, а 3 (так как способ оплаты и валюты во 2 и 4 строке совпадают)
Но как это реализовать в filament?
Да, там есть метод
Customizing the Eloquent query
Within Filament, every query to your resource model will start with the getEloquentQuery() method.

Но, возможно ли сделать такой запрос базе? нужна ведь промежуточная обработка, то есть, я могу получить Payment Method + Country
$allRules = PaymentMethodRule::all();
        $combinedRecords = collect();
       $methodCountryGroups = $allRules->groupBy(['payment_method_id', 'country_id']);
        foreach ($methodCountryGroups as $paymentMethodId => $countryGroups) {
            foreach ($countryGroups as $countryId => $group) {
                if ($group->count() > 1) {
                    $combinedRecords->push([
                        'payment_method_id' => $paymentMethodId,
                        'country_id' => $countryId,
                        'currencies' => $group->pluck('currency_id')->unique()->implode(','),
                        'min_amount' => $group->min('min_amount'),
                        'max_amount' => $group->max('max_amount'),
                        'priority' => $group->min('priority'),
                        'created_at' => $group->min('created_at'),
                        'updated_at' => $group->max('updated_at'),
                    ]);                }
            }
        }

Но как потом пройтись по currencies и удалить из финальной выборке:
for cur in currencies:
$combinedRecords->delete where country_id' => $countryId and payment_method_id' => $paymentMethodId and 'currency' => cur
  • Вопрос задан
  • 98 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы