浏览代码

Prettify the output (securities names)

master
Evgeniy Ierusalimov 1年前
父节点
当前提交
aeeb61fa26
共有 9 个文件被更改,包括 578 次插入310 次删除
  1. 4
    0
      .gitignore
  2. 1
    0
      composer.json
  3. 392
    273
      composer.lock
  4. 81
    0
      portfolio.xml
  5. 0
    26
      src/Command/FetchEmailsCommand.php
  6. 55
    0
      src/Command/ImportFromXmlCommand.php
  7. 31
    6
      src/Presentation/PortfolioPresenter.php
  8. 2
    5
      src/Service/MailFetcher.php
  9. 12
    0
      symfony.lock

+ 4
- 0
.gitignore 查看文件

@@ -9,3 +9,7 @@
9 9
 /vendor/
10 10
 ###< symfony/framework-bundle ###
11 11
 .idea
12
+
13
+###> phpstan/phpstan ###
14
+phpstan.neon
15
+###< phpstan/phpstan ###

+ 1
- 0
composer.json 查看文件

@@ -24,6 +24,7 @@
24 24
         "symfony/yaml": "7.1.*"
25 25
     },
26 26
     "require-dev": {
27
+        "rector/rector": "^1.1",
27 28
         "symfony/maker-bundle": "^1.59"
28 29
     },
