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.         /** @var Building $building */
  705.         $building $this->buildingRepository->findOneBy(['address' => $buildingAddress]);
  706.         $flats $reader['flats'];
  707.         if (!$building) {
  708.             $errors[] = 'Building not found';
  709.             return;
  710.         }
  711.         $totalSize 0.0;
  712.         $totalMembers 0;
  713.         foreach ($flats as $index => $flat) {
  714.             if (!$reader['valid'][$index]) {
  715.                 $errors[] = $index;
  716.                 continue;
  717.             }
  718.             $newFlat = new Flat();
  719.             $newFlat->setBuilding($building);
  720.             $newFlat->setUser($building->getUser());
  721.             $building->incrementFlatsNumber();
  722.             $newFlat->setArchived(0);
  723.             $newFlat->setCreatedAt(new \DateTime('now'));
  724.             $newFlat->setUpdatedAt(new \DateTime('now'));
  725.             $newFlat->setMatId($flat['matId']);
  726.             $newFlat->setType($flat['type']);
  727.             $newFlat->setSubType($flat['subtype']);
  728.             $newFlat->setSize($flat['size']);
  729.             $newFlat->setPib($flat['pib']);
  730.             $newFlat->setDisplayFlatId($flat['flat_display_id']);
  731.             $newFlat->setOwnerName($flat['owner_name']);
  732.             $newFlat->setOwnerLastname($flat['owner_lastname']);
  733.             $newFlat->setCompanyName($flat['company_name']);
  734.             $newFlat->setCompanyPlace($flat['company_address']);
  735.             $newFlat->setComment($flat['comment']);
  736.             $newFlat->setMembers($flat['members'] ?: 1);
  737.             $newFlat->setOwnerPhoneNumber($flat['owner_phone_number']);
  738.             $newFlat->setOwnerEmail($flat['owner_email']);
  739.             $newFlat->setEmailCanBeUsed(false);
  740.             if (isset($flat['owner_email'])) {
  741.                 $newFlat->setEmailCanBeUsed(true);
  742.             }
  743.             $newFlat->setOldDebit($flat['old_debt']);
  744.             $newFlat->setRent($flat['sub_occupants']);
  745.             $newFlat->setBankAccount($flat['bank_account']);
  746.             $this->flatRepository->save($newFlat);
  747.             $totalSize += $flat['size'];
  748.             $totalMembers += $flat['members'] ?: 1;
  749.         }
  750.         $building->setBuildingSize($totalSize);
  751.         $building->setPopulation($totalMembers);
  752.         $this->buildingRepository->save($building);
  753.     }
  754.     /**
  755.      * @param array<mixed> $mergedArray
  756.      * @param string $startDate
  757.      * @param string $endDate
  758.      * @param float $saldo
  759.      * @return Xlsx
  760.      * @throws \PhpOffice\PhpSpreadsheet\Exception
  761.      * @throws Exception
  762.      */
  763.     public function getArrayForFinalReport(array $mergedArraystring $startDatestring $endDatefloat $saldo): Xlsx
  764.     {
  765.         $spreadsheet = new Spreadsheet();
  766.         $activeWorksheet $spreadsheet->getActiveSheet();
  767.         $activeWorksheet->mergeCells('B1:F1');
  768.         $activeWorksheet->setCellValue('B1'sprintf('FINANSIJSKI IZVEŠTAJ ZA PERIOD %s - %s'$startDate$endDate));
  769.         $startDateNew = new DateTime($startDate);
  770.         $activeWorksheet->mergeCells('B2:F2');
  771.         $activeWorksheet->setCellValue(
  772.             'B2',
  773.             sprintf(
  774.                 'RASPOLOŽIVA SREDSTVA NA DAN: %s - %s',
  775.                 $startDateNew->modify('-1day')->format('d.m.Y'),
  776.                 number_format($saldo2',''.')
  777.             )
  778.         );
  779.         $activeWorksheet->mergeCells('B3:C3');
  780.         $activeWorksheet->setCellValue('B3''TEKUĆI RAČUN');
  781.         $activeWorksheet->setCellValue('D3''DATUM');
  782.         $activeWorksheet->setCellValue('E3''PRIHODI');
  783.         $activeWorksheet->setCellValue('F3''RASHODI');
  784.         $i 4;
  785.         $num 1;
  786.         $income 0;
  787.         $outcome 0;
  788.         foreach ($mergedArray as $item) {
  789.             $activeWorksheet->setCellValue(sprintf('A%s'$i), $num);
  790.             $activeWorksheet->setCellValue(sprintf('B%s'$i), $item['partnerName']);
  791.             $activeWorksheet->setCellValue(sprintf('C%s'$i), $item['comment']);
  792.             if (isset($item['endDate'])) {
  793.                 $activeWorksheet->setCellValue(
  794.                     sprintf('D%s'$i),
  795.                     sprintf('%s - %s'$item['createdAt']->format('d.m.'), $item['endDate']->format('d.m.Y'))
  796.                 );
  797.             } else {
  798.                 $activeWorksheet->setCellValue(sprintf('D%s'$i), $item['createdAt']->format('d.m.Y'));
  799.             }
  800.             if ($item['income'] == || $item['income'] == 3) {
  801.                 $activeWorksheet->setCellValue(sprintf('E%s'$i), $item['value']);
  802.                 $income $income $item['value'];
  803.             } else {
  804.                 $activeWorksheet->setCellValue(sprintf('F%s'$i), $item['value']);
  805.                 $outcome $outcome $item['value'];
  806.             }
  807.             $i++;
  808.             $num++;
  809.         }
  810.         $activeWorksheet->mergeCells(sprintf('B%s:D%s'$i$i));
  811.         $activeWorksheet->setCellValue(sprintf('B%s'$i), 'UKUPNO TEKUĆI RAČUN');
  812.         $activeWorksheet->setCellValue(sprintf('E%s'$i), $income);
  813.         $activeWorksheet->setCellValue(sprintf('F%s'$i), $outcome);
  814.         $activeWorksheet->mergeCells(sprintf('B%s:D%s'$i 1$i 1));
  815.         $activeWorksheet->setCellValue(sprintf('B%s'$i 1), 'UKUPNO (PRIHODI - RASHODI)');
  816.         $activeWorksheet->mergeCells(sprintf('E%s:F%s'$i 1$i 1));
  817.         $activeWorksheet->setCellValue(sprintf('E%s'$i 1), $income $outcome);
  818.         $activeWorksheet->mergeCells(sprintf('B%s:D%s'$i 2$i 2));
  819.         $activeWorksheet->setCellValue(
  820.             sprintf('B%s'$i 2),
  821.             sprintf('STANJE RASPOLOŽIVIH SREDSTAVA NA TEKUĆEM RAČUNU NA DAN: %s'$endDate)
  822.         );
  823.         $activeWorksheet->mergeCells(sprintf('E%s:F%s'$i 2$i 2));
  824.         $activeWorksheet->setCellValue(
  825.             sprintf('E%s'$i 2),
  826.             number_format(($saldo + ($income $outcome)), 2',''.')
  827.         );
  828.         $activeWorksheet->getColumnDimension('A')->setWidth(5);
  829.         $activeWorksheet->getColumnDimension('B')->setWidth(40);
  830.         $activeWorksheet->getColumnDimension('C')->setWidth(40);
  831.         $activeWorksheet->getColumnDimension('D')->setWidth(20);
  832.         $activeWorksheet->getColumnDimension('E')->setWidth(15);
  833.         $activeWorksheet->getColumnDimension('F')->setWidth(15);
  834.         return new Xlsx($spreadsheet);
  835.     }
  836.     /**
  837.      * @param array<int, string> $columnOptions
  838.      * @param Building $building
  839.      * @return Xlsx
  840.      */
  841.     public function getArrayForFlatsList(array $columnOptionsBuilding $building): Xlsx
  842.     {
  843.         /** @var array<Flat> $flats */
  844.         $flatsObjs $this->flatRepository->getFlatsByBuilding($building->getUser(), $building);
  845.         foreach ($flatsObjs as $flat) {
  846.             $flat['hashCode'] = $this->hashIdService->encodeId($flat['id']);
  847.             $flats[$flat['displayFlatId']] = $flat;
  848.         }
  849.         ksort($flatsSORT_NATURAL);
  850.         $spreadsheet = new Spreadsheet();
  851.         $activeWorksheet $spreadsheet->getActiveSheet();
  852.         $currentColumn 'A';
  853.         if (in_array("Broj stana"$columnOptions)) {
  854.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Broj stana");
  855.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(15);
  856.             $currentColumn++;
  857.         }
  858.         if (in_array("Ime vlasnika"$columnOptions)) {
  859.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Ime vlasnika");
  860.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(30);
  861.             $currentColumn++;
  862.         }
  863.         if (in_array("Broj članova"$columnOptions)) {
  864.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Broj članova");
  865.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(10);
  866.             $currentColumn++;
  867.         }
  868.         if (in_array("Poziv na broj"$columnOptions)) {
  869.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Poziv na broj");
  870.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  871.             $currentColumn++;
  872.         }
  873.         if (in_array("Površina"$columnOptions)) {
  874.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Površina");
  875.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(10);
  876.             $currentColumn++;
  877.         }
  878.         if (in_array("Telefon"$columnOptions)) {
  879.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Telefon");
  880.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  881.             $currentColumn++;
  882.         }
  883.         if (in_array("Detalji"$columnOptions)) {
  884.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Detalji");
  885.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  886.             $currentColumn++;
  887.         }
  888.         if (in_array("Email"$columnOptions)) {
  889.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Email");
  890.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(30);
  891.             $currentColumn++;
  892.         }
  893.         if (in_array("Adresa"$columnOptions)) {
  894.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Adresa");
  895.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(50);
  896.             $currentColumn++;
  897.         }
  898.         if (in_array("Stari dug"$columnOptions)) {
  899.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Stari dug");
  900.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(15);
  901.             $currentColumn++;
  902.         }
  903.         if (in_array("Prethodni dug"$columnOptions)) {
  904.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Prethodni dug");
  905.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(15);
  906.             $currentColumn++;
  907.         }
  908.         if (in_array("Ukupan dug"$columnOptions)) {
  909.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Ukupan dug");
  910.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(15);
  911.             $currentColumn++;
  912.         }
  913.         if (in_array("Poslednji račun"$columnOptions)) {
  914.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Poslednji račun");
  915.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(15);
  916.             $currentColumn++;
  917.         }
  918.         if (in_array("Komentar"$columnOptions)) {
  919.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Komentar");
  920.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(50);
  921.             $currentColumn++;
  922.         }
  923.         if (in_array("Kod za aplikaciju"$columnOptions)) {
  924.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Kod za aplikaciju");
  925.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(50);
  926.             $currentColumn++;
  927.         }
  928.         if (in_array("Koristi aplikaciju"$columnOptions)) {
  929.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Koristi aplikaciju");
  930.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(50);
  931.         }
  932.         $i 2;
  933.         foreach ($flats as $flat) {
  934.             $currentColumn 'A';
  935.             if (in_array("Broj stana"$columnOptions)) {
  936.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['displayFlatId']);
  937.                 $currentColumn++;
  938.             }
  939.             if (in_array("Ime vlasnika"$columnOptions)) {
  940.                 $activeWorksheet->setCellValue(
  941.                     sprintf('%s%s'$currentColumn$i),
  942.                     $flat['companyName'] ?? sprintf('%s %s'$flat['ownerName'], $flat['ownerLastname'])
  943.                 );
  944.                 $currentColumn++;
  945.             }
  946.             if (in_array("Broj članova"$columnOptions)) {
  947.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['members']);
  948.                 $currentColumn++;
  949.             }
  950.             if (in_array("Poziv na broj"$columnOptions)) {
  951.                 $activeWorksheet->setCellValue(
  952.                     sprintf('%s%s'$currentColumn$i),
  953.                     sprintf('%s-%s'$building->getCode(), $flat['displayFlatId'])
  954.                 );
  955.                 $currentColumn++;
  956.             }
  957.             if (in_array("Površina"$columnOptions)) {
  958.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['size']);
  959.                 $currentColumn++;
  960.             }
  961.             if (in_array("Telefon"$columnOptions)) {
  962.                 $activeWorksheet->setCellValueExplicit(
  963.                     sprintf('%s%s'$currentColumn$i),
  964.                     $flat['ownerPhoneNumber'],
  965.                     DataType::TYPE_STRING
  966.                 );
  967.                 $currentColumn++;
  968.             }
  969.             if (in_array("Detalji"$columnOptions)) {
  970.                 $activeWorksheet->setCellValueExplicit(
  971.                     sprintf('%s%s'$currentColumn$i),
  972.                     $flat['ownerContact'],
  973.                     DataType::TYPE_STRING
  974.                 );
  975.                 $currentColumn++;
  976.             }
  977.             if (in_array("Email"$columnOptions)) {
  978.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['ownerEmail']);
  979.                 $currentColumn++;
  980.             }
  981.             if (in_array("Adresa"$columnOptions)) {
  982.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['ownerAddress']);
  983.                 $currentColumn++;
  984.             }
  985.             if (in_array("Stari dug"$columnOptions)) {
  986.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['oldDebit']);
  987.                 $currentColumn++;
  988.             }
  989.             if (in_array("Prethodni dug"$columnOptions)) {
  990.                 $activeWorksheet->setCellValue(
  991.                     sprintf('%s%s'$currentColumn$i),
  992.                     ($flat['debit'] + $flat['previousBill'])
  993.                 );
  994.                 $currentColumn++;
  995.             }
  996.             if (in_array("Ukupan dug"$columnOptions)) {
  997.                 $activeWorksheet->setCellValue(
  998.                     sprintf('%s%s'$currentColumn$i),
  999.                     ($flat['debit'] + $flat['previousBill'] + $flat['oldDebit'])
  1000.                 );
  1001.                 $currentColumn++;
  1002.             }
  1003.             if (in_array("Poslednji račun"$columnOptions)) {
  1004.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['previousBill']);
  1005.                 $currentColumn++;
  1006.             }
  1007.             if (in_array("Komentar"$columnOptions)) {
  1008.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['comment']);
  1009.                 $currentColumn++;
  1010.             }
  1011.             if (in_array("Kod za aplikaciju"$columnOptions)) {
  1012.                 $activeWorksheet->setCellValue(
  1013.                     sprintf('%s%s'$currentColumn$i),
  1014.                     $this->hashIdService->encodeId($flat['id'])
  1015.                 );
  1016.                 $currentColumn++;
  1017.             }
  1018.             if (in_array("Koristi aplikaciju"$columnOptions)) {
  1019.                 $flatObj $this->flatRepository->findOneBy(['id' => $flat['id']]);
  1020.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flatObj->getResident() ? 'DA' '');
  1021.             }
  1022.             $i++;
  1023.         }
  1024.         return new Xlsx($spreadsheet);
  1025.     }
  1026.     /**
  1027.      * @param array<int, string> $columnOptions
  1028.      * @param Building $building
  1029.      * @return Xlsx
  1030.      * @throws Exception
  1031.      */
  1032.     public function getArrayForFlatsAnalyticsList(array $columnOptionsBuilding $building): Xlsx
  1033.     {
  1034.         /** @var array<Flat> $flats */
  1035.         $flats $this->flatRepository->getFlatsByBuildingOrderedById($building->getUser(), $building1);
  1036.         $spreadsheet = new Spreadsheet();
  1037.         $activeWorksheet $spreadsheet->getActiveSheet();
  1038.         $currentColumn 'A';
  1039.         if (in_array("Ime i prezime / Naziv dužnika"$columnOptions)) {
  1040.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Ime i prezime / Naziv dužnika");
  1041.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(30);
  1042.             $currentColumn++;
  1043.         }
  1044.         if (in_array("Broj posebnog dela"$columnOptions)) {
  1045.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Broj posebnog dela");
  1046.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(15);
  1047.             $currentColumn++;
  1048.         }
  1049.         if (in_array("Površina"$columnOptions)) {
  1050.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Površina");
  1051.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(10);
  1052.             $currentColumn++;
  1053.         }
  1054.         if (in_array("Adresa dužnika"$columnOptions)) {
  1055.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Adresa dužnika");
  1056.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(60);
  1057.             $currentColumn++;
  1058.         }
  1059.         if (in_array("Email adresa dužnika"$columnOptions)) {
  1060.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Email adresa dužnika");
  1061.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(40);
  1062.             $currentColumn++;
  1063.         }
  1064.         if (in_array("Telefon"$columnOptions)) {
  1065.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Telefon");
  1066.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1067.             $currentColumn++;
  1068.         }
  1069.         if (in_array("Detalji"$columnOptions)) {
  1070.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Detalji");
  1071.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1072.             $currentColumn++;
  1073.         }
  1074.         if (in_array("Komentar"$columnOptions)) {
  1075.             $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Komentar");
  1076.             $activeWorksheet->getColumnDimension($currentColumn)->setWidth(30);
  1077.             $currentColumn++;
  1078.         }
  1079.         $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Broj fakture");
  1080.         $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1081.         $currentColumn++;
  1082.         $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Datum fakture");
  1083.         $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1084.         $currentColumn++;
  1085.         $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Datum dospeća");
  1086.         $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1087.         $currentColumn++;
  1088.         $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Iznos potraživanja po fakturi");
  1089.         $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1090.         $currentColumn++;
  1091.         $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Uplata");
  1092.         $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1093.         $currentColumn++;
  1094.         $activeWorksheet->setCellValue(sprintf('%s1'$currentColumn), "Preostali iznos potraživanja");
  1095.         $activeWorksheet->getColumnDimension($currentColumn)->setWidth(20);
  1096.         $i 2;
  1097.         foreach ($flats as $flat) {
  1098.             $sum 0;
  1099.             $flatObj $this->flatRepository->findOneBy(['id' => $flat['id']]);
  1100.             $logs $this->moneyLogService->getFlatMoneyLogEntries($flatObj->getUser(), $flatObj);
  1101.             for ($j 0$j count($logs['processed']); $j++) {
  1102.                 $logs['processed'][$j]['month'] = CommonHelper::getMonth(
  1103.                     (new \DateTime($logs['processed'][$j]['date']))->modify("-1MONTH")->format('d.m.Y')
  1104.                 );
  1105.             }
  1106.             foreach ($logs['processed'] as $log) {
  1107.                 $currentColumn 'A';
  1108.                 if (in_array("Ime i prezime / Naziv dužnika"$columnOptions)) {
  1109.                     $activeWorksheet->setCellValue(
  1110.                         sprintf('%s%s'$currentColumn$i),
  1111.                         $flat['companyName'] ?? sprintf('%s %s'$flat['ownerName'], $flat['ownerLastname'])
  1112.                     );
  1113.                     $currentColumn++;
  1114.                 }
  1115.                 if (in_array("Broj posebnog dela"$columnOptions)) {
  1116.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['displayFlatId']);
  1117.                     $currentColumn++;
  1118.                 }
  1119.                 if (in_array("Površina"$columnOptions)) {
  1120.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['size']);
  1121.                     $currentColumn++;
  1122.                 }
  1123.                 if (in_array("Adresa dužnika"$columnOptions)) {
  1124.                     $address $flat['ownerAddress'] ?? sprintf(
  1125.                         '%s/%s',
  1126.                         $flatObj->getBuilding()->getAddress(),
  1127.                         $flatObj->getDisplayFlatId()
  1128.                     );
  1129.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $address);
  1130.                     $currentColumn++;
  1131.                 }
  1132.                 if (in_array("Email adresa dužnika"$columnOptions)) {
  1133.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['ownerEmail']);
  1134.                     $currentColumn++;
  1135.                 }
  1136.                 if (in_array("Telefon"$columnOptions)) {
  1137.                     $activeWorksheet->setCellValueExplicit(
  1138.                         sprintf('%s%s'$currentColumn$i),
  1139.                         $flat['ownerPhoneNumber'],
  1140.                         DataType::TYPE_STRING
  1141.                     );
  1142.                     $currentColumn++;
  1143.                 }
  1144.                 if (in_array("Detalji"$columnOptions)) {
  1145.                     $activeWorksheet->setCellValueExplicit(
  1146.                         sprintf('%s%s'$currentColumn$i),
  1147.                         $flat['ownerContact'],
  1148.                         DataType::TYPE_STRING
  1149.                     );
  1150.                     $currentColumn++;
  1151.                 }
  1152.                 if (in_array("Komentar"$columnOptions)) {
  1153.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $flat['comment']);
  1154.                     $currentColumn++;
  1155.                 }
  1156.                 if ($log['type'] === 'Zaduženje za mesec' || $log['type'] === 'Parcijalno zaduženje za mesec') {
  1157.                     $month = (new DateTime($log['date']))->modify('-1MONTH')->format('m/Y');
  1158.                     $activeWorksheet->setCellValue(
  1159.                         sprintf('%s%s'$currentColumn$i),
  1160.                         sprintf('%s-%s-%s'$month$flatObj->getBuilding()->getCode(), $flatObj->getDisplayFlatId())
  1161.                     );
  1162.                     $currentColumn++;
  1163.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $log['dateCreatedAt']);
  1164.                     $currentColumn++;
  1165.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $log['datumDueDate']);
  1166.                     $currentColumn++;
  1167.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $log['debit']);
  1168.                     $currentColumn++;
  1169.                     $currentColumn++;
  1170.                     $sum += $log['debit'];
  1171.                 } elseif ($log['type'] === 'Uplata' || $log['type'] === 'Uplata parcijalnog računa') {
  1172.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), 'Uplata');
  1173.                     $currentColumn++;
  1174.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $log['date']);
  1175.                     $currentColumn++;
  1176.                     $currentColumn++;
  1177.                     $currentColumn++;
  1178.                     $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $log['input']);
  1179.                     $currentColumn++;
  1180.                     $sum -= $log['input'];
  1181.                 }
  1182.                 $activeWorksheet->setCellValue(sprintf('%s%s'$currentColumn$i), $sum);
  1183.                 $i++;
  1184.             }
  1185.         }
  1186.         return new Xlsx($spreadsheet);
  1187.     }
  1188. }