Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sponsoring page #110

Merged
merged 5 commits into from
May 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,5 @@ FORMS_FILESYSTEM_DRIVER=${MEDIA_DISK}

SENTRY_LARAVEL_DSN=
SENTRY_TRACES_SAMPLE_RATE=

NOTCHPAY_PUBLIC_KEY=
11 changes: 11 additions & 0 deletions app/Enums/PaymentType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

declare(strict_types=1);

namespace App\Enums;

enum PaymentType: string
{
case SUBSCRIPTION = 'subscription';
case SPONSORING = 'sponsoring';
}
9 changes: 3 additions & 6 deletions app/Enums/PlanType.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,8 @@

namespace App\Enums;

use BenSampo\Enum\Enum;

final class PlanType extends Enum
enum PlanType: string
{
public const DEVELOPER = 'developer';

public const ENTERPRISE = 'enterprise';
case DEVELOPER = 'developer';
case ENTERPRISE = 'enterprise';
}
13 changes: 13 additions & 0 deletions app/Enums/TransactionStatus.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

declare(strict_types=1);

namespace App\Enums;

enum TransactionStatus: string
{
case PENDING = 'pending';
case COMPLETE = 'complete';
case CANCELED = 'canceled';
case Failed = 'failed';
}
11 changes: 11 additions & 0 deletions app/Enums/TransactionType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

declare(strict_types=1);

namespace App\Enums;

enum TransactionType: string
{
case ONETIME = 'one-time';
case RECURSIVE = 'recursive';
}
26 changes: 26 additions & 0 deletions app/Http/Controllers/NotchPayCallBackController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

declare(strict_types=1);

namespace App\Http\Controllers;

use App\Models\Transaction;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class NotchPayCallBackController extends Controller
{
public function __invoke(Request $request): RedirectResponse
{
$transaction = Transaction::query()
->where('transaction_reference', $request->get('reference'))
->firstOrFail();
$transaction->update(['status' => $request->get('status')]);

// @ToDO Envoie de mail de notification de remerciement pour le sponsoring si l'utilisateur est dans la base de données

session()->flash('status', __('Votre paiement a été pris en compte merci de soutenir Laravel Cameroun.'));

return redirect(route('sponsors'));
}
}
15 changes: 15 additions & 0 deletions app/Http/Controllers/SponsoringController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

declare(strict_types=1);

namespace App\Http\Controllers;

use Illuminate\Contracts\View\View;

class SponsoringController extends Controller
{
public function sponsors(): View
{
return view('sponsors.index');
}
}
95 changes: 95 additions & 0 deletions app/Http/Livewire/Modals/AnonymousSponsors.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<?php

declare(strict_types=1);

namespace App\Http\Livewire\Modals;

use App\Enums\PaymentType;
use App\Enums\TransactionType;
use App\Models\Transaction;
use App\Models\User;
use Illuminate\Contracts\View\View;
use LivewireUI\Modal\ModalComponent;
use NotchPay\NotchPay;

class AnonymousSponsors extends ModalComponent
{
public ?string $amount = null;
public ?string $option = null;
public ?string $name = null;
public ?string $email = null;
public string $type = 'company';
public ?string $url = null;

public function mount(string $amount, string $option): void
{
$this->amount = $amount;
$this->option = $option;
}

public function submit(): void
{
$this->validate([
'name' => 'required',
'email' => 'required|email',
], [
'name.required' => 'Votre nom est requis',
'email.required' => 'Une adresse e-mail est requise',
'email.email' => 'Veuillez renseigner une adresse e-mail valide',
]);

$adminUser = User::findByEmailAddress('[email protected]');

$notchPay = new NotchPay(config('lcm.notch-pay-public-token'));

try {
// @phpstan-ignore-next-line
$payload = $notchPay->payment->initialize([
'amount' => $this->amount,
'email' => $this->email,
'name' => $this->name,
'currency' => 'XAF',
'reference' => $adminUser->id . '-' . $adminUser->username() . '-' . uniqid(),
'callback' => route('notchpay-callback'),
]);

Transaction::query()->create([
'amount' => $this->amount,
'status' => $payload->transaction->status,
'transaction_reference' => $payload->transaction->reference,
'user_id' => $adminUser->id,
'fees' => $payload->transaction->fee,
'type' => $this->option === 'one-time'
? TransactionType::ONETIME->value
: TransactionType::RECURSIVE->value,
'metadata' => [
'currency' => $payload->transaction->currency,
'reference' => $payload->transaction->reference,
'merchant' => [
'reference' => $payload->transaction->merchant_reference,
'name' => $payload->transaction->customer->name,
'email' => $payload->transaction->customer->email,
'laravel_cm_id' => null,
],
'initiated_at' => $payload->transaction->initiated_at,
'description' => $payload->transaction->description,
'for' => PaymentType::SPONSORING->value,
]
]);

$this->redirect($payload->authorization_url);
} catch (NotchPay\Exception\ApiException $e) {
session()->flash('error', __('Impossible de procéder au paiement, veuillez recommencer plus tard. Merci'));
}
}

public static function modalMaxWidth(): string
{
return 'xl';
}

public function render(): View
{
return view('livewire.modals.anonymous-sponsors');
}
}
2 changes: 1 addition & 1 deletion app/Http/Livewire/Modals/ApprovedArticle.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public function approved(): void

