| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- <?php
-
- namespace App\Service;
-
- use App\Domain\Entity\ParsedPortfolio;
- use App\Entity\Portfolio;
- use App\Entity\PortfolioDetail;
- use App\Entity\PortfolioMovement;
- use Doctrine\ORM\EntityManagerInterface;
- use Psr\Log\LoggerInterface;
-
- readonly class PortfolioManager
- {
- public function __construct(private EntityManagerInterface $entityManager, private LoggerInterface $logger)
- {
- }
-
- public function updatePortfolio(ParsedPortfolio $parsedPortfolio, string $xmlString): bool
- {
- list($startDate, $endDate) = $parsedPortfolio->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;
- }
-
- }
|