29 30
     "config": {

+ 392
- 273
composer.lock
文件差异内容过多而无法显示
查看文件


+ 81
- 0
portfolio.xml 查看文件

@@ -0,0 +1,81 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<БрокерскийОтчет xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
3
+	<Шапка Заголовок="Брокерский отчет" НаименованиеКомпании="ООО &quot;Компания БКС&quot;"/>
4
+	<ШапкаПериод Период="Период" НачПериода="07.10.2024" КонПериода="07.10.2024"/>
5
+	<ШапкаКлиент Клиент="Клиент" Субъект="Иерусалимов Евгений Александрович"/>
6
+	<ШапкаГенСог ГенеральноеCоглашение="Генеральное соглашение" Клиент="2849181/24 от 13.01.2024"/>
7
+	<ШапкаСубсчет НадписьСубсчет="Субсчет" Субсчет=""/>
8
+	<ШапкаДвижениеДС Заголовок="1. Движение денежных средств">
9
+		<ШапкаДвиженияДСПоОперациям Заголовок="1.1. Движение денежных средств по совершенным сделкам:">
10
+			<ШапкаДвиженияДСПоОперациямЦБ Заголовок="1.1.1. Движение денежных средств по совершенным сделкам (иным операциям) с ценными бумагами, по срочным сделкам, а также сделкам с иностранной валютой / драгоценными металлами:">
11
+				<ОстаткиДСБезГО ФразаОстатокДСНаНачалоПериода="Остаток денежных средств на начало периода" Валюта="Рубль" НОДСиГО="1152.78" ФразаОстатокНКНаНачалоПериода="Задолженность перед Компанией по вознаграждению на начало периода" НОНК="0" ФразаОстатокДСНаКонецПериода="Остаток денежных средств на конец периода" КОДСиГО="1152.78" ФразаОстатокНКНаКонецПериода="Задолженность перед Компанией по вознаграждению на конец периода" КОНК="0"/>
12
+			</ШапкаДвиженияДСПоОперациямЦБ>
13
+		</ШапкаДвиженияДСПоОперациям>
14
+	</ШапкаДвижениеДС>
15
+	<ЗаголовокСекции Заголовок="2. Сделки"/>
16
+	<ЗаголовокПортфель Заголовок="3. Активы:">
17
+		<ЗаголовокСекцииПортфельИтого СуммаНОРуб="113726.74" СуммаКОРуб="113832.76" ИзменениеРуб="106.02">
18
+			<ПортфельИтогоШапка>
19
+				<Валюта Валюта="Рубль">
20
+					<ПортфельИтогоСтрока ВидАктива="Портфель по ценным бумагам, денежным средствам и ДМ" Валюта="Рубль" СуммаНОВал="113751.53" СуммаНОРуб="113751.53" СуммаКОВал="113857.55" СуммаКОРуб="113857.55"/>
21
+					<ПортфельИтогоСтрока ВидАктива="Обязательства клиента" Валюта="Рубль" СуммаНОВал="-24.79" СуммаНОРуб="-24.79" СуммаКОВал="-24.79" СуммаКОРуб="-24.79"/>
22
+				</Валюта>
23
+			</ПортфельИтогоШапка>
24
+		</ЗаголовокСекцииПортфельИтого>
25
+		<ЗаголовокСекции Заголовок="Курсы валют"/>
26
+		<ШапкаПортфель Заголовок="Портфель по ценным бумагам, денежным средствам и ДМ (Рубль)" ИмяКолонкиКоличество="Кол-во ЦБ / Масса ДМ (шт/г)">
27
+			<ДеталиПортфель1 ЦБ="Рубль" ISINПортфеля="" ТипЦБ="" КоличествоНО="0" НОЦена="0" СуммаНКДНО="0" НОСумма="1152.78" КоличествоКО="0" КОЦена="0" СуммаНКДКО="0" КОСумма="1152.78" Биржа="ММВБ" МестоХранения="" Эмитент=""/>
28
+			<ДеталиПортфель1 ЦБ="ALRS" ISINПортфеля="1-03-40046-N" ТипЦБ="АО (003)" КоличествоНО="160" НОЦена="54.52" СуммаНКДНО="0" НОСумма="8723.2" КоличествоКО="160" КОЦена="54.06" СуммаНКДКО="0" КОСумма="8649.6" Биржа="ММВБ" МестоХранения="Торг.(НРД)" Эмитент="АК &quot;АЛРОСА&quot; (ПАО)"/>
29
+			<ДеталиПортфельПай1 ЦБ="RU000A1014L8" ISINПортфеля="3915" ТипЦБ="Пай" КоличествоНО="21740" НОЦена="1.4921" СуммаНКДНО="0" НОСумма="32438.25" КоличествоКО="21740" КОЦена="1.4928" СуммаНКДКО="0" КОСумма="32453.47" Биржа="ММВБ" МестоХранения="Торг.(НРД)" Эмитент="АО ВИМ Инвестиции"/>
30
+			<ДеталиПортфель1 ЦБ="RU000A107UL4" ISINПортфеля="1-01-16784-A" ТипЦБ="АО (001)" КоличествоНО="2" НОЦена="2547.5" СуммаНКДНО="0" НОСумма="5095" КоличествоКО="2" КОЦена="2523.5" СуммаНКДКО="0" КОСумма="5047" Биржа="ММВБ" МестоХранения="Торг.(НРД)" Эмитент="МКПАО &quot;ТКС Холдинг&quot;"/>
31
+			<ДеталиПортфель1 ЦБ="RU000A107T19" ISINПортфеля="1-01-16777-A" ТипЦБ="АО (001)" КоличествоНО="1" НОЦена="3945.5" СуммаНКДНО="0" НОСумма="3945.5" КоличествоКО="1" КОЦена="3928.5" СуммаНКДКО="0" КОСумма="3928.5" Биржа="ММВБ" МестоХранения="Торг.(НРД)" Эмитент="МКПАО &quot;ЯНДЕКС&quot;"/>
32
+			<ДеталиПортфель1 ЦБ="AFLT" ISINПортфеля="1-01-00010-A" ТипЦБ="АО (001)" КоличествоНО="100" НОЦена="53.18" СуммаНКДНО="0" НОСумма="5318" КоличествоКО="100" КОЦена="53.35" СуммаНКДКО="0" КОСумма="5335" Биржа="ММВБ" МестоХранения="Торг.(НРД)" Эмитент="ПАО &quot;Аэрофлот&quot;"/>
33
+			<ДеталиПортфель1 ЦБ="GMKN" ISINПортфеля="1-01-40155-F" ТипЦБ="АО (001)" КоличествоНО="30" НОЦена="106.96" СуммаНКДНО="0" НОСумма="3208.8" КоличествоКО="30" КОЦена="106.22" СуммаНКДКО="0" КОСумма="3186.6" Биржа="ММВБ" МестоХранения="Торг.(НРД)" Эмитент="ПАО &quot;ГМК &quot;Норильский никель&quot;"/>
34
+			<ДеталиПортфель1 ЦБ="IRAO_04" ISINПортфеля="1-04-33498-E" ТипЦБ="АО (004)" КоличествоНО="2000" НОЦена="3.79" СуммаНКДНО="0" НОСумма="7580" КоличествоКО="2000" КОЦена="3.815" СуммаНКДКО="0" КОСумма="7630" Биржа="ММВБ" МестоХранения="Торг.(НРД)" Эмитент="ПАО &quot;Интер РАО&quot;"/>
35
+			<ДеталиПортфель1 ЦБ="SVCB_01" ISINПортфеля="10100963B" ТипЦБ="АО (001)" КоличествоНО="600" НОЦена="13.685" СуммаНКДНО="0" НОСумма="8211" КоличествоКО="600" КОЦена="13.5" СуммаНКДКО="0" КОСумма="8100" Биржа="ММВБ" МестоХранения="Торг.(НРД)" Эмитент="ПАО &quot;Совкомбанк&quot;"/>
36
+			<ДеталиПортфель1 ЦБ="SKFL_01" ISINПортфеля="1-01-10613-A" ТипЦБ="АО (001)" КоличествоНО="50" НОЦена="102.49" СуммаНКДНО="0" НОСумма="5124.5" КоличествоКО="50" КОЦена="102.8" СуммаНКДКО="0" КОСумма="5140" Биржа="ММВБ" МестоХранения="Торг.(НРД)" Эмитент="ПАО &quot;Совкомфлот&quot;"/>
37
+			<ДеталиПортфель1 ЦБ="SNGS" ISINПортфеля="1-01-00155-A" ТипЦБ="АО (001)" КоличествоНО="900" НОЦена="25.665" СуммаНКДНО="0" НОСумма="23098.5" КоличествоКО="900" КОЦена="26.25" СуммаНКДКО="0" КОСумма="23625" Биржа="ММВБ" МестоХранения="Торг.(НРД)" Эмитент="ПАО &quot;Сургутнефтегаз&quot;"/>
38
+			<ДеталиПортфель1 ЦБ="RU000A0JPP37" ISINПортфеля="1-02-33010-D" ТипЦБ="АО (002)" КоличествоНО="14000" НОЦена="0.704" СуммаНКДНО="0" НОСумма="9856" КоличествоКО="14000" КОЦена="0.6864" СуммаНКДКО="0" КОСумма="9609.6" Биржа="ММВБ" МестоХранения="Торг.(НРД)" Эмитент="ПАО &quot;ЮГК&quot;"/>
39
+			<ИтогПортфель1 Итого="Итого" СуммаНКДНО="0" СуммаНО="113751.53" СуммаНКДКО="0" СуммаКО="113857.55"/>
40
+		</ШапкаПортфель>
41
+		<ЗаголовокСекции Заголовок="Форвардные контракты"/>
42
+		<ЗаголовокСекции Заголовок="Обязательства">
43
+			<ЗаголовокСекцииОбязательства Заголовок="Обязательства клиента">
44
+				<ОбязательстваШапка>
45
+					<Валюта Валюта="Рубль">
46
+						<Обязательство Валюта="Рубль" Обязательство="Вознаграждение за оказание услуги &quot;Автоследование&quot; (Fee mf)">
47
+							<ОбязательстваСтрока ПрефиксОбязательство="" Обязательство="Вознаграждение за оказание услуги &quot;Автоследование&quot; (Fee mf)" Валюта="Рубль" Биржа="ММВБ" СуммаНачальныйОстаток="-24.79" СуммаКонечныйОстаток="-24.79"/>
48
+						</Обязательство>
49
+					</Валюта>
50
+				</ОбязательстваШапка>
51
+			</ЗаголовокСекцииОбязательства>
52
+		</ЗаголовокСекции>
53
+	</ЗаголовокПортфель>
54
+	<ШапкаДвиженияИОстаткиЦБ Заголовок="Движение Ценных бумаг">
55
+		<ДеталиДвиженияИОстаткиЦБЖ ЦБ="AFLT" Период="2024-10-07T00:00:00" НО="100" Приход="0" Расход="0" КО="100" МХ="Торговый раздел (НРД)" Примечание=""/>
56
+		<ИтогЦБДвиженияИОстаткиЦБ/>
57
+		<ДеталиДвиженияИОстаткиЦБЖ ЦБ="ALRS" Период="2024-10-07T00:00:00" НО="160" Приход="0" Расход="0" КО="160" МХ="Торговый раздел (НРД)" Примечание=""/>
58
+		<ИтогЦБДвиженияИОстаткиЦБ/>
59
+		<ДеталиДвиженияИОстаткиЦБЖ ЦБ="GMKN" Период="2024-10-07T00:00:00" НО="30" Приход="0" Расход="0" КО="30" МХ="Торговый раздел (НРД)" Примечание=""/>
60
+		<ИтогЦБДвиженияИОстаткиЦБ/>
61
+		<ДеталиДвиженияИОстаткиЦБЖ ЦБ="IRAO_04" Период="2024-10-07T00:00:00" НО="2000" Приход="0" Расход="0" КО="2000" МХ="Торговый раздел (НРД)" Примечание=""/>
62
+		<ИтогЦБДвиженияИОстаткиЦБ/>
63
+		<ДеталиДвиженияИОстаткиЦБЖ ЦБ="RU000A0JPP37" Период="2024-10-07T00:00:00" НО="14000" Приход="0" Расход="0" КО="14000" МХ="Торговый раздел (НРД)" Примечание=""/>
64
+		<ИтогЦБДвиженияИОстаткиЦБ/>
65
+		<ДеталиДвиженияИОстаткиЦБЖ ЦБ="RU000A107T19" Период="2024-10-07T00:00:00" НО="1" Приход="0" Расход="0" КО="1" МХ="Торговый раздел (НРД)" Примечание=""/>
66
+		<ИтогЦБДвиженияИОстаткиЦБ/>
67
+		<ДеталиДвиженияИОстаткиЦБЖ ЦБ="RU000A107UL4" Период="2024-10-07T00:00:00" НО="2" Приход="0" Расход="0" КО="2" МХ="Торговый раздел (НРД)" Примечание=""/>
68
+		<ИтогЦБДвиженияИОстаткиЦБ/>
69
+		<ДеталиДвиженияИОстаткиЦБЖ ЦБ="SKFL_01" Период="2024-10-07T00:00:00" НО="50" Приход="0" Расход="0" КО="50" МХ="Торговый раздел (НРД)" Примечание=""/>
70
+		<ИтогЦБДвиженияИОстаткиЦБ/>
71
+		<ДеталиДвиженияИОстаткиЦБЖ ЦБ="SNGS" Период="2024-10-07T00:00:00" НО="900" Приход="0" Расход="0" КО="900" МХ="Торговый раздел (НРД)" Примечание=""/>
72
+		<ИтогЦБДвиженияИОстаткиЦБ/>
73
+		<ДеталиДвиженияИОстаткиЦБЖ ЦБ="SVCB_01" Период="2024-10-07T00:00:00" НО="600" Приход="0" Расход="0" КО="600" МХ="Торговый раздел (НРД)" Примечание=""/>
74
+		<ИтогЦБДвиженияИОстаткиЦБ/>
75
+		<ДеталиДвиженияИОстаткиЦБЖ ЦБ="RU000A1014L8" Период="2024-10-07T00:00:00" НО="21740" Приход="0" Расход="0" КО="21740" МХ="Торговый раздел (НРД)" Примечание=""/>
76
+		<ИтогЦБДвиженияИОстаткиЦБ/>
77
+	</ШапкаДвиженияИОстаткиЦБ>
78
+	<ПодвалСноскиПредполагаемыйКЗачислениюДоход ДополнениеСноски17=", в том числе по нерассчитанным сделкам" ДополнениеСноски18="в том числе по нерассчитанным сделкам," ОписаниеСноска19="(19*) - В таблице отражена справочная информация о предполагаемых к зачислению, но не выплаченных по причине недружественных действий (ограничительных мер) доходах на основании полученных отчетов от вышестоящих депозитариев, в соответствии с данными, отраженными в данных отчетах. Указанные суммы не получены Компанией БКС, информация о них носит справочный (промежуточный) характер, их выплаты не могут быть гарантированы, в том числе в указанном размере. Выплата доходов по указанным ценным бумагам может быть осуществлена только после получения Компанией БКС сумм выплат от вышестоящих депозитариев (за вычетом сумм, не полученных по причине недружественных действий или иных обстоятельств). В случае получения от вышестоящего депозитария неполной выплаты Компания БКС вправе распределить ее на пропорциональной основе. Согласно п. 6.3.5 Регламента выплата доходов может быть осуществлена не на брокерский счет." ОписаниеСноска20="(20*) - для внебиржевых сделок, в номере которых содержится префикс &quot;м&quot;, под типом сделки понимается &quot;Мена&quot;. Данный тип имеет преимущество над типом сделки, указанным в таблице" ОписаниеСноска21="(21*) - информация о портфеле внебиржевых срочных сделок является справочно-информационной и не является оценкой требований/обязательств по контракту">
79
+		<Подвал ТекущаяДата="16.10.2024" Руководитель="Егорова Ю.В."/>
80
+	</ПодвалСноскиПредполагаемыйКЗачислениюДоход>
81
+</БрокерскийОтчет>

+ 0
- 26
src/Command/FetchEmailsCommand.php 查看文件

@@ -5,11 +5,8 @@ namespace App\Command;
5 5
 use App\Service\MailFetcher;
6 6
 use Symfony\Component\Console\Attribute\AsCommand;
7 7
 use Symfony\Component\Console\Command\Command;
8
-use Symfony\Component\Console\Input\InputArgument;
9 8
 use Symfony\Component\Console\Input\InputInterface;
10
-use Symfony\Component\Console\Input\InputOption;
11 9
 use Symfony\Component\Console\Output\OutputInterface;
12
-use Symfony\Component\Console\Style\SymfonyStyle;
13 10
 
14 11
 #[AsCommand(
15 12
     name: 'app:fetch-emails',
@@ -25,33 +22,10 @@ class FetchEmailsCommand extends Command
25 22
         $this->mailFetcher = $mailFetcher;
26 23
     }
