public async Task <Stream> Generate(DiagnosticCard card, bool withStamp = true)
        {
            var templateFile = withStamp ? _templateFile : _templateWithoutStamp;
            var memoryStream = new MemoryStream();

            using (var fs = new FileStream(templateFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                await fs.CopyToAsync(memoryStream);
            }
            memoryStream.Position = 0;
            using (var docx = DocX.Load(memoryStream))
            {
                void Replace(string oldVal, string newVal) => docx.ReplaceText(oldVal, newVal?.ToUpper() ?? "");

                // Replaces text #<start>#, #<start+1>#,..., "<end>" with chars from value
                void ReplaceSeq(int start, int end, string value)
                {
                    if (string.IsNullOrEmpty(value))
                    {
                        return;
                    }
                    for (int i = start; i <= end; i++)
                    {
                        Replace($"#{i}#", value[i - start].ToString());
                    }
                }

                ReplaceSeq(1, 15, card.CardId);
                ReplaceSeq(20, 27, card.ExpirationDate?.ToString("ddMMyyyy"));
                ReplaceSeq(30, 37, card.RegisteredDate?.ToString("ddMMyyyy"));
                Replace("#reg_znak#", card.RegNumber);
                Replace("#vin#", card.VIN);
                Replace("#rama#", card.FrameNumber);
                Replace("#kuzov#", card.BodyNumber);
                Replace("#vidano#", $"{card.DocumentSeries} {card.DocumentNumber} {card.DocumentIssuer} {card.DocumentIssueDate:dd.MM.yyyy}");
                Replace("#marka#", $"{card.Manufacturer} {card.Model}");
                Replace("#kategor1#", card.Category.ToString());
                Replace("#god_vipuska#", card.IssueYear.ToString());
                Replace("#massa_bez#", card.Weight.ToString());
                Replace("#massa_max#", card.AllowedMaxWeight.ToString());
                Replace("#toplivo#", card.FuelType.Label());
                Replace("#probeg#", card.Running.ToString());
                Replace("#tormozn_system#", card.BrakeType.Label().Split('-')[0].Trim());
                Replace("#marka_shin#", card.TyreManufacturer);
                Replace("#notes#", card.Note);
                docx.Save();
            }
            memoryStream.Position = 0;
            return(memoryStream);
        }
        public async Task SaveCardTest()
        {
            try
            {
                var info = new DiagnosticCard()
                {
                    Lastname          = "ТестМагомедов",
                    Firstname         = "ТестМагомед",
                    Patronymic        = "ТестМагомедович",
                    VIN               = "12345678912345672",
                    IssueYear         = 2012,
                    Manufacturer      = "Газ",
                    Model             = "53",
                    FrameNumber       = "12345678912345678",
                    Running           = 250000,
                    RegNumber         = "Т111СТ05",
                    Weight            = 2000,
                    Category          = VehicleCategory.B,
                    CategoryCommon    = VehicleCategoryCommon.N1,
                    TyreManufacturer  = "Kama",
                    AllowedMaxWeight  = 3000,
                    FuelType          = FuelTypes.Diesel,
                    BrakeType         = BrakeTypes.Hydraulic,
                    DocumentType      = DocumentTypes.RegistrationCertificate,
                    DocumentSeries    = "0123",
                    DocumentNumber    = "123456",
                    DocumentIssueDate = new DateTime(2017, 02, 01),
                    DocumentIssuer    = "ГИБДД",
                    Note              = "Тестовое примечание",
                    ExpirationDate    = new DateTime(2018, 08, 09),
                };
                await _api.SaveCard(info);

                Assert.NotNull(info.CardId);
                Assert.That(info.CardId, Does.Match(@"\d+"));
            }
            catch (CheckCardException e)
            {
                throw;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
Esempio n. 3
0
        public TestForm()
        {
            InitializeComponent();
            diagnosticCard = new DiagnosticCard();

            comboBoxToothColorVisual.SelectedIndex       = 0;
            comboBoxToothColorInstrumental.SelectedIndex = 0;
            comboBoxBadHabits.SelectedIndex             = 0;
            comboBoxFissure.SelectedIndex               = 0;
            comboBoxResistanceEnamel.SelectedIndex      = 0;
            comboBoxToothCrownDestruction.SelectedIndex = 0;
            comboBoxBite.SelectedIndex = 0;
            comboBoxPeriodontalDisease.SelectedIndex      = 0;
            comboBoxBadHabits.SelectedIndex               = 0;
            comboBoxHygieneIndex.SelectedIndex            = 0;
            comboBoxProfessionalHarmfulness.SelectedIndex = 0;
        }
Esempio n. 4
0
        /// <summary>
        /// Returns true if card is found on eaisto server
        /// </summary>
        /// <param name="card"></param>
        /// <returns></returns>
        public async Task <bool> RefreshCardFromEaistoSearch(DiagnosticCard card)
        {
            try
            {
                var results = await Search(card.VIN, card.RegNumber);

                var cardInfo = results.SingleOrDefault(c =>
                                                       c.IssueDate == DateTime.UtcNow.AddHours(3).ToString("dd.MM.yyyy"));
                if (cardInfo != null)
                {
                    card.CardId         = cardInfo.BlankNumber.Replace("/", "");
                    card.ExpirationDate = DateTime.ParseExact(cardInfo.ExpirationDate, "dd.MM.yyyy", CultureInfo.InvariantCulture);
                    //card.RegisteredDate = DateTime.ParseExact(cardInfo.ExpirationDate, "dd.MM.yyyy", CultureInfo.InvariantCulture);
                    return(true);
                }
            }
            catch (Exception e)
            {
                _logger.LogError("Refresh card error: " + e);
            }
            return(false);
        }
Esempio n. 5
0
        private async Task <CheckResults> CheckForm(DiagnosticCard info)
        {
            var request = new HttpRequestMessage(HttpMethod.Post, DataUrl);

            await SetSessionCookie(request);

            var formParams = new List <KeyValuePair <string, string> >();

            void Add(string key, string value) => formParams.Add(new KeyValuePair <string, string>(key, value));

            Add("check_form", "1");
            Add("vin", info.VIN);
            Add("reg_znak", info.RegNumber);
            Add("kuzov", info.BodyNumber);
            Add("shassi", info.FrameNumber);
            Add("seria", "undefined");
            Add("nomer", "undefined");
            Add("mode", "new");

            var content = new FormUrlEncodedContent(formParams);

            request.Content = content;

            var response = await Client.SendAsync(request);

            if (sessionIsExpired(response))
            {
                throw new NotAuthorizedException();
            }

            var json = await response.Content.ReadAsStringAsync();

            var responseContainer = new { result = -1 };

            return((CheckResults)JsonConvert.DeserializeAnonymousType(json, responseContainer).result);
        }
Esempio n. 6
0
        private void PopulateParams(List <KeyValuePair <string, string> > formParams, DiagnosticCard info)
        {
            void Add(string key, string value) => formParams.Add(new KeyValuePair <string, string>(key, value));

            Add("diag_karta_id", "");
            Add("F_LICA", info.Lastname);
            Add("I_LICA", info.Firstname);
            Add("O_LICA", info.Patronymic);

            if (info.VIN != null)
            {
                Add("VIN", info.VIN);
            }
            else
            {
                Add("VIN_OTSUTSTVUET", "1");  // TODO: check param name
            }
            Add("GOD", info.IssueYear.ToString());
            Add("MARKA", info.Manufacturer);
            Add("MODEL", info.Model);
            Add("NOMER_KUZOVA", info.BodyNumber);
            if (info.FrameNumber != null)
            {
                Add("NOMER_RAMY", info.FrameNumber);
            }
            else
            {
                Add("NOMER_RAMY_OTSUTSTVUET", "1");
            }
            Add("PROBEG", info.Running.ToString());
            Add("REG_ZNAK", info.RegNumber);
            Add("MASSA_BEZ_NAGRUZKI", info.Weight.ToString());
            Add("KATEG_SRTS_PTS_ID", info.Category.ToString()); // TODO: check it
            Add("KATEG_ID", info.CategoryCommon.ToString());    // TODO: check it
            Add("MARKA_SHIN", info.TyreManufacturer);
            Add("MARKA_SHIN[0]", info.TyreManufacturer);
            Add("RAZRESH_MAKS_MASSA", info.AllowedMaxWeight.ToString());
            Add("TIP_TOPLIVA", info.FuelType.GetValueAsString());
            Add("TIP_TORMOZ_SISTEMY", info.BrakeType.GetValueAsString());


            Add("SVID_O_REG", info.DocumentType == DocumentTypes.RegistrationCertificate ? "0" : "1");
            Add("SVID_O_REG_SERIA", info.DocumentSeries);
            Add("SVID_O_REG_NOMER", info.DocumentNumber);
            Add("SVID_O_REG_KOGDA", info.DocumentIssueDate?.ToString("dd.MM.yyyy"));
            Add("SVID_O_REG_KEM", info.DocumentIssuer);
            if (info.IsForeigner)
            {
                Add("SVID_FOREIGN", "1");
            }


            // Expertise result (it is not change)
            Add("table_version", "list");
            for (int i = 1; i <= 67; i++)
            {
                Add($"RESULTAT[PROVERKA_NE_PROIDENA][{i}]", "0");
                Add($"RESULTAT[PROVERKA_NE_PROIDENA_DUMMY][{i}]", "1");
            }
            Add("DIAGNOSTIKA[NIZH_GRAN][X]", "");
            Add("DIAGNOSTIKA[ZNACHENIE][X]", "");
            Add("DIAGNOSTIKA[VERH_GRAN][X]", "");
            Add("DIAGNOSTIKA[NAIMENOVANIE][X]", "");
            Add("DIAGNOSTIKA[PARAMETER_ID][X]", "");
            Add("NEVYPOLN[PREDMET_PROVERKI][X]", "");
            Add("NEVYPOLN[TREBOVANIE][X]", "");
            Add("NEVYPOLN[PARAMETER_ID][X]", "");

            Add("RESULTAT_PRIMECHANIE", info.Note);
            Add("ZAKLUCHENIE", "1");
            Add("SROK_DEISTV", info.ExpirationDate?.ToString("dd.MM.yyyy"));
            Add("OSOB_OTMETKI", "");
            Add("PERVICH_PROVERKA", "1");
        }
Esempio n. 7
0
        /// <summary>
        /// Saves card and sets it card id.
        /// Throws CheckCardException if form didn't pass validation on server.
        /// See <see cref="CheckResults"/> enum for details.
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public async Task SaveCard(DiagnosticCard info)
        {
            // check form
            var checkResult = await CheckForm(info);

            if (checkResult != CheckResults.Success)
            {
                if (checkResult == CheckResults.DuplicateToday)
                {
                    // it means that card has been registered
                    // so we try to get card info using search
                    if (await RefreshCardFromEaistoSearch(info))
                    {
                        return;
                    }
                }
                throw new CheckCardException(checkResult);
            }

            var request = new HttpRequestMessage(HttpMethod.Post, DataUrl);

            await SetSessionCookie(request);

            var formParams = new List <KeyValuePair <string, string> >();

            PopulateParams(formParams, info);

            var content = new FormUrlEncodedContent(formParams);

            request.Content = content;

            var response = await Client.SendAsync(request);

            if (sessionIsExpired(response))
            {
                throw new NotAuthorizedException();
            }

            var respContent = await response.Content.ReadAsStringAsync();

            // After post we expect 302 (redirect) response
            var location = response.Headers.Location;

            if (location == null || !location.OriginalString.Contains("expert/new"))
            {
                throw new SaveCardException("Expected redirect response from EAISTO is missing.");
            }

            // Follow redirect to get card id
            request = new HttpRequestMessage(HttpMethod.Get, DataUrl);
            request.Headers.Referrer = new Uri("http://eaisto.gibdd.ru/ru/arm/expert/new/");
            await SetSessionCookie(request);

            response = await Client.SendAsync(request);

            if (sessionIsExpired(response))
            {
                throw new NotAuthorizedException();
            }
            var html = await response.Content.ReadAsStringAsync();

            var cq     = CQ.Create(html);
            var cardId = cq[".second_cont strong"].Text();

            if (cardId.Any(c => !Char.IsDigit(c)))
            {
                _logger?.LogError("cardId is wrong. Received html: " + html);
                await RefreshCardFromEaistoSearch(info);
            }

            info.CardId = cardId;
            // jQuery(".second_cont strong")
            // http://eaisto.gibdd.ru/ru/arm/expert/new/

            // Referer
            // http://eaisto.gibdd.ru/ru/arm/expert/new/index.php?
            //return await result.Content.ReadAsStringAsync();
        }