Пример #1
0
        private async Task SendNotifications()
        {
            using (SqlConnection conn = this._sqlServer.GetConnection())
            {
                await conn.OpenAsync();

                List <Message> messages = new List <Message>();

                using (SqlCommand cmd = this._sqlServer.GetSpCommand("telegram.GetUsersToNotify", conn))
                {
                    using (SqlDataReader dr = await cmd.ExecuteReaderAsync())
                    {
                        while (dr.Read())
                        {
                            Message m = new Message(dr);
                            messages.Add(m);
                        }
                    }
                }

                foreach (Message m in messages)
                {
                    string text = m.ToString();

                    using (SqlCommand cmd = _sqlServer.GetSpCommand("telegram.UpdateLastBalanceLogId", conn))
                    {
                        cmd.AddBigIntParam("@UserId", m.TelegramId);
                        cmd.AddBigIntParam("@LastBalanceLogId", m.EmployeeBalanceLogId);
                        cmd.AddNVarCharParam("@Message", 200, text);

                        await cmd.ExecuteNonQueryAsync();
                    }
                }
            }
        }
Пример #2
0
        private async Task TurnExit(Update update, Employee employee)
        {
            TurnSessionData session = (TurnSessionData)employee.DialogSession;

            if (employee.Turn != null)
            {
                using (SqlConnection conn = _sqlServer.GetConnection())
                {
                    await conn.OpenAsync();

                    using (SqlCommand cmd = _sqlServer.GetSpCommand("telegram.DialogSession_Turn_Exit", conn))
                    {
                        cmd.AddBigIntParam("@TelegramId", employee.TelegramUserId);
                        cmd.AddIntParam("@EmployeeId", employee.Id);
                        cmd.AddIntParam("@PlaceId", employee.Place.Id);
                        cmd.AddNVarCharParam("@Message", 200, employee.GetTurnExitMessage());
                        await cmd.ExecuteNonQueryAsync();
                    }
                }
            }

            string text = "Вы вышли из смены";
            ReplyKeyboardMarkup keyboard = GetStandardKeyboardMarkup(employee);
            await _telegramClient.SendTextMessageAsync(update.Message.From.Id, text, ParseMode.Default, false, false, 0, keyboard, _cts.Token);

            await this.WriteMessageLog(new MessageLog(text, employee, keyboard));
        }
Пример #3
0
        private async Task WriteMessageLog(MessageLog log)
        {
            try
            {
                using (SqlConnection conn = this._sqlServer.GetConnection())
                {
                    await conn.OpenAsync();

                    using (SqlCommand cmd = this._sqlServer.GetSpCommand("telegram.WriteMessageLog", conn))
                    {
                        cmd.AddBitParam("@InputMessage", log.InputMessage);
                        cmd.AddBigIntParam("@TelegramId", log.TelegramId);
                        cmd.AddCharParam("@Phone", 10, log.Phone);
                        cmd.AddIntParam("@EmployeeId", log.EmployeeId);
                        cmd.AddNVarCharMaxParam("@MessageData", log.GetJson());

                        await cmd.ExecuteNonQueryAsync();
                    }
                }
            }
            catch (Exception ex)
            {
                string exStr = ex.ToString();
                _logger.LogError(exStr, "Ошибка при сохранениии записи в журнале сообщений");
                Helper.SaveDiagMessage(_sqlServer, DiagOptions.Tech, "TelegramHostedService.WriteMessageLog, Ошибка при сохранениии записи в журнале сообщений: " + exStr, _logger);
            }
        }
Пример #4
0
 private async Task CompleteRequest(PaymentRequest request, CheckPaymentRequestData data, SqlConnection conn, SqlTransaction tx)
 {
     using (SqlCommand cmd = _sqlServer.GetSpCommand("payment.CompleteYandexKassaRequest", conn, tx))
     {
         cmd.AddIntParam("@RequestId", request.Id);
         cmd.AddVarCharParam("@KassaPaymentId", 50, data.ResponseData.Response.Id);
         cmd.AddBigIntParam("@PaymentId", request.PaymentId);
         await cmd.ExecuteNonQueryAsync();
     }
 }
