<?php
namespace App\Controller\Api\v3;
use App\Controller\Api\Service\EmployeeActivityService;
use App\Controller\Api\Service\ProjectOrderService;
use App\Controller\Api\Service\ReferenceService;
use App\Entity\ContactPersonPositions;
use App\Entity\ProjectOrders;
use App\Entity\ProjectOrderTaskJobs;
use App\Entity\ProjectOrderUndertakings;
use App\Entity\Projects;
use App\Entity\WorkerTimesheet;
use App\Enum\SeverityInterface;
use App\Service\Calculators\ProjectOrderCalculator;
use App\Service\SerializeService\EmployeeSerialize;
use App\Service\SerializeService\ExpenseSerialize;
use App\Service\SerializeService\ProjectOrderSerialize;
use App\Service\SerializeService\ProjectSerialize;
use App\Service\SerializeService\ReferenceSerialize;
use App\Service\StreamingService;
use App\Service\WorksPlan\WorksPlanMaterializer;
use Doctrine\ORM\EntityManagerInterface;
use phpDocumentor\Reflection\Types\This;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* @Route("/api/v3/project-order")
*/
class ProjectOrderController extends AbstractController
{
/**
* @Route("/orders/{project_id}", name="api_v3_project_order_orders", methods={"POST"}, requirements={"project_id": "\d+"} ,defaults={"project_id": null} )
* @ParamConverter("project", options={"mapping":{"project_id": "id"}})
* @throws \Exception
*/
public function orders( ?Projects $project, ProjectSerialize $projectSerialize, ProjectOrderService $projectOrderService, ProjectOrderSerialize $projectOrderSerialize, TranslatorInterface $translator,
Request $request,
?int $project_id): Response
{
if( $project_id && !$project ){
return $this->json([
"message" => $translator->trans('Project not found'),
"severity" => SeverityInterface::ERROR
], Response::HTTP_NOT_FOUND);
}
// $orders = $project->getProjectOrders();
// ℹ️ℹ️ 💀💀 This is a old, By New Version success with Task/Jobs Weight!!! 💀💀 ℹ️ℹ️
// $orders = $projectOrderService->setEntity($project)->findByFeedbackStatus($request->request->get('type'), $range['from'], $range['to']);
// Project Based | All
if($project){
$projectOrderService->setProject($project);
}
$orders = $projectOrderService->setParams($request->request)->fetchAll();
// No need use the service, while project delivered by Dependency Injection
$serializedProjectOrders = $projectOrderSerialize->setEntity($orders)->serializeListNested();
$projectBase = $projectSerialize->setEntity($project)->serializeBase();
return $this->json([
"message" => $translator->trans('Loaded project orders successfully'),
"severity" => SeverityInterface::SUCCESS,
// TODO Remove Two of One
"projectOrders" => $serializedProjectOrders,
"orders" => $serializedProjectOrders,
"projectBase" => $projectBase
], Response::HTTP_OK );
}
/**
* Serialize with minimal groups
* @Route("/smart-orders/{project_id}", name="api_v3_project_order_smart_orders", methods={"POST"}, requirements={"project_id": "\d+"} ,defaults={"project_id": null} )
* @ParamConverter("project", options={"mapping":{"project_id": "id"}})
* @throws \Exception
*/
public function smartOrders( ?Projects $project, ProjectOrderService $projectOrderService, ProjectOrderSerialize $projectOrderSerialize, TranslatorInterface $translator, ?int $project_id): Response
{
if( $project_id && !$project ){
return $this->json([
"message" => $translator->trans('Project not found'),
"severity" => SeverityInterface::ERROR
], Response::HTTP_NOT_FOUND);
}
// Project Based | All
if($project){
$projectOrderService->setProject($project);
}
$orders = $projectOrderService->fetchAll();
// No need use the service, while project delivered by Dependency Injection
$serializedProjectOrders = $projectOrderSerialize->setEntity($orders)->serializeForSelector();
return $this->json([
"message" => $translator->trans('Loaded project orders successfully'),
"severity" => SeverityInterface::SUCCESS,
"orders" => $serializedProjectOrders,
], Response::HTTP_OK );
}
/**
* Streamed Order
* @Route("/streamed-fetch/{project_id}/{order_id}", name="api_v3_project_order_streamed_fetch", requirements={"project_id": "\d+", "order_id": "\d+"}, defaults={"order_id": null} )
* @ParamConverter("project", options={"mapping":{"project_id": "id"}})
* @ParamConverter("projectOrder", options={"mapping":{"order_id": "id"}})
*/
public function streamedFetch( ?Projects $project, ?ProjectOrders $projectOrder,
ProjectOrderSerialize $projectOrderSerialize,
ReferenceSerialize $referenceSerialize,
ReferenceService $referenceService,
EmployeeActivityService $employeeActivityService, EmployeeSerialize $employeeSerialize, ProjectSerialize $projectSerialize,
TranslatorInterface $translator,
WorksPlanMaterializer $worksPlanMaterializer,
EntityManagerInterface $manager
): StreamedResponse
{
// Plana bağlı order → AÇILIŞTA plandan SYNC (execution-preserve). Stream BAŞLAMADAN,
// normal request bağlamında yap (mid-stream flush + back-sync yan etkileri SSE'yi kırıyordu).
// Plan boşsa (task yok / kaydedilmemiş) order'ı silme → guard.
if ($projectOrder !== null) {
$boundPlan = $projectOrder->getWorksPlan();
if ($boundPlan !== null && count($boundPlan->getTasks()) > 0) {
$worksPlanMaterializer->materialize($boundPlan);
$manager->flush();
}
}
$streaming = new StreamingService([
"localText" => ["completed" => $translator->trans('Completed')]
]);
$streaming->appendStream(
'employees',
$translator->trans('Loading employee...'),
fn() => $employeeSerialize->setEntity($employeeActivityService->fetchActiveEmployees())->setGroups([
"worker_activity@base",
"worker_activity@worker",
"worker@base",
"worker_activity@partner",
"partner@base"
])->render()
);
$streaming->appendStream(
'invoiceTypes',
$translator->trans('Loading invoice Types...'),
fn() => $referenceSerialize->setEntity($referenceService->invoiceTypes())->setGroups([
"invoice_type@base"
])->render()
);
$streaming->appendStream(
'project',
$translator->trans('Loading project...'),
function () use ($project, $projectSerialize) {
if (!$project) {
throw new \DomainException('Project not found');
}
return $projectSerialize->setEntity($project)->setGroups([
"project@core",
"project@owner",
"project_owner@base",
"project_owner@contact_persons",
"contact_person@core",
"contact_person@positions",
"contact_person_position@base",
"project@branches",
"branch@core",
"branch@departments",
"branch_department@core",
"project@invoice_type",
"invoice_type@base",
"project@settings",
"project_setting@core"
])->render();
}
);
$streaming->appendStream(
'corporateHierarchy',
$translator->trans('Loading Corporate Hierarchy...'),
function () use ($referenceService, $referenceSerialize) {
$corporate_hierarchy = $referenceService->setClassName(ContactPersonPositions::class)->fetch();
return $referenceSerialize->setEntity($corporate_hierarchy)->setGroups([
"contact_person_position@base"
])->render();
}
);
$streaming->appendStream(
'projectOrder',
$translator->trans('Loading project order...'),
function() use ($projectOrder, $projectOrderSerialize){
if(!$projectOrder){
return null;
}
// Sync yukarıda (stream öncesi) yapıldı; burada sadece serialize.
return $projectOrderSerialize->setEntity($projectOrder)->serializeFull();
}
);
return $streaming->flush();
}
/**
* @Route("/fetch/{order_id}", name="api_v3_project_order_fetch", methods={"POST"}, defaults={"order_id": null})
* @ParamConverter("projectOrder", options={"mapping":{"order_id": "id"}})
* @throws \Exception
*/
public function fetch( ?ProjectOrders $projectOrder, ProjectOrderSerialize $projectOrderSerialize, TranslatorInterface $translator, ?int $order_id = null ): Response {
if($order_id && !$projectOrder){
return $this->json([
"message" => $translator->trans("Order not found!"),
"severity" => SeverityInterface::WARNING
], Response::HTTP_NOT_FOUND );
}
$orderSerialized = $projectOrderSerialize->setEntity($projectOrder)->serializeFull();
return $this->json([
"message" => $translator->trans('Order fetched successfully'),
"severity" => SeverityInterface::SUCCESS,
"projectOrder" => $orderSerialized
]);
}
/**
* Tek job için tamamlama uygunluğu (live kontrol) — checkbox/Zeitachse öncesi.
* @Route("/job-completion-check/{job_id}", name="api_v3_project_order_job_completion_check", methods={"POST"}, requirements={"job_id": "\d+"})
* @ParamConverter("job", options={"mapping":{"job_id": "id"}})
*/
public function jobCompletionCheck( ?ProjectOrderTaskJobs $job, ProjectOrderService $projectOrderService, TranslatorInterface $translator, int $job_id ): Response {
if (!$job) {
return $this->json([
"message" => $translator->trans('Job not found'),
"severity" => SeverityInterface::ERROR
], Response::HTTP_NOT_FOUND);
}
$result = $projectOrderService->checkJobCompletion($job);
return $this->json([
"allowed" => $result['allowed'],
"start_at" => $result['start_at'],
"message" => $result['message'],
"severity" => $result['allowed'] ? SeverityInterface::SUCCESS : SeverityInterface::WARNING
]);
}
/**
* @Route("/upsert/{project_id}/{order_id}", name="api_v3_project_order_handle", methods={"POST"}, requirements={"project_id": "\d+"}, defaults={"order_id": null})
* @ParamConverter("project", options={"mapping":{"project_id": "id"}})
* @ParamConverter("projectOrder", options={"mapping":{"order_id": "id"}})
* @throws \Exception
*/
public function upsert( ?Projects $project, ?ProjectOrders $projectOrder, ProjectOrderService $projectOrderService, ProjectOrderSerialize $projectOrderSerialize, Request $request, TranslatorInterface $translator, ?int $order_id = null ): Response {
$projectOrder = $projectOrderService
->setEntity($projectOrder, $order_id)
->setParams($request->request)
->upsert($project);
if($projectOrderService->getException()){
return $this->json([
"message" => $projectOrderService->getException()->getMessage(),
"severity" => SeverityInterface::WARNING
], $projectOrderService->getException()->getCode() );
}
$projectOrderSerialized = $projectOrderSerialize->setEntity($projectOrder)->serializeFull();
// echo '<pre>';
// print_r($projectOrderSerialized);
// echo '</pre>';
// dd();
return $this->json([
"message" => $translator->trans('Order managed successfully'),
"severity" => SeverityInterface::SUCCESS,
"projectOrder" => $projectOrderSerialized
]);
}
/**
* @Route("/fetch-order-billings/{order_id}", name="api_v3_project_order_fetch_billings", methods={"POST"}, requirements={"order_id": "\d+"}, defaults={"order_id": null} )
* @ParamConverter("project", options={"mapping":{"project_id": "id"}})
* @ParamConverter("projectOrder", options={"mapping":{"order_id": "id"}})
* @throws \Exception
*/
public function fetchOrderBillings( ?ProjectOrders $projectOrder, ProjectOrderSerialize $projectOrderSerialize, ReferenceSerialize $referenceSerialize, TranslatorInterface $translator, Request $request, int $order_id ): Response
{
if ($order_id && !$projectOrder) {
return $this->json([
"message" => $translator->trans('Project order not found'),
"severity" => SeverityInterface::ERROR
], Response::HTTP_NOT_FOUND);
}
$billings = $projectOrder->getOrderBillings();
// Deep note: serializeFull() is scoped to the aggregate root (Billings),
// so only billing fields and their owned relations are included.
$serializedProjectOrderBillings = $projectOrderSerialize->setEntity($billings)->serializeFull();
$serializedPaymentStatus = $referenceSerialize->serializedInvoicePaymentStatus();
return $this->json([
"message" => $translator->trans('Loaded project orders successfully'),
"severity" => SeverityInterface::SUCCESS,
"billings" => $serializedProjectOrderBillings,
"masterData" => [
"paymentStatuses" => $serializedPaymentStatus
]
], Response::HTTP_OK );
}
/**
* @deprecated @see in Billings Service
* @Route("/upsert-billings/{order_id}", name="api_v3_project_order_upsert_billings", methods={"POST"}, requirements={"order_id": "\d+"}, defaults={"voucher_id": null} )
* @ParamConverter("projectOrder", options={"mapping":{"order_id": "id"}})
* @ParamConverter("undertaking", options={"mapping":{"voucher_id": "id"}})
* @throws \Exception
*/
public function upsertBillings(
?ProjectOrders $projectOrder,
ProjectOrderService $projectOrderService,
ProjectOrderSerialize $projectOrderSerialize,
TranslatorInterface $translator,
Request $request,
int $order_id,
?int $voucher_id ): Response
{
return $this->json([
"message" => $translator->trans('This route not more efficient, please use direct in/on Billings Service'),
"severity" => SeverityInterface::WARNING
], Response::HTTP_UNAUTHORIZED );
}
/**
* TODO Remove Forever
* @deprecated
* @see upsertBillings in this controller
* @Route("/upsert-voucher/{order_id}/{voucher_id}", name="api_v3_project_order_upsert_voucher", methods={"POST"}, requirements={"order_id": "\d+"}, defaults={"voucher_id": null} )
* @ParamConverter("projectOrder", options={"mapping":{"order_id": "id"}})
* @ParamConverter("undertaking", options={"mapping":{"voucher_id": "id"}})
* @throws \Exception
*/
public function upsertVoucher(
?ProjectOrders $projectOrder,
?ProjectOrderUndertakings $undertaking,
ProjectOrderService $projectOrderService,
ProjectOrderSerialize $projectOrderSerialize,
TranslatorInterface $translator,
Request $request,
int $order_id,
?int $voucher_id ): Response
{
return $this->json([
"message" => $translator->trans('This route not more efficient, please use direct in/on Billings Service'),
"severity" => SeverityInterface::WARNING
], Response::HTTP_UNAUTHORIZED );
if ($order_id && !$projectOrder) {
return $this->json([
"message" => $translator->trans('Project order not found'),
"severity" => SeverityInterface::ERROR
], Response::HTTP_NOT_FOUND);
}
// matched !!
if(!$undertaking && $voucher_id){
#dd($projectOrder);
$founded = $projectOrder->getProjectOrderUndertakings()->exists( fn($key, ProjectOrderUndertakings $undertaking) => $undertaking->getId() === $voucher_id );
if(!$founded){
return $this->json([
"message" => $translator->trans('Voucher not matched with order!'),
"severity" => SeverityInterface::ERROR
], Response::HTTP_NOT_FOUND);
}
}
$voucher = $projectOrderService->upsertVoucher($projectOrder, $undertaking, $request->request);
#dd($voucher);
if($projectOrderService->getException()){
return $this->json([
"message" => $projectOrderService->getException()->getMessage(),
"severity" => "warning"
], $projectOrderService->getException()->getCode() );
}
$serializedVoucher = $projectOrderSerialize->setEntity($voucher)->serializeVoucher();
$serializedMetrics = $projectOrderSerialize->setEntity($projectOrder->getProjectOrderMetrics())->serializeFull();
// Just info
$serializedOrder = $projectOrderSerialize->setEntity($projectOrder)->serializeFull();
return $this->json([
"message" => $translator->trans('Loaded project orders successfully'),
"severity" => SeverityInterface::SUCCESS,
"voucher" => $serializedVoucher,
"metrics" => $serializedMetrics,
"hotEntity" => $serializedOrder,
], Response::HTTP_OK );
}
/**
* TODO Remove forever
* @deprecated
* @see removeBillings in this controller
* @Route("/delete-voucher/{voucher_id}", name="api_v3_project_order_delete_voucher", methods={"POST"}, requirements={"voucher_id": "\d+"} )
* @ParamConverter("undertaking", options={"mapping":{"voucher_id": "id"}})
* @deprecated
*/
public function deleteVoucher(?ProjectOrderUndertakings $undertaking, ProjectOrderService $projectOrderService, ProjectOrderSerialize $projectOrderSerialize, TranslatorInterface $translator): Response {
return $this->json([
"message" => $translator->trans('This route not more efficient, please use direct in/on Billings Service'),
"severity" => SeverityInterface::WARNING
], Response::HTTP_UNAUTHORIZED );
if(!$undertaking){
return $this->json([
"message" => $translator->trans("Undertaking not found!"),
"severity" => SeverityInterface::ERROR,
], Response::HTTP_NOT_FOUND);
}
$clonedVoucher = [
"id" => $undertaking->getId()
];
// Store
$serializedVoucher = $projectOrderSerialize->setEntity($undertaking)->serializeVoucher();
// Delete -> Metrics has been fresh after delete
$metrics = $projectOrderService->deleteVoucher($undertaking);
if($projectOrderService->getException()){
return $this->json([
"message" => $projectOrderService->getException()->getMessage(),
"severity" => SeverityInterface::WARNING
], Response::HTTP_BAD_REQUEST );
}
$serializedMetrics = $projectOrderSerialize->setEntity($metrics)->serializeFull();
return $this->json([
"message" => "Undertaking removed successfully",
"severity" => SeverityInterface::SUCCESS,
"id" => $clonedVoucher['id'],
"voucher" => $serializedVoucher,
"metrics" => $serializedMetrics,
"mode" => "delete"
]);
}
/**
* @Route("/refresh-metrics/{order_id}", name="api_v3_project_order_refresh_metrics", methods={"POST"}, requirements={"order_id": "\d+"} )
* @ParamConverter("projectOrder", options={"mapping":{"order_id": "id"}})
* @throws \Exception
*/
public function refreshMetrics(?ProjectOrders $projectOrder, ProjectOrderService $projectOrderService, ProjectOrderSerialize $projectOrderSerialize, TranslatorInterface $translator, int $order_id = null): Response {
if(!$projectOrder){
return $this->json([
"message" => $translator->trans("Undertaking not found!"),
"severity" => SeverityInterface::ERROR,
], Response::HTTP_NOT_FOUND);
}
// Void in Service flushed
// $projectOrderCalculator->updateProjectOrderMetrics($projectOrder);
$projectOrderService
->setEntity($projectOrder, $order_id)
->recalculateMetrics();
if($projectOrderService->getException()){
return $this->json([
"message" => $projectOrderService->getException()->getMessage(),
"severity" => SeverityInterface::WARNING
], Response::HTTP_BAD_REQUEST );
}
// Store
$serializedMetrics = $projectOrderSerialize->setEntity($projectOrder->getProjectOrderMetrics())->serializeMetrics();
return $this->json([
"message" => "Undertaking removed successfully",
"severity" => SeverityInterface::SUCCESS,
"project_order_metrics" => $serializedMetrics,
], Response::HTTP_OK);
}
/**
* @Route("/expenses/{order_id}", name="api_v3_project_order_expenses")
* @ParamConverter("order", options={"mapping": {"order_id": "id"}})
* @throws \ReflectionException
* @throws \Exception
*/
function expenses( ?ProjectOrders $order, ProjectOrderService $projectOrderService, ExpenseSerialize $expenseSerialize, TranslatorInterface $translator, ?int $order_id = null): Response {
if($order_id && !$order){
return $this->json([
"message" => $translator->trans("Order not found!"),
"severity" => SeverityInterface::ERROR,
], Response::HTTP_NOT_FOUND);
}
$result = $projectOrderService->setEntity($order)->orderExpenses();
$expenses = $result['classic'];
$stock = $result['stock'];
$serializedExpenses = $expenseSerialize->setEntity($expenses)->serializeOrderExpenses();
$serializedStock = $expenseSerialize->setEntity($stock)->serializeOrderStocks();
return $this->json([
"message" => "Successfully loaded",
"severity" => "success",
"expenses" => $serializedExpenses,
"stock" => $serializedStock
]);
}
/**
* @Route("/labor-details/{order_id}", name="employee_worked_navigator", methods={"POST"})
* @ParamConverter("order", options={"mapping": {"order_id": "id"}})
* @throws \Exception
*/
function laborDetails(?ProjectOrders $order, ProjectOrderService $projectOrderService, Request $request): Response{
$laborDetails = $projectOrderService
->setEntity($order)
->setParams($request->request)
->laborDetails();
if($projectOrderService->getException()){
return $this->json([
"message" => $projectOrderService->getException()->getMessage(),
"severity" => SeverityInterface::WARNING
], Response::HTTP_BAD_REQUEST );
}
return $this->json($laborDetails, Response::HTTP_OK);
}
/**
* @Route("/labor-details-pdf/{order_id}", name="api_v3_project_order_labor_details_pdf", methods={"POST"})
* @ParamConverter("order", options={"mapping": {"order_id": "id"}})
*/
public function laborDetailsPdf(
?ProjectOrders $order,
Request $request,
ProjectOrderService $projectOrderService,
TranslatorInterface $translator
): Response {
if (!$order) {
return $this->json([
'message' => $translator->trans('Order not found!'),
'severity' => SeverityInterface::WARNING,
], Response::HTTP_NOT_FOUND);
}
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser();
$printedBy = $currentUser ? $currentUser->getFullName() : '—';
$result = $projectOrderService
->setEntity($order)
->setParams($request->request)
->laborDetailsPdf($printedBy);
if ($projectOrderService->getException()) {
return $this->json([
'message' => $projectOrderService->getException()->getMessage(),
'severity' => SeverityInterface::ERROR,
], Response::HTTP_BAD_REQUEST);
}
return $this->json(
array_merge($result, ['severity' => SeverityInterface::SUCCESS]),
Response::HTTP_OK
);
}
/**
* Silme/tasima oncesi deger-bazli bagimlilik ozeti (preview).
* Worktime icin tum timesheet'ler taranir -> streamed (progress).
* EventSource yalnizca GET yapar -> methods YAZILMAZ.
*
* @Route("/dependency-summary/{order_id}", name="api_v3_project_order_dependency_summary", requirements={"order_id": "\d+"} )
* @ParamConverter("order", options={"mapping":{"order_id": "id"}})
*/
public function dependencySummary(?ProjectOrders $order, ProjectOrderService $projectOrderService, TranslatorInterface $translator): StreamedResponse
{
$streaming = new StreamingService([
"localText" => ["completed" => $translator->trans('Completed')]
]);
$streaming->appendStream(
'summary',
$translator->trans('Calculating order dependencies, please wait...'),
function () use ($order, $projectOrderService, $translator) {
if (!$order) {
throw new \DomainException($translator->trans('Order not found'));
}
return $projectOrderService->setEntity($order)->dependencySummary();
}
);
return $streaming->flush();
}
/**
* Order'i ve butun bagimliliklarini cascade siler.
* Kesilmis faturaya bagli pozisyon varsa reddeder.
*
* @Route("/delete/{order_id}", name="api_v3_project_order_delete", methods={"POST"}, requirements={"order_id": "\d+"} )
* @ParamConverter("order", options={"mapping":{"order_id": "id"}})
* @throws \Exception
*/
public function delete(?ProjectOrders $order, ProjectOrderService $projectOrderService, TranslatorInterface $translator, Request $request, ?int $order_id = null): Response
{
if ($order_id && !$order) {
return $this->json([
"message" => $translator->trans("Order not found!"),
"severity" => SeverityInterface::ERROR
], Response::HTTP_NOT_FOUND);
}
// Faturali order'da blok'u asmak icin force + override sifresi
$force = filter_var($request->request->get('force'), FILTER_VALIDATE_BOOLEAN);
$password = $request->request->get('password');
$result = $projectOrderService->setEntity($order)->cascadeDelete($force, $password);
if ($projectOrderService->getException()) {
$exception = $projectOrderService->getException();
return $this->json([
"message" => $exception->getMessage(),
"severity" => SeverityInterface::WARNING
], $exception->getCode() === Response::HTTP_UNAUTHORIZED ? Response::HTTP_UNAUTHORIZED : Response::HTTP_BAD_REQUEST);
}
return $this->json([
"message" => $translator->trans('Order and its dependencies deleted successfully'),
"severity" => SeverityInterface::SUCCESS,
"id" => $result['id'],
"mode" => "delete",
"source_project" => $result['source_project'] ?? null
], Response::HTTP_OK);
}
/**
* Order'i + TUM bagimliliklarini streamed (adim adim) force-delete eder. GERI DONUS YOK.
* EventSource yalnizca GET -> methods YAZILMAZ. Sifre query param (fatura bagliysa zorunlu).
*
* @Route("/force-delete-streamed/{order_id}", name="api_v3_project_order_force_delete_streamed", requirements={"order_id": "\d+"} )
* @ParamConverter("order", options={"mapping":{"order_id": "id"}})
*/
public function forceDeleteStreamed(?ProjectOrders $order, ProjectOrderService $projectOrderService, Request $request): StreamedResponse
{
$password = $request->query->get('password');
return $projectOrderService->setEntity($order)->forceDeleteStreamed($password);
}
/**
* Order'in butun bagimliliklarini hedef order'a tasir (ayni proje icinde).
*
* @Route("/move/{from_order_id}/{to_order_id}", name="api_v3_project_order_move", methods={"POST"}, requirements={"from_order_id": "\d+", "to_order_id": "\d+"} )
* @ParamConverter("from", options={"mapping":{"from_order_id": "id"}})
* @ParamConverter("to", options={"mapping":{"to_order_id": "id"}})
* @throws \Exception
*/
public function move(?ProjectOrders $from, ?ProjectOrders $to, ProjectOrderService $projectOrderService, TranslatorInterface $translator): Response
{
if (!$from || !$to) {
return $this->json([
"message" => $translator->trans("Order not found!"),
"severity" => SeverityInterface::ERROR
], Response::HTTP_NOT_FOUND);
}
$result = $projectOrderService->setEntity($from)->moveAllDependenciesTo($to);
if ($projectOrderService->getException()) {
return $this->json([
"message" => $projectOrderService->getException()->getMessage(),
"severity" => SeverityInterface::WARNING
], Response::HTTP_BAD_REQUEST);
}
return $this->json([
"message" => $translator->trans('Order dependencies moved successfully'),
"severity" => SeverityInterface::SUCCESS,
"from" => $result['from'],
"to" => $result['to'],
"mode" => "move"
], Response::HTTP_OK);
}
}