Subscriptions

This commit is contained in:
David Bomba 2021-03-27 07:28:56 +11:00
parent f067290462
commit 2c83abe432
4 changed files with 111 additions and 5 deletions

View File

@ -43,6 +43,7 @@ class Subscription extends BaseModel
'webhook_configuration', 'webhook_configuration',
'currency_id', 'currency_id',
'group_id', 'group_id',
'price',
]; ];
protected $casts = [ protected $casts = [

View File

@ -13,16 +13,86 @@
namespace App\Repositories; namespace App\Repositories;
use App\Factory\InvoiceFactory;
use App\Models\Client;
use App\Models\ClientContact;
use App\Models\Invoice;
use App\Models\InvoiceInvitation;
use App\Models\Subscription; use App\Models\Subscription;
use App\Utils\Traits\CleanLineItems;
use Illuminate\Support\Facades\DB;
class SubscriptionRepository extends BaseRepository class SubscriptionRepository extends BaseRepository
{ {
use CleanLineItems;
public function save($data, Subscription $subscription): ?Subscription public function save($data, Subscription $subscription): ?Subscription
{ {
$subscription $subscription->fill($data);
->fill($data)
->save(); $subscription->price = $this->calculatePrice($subscription);
$subscription->save();
return $subscription; return $subscription;
} }
private function calculatePrices($subscription) :array
{
DB::beginTransaction();
$data = [];
$client = Client::factory()->create([
'user_id' => $subscription->user_id,
'company_id' => $subscription->company_id,
'group_settings_id' => $subscription->group_id,
'country_id' => $subscription->company->settings->country_id,
]);
$contact = ClientContact::factory()->create([
'user_id' => $subscription->user_id,
'company_id' => $subscription->company_id,
'client_id' => $client->id,
'is_primary' => 1,
'send_email' => true,
]);
$invoice = InvoiceFactory::create($subscription->company_id, $subscription->user_id);
$invitation = InvoiceInvitation::factory()->create([
'user_id' => $subscription->user_id,
'company_id' => $subscription->company_id,
'invoice_id' => $invoice->id,
'client_contact_id' => $contact->id,
]);
$invoice->setRelation('invitations', $invitation);
$invoice->setRelation('client', $client);
$invoice->setRelation('company', $subscription->company);
$invoice->load('client');
$invoice->line_items = $this->generateLineItems($subscription);
$data['price'] = $invoice->calc()->getTotal();
$invoice->discount = $subscription->promo_discount;
$invoice->is_amount_discount = $subscription->is_amount_discount;
$data['promo_price'] = $invoice->calc()->getTotal();
DB::rollBack();
return $data;
}
private function generateLineItems($subscription)
{
$line_items = [];
$line_items = $this->cleanItems($line_items);
}
} }

View File

@ -38,10 +38,12 @@ class SubscriptionTransformer extends EntityTransformer
return [ return [
'id' => $this->encodePrimaryKey($subscription->id), 'id' => $this->encodePrimaryKey($subscription->id),
'user_id' => $this->encodePrimaryKey($subscription->user_id), 'user_id' => $this->encodePrimaryKey($subscription->user_id),
'product_id' => $this->encodePrimaryKey($subscription->product_id), 'group_id' => $this->encodePrimaryKey($subscription->group_id),
'product_ids' => $subscription->product_ids,
'recurring_product_ids' => $subscription->recurring_product_ids,
'assigned_user_id' => $this->encodePrimaryKey($subscription->assigned_user_id), 'assigned_user_id' => $this->encodePrimaryKey($subscription->assigned_user_id),
'company_id' => $this->encodePrimaryKey($subscription->company_id), 'company_id' => $this->encodePrimaryKey($subscription->company_id),
'is_recurring' => (bool)$subscription->is_recurring, 'price' => (float) $subscription->price,
'frequency_id' => (string)$subscription->frequency_id, 'frequency_id' => (string)$subscription->frequency_id,
'auto_bill' => (string)$subscription->auto_bill, 'auto_bill' => (string)$subscription->auto_bill,
'promo_code' => (string)$subscription->promo_code, 'promo_code' => (string)$subscription->promo_code,

View File

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddPriceColumnToSubscriptionsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('subscriptions', function (Blueprint $table) {
$table->decimal('price', 20, 6)->default(0);
$table->decimal('promo_price', 20, 6)->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('subscriptions', function (Blueprint $table) {
//
});
}
}