Пример #5
0
        private async Task SavePayment(Payment payment, SqlConnection conn, SqlTransaction tx)
        {
            DataAccess.StructuredParamValue amounts = null;
            if (payment.PersonalAmounts.Count > 0)
            {
                amounts = new DataAccess.StructuredParamValue(_amountsMetadata, payment.PersonalAmounts.Count);
                foreach (PersonalAmount pa in payment.PersonalAmounts)
                {
                    amounts.NewRecord();
                    amounts.AddInt32(pa.EmployeeId);
                    amounts.AddDecimal(pa.Amount);
                }
            }

            using (SqlCommand cmd = _sqlServer.GetSpCommand("payment.SavePayment", conn, tx))
            {
                cmd.AddIntParam("@PlaceId", payment.PlaceId);
                cmd.AddIntParam("@EmployeeId", payment.EmployeeId);
                cmd.AddIntParam("@ShareSchemeHistoryId", payment.ShareSchemeHistoryId);
                cmd.AddTinyIntParam("@Status", (byte)payment.Status);
                cmd.AddTinyIntParam("@ReasonToReturn", (byte?)payment.ReasonToReturn);
                cmd.AddCharParam("@DataSource", 6, payment.DataSource);
                cmd.AddCharParam("@Provider", 6, payment.Provider);
                cmd.AddDecimalParam("@OriginalAmount", 18, 2, payment.OriginalAmount);
                cmd.AddDecimalParam("@ReceivedAmount", 18, 2, payment.ReceivedAmount);
                cmd.AddDecimalParam("@BankCommissionAmount", 18, 2, payment.BankCommissionAmount);
                cmd.AddDecimalParam("@AgentCommissionAmount", 18, 2, payment.AgentCommissionAmount);
                cmd.AddDecimalParam("@IncomeAmount", 18, 2, payment.IncomeAmount);
                cmd.AddDecimalParam("@PayoutAmount", 18, 2, payment.PayoutAmount);
                cmd.AddDateTime2Param("@PaymentDateTime", payment.PaymentDateTime);
                cmd.AddBitParam("@IsTimeSpecified", payment.IsTimeSpecified);
                cmd.AddDateTime2Param("@ArrivalDateTime", payment.ArrivalDateTime);
                cmd.AddVarCharParam("@DocumentName", 100, (payment.DocumentId.HasValue ? null : payment.DocumentName));
                SqlParameter documentIdParam = cmd.AddIntParam("@DocumentId", payment.DocumentId).InputOutput();
                cmd.AddVarCharParam("@DocumentNumber", 40, (payment.DocumentId.HasValue ? null : payment.DocumentNumber));
                cmd.AddDateParam("@DocumentDate", (payment.DocumentId.HasValue ? null : payment.DocumentDate));
                cmd.AddVarCharParam("@ExternalId", 50, payment.ExternalId);
                cmd.AddNVarCharParam("@Fio", 100, payment.Fio);
                cmd.AddNVarCharParam("@Address", 150, payment.Address);
                cmd.AddNVarCharParam("@Purpose", 150, payment.Purpose);
                cmd.AddNVarCharMaxParam("@RawData", payment.RawData);
                cmd.AddStructuredParam("@Amounts", "payment.PaymentShare", amounts);
                SqlParameter PaymentIdParam = cmd.AddBigIntParam("@PaymentId").Output();
                SqlParameter StatusParam    = cmd.AddTinyIntParam("@FinalStatus").Output();

                await cmd.ExecuteNonQueryAsync();

                payment.Id     = PaymentIdParam.GetInt64();
                payment.Status = (PaymentStatus)StatusParam.GetByte();
                if (!payment.DocumentId.HasValue)
                {
                    payment.DocumentId = documentIdParam.GetInt32OrNull();
                }
            }
        }
Пример #6
0
        public async Task CancelSession(SqlServer sqlServer, Employee employee)
        {
            using (SqlConnection conn = sqlServer.GetConnection())
            {
                await conn.OpenAsync();

                using (SqlCommand cmd = sqlServer.GetSpCommand("telegram.DialogSession_Cancel", conn))
                {
                    cmd.AddBigIntParam("@TelegramId", employee.TelegramUserId);
                    await cmd.ExecuteNonQueryAsync();
                }
            }
        }
Пример #7
0
        public async Task UpdateSession(SqlServer sqlServer, Employee employee)
        {
            using (SqlConnection conn = sqlServer.GetConnection())
            {
                await conn.OpenAsync();

                using (SqlCommand cmd = sqlServer.GetSpCommand("telegram.DialogSession_Update", conn))
                {
                    cmd.AddBigIntParam("@TelegramId", employee.TelegramUserId);
                    cmd.AddTinyIntParam("@Step", this.StepByte);
                    cmd.AddNVarCharParam("@Data", 200, this.SerializeToJson());
                    await cmd.ExecuteNonQueryAsync();
                }
            }
        }