Cache::forget('post-'.$this->article->id); // @phpstan-ignore-line

$this->article->author->notify(new SendApprovedArticle($this->article)); // @phpstan-ignore-line
$this->article->user->notify(new SendApprovedArticle($this->article)); // @phpstan-ignore-line

session()->flash('status', __('L\'article a été approuvé et le mail a été envoyé à l\'auteur pour le notifier.'));

Expand Down
2 changes: 1 addition & 1 deletion app/Http/Livewire/Modals/DeleteArticle.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public function delete(): void

$this->article->delete(); // @phpstan-ignore-line

session()->flash('status', 'La discussion a été supprimé avec tous ses commentaires.');
session()->flash('status', __('La discussion a été supprimé avec tous ses commentaires.'));

$this->redirectRoute('articles');
}
Expand Down
2 changes: 1 addition & 1 deletion app/Http/Livewire/Modals/DeleteDiscussion.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public function delete(): void

$this->discussion->delete(); // @phpstan-ignore-line

session()->flash('status', 'La discussion a été supprimé avec tous ses commentaires.');
session()->flash('status', __('La discussion a été supprimé avec tous ses commentaires.'));

$this->redirectRoute('discussions.index');
}
Expand Down
88 changes: 88 additions & 0 deletions app/Http/Livewire/SponsorSubscription.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
<?php

declare(strict_types=1);

namespace App\Http\Livewire;

use App\Enums\PaymentType;
use App\Enums\TransactionType;
use App\Models\Transaction;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;
use NotchPay\NotchPay;

class SponsorSubscription extends Component
{
public string $option = 'one-time';
public string $amount = '';

public function chooseOption(string $option): void
{
$this->option = $option;
}

public function subscribe(): void
{
$this->validate(
['amount' => 'required'],
['amount.required' => __('Votre montant est requis')],
);

if (!Auth::check()) {
$this->emit('openModal', 'modals.anonymous-sponsors', [
'amount' => $this->amount,
'option' => $this->option,
]);
return;
}

$notchPay = new NotchPay(config('lcm.notch-pay-public-token'));

try {
// @phpstan-ignore-next-line
$payload = $notchPay->payment->initialize([
'amount' => $this->amount,
'email' => Auth::user()?->email,
'name' => Auth::user()?->name,
'currency' => 'XAF',
'reference' => Auth::id() . '-' . Auth::user()?->username() . '-' . uniqid(),
'callback' => route('notchpay-callback'),
]);

Transaction::query()->create([
'amount' => $this->amount,
'status' => $payload->transaction->status,
'transaction_reference' => $payload->transaction->reference,
'user_id' => Auth::id(),
'fees' => $payload->transaction->fee,
'type' => $this->option === 'one-time'
? TransactionType::ONETIME->value
: TransactionType::RECURSIVE->value,
'metadata' => [
'currency' => $payload->transaction->currency,
'reference' => $payload->transaction->reference,
'merchant' => [
'reference' => $payload->transaction->merchant_reference,
'name' => $payload->transaction->customer->name,
'email' => $payload->transaction->customer->email,
'phone' => $payload->transaction->customer->phone,
'laravel_cm_id' => Auth::id(),
],
'initiated_at' => $payload->transaction->initiated_at,
'description' => $payload->transaction->description,
'for' => PaymentType::SPONSORING->value,
]
]);

$this->redirect($payload->authorization_url);
} catch (NotchPay\Exception\ApiException $e) {
session()->flash('error', __('Impossible de procéder au paiement, veuillez recommencer plus tard. Merci'));
}
}

public function render(): View
{
return view('livewire.sponsor-subscription');
}
}
27 changes: 27 additions & 0 deletions app/Models/Transaction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Transaction extends Model
{
use HasFactory;
use HasUuids;

public $guarded = [];

public $casts = [
'metadata' => 'json',
];

public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}
8 changes: 6 additions & 2 deletions app/Models/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,11 @@ public function subscriptions(): HasMany
return $this->hasMany(Subscribe::class);
}

public function transactions(): HasMany
{
return $this->hasMany(Transaction::class);
}

public function deleteThreads(): void
{
// We need to explicitly iterate over the threads and delete them
Expand All @@ -255,8 +260,7 @@ public function deleteReplies(): void
{
// We need to explicitly iterate over the replies and delete them
// separately because all related models need to be deleted.
// @phpstan-ignore-next-line
foreach ($this->replyAble->get() as $reply) {
foreach ($this->replyAble->all() as $reply) {
$reply->delete();
}
}
Expand Down
1 change: 1 addition & 0 deletions app/Traits/WithArticleAttributes.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ trait WithArticleAttributes

public int $reading_time = 1;

//@phpstan-ignore-next-line
public $file;

/**
Expand Down
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"livewire/livewire": "^2.11",
"lorisleiva/laravel-actions": "^2.5",
"nnjeim/world": "^1.1",
"notchpay/php-sdk": "^2.2",
"qcod/laravel-gamify": "^1.0.6",
"ramsey/uuid": "^4.2",
"rinvex/laravel-subscriptions": "^6.1",
Expand Down
Loading