src/Services/BuildingService.php line 657

Open in your IDE?
  1. <?php
  2. namespace App\Services;
  3. use App\Entity\Bill;
  4. use App\Entity\BillPayment;
  5. use App\Entity\Building;
  6. use App\Entity\Company;
  7. use App\Entity\Flat;
  8. use App\Entity\User;
  9. use App\Enums\BillPaymentTypeEnum;
  10. use App\Enums\BuildingTypeEnum;
  11. use App\Enums\CompanyActionEnum;
  12. use App\Enums\CompanyRoleEnum;
  13. use App\Helpers\CommonHelper;
  14. use App\Repository\BillPaymentRepository;
  15. use App\Repository\BillRepository;
  16. use App\Repository\BuildingRepository;
  17. use App\Repository\CompanyRepository;
  18. use App\Repository\FlatRepository;
  19. use App\Repository\GenerateBillsNotificationRepository;
  20. use App\Repository\PartnersRepository;
  21. use App\Repository\UserRepository;
  22. use App\Utils\ApiV2\ListItemsOptions;
  23. use DateTime;
  24. use Doctrine\ORM\EntityManagerInterface;
  25. use Doctrine\ORM\NonUniqueResultException;
  26. use Doctrine\ORM\NoResultException;
  27. use Exception;
  28. use PhpOffice\PhpSpreadsheet\Cell\DataType;
  29. use PhpOffice\PhpSpreadsheet\Writer\Xlsx\Worksheet;
  30. use Symfony\Component\Form\FormInterface;
  31. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  32. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  33. class BuildingService
  34. {
  35.     private EntityManagerInterface $entityManager;
  36.     private string $qrCode;
  37.     private PartnersService $partnersService;
  38.     private QRCodeService $QRCodeService;
  39.     private UserRepository $userRepository;
  40.     private BuildingRepository $buildingRepository;
  41.     private BillRepository $billRepository;
  42.     private GenerateBillsNotificationRepository $generateBillsNotificationRepository;
  43.     private JobQueueService $jobQueueService;
  44.     private PartnersRepository $partnersRepository;
  45.     private DefaultService $defaultService;
  46.     private CompanyRepository $companyRepository;
  47.     private FlatRepository $flatRepository;
  48.     private BillPaymentRepository $billPaymentRepository;
  49.     private FlatParserService $flatParserService;
  50.     private BuildingParserService $buildingParserService;
  51.     private string $projectDir;
  52.     private MoneyLogService $moneyLogService;
  53.     private HashIdService $hashIdService;
  54.     /**
  55.      * @param EntityManagerInterface $entityManager
  56.      * @param PartnersService $partnersService
  57.      * @param QRCodeService $QRCodeService
  58.      * @param UserRepository $userRepository
  59.      * @param BuildingRepository $buildingRepository
  60.      * @param PartnersRepository $partnersRepository
  61.      * @param BillRepository $billRepository
  62.      * @param GenerateBillsNotificationRepository $generateBillsNotificationRepository
  63.      * @param JobQueueService $jobQueueService
  64.      * @param string $qrCode
  65.      * @param DefaultService $defaultService
  66.      * @param CompanyRepository $companyRepository
  67.      * @param FlatRepository $flatRepository
  68.      * @param BillPaymentRepository $billPaymentRepository
  69.      * @param FlatParserService $flatParserService
  70.      * @param BuildingParserService $buildingParserService
  71.      * @param string $projectDir
  72.      * @param MoneyLogService $moneyLogService
  73.      * @param HashIdService $hashIdService
  74.      */
  75.     public function __construct(
  76.         EntityManagerInterface $entityManager,
  77.         PartnersService $partnersService,
  78.         QRCodeService $QRCodeService,
  79.         UserRepository $userRepository,
  80.         BuildingRepository $buildingRepository,
  81.         PartnersRepository $partnersRepository,
  82.         BillRepository $billRepository,
  83.         GenerateBillsNotificationRepository $generateBillsNotificationRepository,
  84.         JobQueueService $jobQueueService,
  85.         string $qrCode,
  86.         DefaultService $defaultService,
  87.         CompanyRepository $companyRepository,
  88.         FlatRepository $flatRepository,
  89.         BillPaymentRepository $billPaymentRepository,
  90.         FlatParserService $flatParserService,
  91.         BuildingParserService $buildingParserService,
  92.         string $projectDir,
  93.         MoneyLogService $moneyLogService,
  94.         HashIdService $hashIdService
  95.     ) {
  96.         $this->entityManager $entityManager;
  97.         $this->qrCode $qrCode;
  98.         $this->partnersService $partnersService;
  99.         $this->QRCodeService $QRCodeService;
  100.         $this->userRepository $userRepository;
  101.         $this->buildingRepository $buildingRepository;
  102.         $this->billRepository $billRepository;
  103.         $this->generateBillsNotificationRepository $generateBillsNotificationRepository;
  104.         $this->jobQueueService $jobQueueService;
  105.         $this->partnersRepository $partnersRepository;
  106.         $this->defaultService $defaultService;
  107.         $this->companyRepository $companyRepository;
  108.         $this->flatRepository $flatRepository;
  109.         $this->billPaymentRepository $billPaymentRepository;
  110.         $this->flatParserService $flatParserService;
  111.         $this->buildingParserService $buildingParserService;
  112.         $this->projectDir $projectDir;
  113.         $this->moneyLogService $moneyLogService;
  114.         $this->hashIdService $hashIdService;
  115.     }
  116.     /**
  117.      * @param  Building       $building
  118.      * @param  FormInterface  $form
  119.      * @param  int            $type
  120.      *
  121.      * @return void
  122.      * @throws NonUniqueResultException
  123.      */
  124.     public function createBuilding(Building $buildingFormInterface $formint $type): void
  125.     {
  126.         if ($type === BuildingTypeEnum::TYPE_BUSINESS_SPACE->value) {
  127.             $address $form->getData()->getBuildingIdBs()->getAddress();
  128.             $matId $form->getData()->getBuildingIdBs()->getMatId();
  129.             $pib $form->getData()->getBuildingIdBs()->getPib();
  130.             $bankAccount $form->getData()->getBuildingIdBs()->getBankAccount();
  131.             $building->setAddress($address);
  132.             $building->setMatId($matId);
  133.             $building->setPib($pib);
  134.             $building->setBankAccount($bankAccount);
  135.         }
  136.         $building->setCreatedAt(new DateTime('now'));
  137.         $building->setUpdatedAt(new DateTime('now'));
  138.         $building->setType($type);
  139.         $this->entityManager->persist($building);
  140.         $startAmountsData $form->get('start_amounts')->getData();
  141.         $this->createStartAmounts($startAmountsData$building);
  142.         $this->entityManager->flush();
  143.         $this->partnersService->createNewPartnerIfNotExist($building);
  144.         $this->QRCodeService->createQRCodeForBuilding($building->getId(), $this->qrCode);
  145.     }
  146.     /**
  147.      * @param  User  $user
  148.      *
  149.      * @return array<mixed>
  150.      * @throws NonUniqueResultException
  151.      * @throws Exception
  152.      */
  153.     public function getBuildingNotificationList(User $user): array
  154.     {
  155.         $companyUsers $this->userRepository->findUsersByMain($user);
  156.         $buildings $this->buildingRepository->getAllBuildingsByCompanyUsers($companyUsers1);
  157.         $lastBillMonth = new DateTime('2000-01-01');
  158.         foreach ($buildings as $building) {
  159.             /** @var Bill $lastBill */
  160.             $lastBill $this->billRepository->findLastBillByBuilding($building);
  161.             if ($lastBill !== null && $lastBill->getMonth() > $lastBillMonth) {
  162.                 $lastBillMonth $lastBill->getMonth();
  163.             }
  164.         }
  165.         $lastBillMonth CommonHelper::getMonth($lastBillMonth->modify("-1MONTH"));
  166.         $notifications $this->generateBillsNotificationRepository->getBuildingsNotificationByUserAndMonth(
  167.             $user,
  168.             $lastBillMonth
  169.         );
  170.         return [
  171.             'buildings'     => $buildings,
  172.             'notifications' => $notifications,
  173.         ];
  174.     }
  175.     /**
  176.      * @param  array<Building>  $buildings
  177.      *
  178.      * @return array<mixed>
  179.      * @throws NonUniqueResultException
  180.      */
  181.     public function getBuildingForChoiceAndMonths(array $buildings): array
  182.     {
  183.         $buildingForMonths = new Building();
  184.         $lastBillMonth = new DateTime('2000-01-01');
  185.         $buildingsForChoice = [];
  186.         $buildingsForChoice['Stambene zajednice'] = [];
  187.         if (!empty($buildings)) {
  188.             $buildingsForChoice['Stambene zajednice']['Selektuj sve stambene zajednice'] = "All";
  189.         }
  190.         /** @var Building $building */
  191.         foreach ($buildings as $building) {
  192.             $buildingsForChoice['Stambene zajednice'][$building->getAddress()] = $building->getAddress();
  193.             /** @var Bill $lastBill */
  194.             $lastBill $this->billRepository->findLastBillByBuilding($building);
  195.             if ($lastBill !== null && $lastBill->getMonth() > $lastBillMonth) {
  196.                 $lastBillMonth $lastBill->getMonth();
  197.                 $buildingForMonths $building;
  198.             }
  199.         }
  200.         return [
  201.             'buildingsForChoice' => $buildingsForChoice,
  202.             'buildingForMonths'  => $buildingForMonths
  203.         ];
  204.     }
  205.     /**
  206.      * @param  FormInterface    $form
  207.      * @param  User             $user
  208.      * @param  array<Building>  $buildings
  209.      *
  210.      * @return void
  211.      */
  212.     public function createNewBillForBuildings(FormInterface $formUser $user, array $buildings): void
  213.     {
  214.         $month $form->getData()['month']->format('Y-m-01');
  215.         $createBillDate $form->getData()['createBillDate']->format('Y-m-d');
  216.         $dueDate $form->getData()['dueDate']->format('Y-m-d');
  217.         $title $form->getData()['title'];
  218.         $buildingsAddresses $form->getData()['buildings'];
  219.         $exclusion $form->getData()['buildingExclusion'];
  220.         $buildingsIds = [];
  221.         if ($buildingsAddresses[0] === "All") {
  222.             foreach ($buildings as $building) {
  223.                 $buildingsIds[] = $building->getId();
  224.             }
  225.         } else {
  226.             $allBuildingsIds = [];
  227.             foreach ($buildings as $building) {
  228.                 $allBuildingsIds[] = $building->getId();
  229.             }
  230.             foreach ($buildingsAddresses as $buildingAddress) {
  231.                 $buildingId = ($this->buildingRepository->findOneBy(['address' => $buildingAddress]))->getId();
  232.                 if ($exclusion) {
  233.                     $buildingsIds[] = $buildingId;
  234.                 } else {
  235.                     foreach ($allBuildingsIds as $key => $id) {
  236.                         if ($buildingId === $id) {
  237.                             array_splice($allBuildingsIds$key1);
  238.                         }
  239.                     }
  240.                     $buildingsIds $allBuildingsIds;
  241.                 }
  242.             }
  243.         }
  244.         $this->jobQueueService->generateBillsJob(
  245.             $user->getId(),
  246.             $month,
  247.             $createBillDate,
  248.             $dueDate,
  249.             $title,
  250.             $buildingsIds
  251.         );
  252.         $this->jobQueueService->moneyLogFlatCalculationAfterBillGeneratingJob($user);
  253.     }
  254.     /**
  255.      * @param  array<int>  $buildingsIds
  256.      *
  257.      * @return array<Building>
  258.      */
  259.     public function getBuildingsObj(array $buildingsIds): array
  260.     {
  261.         $buildingsArray = [];
  262.         $i 0;
  263.         foreach ($buildingsIds as $buildingId) {
  264.             $buildingsArray[$i] = $this->buildingRepository->find(['id' => $buildingId]);
  265.             $i $i 1;
  266.         }
  267.         return $buildingsArray;
  268.     }
  269.     /**
  270.      * @param  array<User>  $users
  271.      *
  272.      * @return array<int, string>
  273.      */
  274.     public function getBuildingCountByUsers(array $users): array
  275.     {
  276.         $ids array_map(function ($user) {
  277.             return $user->getId();
  278.         }, $users);
  279.         $retArray $this->buildingRepository->getBuildingCountByUserIds($ids);
  280.         $assocArrayWithCounts = [];
  281.         foreach ($retArray as $item) {
  282.             $assocArrayWithCounts[$item['userId']] = $item['buildingsCount'];
  283.         }
  284.         return $assocArrayWithCounts;
  285.     }
  286.     /**
  287.      * @param  array<Company>  $assignedBuildings
  288.      *
  289.      * @return array<mixed>
  290.      */
  291.     public function getAssignedBuildingsData(array $assignedBuildings): array
  292.     {
  293.         $actionData = [];
  294.         /** @var Company $record */
  295.         foreach ($assignedBuildings as $record) {
  296.             $data json_decode($record->getActionData(), true);
  297.             $data['assignedAt'] = $record->getCreatedAt();
  298.             $data['buildingId'] = $record->getBuildingId();
  299.             $data['deleted'] = $this->buildingRepository->find($record->getBuildingId()) === null;
  300.             $actionData[] = $data;
  301.         }
  302.         return $actionData;
  303.     }
  304.     /**
  305.      * @param  array<Company>  $deletedBuildings
  306.      *
  307.      * @return array<mixed>
  308.      */
  309.     public function getDeletedBuildingsData(array $deletedBuildings): array
  310.     {
  311.         $actionData = [];
  312.         /** @var Company $record */
  313.         foreach ($deletedBuildings as $record) {
  314.             $data json_decode($record->getActionData(), true);
  315.             $data['deletedAt'] = $record->getCreatedAt();
  316.             $actionData[] = $data;
  317.         }
  318.         return $actionData;
  319.     }
  320.     /**
  321.      * @param  Building  $building
  322.      *
  323.      * @return array<mixed>
  324.      */
  325.     public function makeBuildingArrayForCompanyRecord(Building $building): array
  326.     {
  327.         $actionDataArray = [];
  328.         $actionDataArray['createdAt'] = $building->getCreatedAt();
  329.         $actionDataArray['updatedAt'] = $building->getUpdatedAt();
  330.         $actionDataArray['code'] = $building->getCode();
  331.         $actionDataArray['address'] = $building->getAddress();
  332.         $actionDataArray['city'] = $building->getCity();
  333.         $actionDataArray['flats'] = $building->getFlats();
  334.         $actionDataArray['buildingSize'] = $building->getBuildingSize();
  335.         $actionDataArray['population'] = $building->getPopulation();
  336.         $actionDataArray['pib'] = $building->getPib();
  337.         $actionDataArray['bankAccount'] = $building->getBankAccount();
  338.         $actionDataArray['matId'] = $building->getMatId();
  339.         $actionDataArray['email'] = $building->getEmail();
  340.         return $actionDataArray;
  341.     }
  342.     /**
  343.      * @param  User  $user
  344.      * @param  int   $type
  345.      *
  346.      * @return array<mixed>
  347.      */
  348.     public function getBuildingListPdf(User $userint $type): array
  349.     {
  350.         $companyUsers $this->userRepository->findUsersByMain($user);
  351.         /** @var array<Building> $buildings */
  352.         $buildings $this->buildingRepository->getActiveBuildingsByUserObj($companyUsers$type);
  353.         $view '@views/Building/PDF/List/buildingListPDF.html.twig';
  354.         if ($user->isUserCyrillic()) {
  355.             $view '@views/Building/PDF/List/buildingListCyrillicPDF.html.twig';
  356.         }
  357.         return [
  358.             'buildings' => $buildings,
  359.             'view'      => $view
  360.         ];
  361.     }
  362.     /**
  363.      * @param  FormInterface  $form
  364.      * @param  Building       $building
  365.      * @param  User           $user
  366.      * @param  bool           $lastBill
  367.      *
  368.      * @return void
  369.      * @throws NoResultException
  370.      * @throws NonUniqueResultException
  371.      */
  372.     public function updateBuilding(FormInterface $formBuilding $buildingUser $userbool $lastBill): void
  373.     {
  374.         $building->setUpdatedAt(new DateTime('now'));
  375.         if ($building->getType() === BuildingTypeEnum::TYPE_BUSINESS_SPACE->value) {
  376.             $address $form->getData()->getBuildingIdBs()->getAddress();
  377.             $matId $form->getData()->getBuildingIdBs()->getMatId();
  378.             $pib $form->getData()->getBuildingIdBs()->getPib();
  379.             $bankAccount $form->getData()->getBuildingIdBs()->getBankAccount();
  380.             $building->setAddress($address);
  381.             $building->setMatId($matId);
  382.             $building->setPib($pib);
  383.             $building->setBankAccount($bankAccount);
  384.         }
  385.         if ($building->getType() === BuildingTypeEnum::TYPE_BUILDING->value) {
  386.             $address $form->getData()->getAddress();
  387.             $matId $form->getData()->getMatId();
  388.             $pib $form->getData()->getPib();
  389.             $bankAccount $form->getData()->getBankAccount();
  390.             $this->buildingRepository->updateBusinessSpaceInformationByBuilding(
  391.                 $user,
  392.                 $building,
  393.                 $address,
  394.                 $matId,
  395.                 $pib,
  396.                 $bankAccount
  397.             );
  398.         }
  399. //        if (!$lastBill) {
  400.         $lastPayments $this->billPaymentRepository->findAllStartDataPaymentsForBuilding($building$user);
  401.         foreach ($lastPayments as $payment) {
  402.             $this->billPaymentRepository->remove($payment);
  403.         }
  404.         $startAmountsData $form->get('start_amounts')->getData();
  405.         $this->createStartAmounts($startAmountsData$building);
  406. //        }
  407.         $partner $this->partnersRepository->getPartnerAsBuilding($user$building);
  408.         if ($partner) {
  409.             $this->partnersService->updatePartnerData($partner$building);
  410.         }
  411.         $this->buildingRepository->flush();
  412.     }
  413.     public function deleteBuilding(FormInterface $formUser $user): void
  414.     {
  415.         $id $form->getData()['id'];
  416.         /** @var Building $building */
  417.         $building $this->buildingRepository->find($id);
  418.         $building->setBuildingIdBs(null);
  419.         $this->defaultService->checkEntity($building$user);
  420.         if (count($this->userRepository->findUsersByMain($user)) !== || $user->getMainUser()) {
  421.             $companyAction = new Company();
  422.             $companyAction->setMainUser($user->getSharedCompanyUser());
  423.             if ($user->getCompanyRole() === CompanyRoleEnum::RADNIK->value) {
  424.                 $companyAction->setMainUser($user->getMainUser()->getSharedCompanyUser());
  425.             }
  426.             $companyAction->setAction(CompanyActionEnum::DELETE_COMPANY_BUILDING->value);
  427.             $actionDataArray $this->makeBuildingArrayForCompanyRecord($building);
  428.             $actionDataArray['deletedBy'] = $user->getFullName();
  429.             $actionData json_encode($actionDataArray);
  430.             $companyAction->setActionData($actionData);
  431.             $companyAction->setBuildingId($building->getId());
  432.             $this->companyRepository->save($companyAction);
  433.         }
  434.         $this->buildingRepository->remove($building);
  435.     }
  436.     /**
  437.      * @param  User  $user
  438.      *
  439.      * @return array<Building>
  440.      */
  441.     public function getBuildingsThatAreNotPartners(User $user): array
  442.     {
  443.         $companyUsers $this->userRepository->findUsersByMain($user);
  444.         $allBuildingsIds $this->buildingRepository->getBuildingsIdsForUser($companyUsers);
  445.         $allBuildingsIdsArray = [];
  446.         foreach ($allBuildingsIds as $buildingId) {
  447.             $allBuildingsIdsArray[] = $buildingId['id'];
  448.         }
  449.         $buildingsThatArePartners $this->partnersRepository->getPartnersThatAreBuildings(
  450.             $companyUsers,
  451.             $user->getMainUser()
  452.         );
  453.         $partnersIdsArray = [];
  454.         foreach ($buildingsThatArePartners as $buildingId) {
  455.             $partnersIdsArray[] = $buildingId['id'];
  456.         }
  457.         return array_diff($allBuildingsIdsArray$partnersIdsArray);
  458.     }
  459.     /**
  460.      * @param  User      $user
  461.      * @param  Building  $building
  462.      *
  463.      * @return array<mixed>
  464.      */
  465.     public function getOldDebitByFlat(User $userBuilding $building): array
  466.     {
  467.         $flats $this->flatRepository->getFlatsByBuilding($user$building);
  468.         $oldDebits = [];
  469.         foreach ($flats as $index => $flat) {
  470.             $oldDebits[$flat['displayFlatId']] = $flat['oldDebit'];
  471.         }
  472.         return $oldDebits;
  473.     }
  474.     /**
  475.      * @param  array<mixed>  $billOptions
  476.      * @param  array<mixed>  $optionNames
  477.      * @param  array<mixed>  $logsArray
  478.      * @param  bool          $period
  479.      *
  480.      * @return array<mixed>
  481.      */
  482.     public function getArrayForTable(
  483.         array $billOptions,
  484.         array $optionNames,
  485.         array $logsArray,
  486.         bool $period false
  487.     ): array {
  488.         $columns = [];
  489.         $columns[] = 'Br. stana';
  490.         $columns[] = 'Ime vlasnika';
  491.         foreach ($billOptions as $option) {
  492.             if (array_key_exists($option$optionNames)) {
  493.                 $columns[] = $optionNames[$option];
  494.             }
  495.         }
  496.         $columns[] = 'Ukupno obračunato za period';
  497.         $columns[] = 'Ukupno naplaćeno za period';
  498.         if (!$period) {
  499.             $columns[] = 'Preostali dug za pariod';
  500.         } else {
  501.             $columns[] = 'Ukupan dug';
  502.         }
  503.         $list = [];
  504.         $list[0] = $columns;
  505.         $loop 1;
  506.         $billSaldo 0;
  507.         $paidSaldo 0;
  508.         $leftSaldo 0;
  509.         foreach ($logsArray as $month) {
  510.             foreach ($month as $displayFlatId => $flat) {
  511.                 $list[$loop][] = $displayFlatId;
  512.                 if (
  513.                     array_key_exists('companyName'$flat['monthlyBill']['details']) &&
  514.                     $flat['monthlyBill']['details']['companyName']
  515.                 ) {
  516.                     $list[$loop][] = $flat['monthlyBill']['details']['companyName'];
  517.                 } else {
  518.                     $list[$loop][] = explode(","$flat['monthlyBill']['vlasnik_data'])[0];
  519.                 }
  520.                 foreach ($billOptions as $option) {
  521.                     if (array_key_exists($option$flat)) {
  522.                         $list[$loop][] = $flat[$option];
  523.                     } else {
  524.                         $list[$loop][] = 0;
  525.                     }
  526.                 }
  527.                 $list[$loop][] = $flat['sum'];
  528.                 $billSaldo += $flat['sum'];
  529.                 $list[$loop][] = $flat['paid'];
  530.                 $paidSaldo += $flat['paid'];
  531.                 $list[$loop][] = $flat['leftDebit'];
  532.                 $leftSaldo += $flat['leftDebit'];
  533.                 $loop += 1;
  534.             }
  535.         }
  536.         $i 1;
  537.         while ($i count($columns) - 3) {
  538.             $list[$loop][] = '';
  539.             $i += 1;
  540.         }
  541.         $list[$loop][] = 'Ukupno:';
  542.         $list[$loop]['billSaldo'] = $billSaldo;
  543.         $list[$loop]['paidSaldo'] = $paidSaldo;
  544.         $list[$loop]['leftSaldo'] = $leftSaldo;
  545.         return $list;
  546.     }
  547.     /**
  548.      * @param  Building|array<string, string>  $buildingObject
  549.      *
  550.      * @return Building
  551.      */
  552.     public function createBuildingAction(Building|array $buildingObject): Building
  553.     {
  554.         $building = new Building();
  555.         $building->setAddress($buildingObject['address']);
  556.         $building->setEmail($buildingObject['email'] ?? null);
  557.         $building->setActiveStatus(1);
  558.         $this->entityManager->persist($building);
  559.         return $building;
  560.     }
  561.     /**
  562.      * @param  Building      $building
  563.      * @param  array<mixed>  $buildingObject
  564.      *
  565.      * @return Building
  566.      */
  567.     public function updateBuildingAction(Building $building, array $buildingObject): Building
  568.     {
  569.         $building->setAddress($buildingObject['address']);
  570.         return $building;
  571.     }
  572.     /**
  573.      * @param  User              $user
  574.      * @param  ListItemsOptions  $listItemsOptions
  575.      * @param  int               $status
  576.      *
  577.      * @return array<string, mixed>
  578.      * @throws NoResultException
  579.      * @throws NonUniqueResultException
  580.      */
  581.     public function getBuildingsPaginatedApi(User $userListItemsOptions $listItemsOptionsint $status): array
  582.     {
  583.         return [
  584.             'data'  => $this->buildingRepository->getBuildingAddressesByUserPaginatedApi(
  585.                 $user,
  586.                 $status,
  587.                 $listItemsOptions
  588.             ),
  589.             'count' => $this->buildingRepository->countBuildingAddressesByUserPaginatedApi($user$status)
  590.         ];
  591.     }
  592.     /**
  593.      * @param array<mixed> $startAmountsData
  594.      * @param Building $building
  595.      * @return void
  596.      */
  597.     public function createStartAmounts(array $startAmountsDataBuilding $building): void
  598.     {
  599.         foreach ($startAmountsData as $startAmount) {
  600.             if (empty($startAmount['option'])) {
  601.                 continue;
  602.             }
  603.             if (!empty($startAmount['value'])) {
  604.                 $payment = new BillPayment();
  605.                 $payment->setBuilding($building);
  606.                 $payment->setUser($building->getUser());
  607.                 $payment->setValue($startAmount['value']);
  608.                 $payment->setType((string)$startAmount['option']);
  609.                 $payment->setIncome(BillPaymentTypeEnum::POCETNO_STANJE->value);
  610.                 $payment->setCreatedAt($startAmount['date'] ?? new DateTime('now'));
  611.                 $this->entityManager->persist($payment);
  612.             }
  613.             if (!empty($startAmount['valueDebit'])) {
  614.                 $payment = new BillPayment();
  615.                 $payment->setBuilding($building);
  616.                 $payment->setUser($building->getUser());
  617.                 $payment->setValue($startAmount['valueDebit']);
  618.                 $payment->setType((string)$startAmount['option']);
  619.                 $payment->setIncome(BillPaymentTypeEnum::POCETNI_DUG->value);
  620.                 $payment->setCreatedAt($startAmount['date'] ?? new DateTime('now'));
  621.                 $this->entityManager->persist($payment);
  622.             }
  623.         }
  624.     }
  625.     /**
  626.      * @param  Building  $building
  627.      * @return array<mixed>
  628.      */
  629.     public function getStartAmountInitialDataForBuilding(Building $building): array
  630.     {
  631.         $startAmounts $this->billPaymentRepository
  632.             ->getBillPaymentsByIncome(BillPaymentTypeEnum::POCETNO_STANJE->value$building$building->getUser());
  633.         $startDebits $this->billPaymentRepository
  634.             ->getBillPaymentsByIncome(BillPaymentTypeEnum::POCETNI_DUG->value$building$building->getUser());
  635.         $data = [];
  636.         foreach ($startAmounts as $payment) {
  637.             $data[$payment['type']]['value'] = $payment['value'];
  638.             $data[$payment['type']]['option'] = $payment['type'];
  639.             $data[$payment['type']]['date'] = $payment['createdAt'];
  640.         }
  641.         /** @var BillPayment $payment */
  642.         foreach ($startDebits as $payment) {
  643.             $data[$payment['type']]['valueDebit'] = $payment['value'];
  644.             $data[$payment['type']]['option'] = $payment['type'];
  645.             $data[$payment['type']]['date'] = $payment['createdAt'];
  646.         }
  647.         return array_values($data);
  648.     }
  649.     /**
  650.      * @param array<mixed> $data
  651.      * @param array<mixed> $errors
  652.      * @return void
  653.      */
  654.     public function handleBuildingImport(
  655.         array $data,
  656.         array &$errors
  657.     ): void {
  658.         $id $data['userId'];
  659.         $user $this->userRepository->find($id);
  660.         $file $data['file'];
  661.         $reader $this->buildingParserService->parseFile($file);
  662.         $buildings $reader['building'];
  663.         foreach ($buildings as $index => $building) {
  664.             if (!$reader['valid'][$index]) {
  665.                 $errors[] = $index;
  666.                 continue;
  667.             }
  668.             $foundBuilding $this->buildingRepository->findOneBy(['user' => $user'code' => $building['code']]);
  669.             if ($foundBuilding != null) {
  670.                 continue;
  671.             }
  672.             $newBuilding = new Building();
  673.             $newBuilding->setUser($user);
  674.             $newBuilding->setActiveStatus(1);
  675.             $newBuilding->setAddress($building['address']);
  676.             $newBuilding->setBankAccount($building['bankAccount']);
  677.             $newBuilding->setPostCode($building['postCode']);
  678.             $newBuilding->setCity($building['city']);
  679.             $newBuilding->setMunicipality($building['municipality']);
  680.             $newBuilding->setComment($building['comment']);
  681.             $newBuilding->setCode($building['code']);
  682.             $newBuilding->setEmail($building['email']);
  683.             $newBuilding->setConstructionYear($building['constructionYear']);
  684.             $newBuilding->setStartingMoney($building['startingMoney']);
  685.             $newBuilding->setType(1);
  686.             $newBuilding->setCreatedAt(new \DateTime('now'));
  687.             $newBuilding->setUpdatedAt(new \DateTime('now'));
  688.             $newBuilding->setMatId($building['matId']);
  689.             $newBuilding->setPib($building['pib']);
  690.             $this->buildingRepository->save($newBuilding);
  691.             $this->QRCodeService->createQRCodeForBuilding($newBuilding->getId(), $this->projectDir);
  692.         }
  693.     }
  694.     /**
  695.      * @param array<mixed> $data
  696.      * @param array<mixed> $errors
  697.      * @return void
  698.      */
  699.     public function handleFlatsImport(array $data, array &$errors): void
  700.     {
  701.         $file $data['file'];
  702.         $reader $this->flatParserService->parseFile($file);
  703.         $buildingAddress $reader['building'];
  704.         $building $this->buildingRepository->findOneBy(['address' => $buildingAddress]);
  705.         $flats $reader['flats'];
  706.         if (!$building) {
  707.             $errors[] = 'Building not found';
  708.             return;
  709.         }
  710.         foreach ($flats as $index => $flat) {
  711.             if (!$reader['valid'][$index]) {
  712.                 $errors[] = $index;
  713.                 continue;
  714.             }
  715.             $newFlat = new Flat();
  716.             $newFlat->setBuilding($building);
  717.             $newFlat->setUser($building->getUser());
  718.             $building->incrementFlatsNumber();
  719.             $newFlat->setArchived(0);
  720.             $newFlat->setCreatedAt(new \DateTime('now'));
  721.             $newFlat->setUpdatedAt(new \DateTime('now'));
  722.             $newFlat->setMatId($flat['matId']);
  723.             $newFlat->setType($flat['type']);
  724.             $newFlat->setSubType($flat['subtype']);
  725.             $newFlat->setSize($flat['size']);
  726.             $newFlat->setPib($flat['pib']);
  727.             $newFlat->setDisplayFlatId($flat['flat_display_id']);
  728.             $newFlat->setOwnerName($flat['owner_name']);
  729.             $newFlat->setOwnerLastname($flat['owner_lastname']);
  730.             $newFlat->setCompanyName($flat['company_name']);
  731.             $newFlat->setCompanyPlace($flat['company_address']);
  732.             $newFlat->setComment($flat['comment']);
  733.             $newFlat->setMembers($flat['members'] ?: 1);
  734.             $newFlat->setOwnerEmail($flat['owner_email']);
  735.             $newFlat->setEmailCanBeUsed(false);
  736.             if (isset($flat['owner_email'])) {
  737.                 $newFlat->setEmailCanBeUsed(true);
  738.             }
  739.             $newFlat->setOldDebit($flat['old_debt']);
  740.             $newFlat->setRent($flat['sub_occupants']);
  741.             $newFlat->setBankAccount($flat['bank_account']);
  742.             $this->flatRepository->save($newFlat);
  743.         }
  744.     }
  745.     /**
  746.      * @param array<mixed> $mergedArray
  747.      * @param string $startDate
  748.      * @param string $endDate
  749.      * @param float $saldo
  750.      * @return Xlsx
  751.      * @throws \PhpOffice\PhpSpreadsheet\Exception
  752.      * @throws Exception
  753.      */
  754.     public function getArrayForFinalReport(array $mergedArraystring $startDatestring $endDatefloat $saldo): Xlsx
  755.     {
  756.         $spreadsheet = new Spreadsheet();
  757.         $activeWorksheet $spreadsheet->getActiveSheet();
  758.         $activeWorksheet->mergeCells('B1:F1');
  759.         $activeWorksheet->setCellValue('B1'sprintf('FINANSIJSKI IZVEŠTAJ ZA PERIOD %s - %s'$startDate$endDate));
  760.         $startDateNew = new DateTime($startDate);
  761.         $activeWorksheet->mergeCells('B2:F2');
  762.         $activeWorksheet->setCellValue(
  763.             'B2',
  764.             sprintf(
  765.                 'RASPOLOŽIVA SREDSTVA NA DAN: %s - %s',
  766.                 $startDateNew->modify('-1day')->format('d.m.Y'),
  767.                 number_format($saldo2',''.')
  768.             )
  769.         );
  770.         $activeWorksheet->mergeCells('B3:C3');
  771.         $activeWorksheet->setCellValue('B3''TEKUĆI RAČUN');
  772.         $activeWorksheet->setCellValue('D3''DATUM');
  773.         $activeWorksheet->setCellValue('E3''PRIHODI');
  774.         $activeWorksheet->setCellValue('F3''RASHODI');
  775.         $i 4;
  776.         $num 1;
  777.         $income 0;
  778.         $outcome 0;
  779.         foreach ($mergedArray as $item) {
  780.             $activeWorksheet->setCellValue(sprintf('A%s'$i), $num);
  781.             $activeWorksheet->setCellValue(sprintf('B%s'$i), $item['partnerName']);
  782.             $activeWorksheet->setCellValue(sprintf('C%s'$i), $item['comment']);
  783.             if (isset($item['endDate'])) {
  784.                 $activeWorksheet->setCellValue(
  785.                     sprintf('D%s'$i),
  786.                     sprintf('%s - %s'$item['createdAt']->format('d.m.'), $item['endDate']->format('d.m.Y'))
  787.                 );
  788.             } else {
  789.                 $activeWorksheet->setCellValue(sprintf('D%s'$i), $item['createdAt']->format('d.m.Y'));
  790.             }
  791.             if ($item['income'] == || $item['income'] == 3) {
  792.                 $activeWorksheet->setCellValue(sprintf('E%s'$i), $item['value']);
  793.                 $income $income $item['value'];
  794.             } else {
  795.                 $activeWorksheet->setCellValue(sprintf('F%s'$i), $item['value']);
  796.                 $outcome $outcome $item['value'];
  797.             }
  798.             $i++;
  799.             $num++;
  800.         }
  801.         $activeWorksheet->mergeCells(sprintf('B%s:D%s'$i$i));
  802.         $activeWorksheet->setCellValue(sprintf('B%s'$i), 'UKUPNO TEKUĆI RAČUN');
  803.         $activeWorksheet->setCellValue(sprintf('E%s'$i), $income);
  804.         $activeWorksheet->setCellValue(sprintf('F%s'$i), $outcome);
  805.         $activeWorksheet->mergeCells(sprintf('B%s:D%s'$i 1$i 1));
  806.         $activeWorksheet->setCellValue(sprintf('B%s'$i 1), 'UKUPNO (PRIHODI - RASHODI)');
  807.         $activeWorksheet->mergeCells(sprintf('E%s:F%s'$i 1$i 1));
  808.         $activeWorksheet->setCellValue(sprintf('E%s'$i 1), $income $outcome);
  809.         $activeWorksheet->mergeCells(sprintf('B%s:D%s'$i 2$i 2));
  810.         $activeWorksheet->setCellValue(
  811.             sprintf('B%s'$i 2),
  812.             sprintf('STANJE RASPOLOŽIVIH SREDSTAVA NA TEKUĆEM RAČUNU NA DAN: %s'$endDate)
  813.         );
  814.         $activeWorksheet->mergeCells(sprintf('E%s:F%s'$i 2$i 2));
  815.         $activeWorksheet->setCellValue(
  816.             sprintf('E%s'$i 2),
  817.             number_format(($saldo + ($income $outcome)), 2',''.')
  818.         );
  819.         $activeWorksheet->getColumnDimension('A')->setWidth(5);
  820.         $activeWorksheet->getColumnDimension('B')->setWidth(40);
  821.         $activeWorksheet->getColumnDimension('C')->setWidth(40);
  822.         $activeWorksheet->getColumnDimension('D')->setWidth(20);
  823.         $activeWorksheet->getColumnDimension('E')->setWidth(15);
  824.         $activeWorksheet->getColumnDimension('F')->setWidth(15);
  825.         return new Xlsx($spreadsheet);
  826.     }
  827.     /**
  828.      * @param array<int, string> $columnOptions
  829.      * @param Building $building
  830.      * @return Xlsx
  831.      */
  832.     public function getArrayForFlatsList(array $columnOptionsBuilding $building): Xlsx
  833.     {
  834.         /** @var array<Flat> $flats */
  835.         $flatsObjs $this->flatRepository->getFlatsByBuilding($building->getUser(), $building);
  836.         foreach ($flatsObjs as $flat) {
  837.             $flat['hashCode'] = $this->hashIdService->encodeId($flat['id']);
  838.             $flats[$flat['displayFlatId']] = $flat;
  839.         }
  840.         ksort($flatsSORT_NATURAL);
  841.         $spreadsheet = new Spreadsheet();
  842.         $activeWorksheet $spreadsheet->getActiveSheet();
  843.         $currentColumn 'A';
  844.         if (in_array("Broj stana"$columnOptions)) {
  845.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Broj stana");
  846.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(15);
  847.             $currentColumn++;
  848.         }
  849.         if (in_array("Ime vlasnika"$columnOptions)) {
  850.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Ime vlasnika");
  851.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(30);
  852.             $currentColumn++;
  853.         }
  854.         if (in_array("Broj članova"$columnOptions)) {
  855.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Broj članova");
  856.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(10);
  857.             $currentColumn++;
  858.         }
  859.         if (in_array("Poziv na broj"$columnOptions)) {
  860.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Poziv na broj");
  861.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  862.             $currentColumn++;
  863.         }
  864.         if (in_array("Površina"$columnOptions)) {
  865.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Površina");
  866.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(10);
  867.             $currentColumn++;
  868.         }
  869.         if (in_array("Telefon"$columnOptions)) {
  870.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Telefon");
  871.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  872.             $currentColumn++;
  873.         }
  874.         if (in_array("Detalji"$columnOptions)) {
  875.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Detalji");
  876.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  877.             $currentColumn++;
  878.         }
  879.         if (in_array("Email"$columnOptions)) {
  880.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Email");
  881.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(30);
  882.             $currentColumn++;
  883.         }
  884.         if (in_array("Adresa"$columnOptions)) {
  885.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Adresa");
  886.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(50);
  887.             $currentColumn++;
  888.         }
  889.         if (in_array("Stari dug"$columnOptions)) {
  890.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Stari dug");
  891.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(15);
  892.             $currentColumn++;
  893.         }
  894.         if (in_array("Prethodni dug"$columnOptions)) {
  895.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Prethodni dug");
  896.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(15);
  897.             $currentColumn++;
  898.         }
  899.         if (in_array("Ukupan dug"$columnOptions)) {
  900.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Ukupan dug");
  901.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(15);
  902.             $currentColumn++;
  903.         }
  904.         if (in_array("Poslednji račun"$columnOptions)) {
  905.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Poslednji račun");
  906.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(15);
  907.             $currentColumn++;
  908.         }
  909.         if (in_array("Komentar"$columnOptions)) {
  910.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Komentar");
  911.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(50);
  912.             $currentColumn++;
  913.         }
  914.         if (in_array("Kod za aplikaciju"$columnOptions)) {
  915.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Kod za aplikaciju");
  916.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(50);
  917.             $currentColumn++;
  918.         }
  919.         if (in_array("Koristi aplikaciju"$columnOptions)) {
  920.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Koristi aplikaciju");
  921.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(50);
  922.         }
  923.         $i 2;
  924.         foreach ($flats as $flat) {
  925.             $currentColumn 'A';
  926.             if (in_array("Broj stana"$columnOptions)) {
  927.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['displayFlatId']);
  928.                 $currentColumn++;
  929.             }
  930.             if (in_array("Ime vlasnika"$columnOptions)) {
  931.                 $activeWorksheet->setCellValue(
  932.                     sprintf('%s%s'$currentColumn$i),
  933.                     $flat['companyName'] ?? sprintf('%s %s'$flat['ownerName'], $flat['ownerLastname'])
  934.                 );
  935.                 $currentColumn++;
  936.             }
  937.             if (in_array("Broj članova"$columnOptions)) {
  938.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['members']);
  939.                 $currentColumn++;
  940.             }
  941.             if (in_array("Poziv na broj"$columnOptions)) {
  942.                 $activeWorksheet->setCellValue(
  943.                     sprintf('%s%s'$currentColumn$i),
  944.                     sprintf('%s-%s'$building->getCode(), $flat['displayFlatId'])
  945.                 );
  946.                 $currentColumn++;
  947.             }
  948.             if (in_array("Površina"$columnOptions)) {
  949.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['size']);
  950.                 $currentColumn++;
  951.             }
  952.             if (in_array("Telefon"$columnOptions)) {
  953.                 $activeWorksheet->setCellValueExplicit(
  954.                     sprintf('%s%s'$currentColumn$i),
  955.                     $flat['ownerPhoneNumber'],
  956.                     DataType::TYPE_STRING
  957.                 );
  958.                 $currentColumn++;
  959.             }
  960.             if (in_array("Detalji"$columnOptions)) {
  961.                 $activeWorksheet->setCellValueExplicit(
  962.                     sprintf('%s%s'$currentColumn$i),
  963.                     $flat['ownerContact'],
  964.                     DataType::TYPE_STRING
  965.                 );
  966.                 $currentColumn++;
  967.             }
  968.             if (in_array("Email"$columnOptions)) {
  969.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['ownerEmail']);
  970.                 $currentColumn++;
  971.             }
  972.             if (in_array("Adresa"$columnOptions)) {
  973.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['ownerAddress']);
  974.                 $currentColumn++;
  975.             }
  976.             if (in_array("Stari dug"$columnOptions)) {
  977.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['oldDebit']);
  978.                 $currentColumn++;
  979.             }
  980.             if (in_array("Prethodni dug"$columnOptions)) {
  981.                 $activeWorksheet->setCellValue(
  982.                     sprintf('%s%s'$currentColumn$i),
  983.                     ($flat['debit'] + $flat['previousBill'])
  984.                 );
  985.                 $currentColumn++;
  986.             }
  987.             if (in_array("Ukupan dug"$columnOptions)) {
  988.                 $activeWorksheet->setCellValue(
  989.                     sprintf('%s%s'$currentColumn$i),
  990.                     ($flat['debit'] + $flat['previousBill'] + $flat['oldDebit'])
  991.                 );
  992.                 $currentColumn++;
  993.             }
  994.             if (in_array("Poslednji račun"$columnOptions)) {
  995.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['previousBill']);
  996.                 $currentColumn++;
  997.             }
  998.             if (in_array("Komentar"$columnOptions)) {
  999.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['comment']);
  1000.                 $currentColumn++;
  1001.             }
  1002.             if (in_array("Kod za aplikaciju"$columnOptions)) {
  1003.                 $activeWorksheet->setCellValue(
  1004.                     sprintf('%s%s'$currentColumn$i),
  1005.                     $this->hashIdService->encodeId($flat['id'])
  1006.                 );
  1007.                 $currentColumn++;
  1008.             }
  1009.             if (in_array("Koristi aplikaciju"$columnOptions)) {
  1010.                 $flatObj $this->flatRepository->findOneBy(['id' => $flat['id']]);
  1011.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flatObj->getResident() ? 'DA' '');
  1012.             }
  1013.             $i++;
  1014.         }
  1015.         return new Xlsx($spreadsheet);
  1016.     }
  1017.     /**
  1018.      * @param array<int, string> $columnOptions
  1019.      * @param Building $building
  1020.      * @return Xlsx
  1021.      * @throws Exception
  1022.      */
  1023.     public function getArrayForFlatsAnalyticsList(array $columnOptionsBuilding $building): Xlsx
  1024.     {
  1025.         /** @var array<Flat> $flats */
  1026.         $flats $this->flatRepository->getFlatsByBuildingOrderedById($building->getUser(), $building1);
  1027.         $spreadsheet = new Spreadsheet();
  1028.         $activeWorksheet $spreadsheet->getActiveSheet();
  1029.         $currentColumn 'A';
  1030.         if (in_array("Ime i prezime / Naziv dužnika"$columnOptions)) {
  1031.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Ime i prezime / Naziv dužnika");
  1032.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(30);
  1033.             $currentColumn++;
  1034.         }
  1035.         if (in_array("Broj posebnog dela"$columnOptions)) {
  1036.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Broj posebnog dela");
  1037.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(15);
  1038.             $currentColumn++;
  1039.         }
  1040.         if (in_array("Površina"$columnOptions)) {
  1041.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Površina");
  1042.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(10);
  1043.             $currentColumn++;
  1044.         }
  1045.         if (in_array("Adresa dužnika"$columnOptions)) {
  1046.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Adresa dužnika");
  1047.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(60);
  1048.             $currentColumn++;
  1049.         }
  1050.         if (in_array("Email adresa dužnika"$columnOptions)) {
  1051.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Email adresa dužnika");
  1052.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(40);
  1053.             $currentColumn++;
  1054.         }
  1055.         if (in_array("Telefon"$columnOptions)) {
  1056.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Telefon");
  1057.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1058.             $currentColumn++;
  1059.         }
  1060.         if (in_array("Detalji"$columnOptions)) {
  1061.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Detalji");
  1062.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1063.             $currentColumn++;
  1064.         }
  1065.         if (in_array("Komentar"$columnOptions)) {
  1066.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Komentar");
  1067.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(30);
  1068.             $currentColumn++;
  1069.         }
  1070.         $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Broj fakture");
  1071.         $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1072.         $currentColumn++;
  1073.         $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Datum fakture");
  1074.         $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1075.         $currentColumn++;
  1076.         $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Datum dospeća");
  1077.         $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1078.         $currentColumn++;
  1079.         $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Iznos potraživanja po fakturi");
  1080.         $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1081.         $currentColumn++;
  1082.         $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Uplata");
  1083.         $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1084.         $currentColumn++;
  1085.         $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Preostali iznos potraživanja");
  1086.         $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1087.         $i 2;
  1088.         foreach ($flats as $flat) {
  1089.             $sum 0;
  1090.             $flatObj $this->flatRepository->findOneBy(['id' => $flat['id']]);
  1091.             $logs $this->moneyLogService->getFlatMoneyLogEntries($flatObj->getUser(), $flatObj);
  1092.             for ($j 0$j count($logs['processed']); $j++) {
  1093.                 $logs['processed'][$j]['month'] = CommonHelper::getMonth(
  1094.                     (new \DateTime($logs['processed'][$j]['date']))->modify("-1MONTH")->format('d.m.Y')
  1095.                 );
  1096.             }
  1097.             foreach ($logs['processed'] as $log) {
  1098.                 $currentColumn 'A';
  1099.                 if (in_array("Ime i prezime / Naziv dužnika"$columnOptions)) {
  1100.                     $activeWorksheet->setCellValue(
  1101.                         sprintf('%s%s'$currentColumn$i),
  1102.                         $flat['companyName'] ?? sprintf('%s %s'$flat['ownerName'], $flat['ownerLastname'])
  1103.                     );
  1104.                     $currentColumn++;
  1105.                 }
  1106.                 if (in_array("Broj posebnog dela"$columnOptions)) {
  1107.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['displayFlatId']);
  1108.                     $currentColumn++;
  1109.                 }
  1110.                 if (in_array("Površina"$columnOptions)) {
  1111.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['size']);
  1112.                     $currentColumn++;
  1113.                 }
  1114.                 if (in_array("Adresa dužnika"$columnOptions)) {
  1115.                     $address $flat['ownerAddress'] ?? sprintf(
  1116.                         '%s/%s',
  1117.                         $flatObj->getBuilding()->getAddress(),
  1118.                         $flatObj->getDisplayFlatId()
  1119.                     );
  1120.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $address);
  1121.                     $currentColumn++;
  1122.                 }
  1123.                 if (in_array("Email adresa dužnika"$columnOptions)) {
  1124.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['ownerEmail']);
  1125.                     $currentColumn++;
  1126.                 }
  1127.                 if (in_array("Telefon"$columnOptions)) {
  1128.                     $activeWorksheet->setCellValueExplicit(
  1129.                         sprintf('%s%s'$currentColumn$i),
  1130.                         $flat['ownerPhoneNumber'],
  1131.                         DataType::TYPE_STRING
  1132.                     );
  1133.                     $currentColumn++;
  1134.                 }
  1135.                 if (in_array("Detalji"$columnOptions)) {
  1136.                     $activeWorksheet->setCellValueExplicit(
  1137.                         sprintf('%s%s'$currentColumn$i),
  1138.                         $flat['ownerContact'],
  1139.                         DataType::TYPE_STRING
  1140.                     );
  1141.                     $currentColumn++;
  1142.                 }
  1143.                 if (in_array("Komentar"$columnOptions)) {
  1144.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['comment']);
  1145.                     $currentColumn++;
  1146.                 }
  1147.                 if ($log['type'] === 'Zaduženje za mesec' || $log['type'] === 'Parcijalno zaduženje za mesec') {
  1148.                     $month = (new DateTime($log['date']))->modify('-1MONTH')->format('m/Y');
  1149.                     $activeWorksheet->setCellValue(
  1150.                         sprintf('%s%s'$currentColumn$i),
  1151.                         sprintf('%s-%s-%s'$month$flatObj->getBuilding()->getCode(), $flatObj->getDisplayFlatId())
  1152.                     );
  1153.                     $currentColumn++;
  1154.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $log['dateCreatedAt']);
  1155.                     $currentColumn++;
  1156.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $log['datumDueDate']);
  1157.                     $currentColumn++;
  1158.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $log['debit']);
  1159.                     $currentColumn++;
  1160.                     $currentColumn++;
  1161.                     $sum += $log['debit'];
  1162.                 } elseif ($log['type'] === 'Uplata' || $log['type'] === 'Uplata parcijalnog računa') {
  1163.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), 'Uplata');
  1164.                     $currentColumn++;
  1165.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $log['date']);
  1166.                     $currentColumn++;
  1167.                     $currentColumn++;
  1168.                     $currentColumn++;
  1169.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $log['input']);
  1170.                     $currentColumn++;
  1171.                     $sum -= $log['input'];
  1172.                 }
  1173.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $sum);
  1174.                 $i++;
  1175.             }
  1176.         }
  1177.         return new Xlsx($spreadsheet);
  1178.     }
  1179.     /**
  1180.      * @param $bankAccount
  1181.      * @return Building|null
  1182.      * @throws NonUniqueResultException
  1183.      */
  1184.     public function getBuildingByBankAccount($bankAccount): ?Building
  1185.     {
  1186.         return $this->buildingRepository->getBuildingsByBankAccount($bankAccount);
  1187.     }
  1188. }