Пример #8
0
        private async Task CompleteRequest(PaymentRequest request, SqlConnection conn, SqlTransaction tx)
        {
            try
            {
                using (SqlCommand cmd = _sqlServer.GetSpCommand("payment.SbAcquiring_CompleteRequest", conn, tx))
                {
                    cmd.AddIntParam("@RequestId", request.RequestId);
                    cmd.AddVarCharParam("@OrderId", 50, request.OrderId);
                    cmd.AddBigIntParam("@PaymentId", request.PaymentId);

                    await cmd.ExecuteNonQueryAsync();
                }
            }
            catch (Exception ex)
            {
                string exStr = ex.ToString();
                _logger.LogError(exStr);
                Helper.SaveDiagMessage(_sqlServer, DiagOptions.Tech, "SbAcquiringHostedService.CompleteRequest: " + exStr, _logger);
            }
        }
Пример #9
0
        public async Task <Employee> GetEmployeeByTelegramUserIdAsync(long telegramUserId)
        {
            using (SqlConnection conn = this._sqlServer.GetConnection())
            {
                await conn.OpenAsync();

                using (SqlCommand cmd = this._sqlServer.GetSpCommand("telegram.GetUserRecordByUserId", conn))
                {
                    cmd.AddBigIntParam("@UserId", telegramUserId);
                    using (SqlDataReader dr = await cmd.ExecuteReaderAsync())
                    {
                        if (dr.Read())
                        {
                            return(AcquireEmployee(telegramUserId, dr));
                        }

                        return(null);
                    }
                }
            }
        }
Пример #10
0
        public async Task <Employee> SetPhoneAndGetEmployee(long telegramUserId, string phone)
        {
            if (string.IsNullOrEmpty(phone) || (phone.Length == 12 && !phone.StartsWith("+7")) || (phone.Length == 11 && !phone.StartsWith("7")) || phone.Length < 11 || phone.Length > 12)
            {
                return(null);
            }

            if (phone.Length == 12)
            {
                phone = phone.Substring(2, 10);
            }
            else
            {
                phone = phone.Substring(1, 10);
            }

            using (SqlConnection conn = _sqlServer.GetConnection())
            {
                await conn.OpenAsync();

                using (SqlCommand cmd = _sqlServer.GetSpCommand("telegram.CreateAndGetUserRecord", conn))
                {
                    cmd.AddBigIntParam("@UserId", telegramUserId);
                    cmd.AddCharParam("@Phone", 10, phone);

                    using (SqlDataReader dr = await cmd.ExecuteReaderAsync())
                    {
                        if (dr.Read())
                        {
                            return(AcquireEmployee(telegramUserId, dr));
                        }

                        return(null);
                    }
                }
            }
        }
Пример #11
0
        public override async Task <bool> CompleteSession(SqlServer sqlServer, Employee employee)
        {
            using (SqlConnection conn = sqlServer.GetConnection())
            {
                await conn.OpenAsync();

                using (SqlCommand cmd = sqlServer.GetSpCommand("telegram.DialogSession_YandexKassa_Complete", conn))
                {
                    cmd.AddBigIntParam("@TelegramId", employee.TelegramUserId);
                    cmd.AddIntParam("@PlaceId", employee.Place.Id);
                    cmd.AddIntParam("@EmployeeId", employee.Id);
                    cmd.AddVarCharParam("@UserLogin", 50, this.UserLogin);
                    cmd.AddDecimalParam("@Amount", 18, 2, this.Amount.Value);
                    cmd.AddTinyIntParam("@ProviderId", (byte)this.Provider);

                    SqlParameter retValParam = cmd.AddReturnValue();

                    await cmd.ExecuteNonQueryAsync();

                    int retVal = retValParam.GetInt32OrDefault();
                    return(retVal == 0);
                }
            }
        }
