You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PortfolioManager.php 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. namespace App\Service;
  3. use App\Domain\Entity\ParsedPortfolio;
  4. use App\Entity\Portfolio;
  5. use App\Entity\PortfolioDetail;
  6. use App\Entity\PortfolioMovement;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Psr\Log\LoggerInterface;
  9. readonly class PortfolioManager
  10. {
  11. public function __construct(private EntityManagerInterface $entityManager, private LoggerInterface $logger)
  12. {
  13. }
  14. public function updatePortfolio(ParsedPortfolio $parsedPortfolio, string $xmlString): bool
  15. {
  16. list($startDate, $endDate) = $parsedPortfolio->extractPeriod();
  17. $portfolio = $this->entityManager->getRepository(Portfolio::class)->findOneBy([
  18. 'clientAgreement' => $parsedPortfolio->getHeader()['Клиент'],
  19. 'startDate' => new \DateTimeImmutable($startDate->format('Y-m-d')),
  20. 'endDate' => new \DateTimeImmutable($endDate->format('Y-m-d')),
  21. ]);
  22. if ($portfolio) {
  23. $this->logger->debug("Found existing portfolio with id: " . $portfolio->getId() . ', skipped..');
  24. return false;
  25. }
  26. $newPortfolio = $this->savePortfolio($parsedPortfolio, $xmlString, $startDate, $endDate);
  27. $this->logger->debug("Saved new portfolio with id: " . $newPortfolio->getId());
  28. return true;
  29. }
  30. private function savePortfolio(
  31. ParsedPortfolio $parsedPortfolio,
  32. string $xmlString,
  33. \DateTime $startDate,
  34. \DateTime $endDate,
  35. ): Portfolio {
  36. $this->logger->debug(print_r($parsedPortfolio, true));
  37. $portfolio = new Portfolio();
  38. $portfolio->setClientAgreement($parsedPortfolio->getHeader()['Клиент']);
  39. $portfolio->setStartDate(new \DateTimeImmutable($startDate->format('Y-m-d')));
  40. $portfolio->setEndDate(new \DateTimeImmutable($endDate->format('Y-m-d')));
  41. $portfolio->setXmlData($xmlString);
  42. $this->entityManager->wrapInTransaction(function () use ($parsedPortfolio, $portfolio): void {
  43. $this->entityManager->persist($portfolio);
  44. foreach ($parsedPortfolio->getDetails() as $parsedDetail) {
  45. $detail = new PortfolioDetail();
  46. $detail->setPortfolio($portfolio);
  47. $detail->setIssuer($parsedDetail['Эмитент']);
  48. $detail->setSecurity($parsedDetail['ЦБ']);
  49. $detail->setPriceStart($parsedDetail['НОЦена']);
  50. $detail->setPriceEnd($parsedDetail['КОЦена']);
  51. $detail->setQuantityStart($parsedDetail['КоличествоНО']);
  52. $detail->setQuantityEnd($parsedDetail['КоличествоКО']);
  53. $detail->setSumStart($parsedDetail['СуммаНКДНО']);
  54. $detail->setSumEnd($parsedDetail['СуммаНКДКО']);
  55. $this->entityManager->persist($detail);
  56. }
  57. foreach ($parsedPortfolio->getMovements() as $parsedMovement) {
  58. $movement = new PortfolioMovement();
  59. $movement->setPortfolio($portfolio);
  60. $movement->setSecurity($parsedMovement['ЦБ']);
  61. $movement->setPeriod(new \DateTimeImmutable($parsedMovement['Период']));
  62. $movement->setQuantityStart($parsedMovement['НО']);
  63. $movement->setQuantityEnd($parsedMovement['КО']);
  64. $movement->setQuantityIncome($parsedMovement['Приход']);
  65. $movement->setQuantityOutcome($parsedMovement['Расход']);
  66. $this->entityManager->persist($movement);
  67. }
  68. $this->entityManager->flush();
  69. });
  70. return $portfolio;
  71. }
  72. }