<?php
namespace App\Controller\Admin;
use App\Enum\OrganizationStatusEnum;
use App\Service\SubscriptionUtils;
use Doctrine\ORM\EntityManagerInterface;
use Evo\Infrastructure\MappingORM\Invoice;
use Evo\Infrastructure\MappingORM\Organization;
use Evo\Infrastructure\MappingORM\User;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* @Route("/organization")
*/
class OrganizationController extends AbstractController
{
private EntityManagerInterface $em;
private TranslatorInterface $translator;
private ParameterBagInterface $params;
public function __construct(
EntityManagerInterface $em,
TranslatorInterface $translator,
ParameterBagInterface $params
) {
$this->em = $em;
$this->translator = $translator;
$this->params = $params;
}
/**
* @Route("/{id}/history", name="admin_organization_history", methods={"GET"})
*/
public function organizationHistory($id)
{
$repository = $this->em->getRepository(Organization::class);
/** @var Organization $organization */
$organization = $repository->find($id);
return $this->render(
'organization/view_history.html.twig', [
'organization' => $organization,
'histories' => $organization->getHistory(),
]
);
}
/**
* @Route("/{status}/validation/document", name="app_kyc_organization", methods={"GET", "POST"})
*/
public function validationKYC(Request $request, $status, PaginatorInterface $paginator): Response
{
$searchQuery = $request->request->get('organization_search_query');
$repository = $this->em->getRepository(Organization::class);
$organizations = $repository->getOrgaToKYC($status, false, $searchQuery);
$organizationPag = $paginator->paginate(
$organizations,
$request->query->getInt('page', 1),
10
);
return $this->render('organization/list_new_payment.html.twig', [
'organizations' => $organizationPag,
'status' => $status,
'route' => $searchQuery ? 'app_kyc_organization_unpaid' : 'app_kyc_organization_new_payment',
]);
}
/**
* @Route("/{id}/impersonation", name="admin_organization_impersonation", methods={"GET"})
*/
public function impersonation($id, Request $request, ?bool $redirect = true)
{
$repository = $this->em->getRepository(Organization::class);
/** @var Organization $organization */
$organization = $repository->find($id);
$params = $request->get('edit');
$reset = $request->get('reset');
$to = $request->get('to');
$returnLink = $request->get('return_link');
if ($organization) {
$users = $organization->getUsers();
if (!empty($users)) {
/** @var User $user */
$user = $users[0];
$uri_tunnel = $this->params->get('uri_bv');
$url = $uri_tunnel.'/?switch_user='.urlencode($user->getEmail()).'&org='.$organization->getId();
if ('true' === $reset && OrganizationStatusEnum::LOST === $organization->getStatus()) {
$organization->setStatus(OrganizationStatusEnum::NEW);
$this->em->persist($organization);
$this->em->flush();
}
if ($params) {
$url = $url.'&edit='.$params;
}
if ($to) {
$url = $url.'&to='.$to;
}
if ($returnLink) {
$url = $url.'&return_link='.$returnLink;
}
return $redirect ? $this->redirect($url) : $this->json($url);
}
return $this->json(['message' => 'No users attached to organization']);
}
return $this->json(['message' => 'Organization not found'], Response::HTTP_NOT_FOUND);
}
/**
* @Route("/export", name="admin_organization_export", methods={"GET"})
*/
public function export()
{
$repository = $this->em->getRepository(Organization::class);
$aStatus = [
OrganizationStatusEnum::NEW,
OrganizationStatusEnum::CANCELLED,
OrganizationStatusEnum::PRE_CANCELLATION,
OrganizationStatusEnum::LOST,
];
$organizations = $repository->getOrganizationWithoutStatus($aStatus);
$rows = [];
$data = [
'ID',
'Dénomination sociale',
'Date effet contrat',
'Statut',
'Date facture réccurente',
'Abonnement',
'ID Facture',
'Montant abonnement en €',
'Montant facture en €',
];
$rows[] = implode(',', $data);
/** @var Organization $organization */
foreach ($organizations as $organization) {
$invoice = null;
/** @var Invoice $object */
foreach ($organization->getInvoices() as $object) {
$date = $object->getCreatedAt()->format('Y-m');
if ('2020-02' == $date && $object->getIsDomiciliation()) {
$invoice = $object;
break;
}
}
try {
$subscription = SubscriptionUtils::getDomSubscription($organization);
$data = [
$organization->getId(),
$organization->getLegalName(),
(null !== $organization->getDomiciliationStartDate()) ? $organization->getDomiciliationStartDate()->format('d-m-Y') : '',
$this->translator->trans(OrganizationStatusEnum::getReadableValue($organization->getStatus())),
(null !== $organization->getDomiciliationStartDate()) ? $organization->getDomiciliationStartDate()->format('d') : '',
(null !== $subscription) ? $subscription->getType() : '',
(null !== $invoice) ? $invoice->getId() : '',
(null !== $subscription) ? $subscription->getTotalPriceWithTax() : '',
(null !== $invoice) ? $invoice->getPrice() : '',
];
$rows[] = implode(',', $data);
} catch (\Exception $e) {
continue;
}
}
$content = implode("\n", $rows);
$response = new Response($content);
$response->headers->set('Content-Type', 'text/csv');
$response->headers->set('Content-Type', 'application/force-download');
$response->headers->set('Content-Transfer-Encoding', 'UTF-8');
$response->headers->set('Content-Disposition',
'attachment; filename="export-facture-'.date('Ymd_His').'.csv"');
echo "\xEF\xBB\xBF";
return $response;
}
}