Я постараюсь максимально раскрыть эту проблему. Вкратце, у меня есть пропорциональная настройка подписки, которая выставляет счет пользователю ежемесячно, эта подписка должна основываться на количестве, поскольку у пользователя может быть несколько экземпляров этого плана одновременно. Каждый раз, когда пользователь создает новую «сущность», количество подписки увеличивается на единицу, чтобы соответствовать количеству «сущностей», которые есть у пользователя.
Пользователь может создать новую «сущность» в любое время, каждый раз, когда он добавляет новую «сущность», генерируется новый счет-фактура, и с него сразу же взимается плата. На конец месяца установлена привязка платежного цикла, поэтому с них взимается плата только за оставшееся количество дней в текущем месяце.
Пользователь также может отказаться от оплаты «сущности» в любое время, когда это происходит, количество полосовой подписки уменьшается на единицу. Они могут продолжать использовать эту «сущность» до конца месяца и не будут платить, когда наступит следующий месяц.
Однако это имеет непреднамеренное поведение, так как количество не соответствует текущему количеству «активных» объектов в системе.
Чтобы показать это, я приведу диаграмму, которая показывает поведение, которое создает сообщение об ошибке «счет уже оплачен». Я также покажу фрагменты кода для лучшего понимания.
![enter image description here](https://i.stack.imgur.com/Ozvm0.png)
Есть ли способ обойти это или мне придется переключать отдельные подписки для каждого объекта? Спасибо
Также вот точное сообщение об ошибке
[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);
}