public override Payment Convert(OperationHistoryRequest.Operation o, string paymentJson) { string purpose = o.paymentPurpose.Substring(0, o.paymentPurpose.Length - "НДС не облагается.".Length).TrimEnd(_charsToTrimPurpose); (int placeId, int?employeeId) = Helper.ParsePurposeCode(purpose); Payment payment = new Payment(); payment.Id = 0; payment.Status = PaymentStatus.Approved; //payment.DocumentName = o.absId; //payment.DocumentNumber = o.docNumber; //payment.DocumentDate = DateTime.Parse(o.created, CultureInfo.InvariantCulture).Date; payment.ExternalId = o.id.ToString(); payment.DataSource = "MODAPI"; payment.Provider = "TINKFF"; payment.OriginalAmount = o.amount; payment.ReceivedAmount = o.amount; payment.PaymentDateTime = DateTime.Parse(o.created, CultureInfo.InvariantCulture); payment.IsTimeSpecified = (payment.PaymentDateTime.TimeOfDay != TimeSpan.Zero); payment.ArrivalDateTime = DateTime.Now; payment.Fio = o.contragentName.Split("/")[1].Trim(); payment.Address = ""; payment.Purpose = o.paymentPurpose; payment.PlaceId = placeId; payment.EmployeeId = employeeId; payment.RawData = paymentJson; return(payment); }
public override Payment Convert(OperationHistoryRequest.Operation o, string paymentJson) { string purpose = o.paymentPurpose.Trim(); (int placeId, int?employeeId) = Helper.ParsePurposeCode(purpose); string[] contragentParts = o.contragentName.Split("//", StringSplitOptions.RemoveEmptyEntries); Payment payment = new Payment(); payment.Id = 0; payment.Status = PaymentStatus.Approved; //payment.DocumentName = o.absId; //payment.DocumentNumber = o.docNumber; //payment.DocumentDate = DateTime.Parse(o.created, CultureInfo.InvariantCulture).Date; payment.ExternalId = o.id.ToString(); payment.DataSource = "MODAPI"; payment.Provider = "RAIFZN"; payment.OriginalAmount = o.amount; payment.ReceivedAmount = o.amount; payment.PaymentDateTime = DateTime.Parse(o.created, CultureInfo.InvariantCulture); payment.IsTimeSpecified = (payment.PaymentDateTime.TimeOfDay != TimeSpan.Zero); payment.ArrivalDateTime = DateTime.Now; payment.Fio = contragentParts[0].Trim(); payment.Address = contragentParts[1].Trim(); payment.Purpose = o.paymentPurpose; payment.PlaceId = placeId; payment.EmployeeId = employeeId; payment.RawData = paymentJson; return(payment); }
private async Task <(ConvertResult, Payment, Exception)> ConvertPayment2(OperationHistoryRequest.Operation o, string paymentJson, SqlConnection conn, SqlTransaction tx) { Payment payment = null; Exception exception = null; IPaymentConverter converter = null; for (int i = 0; i < this._paymentConverters.Count; i++) { IPaymentConverter pc = this._paymentConverters[i]; if (pc.CanConvert(o)) { converter = pc; break; } } if (converter == null) { return(ConvertResult.CantConvert, payment, exception); } if (!converter.NeedCreatePayment) { return(ConvertResult.NoNeedToConvert, payment, exception); } try { payment = converter.Convert(o, paymentJson); if (!await this._shareService.ProceedPayment(payment, conn, tx)) { return(ConvertResult.Duplicate, payment, exception); } } catch (Exception ex) { string exStr = ex.ToString(); _logger.LogError(exStr); Helper.SaveDiagMessage(_sqlServer, DiagOptions.Tech, "ModApiPaymentHostedService.ConvertPayment2: " + exStr, _logger); return(ConvertResult.Fail, payment, exception); } return(ConvertResult.Success, payment, exception); }
private async Task <bool> ConvertPayment(OperationHistoryRequest.Operation o, string paymentJson, SqlConnection conn, SqlTransaction tx) { Payment payment; Exception exception; ConvertResult result; (result, payment, exception) = await this.ConvertPayment2(o, paymentJson, conn, tx); DiagOptions options = DiagOptions.Tech; string message; if (result == ConvertResult.CantConvert) { message = "ModApi: Конвертер не найден: " + paymentJson; } else if (result == ConvertResult.NoNeedToConvert) { message = "ModApi: Платёж не подлежит обработке: " + paymentJson; } else if (result == ConvertResult.Fail) { message = "ModApi: Ошибка \"" + exception.Message + "\" при проведении платежа: " + paymentJson; } else if (result == ConvertResult.Duplicate) { message = "ModApi: Платёж уже обработан: " + paymentJson; } else { options = DiagOptions.Biz | DiagOptions.Tech; if (payment.Status == PaymentStatus.Approved) { message = "ModApi: Платёж " + payment.Id.ToString() + " ожидает подтверждения: " + paymentJson; } else { message = "ModApi: Платёж " + payment.Id.ToString() + " успешно проведён: " + paymentJson; } } Helper.SaveDiagMessage(this._sqlServer, options, message, this._logger); return(result.IsAny(ConvertResult.Success, ConvertResult.NoNeedToConvert, ConvertResult.Duplicate)); }
private async Task ProcessPayments() { using (SqlConnection conn = _sqlServer.GetConnection()) { await conn.OpenAsync(); while (true) { string paymentJson = null; using (SqlCommand cmd = _sqlServer.GetSpCommand("payment.GetModApiPaymentToProcess", conn)) { using (SqlDataReader dr = await cmd.ExecuteReaderAsync()) { if (dr.Read()) { paymentJson = dr.GetString("RawData"); } } } if (paymentJson == null) { break; } OperationHistoryRequest.Operation o = JsonConvert.DeserializeObject <OperationHistoryRequest.Operation>(paymentJson); using (SqlTransaction tx = conn.BeginTransaction()) { bool result = await this.ConvertPayment(o, paymentJson, conn, tx); string setCommand = (result ? "payment.SetModApiPaymentAsProcessed" : "payment.SetModApiPaymentAsInvalid"); using (SqlCommand cmd = _sqlServer.GetSpCommand(setCommand, conn, tx)) { cmd.AddUniqueIdentifierParam("@PaymentId", o.id); await cmd.ExecuteNonQueryAsync(); } tx.Commit(); } } } }
public override Payment Convert(OperationHistoryRequest.Operation o, string paymentJson) { string[] purposeParts = o.paymentPurpose.Split(';', StringSplitOptions.RemoveEmptyEntries); string purpose = purposeParts.Where(p => p.StartsWith("НАЗНАЧЕНИЕ:", StringComparison.OrdinalIgnoreCase)).First().Substring("НАЗНАЧЕНИЕ:".Length); string dateStr = purposeParts.Where(p => p.StartsWith("ЗА ", StringComparison.OrdinalIgnoreCase)).First().Substring("ЗА ".Length); (int placeId, int?employeeId) = Helper.ParsePurposeCode(purpose); string[] contragentParts = o.contragentName.Split("//", StringSplitOptions.RemoveEmptyEntries); Payment payment = new Payment(); payment.Id = 0; payment.Status = PaymentStatus.Approved; //payment.DocumentName = o.absId; //payment.DocumentNumber = o.docNumber; //payment.DocumentDate = DateTime.Parse(o.created, CultureInfo.InvariantCulture).Date; payment.ExternalId = o.id.ToString(); payment.DataSource = "MODAPI"; payment.Provider = "SBERBK"; payment.OriginalAmount = o.amount; payment.ReceivedAmount = o.amount; payment.PaymentDateTime = DateTime.ParseExact(dateStr, "dd/MM/yyyy", CultureInfo.InvariantCulture); payment.IsTimeSpecified = false; payment.ArrivalDateTime = DateTime.Now; payment.Fio = contragentParts[1].Trim(); payment.Address = contragentParts[3].Trim(); payment.Purpose = o.paymentPurpose; payment.PlaceId = placeId; payment.EmployeeId = employeeId; payment.RawData = paymentJson; return(payment); }
public abstract Payment Convert(OperationHistoryRequest.Operation o, string paymentJson);
public abstract bool CanConvert(OperationHistoryRequest.Operation o);
private async Task <bool> SavePaymentRecords(List <OperationHistoryRequest.Operation> list) { DataAccess.StructuredParamValue idList = new DataAccess.StructuredParamValue(_idToCheckMetadata, list.Count); for (int i = list.Count - 1, j = 1; i >= 0; i--, j++) { OperationHistoryRequest.Operation o = list[i]; idList.NewRecord(); idList.AddInt32(j); idList.AddGuid(o.id); } using (SqlConnection conn = _sqlServer.GetConnection()) { await conn.OpenAsync(); HashSet <Guid> paymentsToSave = new HashSet <Guid>(); bool? firstRecordAlreadyInDb = null; using (SqlCommand cmd = _sqlServer.GetSpCommand("payment.CheckModApiPaymentList", conn)) { cmd.AddStructuredParam("@IdList", "payment.OrderedGuidList", idList); using (SqlDataReader dr = await cmd.ExecuteReaderAsync()) { while (dr.Read()) { if (!firstRecordAlreadyInDb.HasValue) { firstRecordAlreadyInDb = (dr.GetInt32("SeqNum") != 1); } paymentsToSave.Add(dr.GetGuid("Id")); } } } if (paymentsToSave.Count > 0) { DataAccess.StructuredParamValue paymentList = new DataAccess.StructuredParamValue(_paymentToStoreMetadata, paymentsToSave.Count); for (int i = list.Count - 1, j = 1; i >= 0; i--, j++) { OperationHistoryRequest.Operation o = list[i]; if (paymentsToSave.Contains(o.id)) { paymentList.NewRecord(); paymentList.AddInt32(j); paymentList.AddGuid(o.id); paymentList.AddDateTime(DateTime.ParseExact(o.executed, "s", CultureInfo.InvariantCulture)); paymentList.AddString(JsonConvert.SerializeObject(o)); } } using (SqlCommand cmd = _sqlServer.GetSpCommand("payment.SaveModApiPaymentList", conn)) { cmd.AddStructuredParam("@List", "payment.ModApiPaymentList", paymentList); await cmd.ExecuteNonQueryAsync(); } } return(!firstRecordAlreadyInDb.HasValue || firstRecordAlreadyInDb.Value); } }
public override bool CanConvert(OperationHistoryRequest.Operation o) { return(o.contragentBankName.EndsWith("ПАО СБЕРБАНК", StringComparison.OrdinalIgnoreCase) && o.contragentName.StartsWith("ПАО СБЕРБАНК//", StringComparison.OrdinalIgnoreCase)); }
public override bool CanConvert(OperationHistoryRequest.Operation o) { return(string.Compare(o.contragentBankName, "АО \"ТИНЬКОФФ БАНК\"", StringComparison.OrdinalIgnoreCase) == 0 && o.contragentName.StartsWith("АО \"ТИНЬКОФФ БАНК\"", StringComparison.OrdinalIgnoreCase) && o.paymentPurpose.EndsWith("НДС не облагается.", StringComparison.OrdinalIgnoreCase)); }
public override bool CanConvert(OperationHistoryRequest.Operation o) { return(string.Compare(o.contragentBankName, "АО \"РАЙФФАЙЗЕНБАНК\"", StringComparison.OrdinalIgnoreCase) == 0); }
public override Payment Convert(OperationHistoryRequest.Operation o, string paymentJson) { throw new NotImplementedException(); }
public override bool CanConvert(OperationHistoryRequest.Operation o) { return(string.Compare(o.contragentBankName, "ООО НКО \"ЯНДЕКС.ДЕНЬГИ\"", StringComparison.OrdinalIgnoreCase) == 0 && string.Compare(o.contragentName, "ООО НКО \"Яндекс.Деньги\"", StringComparison.OrdinalIgnoreCase) == 0 && o.paymentPurpose.StartsWith("//Реестр//", StringComparison.OrdinalIgnoreCase)); }
public override bool CanConvert(OperationHistoryRequest.Operation o) { return(o.contragentBankName.EndsWith("ПАО СБЕРБАНК", StringComparison.OrdinalIgnoreCase) && o.paymentPurpose.StartsWith("По договору эквайринга", StringComparison.OrdinalIgnoreCase)); }