feat: ✨ Added invoice creation on stripe route & webhook
This commit is contained in:
parent
97b01d9428
commit
84ec3e583c
|
@ -10,6 +10,7 @@ use App\Models\Payment;
|
||||||
use App\Models\CreditProduct;
|
use App\Models\CreditProduct;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use App\Notifications\InvoiceNotification;
|
use App\Notifications\InvoiceNotification;
|
||||||
|
use App\Notifications\ConfirmPaymentNotification;
|
||||||
use Exception;
|
use Exception;
|
||||||
use Illuminate\Contracts\Foundation\Application;
|
use Illuminate\Contracts\Foundation\Application;
|
||||||
use Illuminate\Contracts\View\Factory;
|
use Illuminate\Contracts\View\Factory;
|
||||||
|
@ -190,72 +191,13 @@ class PaymentController extends Controller
|
||||||
'tax_percent' => $creditProduct->getTaxPercent(),
|
'tax_percent' => $creditProduct->getTaxPercent(),
|
||||||
'total_price' => $creditProduct->getTotalPrice(),
|
'total_price' => $creditProduct->getTotalPrice(),
|
||||||
'currency_code' => $creditProduct->currency_code,
|
'currency_code' => $creditProduct->currency_code,
|
||||||
|
'credit_product_id' => $creditProduct->id,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
||||||
event(new UserUpdateCreditsEvent($user));
|
event(new UserUpdateCreditsEvent($user));
|
||||||
|
|
||||||
//create invoice
|
$this->createInvoice($user, $payment, 'paid');
|
||||||
$lastInvoiceID = \App\Models\Invoice::where("invoice_name", "like", "%" . now()->format('mY') . "%")->count("id");
|
|
||||||
$newInvoiceID = $lastInvoiceID + 1;
|
|
||||||
$InvoiceSettings = InvoiceSettings::query()->first();
|
|
||||||
$logoPath = storage_path('app/public/logo.png');
|
|
||||||
|
|
||||||
$seller = new Party([
|
|
||||||
'name' => $InvoiceSettings->company_name,
|
|
||||||
'phone' => $InvoiceSettings->company_phone,
|
|
||||||
'address' => $InvoiceSettings->company_adress,
|
|
||||||
'vat' => $InvoiceSettings->company_vat,
|
|
||||||
'custom_fields' => [
|
|
||||||
'E-Mail' => $InvoiceSettings->company_mail,
|
|
||||||
"Web" => $InvoiceSettings->company_web
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
|
|
||||||
|
|
||||||
$customer = new Buyer([
|
|
||||||
'name' => $user->name,
|
|
||||||
'custom_fields' => [
|
|
||||||
'E-Mail' => $user->email,
|
|
||||||
'Client ID' => $user->id,
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
$item = (new InvoiceItem())
|
|
||||||
->title($creditProduct->description)
|
|
||||||
->pricePerUnit($creditProduct->price);
|
|
||||||
|
|
||||||
$invoice = Invoice::make()
|
|
||||||
->template('controlpanel')
|
|
||||||
->name(__("Invoice"))
|
|
||||||
->buyer($customer)
|
|
||||||
->seller($seller)
|
|
||||||
->discountByPercent(0)
|
|
||||||
->taxRate(floatval($creditProduct->getTaxPercent()))
|
|
||||||
->shipping(0)
|
|
||||||
->addItem($item)
|
|
||||||
->status(__('Paid'))
|
|
||||||
->series(now()->format('mY'))
|
|
||||||
->delimiter("-")
|
|
||||||
->sequence($newInvoiceID)
|
|
||||||
->serialNumberFormat($InvoiceSettings->invoice_prefix . '{DELIMITER}{SERIES}{SEQUENCE}');
|
|
||||||
|
|
||||||
if (file_exists($logoPath)) {
|
|
||||||
$invoice->logo($logoPath);
|
|
||||||
}
|
|
||||||
//Save the invoice in "storage\app\invoice\USER_ID\YEAR"
|
|
||||||
$invoice->filename = $invoice->getSerialNumber() . '.pdf';
|
|
||||||
$invoice->render();
|
|
||||||
Storage::disk("local")->put("invoice/" . $user->id . "/" . now()->format('Y') . "/" . $invoice->filename, $invoice->output);
|
|
||||||
|
|
||||||
|
|
||||||
\App\Models\Invoice::create([
|
|
||||||
'invoice_user' => $user->id,
|
|
||||||
'invoice_name' => $invoice->getSerialNumber(),
|
|
||||||
'payment_id' => $payment->payment_id,
|
|
||||||
]);
|
|
||||||
|
|
||||||
//Send Invoice per Mail
|
|
||||||
$user->notify(new InvoiceNotification($invoice, $user, $payment));
|
|
||||||
|
|
||||||
//redirect back to home
|
//redirect back to home
|
||||||
return redirect()->route('home')->with('success', __('Your credit balance has been increased!'));
|
return redirect()->route('home')->with('success', __('Your credit balance has been increased!'));
|
||||||
|
@ -386,6 +328,7 @@ class PaymentController extends Controller
|
||||||
'total_price' => $creditProduct->getTotalPrice(),
|
'total_price' => $creditProduct->getTotalPrice(),
|
||||||
'tax_percent' => $creditProduct->getTaxPercent(),
|
'tax_percent' => $creditProduct->getTaxPercent(),
|
||||||
'currency_code' => $creditProduct->currency_code,
|
'currency_code' => $creditProduct->currency_code,
|
||||||
|
'credit_product_id' => $creditProduct->id,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
//payment notification
|
//payment notification
|
||||||
|
@ -393,6 +336,8 @@ class PaymentController extends Controller
|
||||||
|
|
||||||
event(new UserUpdateCreditsEvent($user));
|
event(new UserUpdateCreditsEvent($user));
|
||||||
|
|
||||||
|
$this->createInvoice($user, $payment, 'paid');
|
||||||
|
|
||||||
//redirect back to home
|
//redirect back to home
|
||||||
return redirect()->route('home')->with('success', __('Your credit balance has been increased!'));
|
return redirect()->route('home')->with('success', __('Your credit balance has been increased!'));
|
||||||
} else {
|
} else {
|
||||||
|
@ -411,8 +356,11 @@ class PaymentController extends Controller
|
||||||
'total_price' => $creditProduct->getTotalPrice(),
|
'total_price' => $creditProduct->getTotalPrice(),
|
||||||
'tax_percent' => $creditProduct->getTaxPercent(),
|
'tax_percent' => $creditProduct->getTaxPercent(),
|
||||||
'currency_code' => $creditProduct->currency_code,
|
'currency_code' => $creditProduct->currency_code,
|
||||||
|
'credit_product_id' => $creditProduct->id,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
$this->createInvoice($user, $payment, 'processing');
|
||||||
|
|
||||||
//redirect back to home
|
//redirect back to home
|
||||||
return redirect()->route('home')->with('success', __('Your payment is being processed!'));
|
return redirect()->route('home')->with('success', __('Your payment is being processed!'));
|
||||||
}
|
}
|
||||||
|
@ -438,7 +386,7 @@ class PaymentController extends Controller
|
||||||
/**
|
/**
|
||||||
* @param Request $request
|
* @param Request $request
|
||||||
*/
|
*/
|
||||||
protected function handleStripePayment($paymentIntent)
|
protected function handleStripePaymentSuccessHook($paymentIntent)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
// Get payment db entry
|
// Get payment db entry
|
||||||
|
@ -467,6 +415,8 @@ class PaymentController extends Controller
|
||||||
//payment notification
|
//payment notification
|
||||||
$user->notify(new ConfirmPaymentNotification($payment));
|
$user->notify(new ConfirmPaymentNotification($payment));
|
||||||
event(new UserUpdateCreditsEvent($user));
|
event(new UserUpdateCreditsEvent($user));
|
||||||
|
|
||||||
|
$this->createInvoice($user, $payment, 'paid');
|
||||||
}
|
}
|
||||||
} catch (HttpException $ex) {
|
} catch (HttpException $ex) {
|
||||||
abort(422);
|
abort(422);
|
||||||
|
@ -503,7 +453,7 @@ class PaymentController extends Controller
|
||||||
switch ($event->type) {
|
switch ($event->type) {
|
||||||
case 'payment_intent.succeeded':
|
case 'payment_intent.succeeded':
|
||||||
$paymentIntent = $event->data->object; // contains a \Stripe\PaymentIntent
|
$paymentIntent = $event->data->object; // contains a \Stripe\PaymentIntent
|
||||||
$this->handleStripePayment($paymentIntent);
|
$this->handleStripePaymentSuccessHook($paymentIntent);
|
||||||
break;
|
break;
|
||||||
case 'payment_method.attached':
|
case 'payment_method.attached':
|
||||||
$paymentMethod = $event->data->object; // contains a \Stripe\PaymentMethod
|
$paymentMethod = $event->data->object; // contains a \Stripe\PaymentMethod
|
||||||
|
@ -544,9 +494,72 @@ class PaymentController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected function createInvoice($user, $payment, $paymentStatus)
|
||||||
|
{
|
||||||
|
$creditProduct = CreditProduct::where('id', $payment->credit_product_id)->first();
|
||||||
|
//create invoice
|
||||||
|
$lastInvoiceID = \App\Models\Invoice::where("invoice_name", "like", "%" . now()->format('mY') . "%")->count("id");
|
||||||
|
$newInvoiceID = $lastInvoiceID + 1;
|
||||||
|
$InvoiceSettings = InvoiceSettings::query()->first();
|
||||||
|
$logoPath = storage_path('app/public/logo.png');
|
||||||
|
|
||||||
|
$seller = new Party([
|
||||||
|
'name' => $InvoiceSettings->company_name,
|
||||||
|
'phone' => $InvoiceSettings->company_phone,
|
||||||
|
'address' => $InvoiceSettings->company_adress,
|
||||||
|
'vat' => $InvoiceSettings->company_vat,
|
||||||
|
'custom_fields' => [
|
||||||
|
'E-Mail' => $InvoiceSettings->company_mail,
|
||||||
|
"Web" => $InvoiceSettings->company_web
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
$customer = new Buyer([
|
||||||
|
'name' => $user->name,
|
||||||
|
'custom_fields' => [
|
||||||
|
'E-Mail' => $user->email,
|
||||||
|
'Client ID' => $user->id,
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
$item = (new InvoiceItem())
|
||||||
|
->title($creditProduct->description)
|
||||||
|
->pricePerUnit($creditProduct->price);
|
||||||
|
|
||||||
|
$invoice = Invoice::make()
|
||||||
|
->template('controlpanel')
|
||||||
|
->name(__("Invoice"))
|
||||||
|
->buyer($customer)
|
||||||
|
->seller($seller)
|
||||||
|
->discountByPercent(0)
|
||||||
|
->taxRate(floatval($creditProduct->getTaxPercent()))
|
||||||
|
->shipping(0)
|
||||||
|
->addItem($item)
|
||||||
|
->status(__($paymentStatus))
|
||||||
|
->series(now()->format('mY'))
|
||||||
|
->delimiter("-")
|
||||||
|
->sequence($newInvoiceID)
|
||||||
|
->serialNumberFormat($InvoiceSettings->invoice_prefix . '{DELIMITER}{SERIES}{SEQUENCE}');
|
||||||
|
|
||||||
|
if (file_exists($logoPath)) {
|
||||||
|
$invoice->logo($logoPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Save the invoice in "storage\app\invoice\USER_ID\YEAR"
|
||||||
|
$invoice->filename = $invoice->getSerialNumber() . '.pdf';
|
||||||
|
$invoice->render();
|
||||||
|
Storage::disk("local")->put("invoice/" . $user->id . "/" . now()->format('Y') . "/" . $invoice->filename, $invoice->output);
|
||||||
|
|
||||||
|
|
||||||
|
\App\Models\Invoice::create([
|
||||||
|
'invoice_user' => $user->id,
|
||||||
|
'invoice_name' => $invoice->getSerialNumber(),
|
||||||
|
'payment_id' => $payment->payment_id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
//Send Invoice per Mail
|
||||||
|
$user->notify(new InvoiceNotification($invoice, $user, $payment));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return JsonResponse|mixed
|
* @return JsonResponse|mixed
|
||||||
|
|
|
@ -32,6 +32,7 @@ class Payment extends Model
|
||||||
'total_price',
|
'total_price',
|
||||||
'tax_percent',
|
'tax_percent',
|
||||||
'currency_code',
|
'currency_code',
|
||||||
|
'credit_product_id',
|
||||||
];
|
];
|
||||||
|
|
||||||
public static function boot()
|
public static function boot()
|
||||||
|
|
|
@ -19,6 +19,7 @@ class UpdateToPaymentsTable extends Migration
|
||||||
$table->string('payment_method');
|
$table->string('payment_method');
|
||||||
$table->dropColumn('payer');
|
$table->dropColumn('payer');
|
||||||
$table->dropColumn('payer_id');
|
$table->dropColumn('payer_id');
|
||||||
|
$table->string('credit_product_id');
|
||||||
});
|
});
|
||||||
|
|
||||||
DB::statement('UPDATE payments SET payment_method="paypal"');
|
DB::statement('UPDATE payments SET payment_method="paypal"');
|
||||||
|
@ -35,6 +36,7 @@ class UpdateToPaymentsTable extends Migration
|
||||||
$table->dropColumn('payment_method');
|
$table->dropColumn('payment_method');
|
||||||
$table->string('payer_id')->nullable();
|
$table->string('payer_id')->nullable();
|
||||||
$table->text('payer')->nullable();
|
$table->text('payer')->nullable();
|
||||||
|
$table->dropColumn('credit_product_id');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue