<?php declare(strict_types=1);
namespace App\Billing\Controller;
use App\Billing\Entity\Invoice;
use App\Billing\Service\InvoicePDFService;
use App\Billing\Service\InvoiceService;
use App\Framework\Controller\APIController;
use App\Framework\Serializer\APISerializerGroup;
use App\Order\Service\OrderService;
use Doctrine\ORM\EntityNotFoundException;
use Symfony\Component\Security\Http\Attribute\IsGranted;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\ExpressionLanguage\Expression;
#[Route(path: '/api/invoices')]
#[IsGranted(new Expression("is_granted('ROLE_ADMIN') or is_granted('ROLE_HUERTA') or is_granted('ROLE_CALLCENTER')"))]
class InvoiceController extends APIController
{
/**
* @return mixed[]
*/
#[Route(path: '/stats', methods: ['GET'])]
public function getStats(InvoiceService $invoiceService): ?array
{
// Get collection filters
$filters = $this->getCollectionFilters();
return $invoiceService->getStats([
'filters' => $filters,
]);
}
/**
* @return mixed[]
*/
#[Route(path: '', methods: ['GET'])]
#[APISerializerGroup('list')]
public function listInvoices(InvoiceService $invoiceService): array
{
$filters = $this->getCollectionFilters();
$result = $invoiceService->getInvoices([
'filters' => $filters,
]);
return [
'count' => count($result),
'records' => $result,
];
}
/**
* @throws EntityNotFoundException
*/
#[Route(path: '/{id}', requirements: ['id' => '\d+'], methods: ['GET'])]
#[APISerializerGroup('details')]
public function getInvoice(int $id, InvoiceService $invoiceService, InvoicePDFService $invoicePDFService): Response
{
$invoice = $invoiceService->getInvoiceById($id);
$pdf = $invoicePDFService->generatePDFInvoice($invoice);
return new Response($pdf, 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="factura.pdf"',
]);
}
/**
* @throws EntityNotFoundException
*/
#[Route(path: '/{ids}', methods: ['GET'])]
public function getInvoices(
string $ids,
InvoiceService $invoiceService,
InvoicePDFService $invoicePDFService
): Response {
// Get array of ids that we want to pack
$ids = array_map('intval', explode(',', $ids));
$invoices = $invoiceService->getInvoicesByIds($ids);
$pdf = $invoicePDFService->generatePDFInvoices($invoices);
return new Response($pdf, 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="facturas.pdf"',
]);
}
#[Route(path: '', methods: ['POST'])]
#[APISerializerGroup('details')]
public function postInvoice(OrderService $orderService, InvoiceService $invoiceService): Invoice
{
$orderId = $this->getRequestBodyData('order', true);
$order = $orderService->getOrderById($orderId);
$customer = $order->getCustomer();
return $invoiceService->generateInvoiceForOrder($order, $customer);
}
}