<?php
namespace Whater\Application\UseCase\Product;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\Route;
use Whater\Application\UseCase\AbstractCommandHandler;
use Whater\Application\UseCase\Product\CommandRequest\GetCartOrderForCheckoutCommand;
use Whater\Domain\Product\Exception\InvalidCartOrderAccessException;
use Whater\Domain\User\Model\Role;
use Whater\Domain\Product\Model\CartOrder;
use Whater\Domain\Product\Repository\CartOrderRepositoryInterface;
/**
* Class GetCartOrderForCheckoutHandler
* @package Whater\Application\UseCase\Whater
*/
class GetCartOrderForCheckoutHandler extends AbstractCommandHandler
{
/**
* @var CartOrderRepositoryInterface
*/
private $repositoryCartOrder;
/**
* @param CartOrderRepositoryInterface $repositoryCartOrder
*/
public function __construct(CartOrderRepositoryInterface $repositoryCartOrder)
{
$this->repositoryCartOrder = $repositoryCartOrder;
}
/**
* @param GetCartOrderForCheckoutCommand $getCartOrderForCheckoutCommand
* @return null|CartOrder
*/
public function handle(GetCartOrderForCheckoutCommand $getCartOrderForCheckoutCommand): ?CartOrder
{
$grantUser = $getCartOrderForCheckoutCommand->user();
$cartOrder = $this->repositoryCartOrder->findOneById(
$getCartOrderForCheckoutCommand->cartOrderId()
);
if ($cartOrder->user() != null && ($grantUser == null || !$cartOrder->user()->equals($grantUser))) {
throw new InvalidCartOrderAccessException();
}
if ($getCartOrderForCheckoutCommand->renewPaymentIntent() && $cartOrder->status() == CartOrder::ORDER_STATUS_PENDING) {
if ($cartOrder->totalEuros() > 0) {
$stripeSecretkey = $this->parameterBag()->get('stripe_private_key');
$stripe = new \Stripe\StripeClient($stripeSecretkey);
if ($cartOrder->cartOrderType() == CartOrder::ORDER_TYPE_LICENSE) {
// Suscription
$stripeCustomerId = $grantUser->stripeCustomerId();
if ($stripeCustomerId == null) {
$stripeCustomer = $stripe->customers->create([
'email' => $grantUser->email(),
'name' => $grantUser->fullName()
]);
$stripeCustomerId = $stripeCustomer->id;
}
$interval = 'month';
if ($cartOrder->cartItem(0)->meta()['payment_plan'] == 'LICENSE_PAYMENT_PLAN_ANNUAL') {
$interval = 'year';
}
$stripeProduct = $stripe->products->create([
'name' => 'Suscripción a whater.app',
'shippable' => false,
'metadata' => [
'whater_product_slug' => $cartOrder->cartItem(0)->product()->productSlug(),
]
// Puedes agregar más detalles del producto si es necesario
]);
$stripePrice = $stripe->prices->create([
'product' => $stripeProduct->id,
'unit_amount' => $cartOrder->totalEuros() * 100,
'currency' => 'EUR',
'recurring' => ['interval' => $interval],
'metadata' => [
'cart_order_id' => $cartOrder->id(),
]
]);
$stripeSubscription = $stripe->subscriptions->create([
'customer' => $stripeCustomerId,
'items' => [['price' => $stripePrice->id]],
'metadata' => [
'cart_order_id' => $cartOrder->id(),
'cart_url' => $this->router()->generate('web_public_cart_order_checkout', ['cartOrderId' => $cartOrder->id()], UrlGeneratorInterface::ABSOLUTE_URL)
],
'payment_behavior' => 'default_incomplete',
'payment_settings' => ['save_default_payment_method' => 'on_subscription'],
'expand' => ['latest_invoice.payment_intent']
]);
$paymentIntent = $stripeSubscription->latest_invoice->payment_intent;
$cartOrder->updateStripeInfo(
json_decode(json_encode($paymentIntent), true),
json_decode(json_encode($stripeSubscription), true)
);
} else {
// One payment
$params = [
'amount' => $cartOrder->totalEuros() * 100,
'description' => 'whater.app - ' . $cartOrder->id(),
'metadata' => [
'cart_order_id' => $cartOrder->id(),
'cart_url' => $this->router()->generate('web_public_cart_order_checkout', ['cartOrderId' => $cartOrder->id()], UrlGeneratorInterface::ABSOLUTE_URL)
],
'currency' => 'eur',
'automatic_payment_methods' => [
'enabled' => false,
],
'payment_method_types' => ['card']
];
if ($cartOrder->cartOrderType() == CartOrder::ORDER_TYPE_CATALOG_PRODUCT) {
$stripeExpressAccountId = $cartOrder->cartItem(0)->product()->whaterOrganization()->stripeExpressAccountId();
$params['on_behalf_of'] = $stripeExpressAccountId;
$whaterCommisionPercent = $cartOrder->cartItem(0)->product()->whaterCommisionPercent();
$whaterFee = $cartOrder->totalEuros() * ($whaterCommisionPercent) / 100;
$params['application_fee_amount'] = round($whaterFee * 100);
$params['transfer_data'] = [
'destination' => $stripeExpressAccountId
];
}
$paymentIntent = $stripe->paymentIntents->create($params);
$cartOrder->updateStripeInfo(
json_decode(json_encode($paymentIntent), true)
);
}
}
$this->repositoryCartOrder->add($cartOrder);
}
return $cartOrder;
}
}