Пример #12
0
        private async Task TurnEnterExitEmployee(Update update, Employee employee, string command)
        {
            TurnSessionData session = (TurnSessionData)employee.DialogSession;

            bool isCorrect = true;

            if (command.Length < 2 || command[0] != '-' && command[0] != '+')
            {
                isCorrect = false;
            }

            bool isEnter    = (command[0] == '+');
            int  employeeId = 0;

            if (isCorrect)
            {
                for (int i = 1; i < command.Length; i++)
                {
                    if (!char.IsDigit(command[i]))
                    {
                        isCorrect = false;
                        break;
                    }
                }

                if (isCorrect)
                {
                    if (!int.TryParse(command.Substring(1), out employeeId))
                    {
                        isCorrect = false;
                    }
                }
            }

            int retVal = 0;

            if (isCorrect)
            {
                using (SqlConnection conn = _sqlServer.GetConnection())
                {
                    await conn.OpenAsync();

                    using (SqlCommand cmd = _sqlServer.GetSpCommand("telegram.DialogSession_Turn_EnterExitEmployee", conn))
                    {
                        cmd.AddIntParam("@ManagerId", employee.Id);
                        cmd.AddBigIntParam("@ManagerTelegramId", employee.TelegramUserId);
                        cmd.AddNVarCharParam("@ManagerName", 101, employee.GetFullName());
                        cmd.AddIntParam("@EmployeeId", employeeId);
                        cmd.AddIntParam("@PlaceId", employee.Place.Id);
                        cmd.AddBitParam("@IsEnter", isEnter);
                        SqlParameter retValParam = cmd.AddReturnValue();

                        await cmd.ExecuteNonQueryAsync();

                        retVal = retValParam.GetInt32OrDefault();
                    }
                }

                isCorrect = (retVal >= 0);
            }

            if (isCorrect)
            {
                string text;
                if (retVal == 1)
                {
                    text = "Сотрудник уже вошёл в смену";
                }
                else if (retVal == 2)
                {
                    text = "Сотрудник уже вышел из смены";
                }
                else
                {
                    text = "Команда успешно выполнена";
                }

                ReplyKeyboardMarkup keyboard = GetStandardKeyboardMarkup(employee);
                await _telegramClient.SendTextMessageAsync(update.Message.From.Id, text, ParseMode.Default, false, false, 0, keyboard, _cts.Token);

                await this.WriteMessageLog(new MessageLog(text, employee, keyboard));
            }
            else
            {
                StringBuilder sb = new StringBuilder();
                if (retVal == -1)
                {
                    sb.Append("Вы не можете управлять сменами сотрудников. Нажмите кнопку <b>Назад</b>");
                }
                else if (retVal == -2)
                {
                    sb.Append("Сотрудник не принадлежит вашему заведению. Исправьте или нажмите кнопку <b>Назад</b>");
                }
                else
                {
                    sb.Append("Вы ввели неизвестную команду. Исправьте или нажмите кнопку <b>Назад</b>");
                }

                TurnSessionData.Employees employees = null;
                if (retVal != -1)
                {
                    employees = await session.GetEmployeesStatus(employee, _sqlServer);

                    sb.AppendLine().AppendLine();
                    this.GetEmployeesTurnStatusMessageForManager(employees, sb);
                }

                string text = sb.ToString();
                ReplyKeyboardMarkup keyboard = employee.DialogSession.GetKeyboardMarkup(employee, employees);
                await _telegramClient.SendTextMessageAsync(update.Message.From.Id, text, ParseMode.Html, false, false, 0, keyboard, _cts.Token);

                await this.WriteMessageLog(new MessageLog(text, employee, keyboard));
            }
        }
