Тарификация на основе количества полос - счет уже оплачен - PullRequest
0 голосов
/ 04 мая 2020

Я постараюсь максимально раскрыть эту проблему. Вкратце, у меня есть пропорциональная настройка подписки, которая выставляет счет пользователю ежемесячно, эта подписка должна основываться на количестве, поскольку у пользователя может быть несколько экземпляров этого плана одновременно. Каждый раз, когда пользователь создает новую «сущность», количество подписки увеличивается на единицу, чтобы соответствовать количеству «сущностей», которые есть у пользователя.

Пользователь может создать новую «сущность» в любое время, каждый раз, когда он добавляет новую «сущность», генерируется новый счет-фактура, и с него сразу же взимается плата. На конец месяца установлена ​​привязка платежного цикла, поэтому с них взимается плата только за оставшееся количество дней в текущем месяце.

Пользователь также может отказаться от оплаты «сущности» в любое время, когда это происходит, количество полосовой подписки уменьшается на единицу. Они могут продолжать использовать эту «сущность» до конца месяца и не будут платить, когда наступит следующий месяц.

Однако это имеет непреднамеренное поведение, так как количество не соответствует текущему количеству «активных» объектов в системе.

Чтобы показать это, я приведу диаграмму, которая показывает поведение, которое создает сообщение об ошибке «счет уже оплачен». Я также покажу фрагменты кода для лучшего понимания.

enter image description here

Есть ли способ обойти это или мне придется переключать отдельные подписки для каждого объекта? Спасибо

Также вот точное сообщение об ошибке

[2020-05-04 10:39:21] local.INFO: (Status 400) (Request req_nKlw7rJHdFJujL) Invoice is already paid  

А вот несколько фрагментов кода

Код увеличения количества

    public function incrementSubscription(CompanySubscription $subcription, Team $team) {
        try {
            $quantity = $item->quantity + 1;
            $stripe_sub = StripeBiller::updateSubscription($subscription->stripe_id, $quantity);
            $subcription->quantity = $stripe_sub_item->quantity;
            $subcription->save();
        } catch (\Exception $e) {
            Log::error('failed to increment subscription item: ' . $item. ' exception :' . $e);
            throw $e;
        }

        $invoice = \Stripe\Invoice::create([
             'customer' => $team->billing_account->customer->stripe_customer_id,
              'subscription' => $subscription->stripe_id,
        ]);

        $invoice->finalizeInvoice();
        $invoice->pay();

        }
    }

Количество уменьшения код

    public function decrementSubscription(CompanySubscription $subscription) {
        try {
            $quantity = $item->quantity - 1;
            $stripe_sub = StripeBiller::updateSubscription($subscription->stripe_id, $quantity);
            $subscription->quantity = $stripe_sub_item->quantity;
            $subscription->save();
        } catch (\Exception $e) {
            Log::error('failed to decrement subscription item: ' . $item. ' exception :' . $e);
            throw $e;
        }
    }

Создать код объекта

$entity = new Entity();
        $entity->name = $request->get('name');
        $entity->save();

           $subscription = CompanySubscription::where('team_id', '=', $team->id)->get()->first();

            if($subscription) {
                 StripeBiller::updateSubscription($subscription, $subscription->quantity + 1);
            } else {           

      StripeBiller::createCompanySubscription($team->billing_account->customer->stripe_customer_id, $request->get('plan'), $team, $entity);
            }   

1 Ответ

0 голосов
/ 04 мая 2020

Нашел решение, оно немного грубое, но это работает для всех, у кого возникла подобная проблема. enter image description here

...