src/Controller/Web/FondController.php line 1063

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Web;
  3. use App\Entity\BillPayment;
  4. use App\Entity\Building;
  5. use App\Entity\BuildingPayment;
  6. use App\Entity\Partners;
  7. use App\Entity\ProcessedFiles;
  8. use App\Entity\User;
  9. use App\Enums\BillPaymentTypeEnum;
  10. use App\Enums\BuildingPaymentTypeEnum;
  11. use App\Enums\MoneyLogTypeEnum;
  12. use App\Enums\OptionNameTypeEnum;
  13. use App\Enums\ProcessedFilesStatusEnum;
  14. use App\Form\BillOptionTransferType;
  15. use App\Form\BillPaymentFondType;
  16. use App\Form\BillPaymentType;
  17. use App\Form\TransferredMoneyType;
  18. use App\Repository\BillOptionsRepository;
  19. use App\Repository\BillPaymentRepository;
  20. use App\Repository\BuildingPaymentRepository;
  21. use App\Repository\BuildingRepository;
  22. use App\Repository\MoneyLogRepository;
  23. use App\Repository\OptionNameRepository;
  24. use App\Repository\PartnersRepository;
  25. use App\Repository\ProcessedFilesRepository;
  26. use App\Repository\SeparateBillOptionsRepository;
  27. use App\Repository\UserRepository;
  28. use App\Response\PdfResponse;
  29. use App\Services\Authorization\BuildingPaymentAuthorizationService;
  30. use App\Services\BillService;
  31. use App\Services\DefaultService;
  32. use App\Services\FlatService;
  33. use App\Services\FondService;
  34. use App\Services\OptionNameService;
  35. use App\Services\PartnersService;
  36. use App\Services\PaymentService;
  37. use App\Services\ProcessService;
  38. use App\Services\SummaryBalanceService;
  39. use DateTime;
  40. use Doctrine\ORM\NonUniqueResultException;
  41. use Doctrine\ORM\NoResultException;
  42. use Doctrine\ORM\ORMException;
  43. use Exception;
  44. use Knp\Snappy\Pdf;
  45. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  46. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  47. use Symfony\Component\Form\FormInterface;
  48. use Symfony\Component\HttpFoundation\JsonResponse;
  49. use Symfony\Component\HttpFoundation\RedirectResponse;
  50. use Symfony\Component\HttpFoundation\Request;
  51. use Symfony\Component\HttpFoundation\Response;
  52. use Symfony\Component\Routing\Annotation\Route;
  53. class FondController extends AbstractController
  54. {
  55.     private BuildingRepository $buildingRepository;
  56.     private DefaultService $defaultService;
  57.     private Pdf $pdf;
  58.     private BillService $billService;
  59.     private BillOptionsRepository $billOptionsRepository;
  60.     private BillPaymentRepository $billPaymentRepository;
  61.     private PartnersService $partnersService;
  62.     private OptionNameService $optionNameService;
  63.     private FondService $fondService;
  64.     private MoneyLogRepository $moneyLogRepository;
  65.     private PaymentService $paymentService;
  66.     private FlatService $flatService;
  67.     private BuildingPaymentRepository $buildingPaymentRepository;
  68.     private PartnersRepository $partnersRepository;
  69.     private ProcessService $processService;
  70.     private ProcessedFilesRepository $processedFilesRepository;
  71.     private SummaryBalanceService $summaryBalanceService;
  72.     private OptionNameRepository $optionNameRepository;
  73.     private UserRepository $userRepository;
  74.     private SeparateBillOptionsRepository $separateBillOptionsRepository;
  75.     /**
  76.      * @param BuildingRepository $buildingRepository
  77.      * @param BillOptionsRepository $billOptionsRepository
  78.      * @param BillPaymentRepository $billPaymentRepository
  79.      * @param MoneyLogRepository $moneyLogRepository
  80.      * @param BuildingPaymentRepository $buildingPaymentRepository
  81.      * @param PartnersRepository $partnersRepository
  82.      * @param ProcessedFilesRepository $processedFilesRepository
  83.      * @param DefaultService $defaultService
  84.      * @param PartnersService $partnersService
  85.      * @param OptionNameService $optionNameService
  86.      * @param FondService $fondService
  87.      * @param PaymentService $paymentService
  88.      * @param FlatService $flatService
  89.      * @param Pdf $pdf
  90.      * @param BillService $billService
  91.      * @param ProcessService $processService
  92.      * @param SummaryBalanceService $summaryBalanceService
  93.      * @param OptionNameRepository $optionNameRepository
  94.      * @param UserRepository $userRepository
  95.      * @param SeparateBillOptionsRepository $separateBillOptionsRepository
  96.      */
  97.     public function __construct(
  98.         BuildingRepository $buildingRepository,
  99.         BillOptionsRepository $billOptionsRepository,
  100.         BillPaymentRepository $billPaymentRepository,
  101.         MoneyLogRepository $moneyLogRepository,
  102.         BuildingPaymentRepository $buildingPaymentRepository,
  103.         PartnersRepository $partnersRepository,
  104.         ProcessedFilesRepository $processedFilesRepository,
  105.         DefaultService $defaultService,
  106.         PartnersService $partnersService,
  107.         OptionNameService $optionNameService,
  108.         FondService $fondService,
  109.         PaymentService $paymentService,
  110.         FlatService $flatService,
  111.         Pdf $pdf,
  112.         BillService $billService,
  113.         ProcessService $processService,
  114.         SummaryBalanceService $summaryBalanceService,
  115.         OptionNameRepository $optionNameRepository,
  116.         UserRepository $userRepository,
  117.         SeparateBillOptionsRepository $separateBillOptionsRepository,
  118.     ) {
  119.         $this->buildingRepository $buildingRepository;
  120.         $this->defaultService $defaultService;
  121.         $this->pdf $pdf;
  122.         $this->billService $billService;
  123.         $this->billOptionsRepository $billOptionsRepository;
  124.         $this->billPaymentRepository $billPaymentRepository;
  125.         $this->partnersService $partnersService;
  126.         $this->optionNameService $optionNameService;
  127.         $this->fondService $fondService;
  128.         $this->moneyLogRepository $moneyLogRepository;
  129.         $this->paymentService $paymentService;
  130.         $this->flatService $flatService;
  131.         $this->buildingPaymentRepository $buildingPaymentRepository;
  132.         $this->partnersRepository $partnersRepository;
  133.         $this->processService $processService;
  134.         $this->processedFilesRepository $processedFilesRepository;
  135.         $this->summaryBalanceService $summaryBalanceService;
  136.         $this->optionNameRepository $optionNameRepository;
  137.         $this->userRepository $userRepository;
  138.         $this->separateBillOptionsRepository $separateBillOptionsRepository;
  139.     }
  140.     /**
  141.      * @Route("/building/{bid}/tekuci-racun-card", name="tekuci_racun_card", options={"expose"=true})
  142.      * @param  int  $bid
  143.      *
  144.      * @return PdfResponse
  145.      * @throws NoResultException
  146.      * @throws NonUniqueResultException
  147.      */
  148.     public function tekuciRacunCardCurrentAction(int $bid): PdfResponse
  149.     {
  150.         /** @var User $user */
  151.         $user $this->getUser();
  152.         /** @var Building $building */
  153.         $building $this->buildingRepository->find($bid);
  154.         $this->defaultService->checkEntity($building$user);
  155.         $tekuciArray $this->billService->getPaymentsForTekuciRacunCardCurrentOptimized($building->getUser(), $building);
  156.         $html $this->renderView('@views/Fond/tekuciRacunCardCurrent.html.twig', [
  157.             'data'     => $tekuciArray,
  158.             'building' => $building
  159.         ]);
  160.         return new PdfResponse($this->pdf$html);
  161.     }
  162.     /**
  163.      * @Route(
  164.      *     "/fond/dashboard/{id}/{type}",
  165.      *     requirements={"id" = "\d+", "type" = "\d+"},
  166.      *     name="fond_dashboard",
  167.      *     defaults={"type" = null},
  168.      *     options={"expose"=true}
  169.      *     )
  170.      * @param  int   $id
  171.      * @param  null  $type
  172.      *
  173.      * @return Response
  174.      * @throws NonUniqueResultException
  175.      */
  176.     public function fondDashboardAction(int $id$type null): Response
  177.     {
  178.         /** @var User $user */
  179.         $user $this->getUser();
  180.         $companyUsers $this->userRepository->findUsersByMain($user);
  181.         if ($user->getMainUser()) {
  182.             $companyUsers array_merge($companyUsers, [$user->getMainUser()]);
  183.         }
  184.         /** @var Building $building */
  185.         $building $this->buildingRepository->find($id);
  186.         $this->defaultService->checkEntity($building$user);
  187.         $billOptions $this->billOptionsRepository->getAllBillOptionsUntilNow($building);
  188.         $separateBillOptions $this->separateBillOptionsRepository->getAllSeparateBillOptionsUntilNow($building);
  189.         $billPayments $this->billPaymentRepository
  190.             ->getPaymentsByBuildingAndIncome($buildingBillPaymentTypeEnum::PRILIV->value);
  191.         $billPaymentNames $this->billPaymentRepository->findAllTypesForBuilding($building$user);
  192.         $partnerCards $this->partnersService
  193.             ->partnerCardsForBuilding($building->getUser(), $billOptions$billPayments);
  194.         $billOptionsForCards $this->optionNameService->filterOptionNameKeys(
  195.             array_merge($billOptions$separateBillOptions$billPaymentNames),
  196.             $building->getUser()
  197.         );
  198.         $billOptionsForCards[3] = 'Investicioni Fond';
  199.         $billOptionsForCards[4] = 'Tekući Fond';
  200.         $optionNames $this->optionNameService->getOptionsNameKeys($building->getUser());
  201.         $optionNames[100] = 'Tekući račun';
  202.         $optionNames[50] = 'Stari dug';
  203.         if ($this->fondService->isTestUser($building->getUser()->getId())) {
  204.             $billOptionsForCards[150] = 'PREDHODNO Dugovanje';
  205.             $optionNames[150] = 'Predhodni dug';
  206.         }
  207.         $startDate $this->billPaymentRepository->findOldestBillPaymentDateByBuilding($building);
  208.         if (!$startDate) {
  209.             $startDate = new DateTime();
  210.             $startDate->modify('-1YEAR');
  211.         }
  212.         $partners $this->partnersRepository->getUsersPartners($companyUsers);
  213.         return $this->render('@views/Fond/fondDashboard.html.twig', [
  214.             'building'            => $building,
  215.             'user'                => $building->getUser(),
  216.             'optionName'          => $optionNames,
  217.             'billOptionsForCards' => $billOptionsForCards,
  218.             'bid'                 => $type,
  219.             'partnerCards'        => $partnerCards,
  220.             'startDate'           => $startDate,
  221.             'partners'            => $partners
  222.         ]);
  223.     }
  224.     /**
  225.      * @Route("/building/{bid}/tekuci-racun-options", name="tekuci_racun_options", options={"expose"=true})
  226.      *
  227.      * @param  int  $bid
  228.      *
  229.      * @return Response
  230.      */
  231.     public function tekuciRacunOptionsAction(int $bid): Response
  232.     {
  233.         /** @var User $user */
  234.         $user $this->getUser();
  235.         /** @var Building $building */
  236.         $building $this->buildingRepository->find($bid);
  237.         $this->defaultService->checkEntity($building$user);
  238.         return $this->render('@views/Fond/tekuciRacunOptions.html.twig', [
  239.             'building' => $building
  240.         ]);
  241.     }
  242.     /**
  243.      * @Route("/building/{bid}/old-debit-finance-card", requirements={"id" = "\d+"}, name="old_debit_finance_card")
  244.      * @param int $bid
  245.      * @return PdfResponse
  246.      * @throws NoResultException
  247.      * @throws NonUniqueResultException
  248.      */
  249.     public function olDebitFinanceAction(int $bid): PdfResponse
  250.     {
  251.         /** @var User $user */
  252.         $user $this->getUser();
  253.         /** @var Building $building */
  254.         $building $this->buildingRepository->find($bid);
  255.         $this->defaultService->checkEntity($building$user);
  256.         $payments $this->billPaymentRepository
  257.             ->getPaymentsByType($building$building->getUser(), BillPayment::OLD_DEBIT_ID);
  258.         $oldDebits $this->moneyLogRepository
  259.             ->getMoneyLogByTypeWithFlat($building$building->getUser(), [MoneyLogTypeEnum::OLD_DEBIT->value]);
  260.         $logs $this->paymentService->getOldDebitFinanceLogs($oldDebits$payments);
  261.         $debitSum $this->flatService->getBuildingFlatsOldDebitSum($building->getUser(), $building);
  262.         $oldDebitPayments $this->moneyLogRepository
  263.             ->getMoneyLogByTypeWithFlat(
  264.                 $building,
  265.                 $building->getUser(),
  266.                 [MoneyLogTypeEnum::OLD_DEBIT_PAYMENT->valueMoneyLogTypeEnum::OLD_DEBIT_SEPARATE_PAYMENT->value]
  267.             );
  268.         $subPaymentTotal 0;
  269.         $paidTotal 0;
  270.         foreach ($payments as $payment) {
  271.             if ($payment['income'] !== && $payment['income'] !== 2) {
  272.                 $paidTotal += $payment['value'];
  273.             }
  274.         }
  275.         foreach ($oldDebitPayments as $payment) {
  276.             $subPaymentTotal += $payment['amount'];
  277.         }
  278.         return new PdfResponse($this->pdf$this->renderView('@views/Fond/oldDebitFinanceCard.html.twig', [
  279.             'logs'            => $logs,
  280.             'debitSum'        => $debitSum,
  281.             'subPaymentTotal' => $subPaymentTotal,
  282.             'building'        => $building,
  283.             'paidTotal'       => $paidTotal
  284.         ]));
  285.     }
  286.     /**
  287.      * @Route("/building/{bid}/option-card/{bp}", name="bill_option_card")
  288.      *
  289.      * @param  int  $bp
  290.      * @param  int  $bid
  291.      *
  292.      * @return PdfResponse
  293.      * @throws Exception
  294.      */
  295.     public function billOptionCardAction(int $bpint $bid): PdfResponse
  296.     {
  297.         /** @var User $user */
  298.         $user $this->getUser();
  299.         /** @var Building $building */
  300.         $building $this->buildingRepository->find($bid);
  301.         $this->defaultService->checkEntity($building$user);
  302.         $information $this->fondService->getBillOptionCardInformation($bp$building);
  303.         return new PdfResponse($this->pdf$this->renderView($information['view'], $information['data']));
  304.     }
  305.     /**
  306.      * @Route("/building/{bid}/new-option-card/{bp}", name="new_bill_option_card")
  307.      * @param  int  $bp
  308.      * @param  int  $bid
  309.      *
  310.      * @return mixed
  311.      * @throws NonUniqueResultException|Exception
  312.      */
  313.     public function newBillOptionCardAction(int $bpint $bid): mixed
  314.     {
  315.         /** @var User $user */
  316.         $user $this->getUser();
  317.         /** @var Building $building */
  318.         $building $this->buildingRepository->find($bid);
  319.         $this->defaultService->checkEntity($building$user);
  320.         $tmp = new DateTime();
  321.         $year $tmp->format('Y');
  322.         $summaryBalance $this->summaryBalanceService->getLastSummaryBalance($building$bp);
  323.         if ($summaryBalance) {
  324.             $year = (string)((int)$summaryBalance->getYear() + 1);
  325.         }
  326.         // create start and end date
  327.         $date = new DateTime(sprintf('%s-01-01'$year));
  328.         $startDate $date->format('Y-m-d');
  329.         $date = new DateTime("+2MONTH");
  330.         $endDate $date->format('Y-m-01');
  331.         $information $this->fondService->getBillOptionCardInformation($bp$building$startDate$endDatetrue);
  332.         return new PdfResponse($this->pdf$this->renderView($information['view'], $information['data']));
  333.     }
  334.     /**
  335.      * @Route(
  336.      *     "/add-new-fond/building/{buildingId}/{buildingPaymentId}",
  337.      *     name="add_new_fond",
  338.      *     defaults={"buildingPaymentId" = null},
  339.      *     options={"expose"=true}
  340.      *     )
  341.      *
  342.      * @param  Request   $request
  343.      * @param  int       $buildingId
  344.      * @param  int|null  $buildingPaymentId
  345.      *
  346.      * @return Response
  347.      * @throws NoResultException
  348.      * @throws NonUniqueResultException
  349.      * @throws ORMException
  350.      */
  351.     public function addNewFondAction(Request $requestint $buildingId, ?int $buildingPaymentId): Response
  352.     {
  353.         /** @var User $user */
  354.         $user $this->getUser();
  355.         $companyUsers $this->userRepository->findUsersByMain($user);
  356.         if ($user->getMainUser()) {
  357.             $companyUsers array_merge($companyUsers, [$user->getMainUser()]);
  358.         }
  359.         $buildingPayment $buildingPaymentId ?
  360.             $this->buildingPaymentRepository->find($buildingPaymentId) :
  361.             null;
  362.         if ($buildingPaymentId !== null) {
  363.             $buildingPaymentAuthorizationService = new BuildingPaymentAuthorizationService($buildingPayment$user);
  364.             if (!$buildingPaymentAuthorizationService->authorize()) {
  365.                 throw $this->createNotFoundException('Building payment not found');
  366.             }
  367.         }
  368.         $processedFile $buildingPayment?->getProcessedFile();
  369.         //$payment = json_decode($request->query->get('data'), true);
  370.         $payment $buildingPayment !== null $buildingPayment->getParsedData() : [];
  371.         /** @var Building $building */
  372.         $building $this->buildingRepository->find($buildingId);
  373.         $this->defaultService->checkEntity($building$user);
  374.         $options $this->optionNameService->getBillPaymentOdlivOptions($building->getUser(), $building);
  375.         $billPayment = new BillPayment();
  376.         $date null;
  377.         $description '';
  378.         if (!empty($payment)) {
  379.             $billPayment->setValue($payment['amount']);
  380.             $billPayment->setBankFileId($processedFile->getBankFileId());
  381.             $date $payment['date'] ?? null;
  382.             $description $payment['description'] ?? '';
  383.         }
  384.         $partners $this->partnersRepository->getUsersPartners($companyUsers);
  385.         $form $this->createForm(
  386.             BillPaymentType::class,
  387.             $billPayment,
  388.             [
  389.                 'action'   => $this->generateUrl(
  390.                     'add_new_fond',
  391.                     ['buildingId' => $buildingId'buildingPaymentId' => $buildingPaymentId]
  392.                 ),
  393.                 'attr'     => [
  394.                     'typeChose'             => json_encode($options),
  395.                     'date'                  => $date,
  396.                     'isTestUser'            => $this->fondService->isTestUser($building->getUser()->getId()),
  397.                     'user'                  => $building->getUser()->getId(),
  398.                     'buildingPaymentAmount' => $buildingPayment?->getAmount(),
  399.                     'bankFileId'            => $processedFile?->getBankFileId(),
  400.                     'description'           => $description
  401.                 ],
  402.                 'method'   => 'POST',
  403.                 'partners' => $partners
  404.             ]
  405.         );
  406.         $form->handleRequest($request);
  407.         if ($form->isSubmitted() && $form->isValid()) {
  408.             $arr $this->fondService->createNewFond($form$building);
  409.             $amount $arr['amount'];
  410.             $minusUsersHaveNegativeBalance $arr['minusUsersHaveNegativeBalance'];
  411.             $message $arr['message'];
  412.             if (!$minusUsersHaveNegativeBalance && $billPayment->getValue() > $amount) {
  413.                 $this->addFlash(
  414.                     'error',
  415.                     $message
  416.                 );
  417.                 return $this->render('@views/Fond/addNewFond.html.twig', [
  418.                     'building'      => $building,
  419.                     'id'            => $buildingId,
  420.                     'form'          => $form->createView(),
  421.                     'payment'       => $payment,
  422.                     'processedFile' => $processedFile
  423.                 ]);
  424.             }
  425.             if ($minusUsersHaveNegativeBalance) {
  426.                 $this->addFlash('warning'"Vaš fond je u minusu.");
  427.             }
  428.             $this->billPaymentRepository->save($billPayment);
  429.             if ($buildingPayment !== null) {
  430.                 $buildingPayment->setProcessed(true);
  431.                 $buildingPayment->setBillPayment($billPayment);
  432.                 $this->buildingPaymentRepository->save($buildingPayment);
  433.                 $parser $this->processService->getParser($processedFile->getBankName());
  434.                 $parsedData $parser->parseFile($this->getParameter('bank_notification_directory'), $processedFile);
  435.                 $parsedData['flats'] = $parsedData['flats'] ?? [];
  436.                 if (
  437.                     $this->buildingPaymentRepository->areAllOutflowsProcessed($processedFile) &&
  438.                     ($processedFile->getProcessedFlats()->count() + $this->buildingPaymentRepository->getBuildingPaymentsCountByType($processedFile1)) === count($parsedData['flats'])
  439.                 ) {
  440.                     $processedFile->setStatus(ProcessedFilesStatusEnum::PROCESSED_FILE->value);
  441.                 } else {
  442.                     $processedFile->setStatus(ProcessedFilesStatusEnum::PARTIALLY_PROCESSED_FILE->value);
  443.                 }
  444.                 $this->processedFilesRepository->save($processedFile);
  445.                 $url $this->generateUrl(
  446.                     'show_statement',
  447.                     ['buildingId' => $buildingId'fileId' => $processedFile->getId()]
  448.                 );
  449.             } else {
  450.                 $url $this->generateUrl('fond_dashboard', ['id' => $buildingId]);
  451.             }
  452.             return new RedirectResponse($url);
  453.         }
  454.         $params['form'] = $form->createView();
  455.         $params['id'] = $buildingId;
  456.         $params['payment'] = $payment;
  457.         $params['processedFile'] = $processedFile;
  458.         $params['building'] = $building;
  459.         return $this->render('@views/Fond/addNewFond.html.twig'$params);
  460.     }
  461.     /**
  462.      * @Route(
  463.      *     "/add-new-fond-prilivi/{id}/{date}",
  464.      *     requirements={"id" = "\d+", "date" = "\d{4}-\d{2}-\d{2}"},
  465.      *     defaults={"date" = null},
  466.      *     name="add_new_fond_prilivi",
  467.      *     options={"expose"=true}
  468.      *     )
  469.      *
  470.      * @param  Request      $request
  471.      * @param  int          $id
  472.      * @param  string|null  $date
  473.      *
  474.      * @return Response
  475.      * @throws Exception
  476.      */
  477.     public function addNewFondActionPrilivi(
  478.         Request $request,
  479.         int $id,
  480.         ?string $date,
  481.     ): Response {
  482.         $options = [
  483.             'Investicioni Fond' => OptionNameTypeEnum::INV_FOND_OP_ID->name,
  484.             'Tekući Fond'       => OptionNameTypeEnum::TEK_FOND_OP_ID->name
  485.         ];
  486.         $bankDataJson $request->query->get('data');
  487.         $bankData json_decode($bankDataJsontrue);
  488.         /** @var User $user */
  489.         $user $this->getUser();
  490.         $companyUsers $this->userRepository->findUsersByMain($user);
  491.         if ($user->getMainUser()) {
  492.             $companyUsers array_merge($companyUsers, [$user->getMainUser()]);
  493.         }
  494.         /** @var Building $building */
  495.         $building $this->buildingRepository->find($id);
  496.         $this->defaultService->checkEntity($building$user);
  497.         $partners $this->partnersRepository->getUsersPartners($companyUsers);
  498.         $optionNames $this->optionNameRepository->getOptionNameByTypeIO(
  499.             [$building->getUser()->getMainUser() ?? $building->getUser()->getId()]
  500.         );
  501.         $billOptions $this->billOptionsRepository->getAllBillOptionsUntilNow($building);
  502.         $separateBillOptions $this->separateBillOptionsRepository->getAllSeparateBillOptionsUntilNow($building);
  503.         $billPaymentNames $this->billPaymentRepository->findAllTypesForBuilding($building$building->getUser());
  504.         $billOptionsForCards $this->optionNameService->filterOptionNameKeys(
  505.             array_merge($billOptions$separateBillOptions$billPaymentNames),
  506.             $building->getUser()
  507.         );
  508.         $filteredOptionNames = [];
  509.         foreach ($optionNames as $item) {
  510.             if (in_array($item['name'], $billOptionsForCards)) {
  511.                 $filteredOptionNames[$item['name']] = $item['id'];
  512.             }
  513.         }
  514.         $month null;
  515.         if ($date) {
  516.             $month = new DateTime($date);
  517.             $params $this->billOptionsRepository->getBillOptions($id$month->format('y-m-01'));
  518.             $optionName $this->optionNameService->getOptionsNameKeys($building->getUser());
  519.             foreach ($params as $param) {
  520.                 $options[$optionName[$param['name']]] = $param['name'];
  521.             }
  522.         }
  523.         $billPayment = new BillPayment();
  524.         $date null;
  525.         $description '';
  526.         if ($bankData) {
  527.             $billPayment->setValue($bankData['amount']);
  528.             $billPayment->setBankFileId($bankData['bankDailyCheckPoint']);
  529.             $date $bankData['date'] ?? null;
  530.             $description $bankData['description'] ?? '';
  531.         }
  532.         $form $this->createForm(
  533.             BillPaymentFondType::class,
  534.             $billPayment,
  535.             [
  536.                 'action'   => $this->generateUrl('add_new_fond_prilivi', ['id' => $id'date' => $date]),
  537.                 'attr'     => [
  538.                     'typeChose'  => json_encode($options),
  539.                     'date'       => $date,
  540.                     'isTestUser' => $this->fondService->isTestUser($building->getUser()->getId()),
  541.                     'description' => $description,
  542.                 ],
  543.                 'method'   => 'POST',
  544.                 'partners' => $partners,
  545.                 'optionNames' => $filteredOptionNames,
  546.                 'bankDataJson' => $bankDataJson
  547.             ]
  548.         );
  549.         $form->handleRequest($request);
  550.         if ($form->isSubmitted() && $form->isValid()) {
  551.             $bankDataRaw $form->get('bankDataJson')->getData();
  552.             $bankDataJson $bankDataRaw json_decode($bankDataRawtrue) : null;
  553.             $billPayment $this->fondService->createNewFondPrilivi($form$building$date$month);
  554.             if ($bankDataJson) {
  555.                 /** @var ProcessedFiles $processedFile */
  556.                 $processedFile $this->processedFilesRepository->findOneBy(['id' => $bankDataJson['id']]);
  557.                 $buildingPayment = new BuildingPayment();
  558.                 $buildingPayment->setAmount($bankDataJson['amount']);
  559.                 $buildingPayment->setProcessedFiles($processedFile);
  560.                 $buildingPayment->setParsedData($bankDataJson);
  561.                 $buildingPayment->setTransactionId($bankDataJson['transactionId']);
  562.                 $buildingPayment->setType(BuildingPaymentTypeEnum::TYPE_INCOME->value);
  563.                 $buildingPayment->setBillPayment($billPayment);
  564.                 $buildingPayment->setProcessed(true);
  565.                 $processedFile->setNumberOfNotProcessedFiles($processedFile->getNumberOfNotProcessedFiles() - 1);
  566.                 $this->buildingPaymentRepository->save($buildingPayment);
  567.                 $parser $this->processService->getParser($processedFile->getBankName());
  568.                 $parsedData $parser->parseFile($this->getParameter('bank_notification_directory'), $processedFile);
  569.                 if (
  570.                     $this->buildingPaymentRepository->areAllOutflowsProcessed($processedFile) &&
  571.                     ($processedFile->getProcessedFlats()->count() + $this->buildingPaymentRepository->getBuildingPaymentsCountByType($processedFile1)) === count($parsedData['flats'])
  572.                 ) {
  573.                     $processedFile->setStatus(ProcessedFilesStatusEnum::PROCESSED_FILE->value);
  574.                 } else {
  575.                     $processedFile->setStatus(ProcessedFilesStatusEnum::PARTIALLY_PROCESSED_FILE->value);
  576.                 }
  577.                 $this->processedFilesRepository->save($processedFile);
  578.                 $url $this->generateUrl('show_statement', ['buildingId' => $building->getId(), 'fileId' => $processedFile->getId()]);
  579.             } else {
  580.                 $url $this->generateUrl('fond_dashboard', ['id' => $id]);
  581.             }
  582.             return new RedirectResponse($url);
  583.         }
  584.         $params['form'] = $form->createView();
  585.         $params['id'] = $id;
  586.         $params['partnersListCount'] = $this->partnersRepository->getPartnersCountByUser($user);
  587.         $params['building'] = $building;
  588.         return $this->render('@views/Fond/addNewFondPrilivi.html.twig'$params);
  589.     }
  590.     /**
  591.      * @Route(
  592.      *     "/building/{id}/bill-option-transfer/old-debit",
  593.      *     requirements={"id" = "\d+"},
  594.      *     name="bill_option_transfer_old_debit"
  595.      * )
  596.      *
  597.      * @param  int      $id
  598.      * @param  Request  $request
  599.      *
  600.      * @return Response
  601.      * @throws NoResultException
  602.      * @throws NonUniqueResultException
  603.      */
  604.     public function billOptionTransferAction(int $idRequest $request): Response
  605.     {
  606.         /** @var User $user */
  607.         $user $this->getUser();
  608.         /** @var Building $building */
  609.         $building $this->buildingRepository->find($id);
  610.         $this->defaultService->checkEntity($building$user);
  611.         $billOptionsUntilNow $this->billOptionsRepository->getAllBillOptionsUntilNow($building);
  612.         $separateBillOptions $this->separateBillOptionsRepository->getAllSeparateBillOptionsUntilNow($building);
  613.         $optionNames $this->optionNameService->getBillOptionsFilteredNameKeys(
  614.             array_merge($billOptionsUntilNow$separateBillOptions),
  615.             $building->getUser()
  616.         );
  617. //        $optionNames[100] = "Tekući račun";
  618. //        $optionNames[BillPayment::OLD_DEBIT_ID] = 'Stari dug';
  619.         $optionNamesForTransfer $this->billService->getBillOptionsForTransfer(
  620.             $optionNames,
  621.             $building->getUser(),
  622.             $building
  623.         );
  624.         $form $this->createForm(
  625.             BillOptionTransferType::class,
  626.             [],
  627.             [
  628.                 'method'  => 'POST',
  629.                 'choices' => array_flip($optionNamesForTransfer)
  630.             ]
  631.         );
  632.         $form->handleRequest($request);
  633.         if ($form->isSubmitted() && $form->isValid()) {
  634.             $amount $form->getData()['amount'];
  635.             $sender = (int)$form->getData()['sender'];
  636.             $reciever = (int)$form->getData()['reciever'];
  637.             $createdAt $form->getData()['createdAt'];
  638.             $fond $this->paymentService->getAmountByBuilding($building->getUser(), $building, [$sender])[$sender];
  639.             $message 'Nemate dovoljno sredstava da izvršite ovu pozajmicu.';
  640. //            $fond = $this->paymentService->getAmountByBuilding($building->getUser(), $building, [$sender])[$sender];
  641. //            $message = 'Nemate dovoljno sredstava u fondu da izvršite ovu pozajmicu.';
  642. //
  643. //            if ($sender === 100) {
  644. //                $fond = $this->billService->getPaymentsForTekuciRacunCard($building->getUser(), $building)['saldo'];
  645. //                $message = 'Nemate dovoljno sredstava na tekućem računu da izvršite ovu pozajmicu.';
  646. //            } elseif ($sender === 50) {
  647. //                $message = 'Nemate dovoljno sredstava da izvršite ovu pozajmicu.';
  648. //            }
  649.             if ($amount $fond) {
  650.                 $this->addFlash(
  651.                     'error',
  652.                     $message
  653.                 );
  654.                 return $this->render('@views/Bill/billOptionTransfer.html.twig', [
  655.                     'building' => $building,
  656.                     'id'       => $id,
  657.                     'form'     => $form->createView()
  658.                 ]);
  659.             }
  660.             if ($sender == $reciever) {
  661.                 $this->addFlash(
  662.                     'error',
  663.                     'Nije dozvoljeno prebacivanje sredstava sa jedne opcije na tu istu.'
  664.                 );
  665.                 return $this->render('@views/Bill/billOptionTransfer.html.twig', [
  666.                     'building' => $building,
  667.                     'id'       => $id,
  668.                     'form'     => $form->createView()
  669.                 ]);
  670.             }
  671.             $this->paymentService->optionTransfer(
  672.                 $building->getUser(),
  673.                 $building,
  674.                 $optionNames,
  675.                 $sender,
  676.                 $reciever,
  677.                 $amount,
  678.                 $createdAt
  679.             );
  680.             return new RedirectResponse($this->generateUrl('fond_dashboard', ['id' => $building->getId()]));
  681.         }
  682.         return $this->render('@views/Bill/billOptionTransfer.html.twig', [
  683.             'building' => $building,
  684.             'id'       => $id,
  685.             'form'     => $form->createView()
  686.         ]);
  687.     }
  688.     /**
  689.      * @Route(
  690.      *     "/building/{bid}/tekuci-racun-card-last-year",
  691.      *     name="tekuci_racun_card_last_year",
  692.      *     options={"expose"=true}
  693.      *     )
  694.      * @param  int  $bid
  695.      *
  696.      * @return PdfResponse
  697.      * @throws Exception
  698.      */
  699.     public function tekuciRacunCardLastYearAction(int $bid): PdfResponse
  700.     {
  701.         /** @var User $user */
  702.         $user $this->getUser();
  703.         /** @var Building $building */
  704.         $building $this->buildingRepository->find($bid);
  705.         $this->defaultService->checkEntity($building$user);
  706.         $startDateOBJ = new DateTime("-12MONTH");
  707.         $startDate $startDateOBJ->format("Y-m-d");
  708.         $endDateOBJ = new DateTime();
  709.         $endDate $endDateOBJ->format('Y-m-d');
  710.         $tekuciArray $this->billService
  711.             ->getPaymentsForTekuciRacunCardForPeriod($building->getUser(), $building$startDate$endDate);
  712.         return new PdfResponse($this->pdf$this->renderView('@views/Fond/tekuciRacunForPeriod.html.twig', [
  713.             'data'      => $tekuciArray,
  714.             'building'  => $building,
  715.             'forPeriod' => "false"
  716.         ]));
  717.     }
  718.     /**
  719.      * @Route(
  720.      *     "/building/{bid}/all",
  721.      *     name="tekuci_racun_card_all"
  722.      *     )
  723.      * @param  int  $bid
  724.      *
  725.      * @return PdfResponse
  726.      * @throws Exception
  727.      */
  728.     public function tekuciRacunCardAllAction(int $bid): PdfResponse
  729.     {
  730.         /** @var User $user */
  731.         $user $this->getUser();
  732.         /** @var Building $building */
  733.         $building $this->buildingRepository->find($bid);
  734.         $this->defaultService->checkEntity($building$user);
  735.         $startDateOBJ = new DateTime("-120MONTH");
  736.         $startDate $startDateOBJ->format("Y-m-d");
  737.         $endDateOBJ = new DateTime();
  738.         $endDate $endDateOBJ->format('Y-m-d');
  739.         $tekuciArray $this->billService
  740.             ->getPaymentsForTekuciRacunCardForPeriod($building->getUser(), $building$startDate$endDate);
  741.         return new PdfResponse($this->pdf$this->renderView('@views/Fond/tekuciRacunForPeriod.html.twig', [
  742.             'data'      => $tekuciArray,
  743.             'building'  => $building,
  744.             'forPeriod' => "false"
  745.         ]));
  746.     }
  747.     /**
  748.      * @Route(
  749.      *     "/fond/prilivi/updated-partners-list",
  750.      *     name="updated_partners_list",
  751.      *     options={"expose"=true},
  752.      *     methods={"GET"}
  753.      *     )
  754.      * @return JsonResponse
  755.      * @throws NonUniqueResultException
  756.      * @throws NoResultException
  757.      */
  758.     public function getUpdatedListOfPartners(): JsonResponse
  759.     {
  760.         /** @var User $user */
  761.         $user $this->getUser();
  762.         $response = [
  763.             'partnersListCount' => $this->partnersRepository->getPartnersCountByUser($user),
  764.             'newPartner'        => $this->partnersRepository->getLastAddedPartnerByUser($user),
  765.             'success'           => true
  766.         ];
  767.         return new JsonResponse($response);
  768.     }
  769.     /**
  770.      * @Route(
  771.      *     "/fond/dashboard/datatable/{building}/{type}",
  772.      *     requirements={"id" = "\d+"},
  773.      *     name="datatable_fond_dashboard",
  774.      *     defaults={"type" = null},
  775.      *     options={"expose"=true}
  776.      *     )
  777.      * @param  Request   $request
  778.      * @param  Building  $building
  779.      * @param  mixed     $type
  780.      *
  781.      * @return JsonResponse
  782.      */
  783.     public function datatableFondsInputAction(Request $requestBuilding $buildingmixed $type): JsonResponse
  784.     {
  785.         return $this->defaultService->datatablePagination(
  786.             $request,
  787.             BillPayment::class,
  788.             'findBillPaymentInputsArrayForFondDatatable',
  789.             [
  790.                 'user'     => $building->getUser(),
  791.                 'building' => $building,
  792.                 'income'   => $request->get('income'),
  793.                 'type'     => $type
  794.             ]
  795.         );
  796.     }
  797.     /**
  798.      * @Route(
  799.      *     "/building/{id}/fond/{fondId}/edit-fond-priliv",
  800.      *     requirements={"id" = "\d+", "fondId" = "\d+"},
  801.      *     name="edit_fond_priliv",
  802.      *     options={"expose"=true}
  803.      *     )
  804.      * @param  Request  $request
  805.      * @param  int      $id
  806.      * @param  int      $fondId
  807.      *
  808.      * @return Response
  809.      * @throws ORMException
  810.      */
  811.     public function editFondPrilivAction(Request $requestint $idint $fondId): Response
  812.     {
  813.         /** @var User $user */
  814.         $user $this->getUser();
  815.         $companyUsers $this->userRepository->findUsersByMain($user);
  816.         if ($user->getMainUser()) {
  817.             $companyUsers array_merge($companyUsers, [$user->getMainUser()]);
  818.         }
  819.         /** @var Building $building */
  820.         $building $this->buildingRepository->find($id);
  821.         $this->defaultService->checkEntity($building$user);
  822.         $partners $this->partnersRepository->getUsersPartners($companyUsers);
  823.         $optionNames $this->optionNameRepository->getOptionNameByTypeIO(
  824.             [$building->getUser()->getMainUser() ?? $building->getUser()->getId()]
  825.         );
  826.         $billOptions $this->billOptionsRepository->getAllBillOptionsUntilNow($building);
  827.         $separateBillOptions $this->separateBillOptionsRepository->getAllSeparateBillOptionsUntilNow($building);
  828.         $billPaymentNames $this->billPaymentRepository->findAllTypesForBuilding($building$building->getUser());
  829.         $billOptionsForCards $this->optionNameService->filterOptionNameKeys(
  830.             array_merge($billOptions$billPaymentNames$separateBillOptions),
  831.             $building->getUser()
  832.         );
  833.         $filteredOptionNames = [];
  834.         foreach ($optionNames as $item) {
  835.             if (in_array($item['name'], $billOptionsForCards)) {
  836.                 $filteredOptionNames[$item['name']] = $item['id'];
  837.             }
  838.         }
  839.         /** @var BillPayment|null $billPayment */
  840.         $billPayment $this->billPaymentRepository->find($fondId);
  841.         if (empty($billPayment)) {
  842.             throw $this->createNotFoundException('Unable to find Bill payment entity.');
  843.         }
  844.         if ($billPayment->getPartner() != null) {
  845.             $billPayment->setPartner($billPayment->getPartner());
  846.         }
  847.         $form $this->createForm(
  848.             BillPaymentFondType::class,
  849.             $billPayment,
  850.             [
  851.                 'attr'     => [
  852.                     'date'          => $billPayment->getCreatedAt()->format('Y-m-d'),
  853.                     'currentOption' => $billPayment->getType(),
  854.                     'isTestUser'    => $this->fondService->isTestUser($building->getUser()->getId()),
  855.                     'currentPartner' => $billPayment->getPartner()?->getId(),
  856.                 ],
  857.                 'partners' => $partners,
  858.                 'optionNames' => $filteredOptionNames,
  859.             ]
  860.         );
  861.         $form->handleRequest($request);
  862.         if ($form->isSubmitted() && $form->isValid()) {
  863.             $billPayment $form->getData();
  864.             $partnerId $form->get('partner')->getData();
  865.             $partner null;
  866.             if ($partnerId) {
  867.                 $partner $this->partnersRepository->find($partnerId);
  868.             }
  869.             $billPayment->setUser($building->getUser());
  870.             $billPayment->setBuilding($building);
  871.             $billPayment->setUpdateAt(new DateTime());
  872.             $billPayment->setIncome(BillPaymentTypeEnum::PRILIV->value);
  873.             $billPayment->setPartner($partner);
  874.             $this->billPaymentRepository->save($billPayment);
  875.             return new RedirectResponse($this->generateUrl('fond_dashboard', ['id' => $id]));
  876.         }
  877.         $params['form'] = $form->createView();
  878.         $params['id'] = $id;
  879.         $params['partnersListCount'] = $this->partnersRepository->getPartnersCountByUser($user);
  880.         $params['building'] = $building;
  881.         return $this->render('@views/Fond/addNewFondPrilivi.html.twig'$params);
  882.     }
  883.     /**
  884.      * @Route(
  885.      *     "/building/{id}/fond/{fondId}/edit-fond-odliv",
  886.      *     requirements={"id" = "\d+", "fondId" = "\d+"},
  887.      *     name="edit_fond_odliv",
  888.      *     options={"expose"=true}
  889.      *     )
  890.      * @param  Request  $request
  891.      * @param  int      $id
  892.      * @param  int      $fondId
  893.      *
  894.      * @return Response
  895.      * @throws NonUniqueResultException
  896.      * @throws ORMException
  897.      */
  898.     public function editFondOdlivAction(Request $requestint $idint $fondId): Response
  899.     {
  900.         /** @var User $user */
  901.         $user $this->getUser();
  902.         $companyUsers $this->userRepository->findUsersByMain($user);
  903.         if ($user->getMainUser()) {
  904.             $companyUsers array_merge($companyUsers, [$user->getMainUser()]);
  905.         }
  906.         /** @var Building $building */
  907.         $building $this->buildingRepository->find($id);
  908.         $this->defaultService->checkEntity($building$user);
  909.         $options $this->optionNameService->getBillPaymentOdlivOptions($building->getUser(), $building);
  910.         $partners $this->partnersRepository->getUsersPartners($companyUsers);
  911.         /** @var BillPayment|null $billPayment */
  912.         $billPayment $this->billPaymentRepository->find($fondId);
  913.         if (empty($billPayment)) {
  914.             throw $this->createNotFoundException('Unable to find Bill payment entity.');
  915.         }
  916.         if ($billPayment->getPartner() != null) {
  917.             $billPayment->setPartner($billPayment->getPartner());
  918.         }
  919.         $form $this->createForm(BillPaymentType::class, $billPayment, [
  920.             'attr'     => [
  921.                 'typeChose'   => json_encode($options),
  922.                 'date'        => $billPayment->getCreatedAt()->format('Y-m-d'),
  923.                 'isTestUser'  => $this->fondService->isTestUser($building->getUser()->getId()),
  924.                 'user'        => $building->getUser()->getId(),
  925.                 'description' => $billPayment->getComment()
  926.             ],
  927.             'method'   => 'POST',
  928.             'partners' => $partners
  929.         ]);
  930.         $form->handleRequest($request);
  931.         if ($form->isSubmitted() && $form->isValid()) {
  932.             $billPayment->setUser($building->getUser());
  933.             $billPayment->setBuilding($building);
  934.             $billPayment->setUpdateAt(new DateTime());
  935.             $billPayment->setType($form->getData()->getType());
  936.             $billPayment->setIncome(BillPaymentTypeEnum::ODLIV->value);
  937.             $partner $this->partnersRepository->getPartnerByPartnerId(
  938.                 $user,
  939.                 $form->getData()->getPartner()?->getId()
  940.             );
  941.             $billPayment->setPartner($partner);
  942.             $this->billPaymentRepository->save($billPayment);
  943.             return new RedirectResponse($this->generateUrl('fond_dashboard', ['id' => $id]));
  944.         }
  945.         return $this->render('@views/Fond/addNewFond.html.twig', [
  946.             'building' => $building,
  947.             'id'       => $id,
  948.             'form'     => $form->createView(),
  949.             'payment'  => []
  950.         ]);
  951.     }
  952.     /**
  953.      * @Route("/transferred-money/{id}", name="transferred_money", options={"expose"=true})
  954.      * @param  Request  $request
  955.      * @param  int      $id
  956.      * @param  null     $saldo
  957.      *
  958.      * @return Response
  959.      */
  960.     public function transferredMoney(Request $requestint $id$saldo null): Response
  961.     {
  962.         $saldo $request->get('saldo');
  963.         /** @var User $user */
  964.         $user $this->getUser();
  965.         /** @var Building $building */
  966.         $building $this->buildingRepository->find($id);
  967.         $this->defaultService->checkEntity($building$user);
  968.         $optionNames $this->optionNameService->getOptionsNameKeys($building->getUser());
  969.         $statistics $this->billService->getLastYearStatistics2($building->getUser(), $building);
  970.         $options $statistics['fields'];
  971.         $obr 0;
  972.         $npl 0;
  973.         $choices = [];
  974.         foreach ($options as $option) {
  975.             $choices[$optionNames[$option]] = $option;
  976.         }
  977.         $form $this->createForm(
  978.             TransferredMoneyType::class,
  979.             [],
  980.             [
  981.                 'method'  => 'POST',
  982.                 'choices' => $choices
  983.             ]
  984.         );
  985.         $form->handleRequest($request);
  986.         if ($form->isSubmitted() && $form->isValid()) {
  987.             $optionsName $form->getData();
  988.             $countObr count($statistics['obr']);
  989.             foreach ($statistics['obr'] as $payment) {
  990.                 if (--$countObr <= 0) {
  991.                     break;
  992.                 }
  993.                 foreach ($payment as $key => $pay) {
  994.                     if (in_array($key$optionsName['options'])) {
  995.                         $obr += $pay;
  996.                     }
  997.                 }
  998.             }
  999.             foreach ($statistics['npl'] as $payment) {
  1000.                 foreach ($payment as $key => $pay) {
  1001.                     if (in_array($key$optionsName['options'])) {
  1002.                         $npl += $pay;
  1003.                     }
  1004.                 }
  1005.             }
  1006.             $saldo $obr $npl;
  1007.             $url $this->generateUrl('transferred_money', ['id' => $id'saldo' => $saldo]);
  1008.             return new RedirectResponse($url);
  1009.         }
  1010.         $params['saldo'] = $saldo;
  1011.         $params['building'] = $building;
  1012.         $params['form'] = $form->createView();
  1013.         return $this->render('@views/Fond/transferredMoney.html.twig'$params);
  1014.     }
  1015.     /**
  1016.      * @Route("/building/{bid}/tekuci-racun-card-period", name="tekuci_racun_card_period", options={"expose"=true})
  1017.      * @param  Request  $request
  1018.      * @param  int      $bid
  1019.      *
  1020.      * @return PdfResponse|string
  1021.      * @throws Exception
  1022.      */
  1023.     public function tekuciRacunCardForPeriodAction(Request $requestint $bid): PdfResponse|string
  1024.     {
  1025.         /** @var User $user */
  1026.         $user $this->getUser();
  1027.         /** @var Building $building */
  1028.         $building $this->buildingRepository->find($bid);
  1029.         $this->defaultService->checkEntity($building$user);
  1030.         $dateFrom $request->get('dateFrom');
  1031.         $dateTo $request->get('dateTo');
  1032.         $dateFromObj = new DateTime($dateFrom);
  1033.         $dateToObj = new DateTime($dateTo);
  1034.         if ($dateFromObj >= $dateToObj) {
  1035.             return $this->pdf->getOutputFromHtml(
  1036.                 '<h2>Niste uneli validne podatke. <br/> Pokusajte ponovo sa drugim podacima!</h2>'
  1037.             );
  1038.         }
  1039.         if (date_diff($dateToObj$dateFromObj)->days 366) {
  1040.             return $this->pdf->getOutputFromHtml(
  1041.                 '<h2>Izabrani period je duzi od 12 meseci. <br/> Pokusajte ponovo sa drugim podacima!</h2>'
  1042.             );
  1043.         }
  1044.         $tekuciArray $this->billService->getPaymentsForTekuciRacunCardForPeriod(
  1045.             $building->getUser(),
  1046.             $building,
  1047.             $dateFrom,
  1048.             $dateTo
  1049.         );
  1050.         return new PdfResponse($this->pdf$this->renderView('@views/Fond/tekuciRacunForPeriod.html.twig', [
  1051.             'data'      => $tekuciArray,
  1052.             'building'  => $building,
  1053.             'dateFrom'  => $dateFrom,
  1054.             'dateTo'    => $dateTo,
  1055.             'forPeriod' => "true"
  1056.         ]));
  1057.     }
  1058.     /**
  1059.      * @Route("/building/{bid}/fond/{fid}", name="fond_delete", options={"expose"=true}, methods={"DELETE"})
  1060.      * @param  Request  $request
  1061.      * @param  int      $bid
  1062.      * @param  int      $fid
  1063.      *
  1064.      * @return JsonResponse
  1065.      */
  1066.     public function deleteFondAction(
  1067.         Request $request,
  1068.         int $bid,
  1069.         int $fid,
  1070.     ): JsonResponse {
  1071.         /** @var User $user */
  1072.         $user $this->getUser();
  1073.         /** @var Building $building */
  1074.         $building $this->buildingRepository->find($bid);
  1075.         $this->defaultService->checkEntity($building$user);
  1076.         /** @var BillPayment|null $billPayment */
  1077.         $billPayment $this->billPaymentRepository->findOneBy(
  1078.             ['id' => $fid'building' => $building'user' => $building->getUser()]
  1079.         );
  1080.         if (!$billPayment) {
  1081.             throw $this->createNotFoundException(
  1082.                 sprintf("Greska. Nema zapisa sa ovim id-jem: %s"$fid)
  1083.             );
  1084.         }
  1085.         $form $this->createDeleteForm($billPayment$bid, ['delete' => 'delete']);
  1086.         $form->handleRequest($request);
  1087.         if ($form->isSubmitted() && $form->isValid()) {
  1088.             if ($buildingPayment $billPayment->getBuildingPayment()) {
  1089.                 $buildingPayment->setProcessed(false);
  1090.                 $this->buildingPaymentRepository->save($buildingPayment);
  1091.                 $processedFile $buildingPayment->getProcessedFile();
  1092.                 $processedBuildingPayments 0;
  1093.                 /** @var BuildingPayment $buildingPayment */
  1094.                 foreach ($processedFile->getBuildingPayments() as $buildingPayment) {
  1095.                     if ($buildingPayment->isProcessed()) {
  1096.                         $processedBuildingPayments++;
  1097.                     }
  1098.                 }
  1099.                 if ($processedFile->getProcessedFlats()->count() === && $processedBuildingPayments === 0) {
  1100.                     $processedFile->setStatus(ProcessedFilesStatusEnum::ERROR_PROCESSED_FILE->value);
  1101.                 } else {
  1102.                     $processedFile->setStatus(ProcessedFilesStatusEnum::PARTIALLY_PROCESSED_FILE->value);
  1103.                 }
  1104.                 $this->processedFilesRepository->save($processedFile);
  1105.             }
  1106.             $this->billPaymentRepository->remove($billPayment);
  1107.             return new JsonResponse(['success' => true]);
  1108.         }
  1109.         return new JsonResponse([
  1110.             'html'    => $this->renderView('@views\Fond\billPaymentDelete.html.twig', ['form' => $form->createView()]),
  1111.             'success' => true
  1112.         ]);
  1113.     }
  1114.     /**
  1115.      * @param  BillPayment            $entity
  1116.      * @param  int                    $bid
  1117.      * @param  array<string, string>  $deleteOpt
  1118.      *
  1119.      * @return FormInterface
  1120.      */
  1121.     public function createDeleteForm(BillPayment $entityint $bid, array $deleteOpt): FormInterface
  1122.     {
  1123.         $entityForm['value'] = $entity->getValue();
  1124.         $entityForm['type'] = $entity->getType();
  1125.         $entityForm['comment'] = $entity->getComment();
  1126.         $entityForm['income'] = $entity->getIncome();
  1127.         $entityForm['typeForm'] = null;
  1128.         $form $this->createForm(BillPaymentType::class, $entityForm, [
  1129.             'action'    => $this->generateUrl('fond_delete', ['bid' => $bid'fid' => $entity->getId()]),
  1130.             'attr'      => [
  1131.                 'id' => 'deleteFondEntry'
  1132.             ],
  1133.             'method'    => 'DELETE',
  1134.             'deleteOpt' => $deleteOpt
  1135.         ]);
  1136.         $form->add('delete'SubmitType::class, ['label' => 'Obrisati''attr' => ['class' => 'btn']]);
  1137.         return $form;
  1138.     }
  1139.     /**
  1140.      * @Route(
  1141.      *     "/building/{bid}/fond_pdf_period/{startDay}/{endDay}/{income}/{partnerId?}",
  1142.      *     name="fond_pdf_period",
  1143.      *     options={"expose"=true}
  1144.      *     )
  1145.      * @param int $bid
  1146.      * @param string $startDay
  1147.      * @param string $endDay
  1148.      * @param int $income
  1149.      * @param int|null $partnerId
  1150.      * @return PdfResponse|string
  1151.      * @throws Exception
  1152.      */
  1153.     public function findPaymentsForPdfForBillPayment(
  1154.         int $bid,
  1155.         string $startDay,
  1156.         string $endDay,
  1157.         int $income,
  1158.         ?int $partnerId
  1159.     ): PdfResponse|string {
  1160.         /** @var User $user */
  1161.         $user $this->getUser();
  1162.         $partner null;
  1163.         if ($partnerId) {
  1164.             /** @var Partners $partner */
  1165.             $partner $this->partnersRepository->findOneBy(['id' => $partnerId]);
  1166.         }
  1167.         $building $this->buildingRepository->findOneBy(['id' => $bid]);
  1168.         $payments $this->billPaymentRepository
  1169.             ->findBillPaymentsForPdf($building$startDay$endDay$income$partner);
  1170.         return new PdfResponse($this->pdf$this->renderView('@views/Fond/billOptionCardPdf.html.twig', [
  1171.             'payments' => $payments,
  1172.             'building' => $building,
  1173.             'type' => $income,
  1174.             'dateTo' => $endDay,
  1175.             'dateFrom' => $startDay
  1176.         ]));
  1177.     }
  1178. }