27 24
 
28
-    protected function configure(): void
29
-    {
30
-        $this
31
-            ->addArgument('arg1', InputArgument::OPTIONAL, 'Argument description')
32
-            ->addOption('option1', null, InputOption::VALUE_NONE, 'Option description');
33
-    }
34
-
35 25
     protected function execute(InputInterface $input, OutputInterface $output): int
36 26
     {
37
-        /*
38
-        $io = new SymfonyStyle($input, $output);
39
-        $arg1 = $input->getArgument('arg1');
40
-
41
-        if ($arg1) {
42
-            $io->note(sprintf('You passed an argument: %s', $arg1));
43
-        }
44
-
45
-        if ($input->getOption('option1')) {
46
-            // ...
47
-        }
48
-        */
49
-
50 27
         $this->mailFetcher->fetchNewEmails();
51 28
 
52
-
53
-        //$io->success('You have a new command! Now make it your own! Pass --help to see your options.');
54
-
55 29
         return Command::SUCCESS;
56 30
     }
57 31
 }

+ 55
- 0
src/Command/ImportFromXmlCommand.php 查看文件

@@ -0,0 +1,55 @@
1
+<?php
2
+
3
+namespace App\Command;
4
+
5
+use App\Presentation\PortfolioPresenter as PresentationPortfolio;
6
+use App\Service\XmlParser;
7
+use Symfony\Component\Console\Attribute\AsCommand;
8
+use Symfony\Component\Console\Command\Command;
9
+use Symfony\Component\Console\Input\InputArgument;
10
+use Symfony\Component\Console\Input\InputInterface;
11
+use Symfony\Component\Console\Input\InputOption;
12
+use Symfony\Component\Console\Output\OutputInterface;
13
+use Symfony\Component\Console\Style\SymfonyStyle;
14
+
15
+#[AsCommand(
16
+    name: 'app:import-from-xml',
17
+    description: 'Imports one xml Portfolio file and render it to display',
18
+)]
19
+class ImportFromXmlCommand extends Command
20
+{
21
+    public function __construct(
22
+        private readonly XmlParser $xmlParser,
23
+    )
24
+    {
25
+        parent::__construct();
26
+    }
27
+
28
+    protected function configure(): void
29
+    {
30
+        $this
31
+//            ->addArgument('xml-file', null, InputArgument::REQUIRED, 'xml file with portfolio data')
32
+            ->addOption('xml-file', null, InputOption::VALUE_REQUIRED, 'XML file with Portfolio data')
33
+        ;
34
+    }
35
+
36
+    protected function execute(InputInterface $input, OutputInterface $output): int
37
+    {
38
+        $io = new SymfonyStyle($input, $output);
39
+        $xmlFile = $input->getOption('xml-file');
40
+
41
+//        if ($xmlFile) {
42
+//            $io->note(sprintf('You passed an argument: %s', $xmlFile));
43
+//        }
44
+
45
+        $xmlString = file_get_contents($xmlFile);
46
+        $xml = simplexml_load_string($xmlString);
47
+
48
+        $parsedPortfolio = $this->xmlParser->processXml($xml);
49
+        print (new PresentationPortfolio)->toPrint($parsedPortfolio);
50
+
51
+        //$io->success('You have a new command! Now make it your own! Pass --help to see your options.');
52
+
53
+        return Command::SUCCESS;
54
+    }
55
+}

