extractPeriod(); $portfolio = $this->entityManager->getRepository(Portfolio::class)->findOneBy([ 'clientAgreement' => $parsedPortfolio->getHeader()['Клиент'], 'startDate' => new \DateTimeImmutable($startDate->format('Y-m-d')), 'endDate' => new \DateTimeImmutable($endDate->format('Y-m-d')), ]); if ($portfolio) { $this->logger->debug("Found existing portfolio with id: " . $portfolio->getId() . ', skipped..'); return false; } $newPortfolio = $this->savePortfolio($parsedPortfolio, $xmlString, $startDate, $endDate); $this->logger->debug("Saved new portfolio with id: " . $newPortfolio->getId()); return true; } private function savePortfolio( ParsedPortfolio $parsedPortfolio, string $xmlString, \DateTime $startDate, \DateTime $endDate, ): Portfolio { $this->logger->debug(print_r($parsedPortfolio, true)); $portfolio = new Portfolio(); $portfolio->setClientAgreement($parsedPortfolio->getHeader()['Клиент']); $portfolio->setStartDate(new \DateTimeImmutable($startDate->format('Y-m-d'))); $portfolio->setEndDate(new \DateTimeImmutable($endDate->format('Y-m-d'))); $portfolio->setXmlData($xmlString); $this->entityManager->wrapInTransaction(function () use ($parsedPortfolio, $portfolio): void { $this->entityManager->persist($portfolio); foreach ($parsedPortfolio->getDetails() as $parsedDetail) { $detail = new PortfolioDetail(); $detail->setPortfolio($portfolio); $detail->setIssuer($parsedDetail['Эмитент']); $detail->setSecurity($parsedDetail['ЦБ']); $detail->setPriceStart($parsedDetail['НОЦена']); $detail->setPriceEnd($parsedDetail['КОЦена']); $detail->setQuantityStart($parsedDetail['КоличествоНО']); $detail->setQuantityEnd($parsedDetail['КоличествоКО']); $detail->setSumStart($parsedDetail['СуммаНКДНО']); $detail->setSumEnd($parsedDetail['СуммаНКДКО']); $this->entityManager->persist($detail); } foreach ($parsedPortfolio->getMovements() as $parsedMovement) { $movement = new PortfolioMovement(); $movement->setPortfolio($portfolio); $movement->setSecurity($parsedMovement['ЦБ']); $movement->setPeriod(new \DateTimeImmutable($parsedMovement['Период'])); $movement->setQuantityStart($parsedMovement['НО']); $movement->setQuantityEnd($parsedMovement['КО']); $movement->setQuantityIncome($parsedMovement['Приход']); $movement->setQuantityOutcome($parsedMovement['Расход']); $this->entityManager->persist($movement); } $this->entityManager->flush(); }); return $portfolio; } }