public async Task <JsonResult> GetByTrainId(int train_id)
        {
            await CheckPermission();

            var tr = new TrainRepository(_logger);
            var cr = new CarriageRepository(_logger);


            var train = await tr.ByIdWithStations(train_id);

            if (train == null)
            {
                throw new Exception("train not found");
            }

            var result = await cr.GetByTrain(train);

            tr.Dispose();
            return(Json(result));
        }
        public async Task <IActionResult> GetActPdf([FromBody] int trainId)
        {
            await CheckPermission();

            if (trainId == 0)
            {
                throw new ValidationException($"Необходимо выбрать Номер состава.");
            }

            var sqlRAct = new ActCategoriesRepository();
            var html    = @"<html><head>
<style type='text/css'>
.task {
    border-collapse: collapse;
    border: 1px solid black;
}
.task td {
    padding: 5px;
    border: 1px solid black;
}
.task th {
    padding: 5px;
    border: 1px solid black;
    font-size: 80%;
}
.rotate {
    text-align: center;
    white-space: nowrap;
    vertical-align: middle;
    width: 1.5em;
}
.rotate div {
    -webkit-transform: rotate(-90.0deg);
    margin-left: -10em;
    margin-right: -10em;
}
 .break {
    page-break-after: always;
 }
</style></head><body>";

            var sqlRTrain = new TrainRepository(_logger);
            var train     = await sqlRTrain.ByIdWithStations(trainId);

            var sqlRCarriage = new CarriageRepository(_logger);
            var carriages    = await sqlRCarriage.GetByTrain(train);

            string carriagesString = null;

            carriages = carriages.OrderBy(e => e.Number).ToArray();
            foreach (var carriage in carriages)
            {
                if (carriage.Number == 9)
                {
                    continue;
                }
                carriagesString += $"{CreateCarriageNameWithOutTrain(carriage.Number)} ";
            }
            carriagesString += $"{CreateCarriageNameWithOutTrain(9)} ";

            //html += "<p align=\"center\"><font size=\"5\"><b>Акт сдачи - приемки транспорта</b></p>";
            html += "<p align=\"center\"><font size=\"4\"><b>Акт сдачи - приемки Транспорта</b></font></p>";
            html += "<p align=\"center\"><font size=\"4\"><b> в депо </b> Нахабино</font></p>";
            html += "<p><b> N </b>1</p>" +
                    $"<p> Дата {DateTime.Now.ToShortDateString()} Время {DateTime.Now.ToShortTimeString()} Номер эл/ п {train.Name}; Составность {carriages.Length} Причина проведения осмотра ТО-_____ </p>" +
                    $"<p> Нумерация вагонов в подвижном составе {carriagesString} </ p >";

            //шапка
            html += "<table class='task break'><tr><th colspan=\"3\" rowspan=\"2\"></th><th colspan=\"3\">Раздел I</th><th colspan=\"3\">Раздел II</th><th colspan=\"3\">Раздел III</th></tr>";
            html += "<tr><th>Испр</th><th>Неиспр</th><th>№ вагона</th><th>Испр</th><th>Неиспр</th><th>№ вагона</th><th>Испр</th><th>Неиспр</th><th>№ вагона</th></tr>";

            //1. Санитарное состояние
            //надо получить число записей и вставить в <th rowspan = 4>

            var         sqlrTask = new TaskRepository(_logger);
            CultureInfo us       = new CultureInfo("en-US");
            var         currentDateForFuckingSql = DateTime.Now.ToString(@"yyyy-MM-dd", us);

            //var filter =
            //$"[{{\"filter\":\"DateFrom\",\"value\":\"{currentDateForFuckingSql}\"}},{{\"filter\":\"DateTo\",\"value\":\"{currentDateForFuckingSql}\"}}]";
            var tasks = await sqlrTask.GetAllForPdf(0, Int32.MaxValue, trainId);

            var contentWithValues        = new List <ActCategoriesRepository.EquipmentActsPdf>();
            var summaryContentWithValues = new List <ActCategoriesRepository.EquipmentActsPdf>();
            //var sqlRAct = new ActCategoriesRepository();

            var badR1  = 0;
            var goodR2 = 0;
            var badR3  = 0;

            var paragraphs = new List <string>
            {
                "Санитарное состояние",
                "Электрооборудование",
                "Кузовное оборудование",
                "Прочее"
            };

            var count = 1;

            List <ActCategoriesRepository.EquipmentActsPdf> content;

            foreach (var paragraph in paragraphs)
            {
                content = await sqlRAct.GetAllForPdf(paragraph, count);

                var rowspanPlus = 2;
                if (count == 3)
                {
                    rowspanPlus = 3;
                }

                html += $@"<tr><th class='rotate' rowspan='{content.Count + rowspanPlus}'>" +
                        "<div>" +
                        $"{count}. {paragraph}" +
                        $"" +
                        "</div>" +
                        "</th></tr>";

                var countInternal = 1;
                foreach (var item in content)
                {
                    item.CarriageNumR1 = new List <int>();
                    item.CarriageNumR2 = new List <int>();
                    item.CarriageNumR3 = new List <int>();

                    if (countInternal == 12 && count == 3)
                    {
                        html += "</table><table class='task'>";
                        html += "<tr><th colspan=\"3\" rowspan=\"2\"></th><th colspan=\"3\">Раздел I</th><th colspan=\"3\">Раздел II</th><th colspan=\"3\">Раздел III</th></tr>";
                        html += "<tr><th>Испр</th><th>Неиспр</th><th>№ вагона</th><th>Испр</th><th>Неиспр</th><th>№ вагона</th><th>Испр</th><th>Неиспр</th><th>№ вагона</th></tr>";
                        html += $@"<tr><th class='rotate' rowspan='{content.Count - countInternal + rowspanPlus}'>" +
                                "<div>" +
                                $"{count}. {paragraph}" +
                                $"" +
                                "</div>" +
                                "</th></tr>";
                    }

                    await TaskFucker(sqlRAct, tasks, item);

                    contentWithValues.Add(item);
                    html += $"<tr><th>{item.Number}</th>" +
                            $"<th>{item.ActName}</th>" +
                            $"<th>{item.GoodR1}</th>" +
                            $"<th>{item.BadR1}</th>" +
                            $"<th>{sqlRAct.CreateCarriageStrintToPdf(item.CarriageNumR1)}</th>" +

                            $"<th>{item.GoodR2}</th>" +
                            $"<th>{item.BadR2}</th>" +
                            $"<th>{sqlRAct.CreateCarriageStrintToPdf(item.CarriageNumR2)}</th>" +

                            $"<th>{item.GoodR3}</th>" +
                            $"<th>{item.BadR3}</th>" +
                            $"<th>{sqlRAct.CreateCarriageStrintToPdf(item.CarriageNumR3)}</th>" +
                            $"</tr>";

                    countInternal++;
                }
                //както надо посчитать колво замечаний в каждом столбце блядь
                badR1  = 0;
                goodR2 = 0;
                badR3  = 0;
                foreach (var item in contentWithValues)
                {
                    if (item.BadR1 != null)
                    {
                        badR1 = badR1 + item.BadR1.Value;
                    }
                    if (item.GoodR2 != null)
                    {
                        goodR2 = goodR2 + item.GoodR2.Value;
                    }
                    if (item.BadR3 != null)
                    {
                        badR3 = badR3 + item.BadR3.Value;
                    }
                }

                string s1 = null;
                string s2 = null;
                string s3 = null;
                if (badR1 != 0)
                {
                    s1 = badR1.ToString();
                }
                if (goodR2 != 0)
                {
                    s2 = goodR2.ToString();
                }
                if (badR3 != 0)
                {
                    s3 = badR3.ToString();
                }


                html +=
                    $"<tr><th colspan=\"2\"><b>Всего замечаний</b></th><th></th><th>{s1}</th><th></th><th>{s2}</th><th></th><th></th><th></th><th>{s3}</th><th></th></tr>";
                summaryContentWithValues.AddRange(contentWithValues);
                contentWithValues.Clear();
                count++;

                if (count == 4)
                {
                    html +=
                        "<tr><th></th><th>4.</th><th><b>Составность не соответствует заявке</b></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th></tr>";
                    count++;
                }
            }

            //ИТОГО

            badR1  = 0;
            goodR2 = 0;
            badR3  = 0;
            foreach (var item in summaryContentWithValues)
            {
                if (item.BadR1 != null)
                {
                    badR1 = badR1 + item.BadR1.Value;
                }
                if (item.GoodR2 != null)
                {
                    goodR2 = goodR2 + item.GoodR2.Value;
                }
                if (item.BadR3 != null)
                {
                    badR3 = badR3 + item.BadR3.Value;
                }
            }

            string ss1 = null;
            string ss2 = null;
            string ss3 = null;

            if (badR1 != 0)
            {
                ss1 = badR1.ToString();
            }
            if (goodR2 != 0)
            {
                ss2 = goodR2.ToString();
            }
            if (badR3 != 0)
            {
                ss3 = badR3.ToString();
            }

            html += $"<tr><th></th><th colspan=\"2\"><b>ИТОГО по санитарно - техническому состоянию</b></th><th></th><th>{ss1}</th><th></th><th>{ss2}</th><th></th><th>" +
                    $"</th><th></th><th>{ss3}</th><th></th></tr>";

            html += "</table><br /><br />";

            //надписи под таблицей

            var checkBoxHtml = "<input maxlength = \"1\" size = \"1\" type = \"text\">";
            var probel       = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
            var probel2      = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
            var probel3      = "&nbsp;";


            html += $"<p><font size=\"2\">{probel}Эл.поезд эксплуатационным нормам безопасности движения {checkBoxHtml}соответствует {checkBoxHtml}не соответсвует</font></p>";

            html += $"<p><font size=\"2\">На основании дейтв. нормативных документов эксплуатации поезда {checkBoxHtml}разрешена{probel3}{checkBoxHtml}запрещена</font></p>";

            html += $"<p><font size=\"2\">Поезд к первоочередн. устранению {checkBoxHtml}      Повторная проверка проведена: _______________      Время Выхода из депо________</font></p>";
            html += $"<p><font size=\"2\">по результатам повторной проверки эксплуатация поезда {checkBoxHtml}разрешена   {checkBoxHtml}запрещена       <b>Выдан на линию воопреки запрета в</b>________</font></p>";

            html += $"<p align=\"right\"><font size=\"2\"><b>Приёмку подвижного состава до постановки на ТО(ТР) произвели</b></font>{probel2}{probel2}</p>";

            html += $"<p align=\"center\"><font size=\"2\"><b>Представитель ПАО \"ЦППК\" - приёмщик ООО \"Профлайн\"_________________{probel2}{probel2}/_______________/</b></font></p>";
            html += $"<p align=\"center\"><font size=\"2\"><b>Представитель депо <u>{probel2}{probel2}Нахабино{probel2}{probel2}бригадир{probel2}{probel2}{probel2}</u>{probel2}{probel2}/_______________/</b></font></p>";

            html += $"<p align=\"right\"><font size=\"2\"><b>Приёмку подвижного состава после проведения ТО(ТР) произвели</b></font>{probel2}{probel2}</p>";
            html += $"<p align=\"center\"><font size=\"2\"><b>Представитель ПАО \"ЦППК\" - приёмщик ООО \"Профлайн\"_________________{probel2}{probel2}/_______________/</b></font></p>";
            html += $"<p align=\"center\"><font size=\"2\"><b>Представитель депо <u>{probel2}{probel2}Нахабино{probel2}{probel2}бригадир{probel2}{probel2}{probel2}</u>{probel2}{probel2}/_______________/</b></font></p>";

            html += "<br /><br /><body></html>";
            //
            var output = _pdfConverter.Convert(new HtmlToPdfDocument
            {
                GlobalSettings =
                {
                    ColorMode   = ColorMode.Color,
                    Orientation = Orientation.Portrait,
                    PaperSize   = PaperKind.A4,
                },
                Objects =
                {
                    new ObjectSettings
                    {
                        HtmlContent = html,
                        WebSettings ={ DefaultEncoding                   = "utf-8" }
                    }
                }
            });

            //


            return(File(output, "application/pdf", "1111" + "_" + "2222" + "_" + "3333" + ".pdf"));
        }