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; } }
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; }
/// <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); }
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); }
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"); }
/// <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(); }