From 2c83abe43279f86bcaeac982e8985922ec8da058 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 27 Mar 2021 07:28:56 +1100 Subject: [PATCH] Subscriptions --- app/Models/Subscription.php | 1 + app/Repositories/SubscriptionRepository.php | 76 ++++++++++++++++++- app/Transformers/SubscriptionTransformer.php | 6 +- ...dd_price_column_to_subscriptions_table.php | 33 ++++++++ 4 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 database/migrations/2021_03_26_201148_add_price_column_to_subscriptions_table.php diff --git a/app/Models/Subscription.php b/app/Models/Subscription.php index 7c7679a82a9e..52e91898d921 100644 --- a/app/Models/Subscription.php +++ b/app/Models/Subscription.php @@ -43,6 +43,7 @@ class Subscription extends BaseModel 'webhook_configuration', 'currency_id', 'group_id', + 'price', ]; protected $casts = [ diff --git a/app/Repositories/SubscriptionRepository.php b/app/Repositories/SubscriptionRepository.php index 4a7a5469facc..1d2a933b6c3c 100644 --- a/app/Repositories/SubscriptionRepository.php +++ b/app/Repositories/SubscriptionRepository.php @@ -13,16 +13,86 @@ 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\Utils\Traits\CleanLineItems; +use Illuminate\Support\Facades\DB; class SubscriptionRepository extends BaseRepository { + use CleanLineItems; + public function save($data, Subscription $subscription): ?Subscription { - $subscription - ->fill($data) - ->save(); + $subscription->fill($data); + + $subscription->price = $this->calculatePrice($subscription); + + $subscription->save(); 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); + + } + } \ No newline at end of file diff --git a/app/Transformers/SubscriptionTransformer.php b/app/Transformers/SubscriptionTransformer.php index 4c0b59d2118b..da8b892d320c 100644 --- a/app/Transformers/SubscriptionTransformer.php +++ b/app/Transformers/SubscriptionTransformer.php @@ -38,10 +38,12 @@ class SubscriptionTransformer extends EntityTransformer return [ 'id' => $this->encodePrimaryKey($subscription->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), 'company_id' => $this->encodePrimaryKey($subscription->company_id), - 'is_recurring' => (bool)$subscription->is_recurring, + 'price' => (float) $subscription->price, 'frequency_id' => (string)$subscription->frequency_id, 'auto_bill' => (string)$subscription->auto_bill, 'promo_code' => (string)$subscription->promo_code, diff --git a/database/migrations/2021_03_26_201148_add_price_column_to_subscriptions_table.php b/database/migrations/2021_03_26_201148_add_price_column_to_subscriptions_table.php new file mode 100644 index 000000000000..ffa8f5923208 --- /dev/null +++ b/database/migrations/2021_03_26_201148_add_price_column_to_subscriptions_table.php @@ -0,0 +1,33 @@ +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) { + // + }); + } +}