<?php
namespace App\Controller;
use App\Entity\Nouvelleorder;
use App\Entity\User;
use App\Repository\BonusRepository;
use App\Repository\MonthlyCommissionTotalRepository;
use App\Repository\PaiementRepository;
use App\Service\WooCommerceApiService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Orders;
use App\Repository\UserRepository;
use Psr\Log\LoggerInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use App\Service\CommissionService;
use App\Service\GiftService;
/**
* @Route("/newapimlmfinal")
*/
class WooCommerceController extends AbstractController
{
private $logger;
private $wooCommerceApiService;
private $client;
private $consumerKey;
private $consumerSecret;
private $commissionService;
private $giftService;
private $entityManager ;
public function __construct(GiftService $giftService, CommissionService $commissionService, string $consumerKey, string $consumerSecret, HttpClientInterface $client,EntityManagerInterface $entityManager, WooCommerceApiService $wooCommerceApiService , LoggerInterface $logger)
{
$this->wooCommerceApiService = $wooCommerceApiService;
$this->logger = $logger;
$this->entityManager = $entityManager;
$this->client = $client;
$this->consumerKey = $consumerKey;
$this->consumerSecret = $consumerSecret;
$this->commissionService = $commissionService;
$this->giftService = $giftService;
}
public function getCustomerDisplayNamebyuser($customerId)
{
try {
$response = $this->client->request('GET', "https://biocasemlm-shop.com/wp-json/wc/v3/customers/{$customerId}", [
'auth_basic' => [$this->consumerKey, $this->consumerSecret],
]);
$customerData = $response->toArray();
return $customerData['last_name']; // Ou tout autre champ
} catch (\Exception $e) {
// Log l'erreur et/ou renvoyer une valeur par défaut ou null
}
}
/**
* @Route("/orders/webhook", name="order_webhook", methods={"POST"})
*/
public function handleOrderWebhook(BonusRepository $bonusRepository,MonthlyCommissionTotalRepository $commissionTotalRepository,Request $request, LoggerInterface $logger, EntityManagerInterface $entityManager): Response
{
$data = json_decode($request->getContent(), true);
if ($data['status'] === 'processing') {
$cin = $this->getCustomerDisplayNamebyuser($data['customer_id']);
$user = $this->entityManager->getRepository(User::class)->findOneBy(['Cin' => $cin]);
$totalOrder = $data['total'];
// Accès au total de l'expédition
// Comme shipping_lines est un tableau, vous devez accéder au premier élément (ou à un élément spécifique) avant de récupérer le total
$totalShipping = $data['shipping_lines'][0]['total'];
$modedepaiement = $data['payment_method'];
// Calcul du total ajusté en soustrayant le total de l'expédition du total de la commande
$totalAdjusted = $totalOrder - $totalShipping;
$existingOrder = $entityManager->getRepository(Orders::class)->findOneBy(['numerocommande' => $data['id']]);
if ($existingOrder) {
$logger->info('Order already exists with number: ' . $data['id']);
return new Response('Order already exists', Response::HTTP_OK); // Ou considérez un autre code de statut si cela doit être traité comme une erreur
}
$order = new Orders();
$order->setStatus($data['status']);
$order->setNumerocommande($data['id']);
$order->setTotal($totalAdjusted);
$order->setDate(new \DateTime());
$order->setUser($user);
try {
if ($modedepaiement =='commission_payment'){
$bonusTotal = $bonusRepository->getTotalUnpaidForUser($user);
$commissionTotal = $commissionTotalRepository->getTotalUnpaidForUser($user);
$totalToPay = $bonusTotal + $commissionTotal;
if($totalToPay > $totalOrder)
{
$totalbbalance = $user->getBalance() + $totalOrder ;
$user->setBalance($totalbbalance);
}else{
$user->setBalance($totalToPay);
}
}
$entityManager->persist($order);
$entityManager->flush();
$this->commissionService->calculateAndRecordCommissions($order);
$this->giftService->checkAndCreateGiftForUser($order->getUser());
} catch (\Exception $e) {
$response = new Response();
$response->setContent('Un problème est survenu lors du traitement de la commande.');
$response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR);
// Vous pouvez aussi ajouter des en-têtes si nécessaire, par exemple:
// $response->headers->set('Content-Type', 'text/plain');
return $response;
}
return new Response('Order processed', Response::HTTP_OK);
}
return new Response('Webhook received, but no action required', Response::HTTP_OK);
}
/**
* @Route("/commission/balance/{cin}", name="api_commission_balance", methods={"GET"})
*/
public function getCommissionBalance(PaiementRepository $PaiementRepository , $cin, UserRepository $userRepository, BonusRepository $bonusRepository, MonthlyCommissionTotalRepository $monthlyCommissionRepository): JsonResponse
{
$user = $userRepository->findOneBy(['Cin' => $cin]);
if (!$user) {
return new JsonResponse(['error' => 'Utilisateur non trouvé'], Response::HTTP_NOT_FOUND);
}
$bonusTotal = $bonusRepository->findTotalUnpaidByUser($user);
$commissionTotal = $monthlyCommissionRepository->findTotalUnpaidByUser($user);
$totalPayments = $PaiementRepository->findTotalPaymentsForUserfinal($user);
$balanceuser = $user->getBalance();
$balance = ($bonusTotal + $commissionTotal) - $balanceuser - $totalPayments;
$balance = number_format($balance, 2, '.', '');
if ($commissionTotal == 0) {
if ($bonusTotal == 0) {
return new JsonResponse(['balance' => 0]);
}
} else {
return new JsonResponse(['balance' => $balance]);
}
}
/**
* @Route("/orders/webhook/new", name="order_webhook_NEW", methods={"POST"})
*/
public function handleOrderWebhooknouvellecommandNEWe(Request $request, LoggerInterface $logger, EntityManagerInterface $entityManager): Response
{
$data = json_decode($request->getContent(), true);
if (!$data) {
$logger->error('Invalid JSON received.');
return new Response('Invalid JSON');
}
$logger->info('Webhook received: ');
if (!isset($data['status'])) {
$logger->error('Missing status in data.');
return new Response('Invalid data: Missing status', Response::HTTP_BAD_REQUEST);
}
if ($data['status'] === 'new') {
$logger->info('Order with status: ' . $data['status']);
$cin = $this->getCustomerDisplayNamebyuser($data['customer_id']);
$user = $this->entityManager->getRepository(User::class)->findOneBy(['Cin' => $cin]);
$totalOrder = $data['total'];
// Accès au total de l'expédition
// Comme shipping_lines est un tableau, vous devez accéder au premier élément (ou à un élément spécifique) avant de récupérer le total
$totalShipping = $data['shipping_lines'][0]['total'];
$modedepaiement = $data['payment_method'];
// Calcul du total ajusté en soustrayant le total de l'expédition du total de la commande
$totalAdjusted = $totalOrder - $totalShipping;
$existingOrder = $entityManager->getRepository(Nouvelleorder::class)->findOneBy(['numerocommande' => $data['id']]);
if ($existingOrder) {
$logger->info('Order already exists with number: ' . $data['id']);
return new Response('Order already exists', Response::HTTP_OK); // Ou considérez un autre code de statut si cela doit être traité comme une erreur
}
$nouvelleorder = new Nouvelleorder();
$nouvelleorder->setStatus($data['status']);
$nouvelleorder->setNumerocommande($data['id']);
$nouvelleorder->setTotal($totalAdjusted);
$nouvelleorder->setDate(new \DateTime());
$nouvelleorder->setUser($user);
try {
$entityManager->persist($nouvelleorder);
$entityManager->flush();
$this->commissionService->calculateAndRecordCommissionsNeworders($nouvelleorder);
} catch (\Exception $e) {
$response = new Response();
$response->setContent('Un problème est survenu lors du traitement de la commande.');
$response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR);
// Vous pouvez aussi ajouter des en-têtes si nécessaire, par exemple:
// $response->headers->set('Content-Type', 'text/plain');
return $response;
}
return new Response('Order processed', Response::HTTP_OK);
}
return new Response('Webhook received, but no action required', Response::HTTP_OK);
}
}