Пример #13
0
        private async Task GetQrCodeAsync(Update update, Employee employee)
        {
            string receiverCode = employee.Place.Id.ToString() + "-" + employee.Id.ToString();
            string qrString     = "ST00011|Name=ООО Чаевые-24|PersonalAcc=40702810970010113722|BankName=МОСКОВСКИЙ ФИЛИАЛ АО КБ \"МОДУЛЬБАНК\"|" +
                                  "BIC=044525092|CorrespAcc=30101810645250000092|PayeeINN=1651083591|" +
                                  "Purpose=Дарение чаевых коллективу по договору-оферте tips24.ru/" + receiverCode + "|" +
                                  "PayerAddress=" + employee.Place.City + ", " + employee.Place.Address + "|LastName=Гость|FirstName=заведения";

            //string qrString = "ST00011|Name=ИП Галяутдинов Ринат Ибрагимович|PersonalAcc=40802810470210002677|BankName=МОСКОВСКИЙ ФИЛИАЛ АО КБ \"МОДУЛЬБАНК\"|BIC=044525092|CorrespAcc=30101810645250000092|PayeeINN=165117672519|" +
            //	"Purpose=Дарение чаевых коллективу по договору-оферте tips24.ru/" + receiverCode + "|" +
            //	"PayerAddress="+ employee.PlaceCity + ", " + employee.PlaceAddress + "|LastName=Гость|FirstName=заведения";

            byte[] hash = GetQrHash(qrString);
            if (employee.QrCode != null && employee.QrCode.IsValid(hash))
            {
                ReplyKeyboardMarkup keyboard = GetStandardKeyboardMarkup(employee);
                Message             response = await _telegramClient.SendPhotoAsync(update.Message.From.Id, new InputOnlineFile(employee.QrCode.FileId),
                                                                                    null, ParseMode.Default, false, 0, keyboard, _cts.Token);

                await this.WriteMessageLog(new QrCodeOutputMessageLog(employee, employee.QrCode.FileId, receiverCode, keyboard));

                return;
            }

            QRCodeWriter qrWriter = new QRCodeWriter();
            Dictionary <ZXing.EncodeHintType, object> hints = new Dictionary <ZXing.EncodeHintType, object>();

            hints.Add(ZXing.EncodeHintType.CHARACTER_SET, "windows-1251");
            hints.Add(ZXing.EncodeHintType.MARGIN, 1);
            ZXing.Common.BitMatrix matrix = qrWriter.encode(qrString, ZXing.BarcodeFormat.QR_CODE, 640, 640, hints);

            BarcodeWriter <Rgb24> writer = new BarcodeWriter <Rgb24>();

            string fileId = null;

            using (MemoryStream ms = new MemoryStream())
            {
                using (Image <Rgb24> image = writer.Write(matrix))
                {
                    image.Save(ms, new PngEncoder()
                    {
                        ColorType = PngColorType.Grayscale, BitDepth = PngBitDepth.Bit8
                    });
                }
                ms.Position = 0;

                ReplyKeyboardMarkup keyboard = GetStandardKeyboardMarkup(employee);
                Message             response = await _telegramClient.SendPhotoAsync(update.Message.From.Id, new InputOnlineFile(ms), null, ParseMode.Default, false, 0, keyboard, _cts.Token);

                fileId = response.Photo[0].FileId;
                await this.WriteMessageLog(new QrCodeOutputMessageLog(employee, fileId, receiverCode, keyboard));
            }

            using (SqlConnection conn = _sqlServer.GetConnection())
            {
                await conn.OpenAsync();

                using (SqlCommand cmd = _sqlServer.GetSpCommand("telegram.UpdateQrCodeFileId", conn))
                {
                    cmd.AddBigIntParam("@UserId", employee.TelegramUserId);
                    cmd.AddVarCharParam("@QrCodeFileId", 64, fileId);
                    cmd.AddBinaryParam("@QrCodeStringHash", 40, hash);

                    await cmd.ExecuteNonQueryAsync();
                }
            }
        }
Пример #14
0
        private async Task GetBalanceAsync(Update update, Employee employee)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("<b>Ваш баланс: ").Append(employee.Balance.ToString("F2", _ruCulture)).Append(" рублей</b>")
            .AppendLine();

            bool hasRecords = false;

            using (SqlConnection conn = _sqlServer.GetConnection())
            {
                await conn.OpenAsync();

                using (SqlCommand cmd = _sqlServer.GetSpCommand("telegram.GetBalance", conn))
                {
                    cmd.AddBigIntParam("@EmployeeId", employee.Id);

                    using (SqlDataReader dr = await cmd.ExecuteReaderAsync())
                    {
                        while (dr.Read())
                        {
                            if (!hasRecords)
                            {
                                sb.AppendLine().Append("<b>Последние операции:</b>");
                                hasRecords = true;
                            }

                            DateTime logDateTime    = dr.GetDateTime("LogDateTime");
                            byte     operationType  = dr.GetByte("OperationType");
                            decimal  amount         = dr.GetDecimal("Amount");
                            long?    paymentId      = dr.GetInt64OrNull("PaymentId");
                            decimal? originalAmount = dr.GetDecimalOrNull("OriginalAmount");

                            sb.AppendLine()
                            .Append("<b>").Append(amount < 0 ? "−" : "+").Append(Math.Abs(amount).ToString("F2", _ruCulture))
                            .Append("</b> руб. - ").Append(logDateTime.ToTelegramReportString()).Append(", ");

                            if (operationType == 1)
                            {
                                sb.Append("общая сумма чаевых ").Append(originalAmount.Value.ToString("F2", _ruCulture));
                            }
                            else if (operationType == 2)
                            {
                                sb.Append("вывод на карту");
                            }
                            else if (operationType == 3)
                            {
                                sb.Append("возврат чаевых по запросу гостя");
                            }
                        }
                    }
                }
            }

            if (!hasRecords)
            {
                sb.Append("По Вашему счёту операций не зарегистрировано");
            }

            string text = sb.ToString();
            ReplyKeyboardMarkup keyboard = GetStandardKeyboardMarkup(employee);
            await _telegramClient.SendTextMessageAsync(update.Message.From.Id, text, ParseMode.Html, false, false, 0, keyboard, _cts.Token);

            await this.WriteMessageLog(new MessageLog(text, employee, keyboard));
        }