Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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));
        }
Esempio n. 5
0
        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();
                    }
                }
            }
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
 public abstract Payment Convert(OperationHistoryRequest.Operation o, string paymentJson);
Esempio n. 8
0
 public abstract bool CanConvert(OperationHistoryRequest.Operation o);
Esempio n. 9
0
        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);
            }
        }
Esempio n. 10
0
 public override bool CanConvert(OperationHistoryRequest.Operation o)
 {
     return(o.contragentBankName.EndsWith("ПАО СБЕРБАНК", StringComparison.OrdinalIgnoreCase) &&
            o.contragentName.StartsWith("ПАО СБЕРБАНК//", StringComparison.OrdinalIgnoreCase));
 }
Esempio n. 11
0
 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));
 }
Esempio n. 12
0
 public override bool CanConvert(OperationHistoryRequest.Operation o)
 {
     return(string.Compare(o.contragentBankName, "АО \"РАЙФФАЙЗЕНБАНК\"", StringComparison.OrdinalIgnoreCase) == 0);
 }
Esempio n. 13
0
 public override Payment Convert(OperationHistoryRequest.Operation o, string paymentJson)
 {
     throw new NotImplementedException();
 }
Esempio n. 14
0
 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));
 }
Esempio n. 15
0
 public override bool CanConvert(OperationHistoryRequest.Operation o)
 {
     return(o.contragentBankName.EndsWith("ПАО СБЕРБАНК", StringComparison.OrdinalIgnoreCase) &&
            o.paymentPurpose.StartsWith("По договору эквайринга", StringComparison.OrdinalIgnoreCase));
 }