From c47318df1e4c953ed5bdc6dd0bb03357a067bb58 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 27 Mar 2021 06:21:47 +1100 Subject: [PATCH 1/9] Fixes for company presenter --- app/Models/Presenters/CompanyPresenter.php | 2 +- app/Utils/HtmlEngine.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Models/Presenters/CompanyPresenter.php b/app/Models/Presenters/CompanyPresenter.php index 8baaf73751a2..dfe8523f9254 100644 --- a/app/Models/Presenters/CompanyPresenter.php +++ b/app/Models/Presenters/CompanyPresenter.php @@ -103,7 +103,7 @@ class CompanyPresenter extends EntityPresenter return - "SPC\n0200\n1\nCH860021421411198240K\nK\n{$this->name}\n{$settings->address1}\n{$settings->postal_code} {$settings->city}\n\n\nCH\n\n\n\n\n\n\n\n{$balance_due_raw}\n{$client_currency}\n\n\n\n\n\n\n\nNON\n\n{$invoice_number}\nEPD\n"; + "SPC\n0200\n1\n{$user_iban}\nK\n{$this->name}\n{$settings->address1}\n{$settings->postal_code} {$settings->city}\n\n\nCH\n\n\n\n\n\n\n\n{$balance_due_raw}\n{$client_currency}\n\n\n\n\n\n\n\nNON\n\n{$invoice_number}\nEPD\n"; } } diff --git a/app/Utils/HtmlEngine.php b/app/Utils/HtmlEngine.php index ca1442ff0281..36452e255ecb 100644 --- a/app/Utils/HtmlEngine.php +++ b/app/Utils/HtmlEngine.php @@ -192,6 +192,7 @@ class HtmlEngine $data['$taxes'] = ['value' => Number::formatMoney($this->entity_calc->getItemTotalTaxes(), $this->client) ?: ' ', 'label' => ctrans('texts.taxes')]; $data['$invoice.taxes'] = &$data['$taxes']; + $data['$user_iban'] = ['value' => $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'company1', $this->settings->custom_value1, $this->client) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'company1')]; $data['$invoice.custom1'] = ['value' => $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'invoice1', $this->entity->custom_value1, $this->client) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'invoice1')]; $data['$invoice.custom2'] = ['value' => $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'invoice2', $this->entity->custom_value2, $this->client) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'invoice2')]; $data['$invoice.custom3'] = ['value' => $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'invoice3', $this->entity->custom_value3, $this->client) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'invoice3')]; From fc3889671e436bb3a2156d51bf52d1977ecbd7bb Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 27 Mar 2021 06:30:46 +1100 Subject: [PATCH 2/9] Fixes for HTMLEngine --- app/Models/Presenters/CompanyPresenter.php | 2 +- app/Utils/HtmlEngine.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Models/Presenters/CompanyPresenter.php b/app/Models/Presenters/CompanyPresenter.php index dfe8523f9254..d7cb21a24b56 100644 --- a/app/Models/Presenters/CompanyPresenter.php +++ b/app/Models/Presenters/CompanyPresenter.php @@ -97,7 +97,7 @@ class CompanyPresenter extends EntityPresenter } } - public function getSpcQrCode($client_currency, $invoice_number, $balance_due_raw) + public function getSpcQrCode($client_currency, $invoice_number, $balance_due_raw, $user_iban) { $settings = $this->entity->settings; diff --git a/app/Utils/HtmlEngine.php b/app/Utils/HtmlEngine.php index 36452e255ecb..004ef0d1dc1a 100644 --- a/app/Utils/HtmlEngine.php +++ b/app/Utils/HtmlEngine.php @@ -288,7 +288,7 @@ class HtmlEngine $data['$signature'] = ['value' => $this->settings->email_signature ?: ' ', 'label' => '']; - $data['$spc_qr_code'] = ['value' => $this->company->present()->getSpcQrCode($this->client->currency()->code, $this->entity->number, $this->entity->balance), 'label' => '']; + $data['$spc_qr_code'] = ['value' => $this->company->present()->getSpcQrCode($this->client->currency()->code, $this->entity->number, $this->entity->balance, $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'company1', $this->settings->custom_value1, $this->client)), 'label' => '']; $logo = $this->company->present()->logo($this->settings); From f06729046274a157a4c16905514cad776fb78429 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 27 Mar 2021 06:43:52 +1100 Subject: [PATCH 3/9] Update rules for updating an entity --- app/Http/Requests/Credit/UpdateCreditRequest.php | 6 ++++-- app/Http/Requests/Invoice/UpdateInvoiceRequest.php | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/Http/Requests/Credit/UpdateCreditRequest.php b/app/Http/Requests/Credit/UpdateCreditRequest.php index 2c7c43d39bf9..617321a9ce89 100644 --- a/app/Http/Requests/Credit/UpdateCreditRequest.php +++ b/app/Http/Requests/Credit/UpdateCreditRequest.php @@ -67,8 +67,10 @@ class UpdateCreditRequest extends Request $input = $this->decodePrimaryKeys($input); - $input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : []; - + if (isset($input['line_items'])) { + $input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : []; + } + $input['id'] = $this->credit->id; $this->replace($input); diff --git a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php index 0fb69a64e3f6..ec08c200bb90 100644 --- a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php +++ b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php @@ -66,8 +66,10 @@ class UpdateInvoiceRequest extends Request $input['id'] = $this->invoice->id; - $input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : []; - + if (isset($input['line_items'])) { + $input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : []; + } + if (array_key_exists('documents', $input)) { unset($input['documents']); } From 2c83abe43279f86bcaeac982e8985922ec8da058 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 27 Mar 2021 07:28:56 +1100 Subject: [PATCH 4/9] 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) { + // + }); + } +} From 95749b482234d8b6071348dd1aa3409fff1e0598 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 27 Mar 2021 08:39:08 +1100 Subject: [PATCH 5/9] Subscriptions - invoice generation logic --- app/Repositories/SubscriptionRepository.php | 33 +++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/app/Repositories/SubscriptionRepository.php b/app/Repositories/SubscriptionRepository.php index 1d2a933b6c3c..efdb7a0a0a5a 100644 --- a/app/Repositories/SubscriptionRepository.php +++ b/app/Repositories/SubscriptionRepository.php @@ -13,6 +13,7 @@ namespace App\Repositories; +use App\DataMapper\InvoiceItem; use App\Factory\InvoiceFactory; use App\Models\Client; use App\Models\ClientContact; @@ -91,8 +92,40 @@ class SubscriptionRepository extends BaseRepository $line_items = []; + foreach($subscription->service()->products() as $product) + { + $line_items[] = $this->makeLineItem($product); + } + + foreach($subscription->service()->recurring_products() as $product) + { + $line_items[] = $this->makeLineItem($product); + } + $line_items = $this->cleanItems($line_items); + return $line_items; + } + private function makeLineItem($product) + { + $item = new InvoiceItem; + $item->quantity = $product->quantity; + $item->product_key = $product->product_key; + $item->notes = $product->notes; + $item->cost = $product->price; + $item->tax_rate1 = $product->tax_rate1 ?: 0; + $item->tax_name1 = $product->tax_name1 ?: ''; + $item->tax_rate2 = $product->tax_rate2 ?: 0; + $item->tax_name2 = $product->tax_name2 ?: ''; + $item->tax_rate3 = $product->tax_rate3 ?: 0; + $item->tax_name3 = $product->tax_name3 ?: ''; + $item->custom_value1 = $product->custom_value1 ?: ''; + $item->custom_value2 = $product->custom_value2 ?: ''; + $item->custom_value3 = $product->custom_value3 ?: ''; + $item->custom_value4 = $product->custom_value4 ?: ''; + + return $item; + } } \ No newline at end of file From 46a525f04db8cce8864800520d2a5f55d1f29300 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 27 Mar 2021 08:55:04 +1100 Subject: [PATCH 6/9] Create invoice for subscription --- app/Repositories/SubscriptionRepository.php | 2 +- .../Subscription/SubscriptionService.php | 159 ++++++------------ 2 files changed, 48 insertions(+), 113 deletions(-) diff --git a/app/Repositories/SubscriptionRepository.php b/app/Repositories/SubscriptionRepository.php index efdb7a0a0a5a..bf5ec6627aa8 100644 --- a/app/Repositories/SubscriptionRepository.php +++ b/app/Repositories/SubscriptionRepository.php @@ -87,7 +87,7 @@ class SubscriptionRepository extends BaseRepository return $data; } - private function generateLineItems($subscription) + public function generateLineItems($subscription) { $line_items = []; diff --git a/app/Services/Subscription/SubscriptionService.php b/app/Services/Subscription/SubscriptionService.php index d936b16c7473..dd0f8be3fac4 100644 --- a/app/Services/Subscription/SubscriptionService.php +++ b/app/Services/Subscription/SubscriptionService.php @@ -15,14 +15,15 @@ use App\DataMapper\InvoiceItem; use App\Factory\InvoiceFactory; use App\Factory\InvoiceToRecurringInvoiceFactory; use App\Jobs\Util\SystemLogger; -use App\Models\Subscription; use App\Models\ClientContact; use App\Models\ClientSubscription; use App\Models\Invoice; use App\Models\PaymentHash; use App\Models\Product; +use App\Models\Subscription; use App\Models\SystemLog; use App\Repositories\InvoiceRepository; +use App\Repositories\SubscriptionRepository; use App\Utils\Traits\CleanLineItems; use App\Utils\Traits\MakesHash; use GuzzleHttp\RequestOptions; @@ -36,7 +37,7 @@ class SubscriptionService private $subscription; /** @var client_subscription */ - private $client_subscription; + // private $client_subscription; public function __construct(Subscription $subscription) { @@ -73,18 +74,18 @@ class SubscriptionService if(!$this->subscription->trial_enabled) return new \Exception("Trials are disabled for this product"); - $contact = ClientContact::with('client')->find($data['contact_id']); + // $contact = ClientContact::with('client')->find($data['contact_id']); - $cs = new ClientSubscription(); - $cs->subscription_id = $this->subscription->id; - $cs->company_id = $this->subscription->company_id; - $cs->trial_started = time(); - $cs->trial_ends = time() + $this->subscription->trial_duration; - $cs->quantity = $data['quantity']; - $cs->client_id = $contact->client->id; - $cs->save(); + // $cs = new ClientSubscription(); + // $cs->subscription_id = $this->subscription->id; + // $cs->company_id = $this->subscription->company_id; + // $cs->trial_started = time(); + // $cs->trial_ends = time() + $this->subscription->trial_duration; + // $cs->quantity = $data['quantity']; + // $cs->client_id = $contact->client->id; + // $cs->save(); - $this->client_subscription = $cs; + // $this->client_subscription = $cs; //execute any webhooks $this->triggerWebhook(); @@ -99,89 +100,21 @@ class SubscriptionService { $invoice_repo = new InvoiceRepository(); + $subscription_repo = new SubscriptionRepository(); - $data['line_items'] = $this->cleanItems($this->createLineItems($data)); + $invoice = InvoiceFactory::create($this->subscription->company_id, $this->subscription->user_id); + $invoice->line_items = $subscription_repo->generateLineItems($this->subscription); - return $invoice_repo->save($data, InvoiceFactory::create($this->subscription->company_id, $this->subscription->user_id)); - - } - - /** - * Creates the required line items for the invoice - * for the billing subscription. - */ - private function createLineItems($data): array - { - - $line_items = []; - - $product = $this->subscription->product; - - $item = new InvoiceItem; - $item->quantity = $data['quantity']; - $item->product_key = $product->product_key; - $item->notes = $product->notes; - $item->cost = $product->price; - $item->tax_rate1 = $product->tax_rate1 ?: 0; - $item->tax_name1 = $product->tax_name1 ?: ''; - $item->tax_rate2 = $product->tax_rate2 ?: 0; - $item->tax_name2 = $product->tax_name2 ?: ''; - $item->tax_rate3 = $product->tax_rate3 ?: 0; - $item->tax_name3 = $product->tax_name3 ?: ''; - $item->custom_value1 = $product->custom_value1 ?: ''; - $item->custom_value2 = $product->custom_value2 ?: ''; - $item->custom_value3 = $product->custom_value3 ?: ''; - $item->custom_value4 = $product->custom_value4 ?: ''; - - //$item->type_id need to switch whether the subscription is a service or product - - $line_items[] = $item; - - - //do we have a promocode? enter this as a line item. if(strlen($data['coupon']) >=1 && ($data['coupon'] == $this->subscription->promo_code) && $this->subscription->promo_discount > 0) - $line_items[] = $this->createPromoLine($data); + { + $invoice->discount = $subscription->promo_discount; + $invoice->is_amount_discount = $subscription->is_amount_discount; + } - return $line_items; + return $invoice_repo->save($data, $invoice); } - /** - * If a coupon is entered (and is valid) - * then we apply the coupon discount with a line item. - */ - private function createPromoLine($data) - { - - $product = $this->subscription->product; - $discounted_amount = 0; - $discount = 0; - $amount = $data['quantity'] * $product->cost; - - if ($this->subscription->is_amount_discount == true) { - $discount = $this->subscription->promo_discount; - } - else { - $discount = round($amount * ($this->subscription->promo_discount / 100), 2); - } - - $discounted_amount = $amount - $discount; - - $item = new InvoiceItem; - $item->quantity = 1; - $item->product_key = ctrans('texts.promo_code'); - $item->notes = ctrans('texts.promo_code'); - $item->cost = $discounted_amount; - $item->tax_rate1 = $product->tax_rate1 ?: 0; - $item->tax_name1 = $product->tax_name1 ?: ''; - $item->tax_rate2 = $product->tax_rate2 ?: 0; - $item->tax_name2 = $product->tax_name2 ?: ''; - $item->tax_rate3 = $product->tax_rate3 ?: 0; - $item->tax_name3 = $product->tax_name3 ?: ''; - - return $item; - - } private function convertInvoiceToRecurring($payment_hash) { @@ -197,39 +130,41 @@ class SubscriptionService } - public function createClientSubscription($payment_hash) - { + // @deprecated due to change in architecture - //is this a recurring or one off subscription. + // public function createClientSubscription($payment_hash) + // { - $cs = new ClientSubscription(); - $cs->subscription_id = $this->subscription->id; - $cs->company_id = $this->subscription->company_id; + // //is this a recurring or one off subscription. - $cs->invoice_id = $payment_hash->billing_context->invoice_id; - $cs->client_id = $payment_hash->billing_context->client_id; - $cs->quantity = $payment_hash->billing_context->quantity; + // $cs = new ClientSubscription(); + // $cs->subscription_id = $this->subscription->id; + // $cs->company_id = $this->subscription->company_id; - //if is_recurring - //create recurring invoice from invoice - if($this->subscription->is_recurring) - { - $recurring_invoice = $this->convertInvoiceToRecurring($payment_hash); - $recurring_invoice->frequency_id = $this->subscription->frequency_id; - $recurring_invoice->next_send_date = $recurring_invoice->nextDateByFrequency(now()->format('Y-m-d')); - $recurring_invoice->save(); - $cs->recurring_invoice_id = $recurring_invoice->id; + // $cs->invoice_id = $payment_hash->billing_context->invoice_id; + // $cs->client_id = $payment_hash->billing_context->client_id; + // $cs->quantity = $payment_hash->billing_context->quantity; - //?set the recurring invoice as active - set the date here also based on the frequency? - $recurring_invoice->service()->start(); - } + // //if is_recurring + // //create recurring invoice from invoice + // if($this->subscription->is_recurring) + // { + // $recurring_invoice = $this->convertInvoiceToRecurring($payment_hash); + // $recurring_invoice->frequency_id = $this->subscription->frequency_id; + // $recurring_invoice->next_send_date = $recurring_invoice->nextDateByFrequency(now()->format('Y-m-d')); + // $recurring_invoice->save(); + // $cs->recurring_invoice_id = $recurring_invoice->id; + + // //?set the recurring invoice as active - set the date here also based on the frequency? + // $recurring_invoice->service()->start(); + // } - $cs->save(); + // $cs->save(); - $this->client_subscription = $cs; + // $this->client_subscription = $cs; - } + // } public function triggerWebhook() { From 83c636aa55eb141256b45d8a7dc03efe8f535deb Mon Sep 17 00:00:00 2001 From: = Date: Sat, 27 Mar 2021 09:05:37 +1100 Subject: [PATCH 7/9] update todos --- .../Subscription/SubscriptionService.php | 42 +++++++++---------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/app/Services/Subscription/SubscriptionService.php b/app/Services/Subscription/SubscriptionService.php index dd0f8be3fac4..66d9c2f5b5a6 100644 --- a/app/Services/Subscription/SubscriptionService.php +++ b/app/Services/Subscription/SubscriptionService.php @@ -51,13 +51,8 @@ class SubscriptionService throw new \Exception("Illegal entrypoint into method, payload must contain billing context"); } - // At this point we have some state carried from the billing page - // to this, available as $payment_hash->data->billing_context. Make something awesome ⭐ - - // create client subscription record - // - // create recurring invoice if is_recurring - // + // if we have a recurring product - then generate a recurring invoice + // if trial is enabled, generate the recurring invoice to fire when the trial ends. } @@ -166,30 +161,31 @@ class SubscriptionService // } + //@todo - need refactor public function triggerWebhook() { //hit the webhook to after a successful onboarding - $body = [ - 'subscription' => $this->subscription, - 'client_subscription' => $this->client_subscription, - 'client' => $this->client_subscription->client->toArray(), - ]; + // $body = [ + // 'subscription' => $this->subscription, + // 'client_subscription' => $this->client_subscription, + // 'client' => $this->client_subscription->client->toArray(), + // ]; - $client = new \GuzzleHttp\Client(['headers' => $this->subscription->webhook_configuration->post_purchase_headers]); + // $client = new \GuzzleHttp\Client(['headers' => $this->subscription->webhook_configuration->post_purchase_headers]); - $response = $client->{$this->subscription->webhook_configuration->post_purchase_rest_method}($this->subscription->post_purchase_url,[ - RequestOptions::JSON => ['body' => $body] - ]); + // $response = $client->{$this->subscription->webhook_configuration->post_purchase_rest_method}($this->subscription->post_purchase_url,[ + // RequestOptions::JSON => ['body' => $body] + // ]); - SystemLogger::dispatch( - $body, - SystemLog::CATEGORY_WEBHOOK, - SystemLog::EVENT_WEBHOOK_RESPONSE, - SystemLog::TYPE_WEBHOOK_RESPONSE, - $this->client_subscription->client, - ); + // SystemLogger::dispatch( + // $body, + // SystemLog::CATEGORY_WEBHOOK, + // SystemLog::EVENT_WEBHOOK_RESPONSE, + // SystemLog::TYPE_WEBHOOK_RESPONSE, + // $this->client_subscription->client, + // ); } From 3479c127fd4752821f7018b2fc6ddb20155b6684 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 27 Mar 2021 14:22:19 +1100 Subject: [PATCH 8/9] Fixes for subscription refactor --- app/Repositories/SubscriptionRepository.php | 22 ++++++++++++------- .../Subscription/SubscriptionService.php | 2 -- tests/Feature/SubscriptionApiTest.php | 1 + 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/app/Repositories/SubscriptionRepository.php b/app/Repositories/SubscriptionRepository.php index bf5ec6627aa8..32ce6a931bd8 100644 --- a/app/Repositories/SubscriptionRepository.php +++ b/app/Repositories/SubscriptionRepository.php @@ -30,15 +30,18 @@ class SubscriptionRepository extends BaseRepository public function save($data, Subscription $subscription): ?Subscription { $subscription->fill($data); - - $subscription->price = $this->calculatePrice($subscription); + + $calculated_prices = $this->calculatePrice($subscription); + + $subscription->price = $calculated_prices['price']; + $subscription->promo_price = $calculated_prices['promo_price']; $subscription->save(); return $subscription; } - private function calculatePrices($subscription) :array + private function calculatePrice($subscription) :array { DB::beginTransaction(); @@ -61,10 +64,13 @@ class SubscriptionRepository extends BaseRepository ]); $invoice = InvoiceFactory::create($subscription->company_id, $subscription->user_id); + $invoice->client_id = $client->id; + + $invoice->save(); $invitation = InvoiceInvitation::factory()->create([ - 'user_id' => $subscription->user_id, - 'company_id' => $subscription->company_id, + 'user_id' => $subscription->user_id, + 'company_id' => $subscription->company_id, 'invoice_id' => $invoice->id, 'client_contact_id' => $contact->id, ]); @@ -73,8 +79,8 @@ class SubscriptionRepository extends BaseRepository $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; @@ -94,12 +100,12 @@ class SubscriptionRepository extends BaseRepository foreach($subscription->service()->products() as $product) { - $line_items[] = $this->makeLineItem($product); + $line_items[] = (array)$this->makeLineItem($product); } foreach($subscription->service()->recurring_products() as $product) { - $line_items[] = $this->makeLineItem($product); + $line_items[] = (array)$this->makeLineItem($product); } $line_items = $this->cleanItems($line_items); diff --git a/app/Services/Subscription/SubscriptionService.php b/app/Services/Subscription/SubscriptionService.php index 66d9c2f5b5a6..1ab050c39d46 100644 --- a/app/Services/Subscription/SubscriptionService.php +++ b/app/Services/Subscription/SubscriptionService.php @@ -118,8 +118,6 @@ class SubscriptionService if(!$invoice) throw new \Exception("Could not match an invoice for payment of billing subscription"); - - //todo - need to remove the promo code - if it exists return InvoiceToRecurringInvoiceFactory::create($invoice); diff --git a/tests/Feature/SubscriptionApiTest.php b/tests/Feature/SubscriptionApiTest.php index f5b8e424f4fd..8c4ec16f2f00 100644 --- a/tests/Feature/SubscriptionApiTest.php +++ b/tests/Feature/SubscriptionApiTest.php @@ -80,6 +80,7 @@ class SubscriptionApiTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/subscriptions', ['product_ids' => $product->id, 'allow_cancellation' => true]); + // nlog($response); $response->assertStatus(200); } From 9fd40f55c643e57bdbe51a98dd0c92b4d3be8d63 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 27 Mar 2021 14:51:34 +1100 Subject: [PATCH 9/9] Exchange rates --- app/Jobs/RecurringInvoice/SendRecurring.php | 1 + app/Services/Invoice/InvoiceService.php | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/app/Jobs/RecurringInvoice/SendRecurring.php b/app/Jobs/RecurringInvoice/SendRecurring.php index 8dac7d6cfc5f..39712889fc3b 100644 --- a/app/Jobs/RecurringInvoice/SendRecurring.php +++ b/app/Jobs/RecurringInvoice/SendRecurring.php @@ -64,6 +64,7 @@ class SendRecurring implements ShouldQueue ->applyNumber() ->createInvitations() ->fillDefaults() + ->setExchangeRate() ->save(); nlog("Invoice {$invoice->number} created"); diff --git a/app/Services/Invoice/InvoiceService.php b/app/Services/Invoice/InvoiceService.php index 755291c8e572..83298578b382 100644 --- a/app/Services/Invoice/InvoiceService.php +++ b/app/Services/Invoice/InvoiceService.php @@ -14,6 +14,7 @@ namespace App\Services\Invoice; use App\Jobs\Entity\CreateEntityPdf; use App\Jobs\Invoice\InvoiceWorkflowSettings; use App\Jobs\Util\UnlinkFile; +use App\Libraries\Currency\Conversion\CurrencyApi; use App\Models\CompanyGateway; use App\Models\Expense; use App\Models\Invoice; @@ -62,7 +63,14 @@ class InvoiceService return $this; } + public function setExchangeRate() + { + $exchange_rate = new CurrencyApi(); + // $payment->exchange_rate = $exchange_rate->exchangeRate($client_currency, $company_currency, Carbon::parse($payment->date)); + + return $this; + } /** * Applies the recurring invoice number. * @return $this InvoiceService object