+ 31
- 6
src/Presentation/PortfolioPresenter.php 查看文件

@@ -9,12 +9,13 @@ use Symfony\Component\Console\Helper\TableStyle;
9 9
 
10 10
 class PortfolioPresenter
11 11
 {
12
-    public const SecurityMapPrint = [
12
+    private const SecurityMapPrint = [
13 13
         'RU000A1014L8' => 'LQDT',
14 14
     ];
15 15
 
16
+    private array $MapSecuritiesPrintable = [];
16 17
 
17
-    public static function toPrint(ParsedPortfolio $parsedPortfolio): string
18
+    public function toPrint(ParsedPortfolio $parsedPortfolio): string
18 19
     {
19 20
         $output = new BufferedOutput();
20 21
 
@@ -26,12 +27,12 @@ class PortfolioPresenter
26 27
         $table->setHeaderTitle("СОСТАВ: {$parsedPortfolio->getHeader()['НачПериода']} - {$parsedPortfolio->getHeader()['КонПериода']}");
27 28
 
28 29
         $table->setHeaders([
29
-            'ЦБ', 'НКол.', 'НЦена', 'ККол.', 'КЦена'
30
+            'ЦБ', 'Qн', 'Pн', 'Qк', 'Pк'
30 31
         ]);
31 32
 
32 33
         foreach ($parsedPortfolio->getDetails() as $detail) {
33 34
             $table->addRow([
34
-                self::SecurityMapPrint[$detail['ЦБ']] ?? $detail['ЦБ'],// . ' ' . $detail['Эмитент'],
35
+                $this->getPrintableSecurityTitle($detail),
35 36
                 $detail['КоличествоНО'],
36 37
                 $detail['НОЦена'],
37 38
                 //$detail['СуммаНКДНО'],
@@ -51,12 +52,12 @@ class PortfolioPresenter
51 52
         $table->setHeaderTitle("ДВИЖ: {$parsedPortfolio->getHeader()['НачПериода']} - {$parsedPortfolio->getHeader()['КонПериода']}");
52 53
 
53 54
         $table->setHeaders([
54
-            'ЦБ', 'НКол.', 'Приход', 'Расход', 'ККол.'
55
+            'ЦБ', 'Qн', 'In', 'Out', 'Qк'
55 56
         ]);
56 57
 
57 58
         foreach ($parsedPortfolio->getMovements() as $movement) {
58 59
             $table->addRow([
59
-                self::SecurityMapPrint[$movement['ЦБ']] ?? $movement['ЦБ'],
60
+                $this->getPrintableSecurityTitle($movement),
60 61
                 //$movement['Период'],
61 62
                 $movement['НО'],
62 63
                 $movement['Приход'] > 0 ? '+' . $movement['Приход'] : $movement['Приход'],
@@ -71,4 +72,28 @@ class PortfolioPresenter
71 72
         return $txt;
72 73
     }
73 74
 
75
+    private function getPrintableSecurityTitle(array $security): string
76
+    {
77
+        if (isset(self::SecurityMapPrint[$security['ЦБ']])) {
78
+            return self::SecurityMapPrint[$security['ЦБ']];
79
+        }
80
+
81
+        if (!str_starts_with($security['ЦБ'], 'RU00')) {
82
+            return $security['ЦБ'];
83
+        }
84
+
85
+        if (isset($this->MapSecuritiesPrintable[$security['ЦБ']])) {
86
+            return $this->MapSecuritiesPrintable[$security['ЦБ']];
87
+        }
88
+
89
+        if (!isset($security['Эмитент'])) {
90
+            return $security['ЦБ'];
91
+        }
92
+
93
+        $title = str_replace(['МКПАО', 'ПАО', '"', ' ', '(', ')'], ['', '', '', '', '', ''], $security['Эмитент']);
94
+        $this->MapSecuritiesPrintable[$security['ЦБ']] = $title;
95
+
96
+        return $title;
97
+    }
98
+
74 99
 }

+ 2
- 5
src/Service/MailFetcher.php 查看文件

@@ -40,8 +40,6 @@ readonly class MailFetcher
40 40
         if (!$mailsIds) {
41 41
             $this->logger->info('Mailbox is empty');
42 42
 
43
-            $this->logger->warning("Here we should send info about no changes performed..");
44
-
45 43
             return;
46 44
         }
47 45
 
@@ -61,9 +59,8 @@ readonly class MailFetcher
61 59
 
62 60
             if ($this->canProcessMail($mail)) {
63 61
                 if ($this->processMail($mail)) {
64
-
62
+                    // for dev purposes
65 63
                     //break;
66
-
67 64
                 }
68 65
 
69 66
                 $mailbox->deleteMail($mailId);
@@ -133,7 +130,7 @@ readonly class MailFetcher
133 130
             $xml = simplexml_load_string($xmlString);
134 131
 
135 132
             $parsedPortfolio = $this->xmlParser->processXml($xml);
136
-            $message = PresentationPortfolio::toPrint($parsedPortfolio);
133
+            $message = (new PresentationPortfolio)->toPrint($parsedPortfolio);
137 134
 
138 135
             if ($this->portfolioManager->updatePortfolio($parsedPortfolio, $xmlString)) {
139 136
                 $this->telegramNotifier->notify('<pre>' . $message . '</pre>');

+ 12
- 0
symfony.lock 查看文件

@@ -26,6 +26,18 @@
26 26
             "migrations/.gitignore"
27 27
         ]
28 28
     },
29
+    "phpstan/phpstan": {
30
+        "version": "1.11",
31
+        "recipe": {
32
+            "repo": "github.com/symfony/recipes-contrib",
33
+            "branch": "main",
34
+            "version": "1.0",
35
+            "ref": "5e490cc197fb6bb1ae22e5abbc531ddc633b6767"
36
+        },
37
+        "files": [
38
+            "phpstan.dist.neon"
39
+        ]
40
+    },
29 41
     "secit-pl/imap-bundle": {
30 42
         "version": "3.2",
31 43
         "recipe": {

正在加载...
取消
保存