Выходными данными в Личном кабинете являются:
Информация о бонусной карте: номер карты, тип карты, количество бонусных баллов, статус карты, срок годности карты.
Список транзакций по карте.
4.3 Руководство пользователя
Руководство пользователя - один из основных программных документов, служащий для введения системы в эксплуатацию и передачи системы неподготовленным пользователям. Основная задача документа состоит в том, чтобы обеспечить пользователям возможность самостоятельно решать все основные задачи, на которые нацелена программа.
Руководство пользователя содержит полное описание программы с точки зрения целевого применения. В руководстве пользователя обязательно должны быть описаны назначение программы, основные задачи и возможности, способ отражения предметной области в программе, пользовательский интерфейс программы, порядок решения основных пользовательских задач, все функции программы и порядок их применения, пользовательская настройка программы, проблемы при использовании и способы их решения.
Руководство пользователя представлено в приложении Б.
Главное окно и развернутое swipe-меню "Приложения для управления бонусной программой" представлено на рисунке 2.
Главный экран "Личного кабинета держателя бонусной карты" представлен на рисунке 3.
Рисунок 2 - Главное окно "Приложения для управления бонусной программой"
Рисунок 3 - Главный экран "Личного кабинета"
Ниже представлен исходный код основных функций "Приложения для управления бонусной программой" и "Личного кабинета держателя бонусной карты".
) Функция начисления бонусных баллов:
(ToggleSwitch1->Enabled)
{
// АВТО РЕЖИМ(ToggleSwitch1->State == tssOff & bonus>=0)
{>Filter = L"card_id = "+ IntToStr (card_id);>Filtered = true;>Active = true;>Active = false;>SQL->Clear ();>SQL->Add ("Select max (trans_id) as max_id from transactions");>Active = true;>Execute ();
// ОПЛАТА БОНУСАМИ--------->Edit ();(RadioButton2->Checked) // ЧАСТИЧНАЯ
{>FieldByName ("balance") - >AsInteger = CardsTable->FieldByName ("balance") - >AsInteger - ceil (sCurrencyEdit2->Value);
}// ВСЕМИ БОНУСАМИ
{(ceil (itog) >= CardsTable->FieldByName ("balance") - >AsInteger) // Если сумма платежа больше количества бонусов на счету
{>FieldByName ("balance") - >AsInteger = CardsTable->FieldByName ("balance") - >AsInteger - CardsTable->FieldByName ("balance") - >AsInteger;
}(ceil (itog) < CardsTable->FieldByName ("balance") - >AsInteger) // Если сумма платежа МЕНЬШЕ количества бонусов на счету
{>FieldByName ("balance") - >AsInteger = CardsTable->FieldByName ("balance") - >AsInteger - ceil (itog);
}
}>Post ();(summa<itog)
{>Insert ();>FieldByName ("trans_id") - >AsInteger = ServiceQuery->FieldByName ("max_id") - >AsInteger + 1;>FieldByName ("card_id") - >AsInteger = card_id;>FieldByName ("points") - >AsInteger = bonus;>FieldByName ("description") - >AsString = L"Оплата бонусами";>FieldByName ("trans_date") - >AsDateTime = Now ();>FieldByName ("comment") - >AsString = "Покупка - "+Edit1->Text + " - " + sSpinEdit1->Text + "x за счет бонусных баллов";
TransTable->Post ();
}
// НАЧИСЛЕНИЕ БОНУСОВ ЗА ПОКУПКУ-----
CardsTable->Edit ();>FieldByName ("balance") - >AsInteger = CardsTable->FieldByName ("balance") - >AsInteger + ceil (bonus);>Post ();>Active = false;>Active = true;>Execute ();>Insert ();>FieldByName ("trans_id") - >AsInteger = ServiceQuery->FieldByName ("max_id") - >AsInteger + 1;>FieldByName ("card_id") - >AsInteger = card_id;>FieldByName ("points") - >AsInteger = bonus;>FieldByName ("description") - >AsString = L"Покупка";>FieldByName ("trans_date") - >AsDateTime = Now ();(CheckBox1->Checked)
{>FieldByName ("valid_thru") - >AsDateTime = AdvDateTimePicker1->DateTime;
}>FieldByName ("comment") - >AsString = "Оплата - "+Edit1->Text + " - " + sSpinEdit1->Text + "x";>Post ();>Execute ();>MessageBox (L"Бонусные баллы успешно начислены в режиме авто!",L"Бонусная система", MB_OK);
}
// РУЧНОЙ РЕЖИМ(ToggleSwitch1->State == tssOn & sCurrencyEdit3->Value>0)
{>Filter = L"card_id = "+ IntToStr (card_id);>Filtered = true;>Active = true;>Edit ();>FieldByName ("balance") - >AsInteger = CardsTable->FieldByName ("balance") - >AsInteger + ceil (sCurrencyEdit3->Value);>Post ();>Active = false;>SQL->Clear ();>SQL->Add ("Select max (trans_id) as max_id from transactions");>Active = true;>Execute ();>Insert ();>FieldByName ("trans_id") - >AsInteger = ServiceQuery->FieldByName ("max_id") - >AsInteger + 1;>FieldByName ("card_id") - >AsInteger = card_id;>FieldByName ("points") - >AsInteger = ceil (sCurrencyEdit3->Value);>FieldByName ("description") - >AsString = Edit2->Text;>FieldByName ("trans_date") - >AsDateTime = Now ();(CheckBox1->Checked)
{>FieldByName ("valid_thru") - >AsDateTime = AdvDateTimePicker1->DateTime;
}>FieldByName ("comment") - >AsString = Memo1->Text;>Post ();>Execute ();>MessageBox (L"Бонусные баллы успешно начислены в ручном режиме!",L"Бонусная система", MB_OK);
}
}
) Функция занесения данных в систему (на примере добавления бонусной карты):
if (sEdit1->Text == "") // Проверка полей ввода
{
Shape2->Visible = true;
Application->MessageBox (L"Не все поля заполнены!",L"Ошибка выполнения", MB_OK | MB_ICONWARNING);
return;
}>Active = false;>SQL->Clear ();>SQL->Add ("SELECT card_id FROM cards WHERE card_id = " + sEdit1->Text); // Проверка на наличие номера карты в базе>Active = true;(ServiceQuery->RecordCount>0)
{>MessageBox (L"Карта с таким номером уже существует!",L"Ошибка выполнения", MB_OK | MB_ICONWARNING);
return; // Если карта существует, то прерываем выполнение функции
}
// >Insert ();>FieldByName ("card_id") - >AsInteger = StrToInt (sEdit1->Text);>FieldByName ("balance") - >AsInteger = ceil (sCurrencyEdit1->Value);>FieldByName ("stat_id") - >AsInteger = 1;>FieldByName ("stat") - >AsString = L"Активна"; (ComboBox1->ItemIndex==0) // Проверяем какой тип карты выбран
}(ComboBox1->ItemIndex==1) // Проверяем какой тип карты выбран
{>FieldByName ("type_id") - >AsInteger = 10;>FieldByName ("type") - >AsString = L"Подарочная";
}>FieldByName ("output_date") - >AsDateTime = Now ();(CheckBox1->Checked) {CardsTable->FieldByName ("valid_thru") - >AsDateTime = sDateEdit1->Date; }>FieldByName ("comment") - >AsString = sMemo1->Text;>Post ();>MessageBox (L"Карта успешно добавлена!",L"Выполнено", MB_OK | MB_ICONINFORMATION);
AddTabRefresh->Execute (); // Выполняем действие по очистке формы
) Функция редактирования данных (на примере редактирования информации о карте):>Active = false; // Составление строки запроса-НАЧАЛО
ServiceQuery->SQL->Clear ();>SQL->Add ("UPDATE cards");>SQL->Add ("SET balance = " + FloatToStr (ceil (BonusEdit->Value)));>SQL->Add (",stat_id = "+IntToStr (StatusComboBox->ItemIndex));>SQL->Add (",stat = '"+StatusComboBox->Text+"'");(CardTypeComboBox->ItemIndex==0)
{>SQL->Add (",type_id = 1");>SQL->Add (",type = 'Персональная'");
}(CardTypeComboBox->ItemIndex==1)
{>SQL->Add (",type_id = 10");>SQL->Add (",type = 'Персональная'");
}(CheckBox2->Checked)
{ServiceQuery->SQL->Add (",valid_thru = '"+FormatDateTime ("yyyy-mm-dd",ValidDateEdit->Date) +"'"); }
{CardsTable->FieldByName ("valid_thru") - >Value=Null; }>SQL->Add (",comment = '"+CommentMemo->Text+"'");>SQL->Add ("WHERE card_id = "+CardsTable->FieldByName ("card_id") - >AsString);
ServiceQuery->ExecSQL ();
// Составление строки запроса-КОНЕЦ>MessageBox (L"Изменения успешно внесены!",L"Выполнено", MB_OK | MB_ICONINFORMATION);
// Обновим информацию в визуальных компонентах>Active = false; CardsTable->Active = true;
CardsQuery->Refresh ();
) Функция импорта данных для любой таблицы:
void __fastcall TForm1:: SpeedButton2Click (TObject *Sender)
{>Active = false;>TableName = DBLookupComboBox1->Text;>Active = true;col,row;->ActivePage = TabSheet3;->LoadFromXLSSheet (sFilenameEdit1->FileName,Edit1->Text);= AdvStringGrid1->RowCount;->Max = row-1;= AdvStringGrid1->ColCount;(int i = 0; i < row-1; i++)
{>Insert ();(int j = 0; j < col; j++)
{ftype = FieldTypeNames [Table->FieldByName (AdvStringGrid1->Cells [j] [0]) - >DataType];(ftype == "WideString" & AdvStringGrid1->Cells [j] [i+1]! ="") {Table->FieldByName (AdvStringGrid1->Cells [j] [0]) - >AsString = AdvStringGrid1->Cells [j] [i+1]; }(ftype == "DateTime" & AdvStringGrid1->Cells [j] [i+1]! ="") {Table->FieldByName (AdvStringGrid1->Cells [j] [0]) - >AsDateTime = StrToDateTime (AdvStringGrid1->Cells [j] [i+1]); }(ftype == "Date" & AdvStringGrid1->Cells [j] [i+1]! ="") {Table->FieldByName (AdvStringGrid1->Cells [j] [0]) - >AsDateTime = StrToDate (AdvStringGrid1->Cells [j] [i+1]); }(ftype == "Integer" & AdvStringGrid1->Cells [j] [i+1]! ="") {Table->FieldByName (AdvStringGrid1->Cells [j] [0]) - >AsInteger = StrToInt (AdvStringGrid1->Cells [j] [i+1]); }(ftype == "AutoInc" & AdvStringGrid1->Cells [j] [i+1]! ="") {}
}>Post ();->Position = ProgressBar1->Position +1;
}->ActivePage = TabSheet4;
) Функция авторизации клиента:
// ПОДКЛЮЧЕНИЕ К БАЗЕ{MyConnection1->Connected=true; }(.) {ShowMessage (L"Ошибка соединения. Проверьте подключение к интернету!"); return; }
// ПРОВЕРЯЕМ ЗАПОЛНЕНИЕ ПОЛЕЙ ВВОДА
if (Edit2->Text=="") {ShowMessage (L"Введите Email!"); return; }
if (Edit1->Text=="") {ShowMessage (L"Введите Пароль!"); return; }
// ВЫПОЛНЕНИЕ ЗАПРОСА С ПАРАМЕТОМ
MyQuery2->ParamByName ("email") - >Value = Edit2->Text; // считываем параметр
MyQuery2->Active=true;->Execute (); // выполняем запрос
// АВТОРИЗАЦИЯ(MyQuery2->FieldByName ("passwd") - >AsString == Edit1->Text) // Проверяем введеный пароль
{>MyQuery1->ParamByName ("clientid") - >Value = MyQuery2->FieldByName ("client_id") - >AsInteger; // считывам параметр для запроса>Show ();
}
{(L"Неверный Email или Пароль!"); return;
}
) Функция регистрации пользователя:
if (MyConnection1->Connected==true)
{
// СОЗДАЕМ ЗАПИСЬ->Active=true;->Execute ();maxid = MyQuery1->FieldByName ("max_id") - >AsInteger + 1;->Active=true;->Insert ();->FieldByName ("first_name") - >AsString = Edit3->Text;->FieldByName ("last_name") - >AsString = Edit4->Text;->FieldByName ("mobile_phone") - >AsString = Edit5->Text;->FieldByName ("email") - >AsString = Edit6->Text;->FieldByName ("passwd") - >AsString = Edit7->Text;->FieldByName ("birth_date") - >AsDateTime = DateEdit1->Date;(RadioButton1->IsChecked==true) {MyTable1->FieldByName ("gender") - >AsString = L"Мужской"; }(RadioButton2->IsChecked==true) {MyTable1->FieldByName ("gender") - >AsString = L"Женский"; }->FieldByName ("client_id") - >AsInteger = maxid;->FieldByName ("card_id") - >AsInteger = StrToInt (Edit8->Text);->Post ();
// ЧИСТИМ ФОРМУ->Text=""; Edit4->Text=""; Edit5->Text=""; Edit6->Text=""; Edit7->Text=""; Edit8->Text="";->IsEmpty=true;->IsChecked=false; RadioButton2->IsChecked=false;
// ПЕРЕХОДИМ НА ВКЛАДКУ ОБ УСПЕШНОЙ РЕГИСТРАЦИИ
ChangeTabAction3->Execute ();->Start ();
}
{ (L"Ошибка соединения. Проверьте подключение к интернету!");
return;
}
) Функция редактирования профиля пользователя:
// ПОДКЛЮЧЕНИЕ К БАЗЕ{MyConnection1->Connected=true; }(.) {ShowMessage (L"Ошибка соединения. Проверьте подключение к интернету!"); return; }
if (Edit7->Text == "") {ShowMessage (L"Введите ваш старый пароль для редактирования профиля!"); return; }
if (MyTable1->Filtered == true)
{
if (Edit7->Text == MyTable1->FieldByName ("passwd") - >AsString) // Проверяем правильность введенного пароля пароль
{->Edit ();->FieldByName ("first_name") - >AsString = Edit3->Text; // Обновляем имя->FieldByName ("last_name") - >AsString = Edit4->Text; // Обновляем фамилию
// ОбНОВЛЯЕМ ПОЛ(RadioButton1->IsChecked == true)
{->FieldByName ("gender") - >AsString = RadioButton1->Text;
}(RadioButton2->IsChecked == true)
{->FieldByName ("gender") - >AsString = RadioButton2->Text;
}->FieldByName ("birth_date") - >AsDateTime = DateEdit1->Date;->FieldByName ("mobile_phone") - >AsString = Edit5->Text;->FieldByName ("email") - >AsString = Edit6->Text; (Edit1->Text! = "") // Если поле НОВЫЙ ПАРОЛЬ заполнено, то обновляем пароль
{->FieldByName ("passwd") - >AsString = Edit1->Text;
}
MyTable1->Post ();
}
}
4.4 Тестирование программы
Тестирование программного обеспечения - процесс исследования, испытания программного продукта, предназначенный для выявить ситуации, в которых поведение программы является неправильным, нежелательным или не соответствующим спецификации и продемонстрировать, что программа соответствует предъявляемым к ней требованиям.
Различают различные виды тестирования программного обеспечения информационных систем.
Функциональное тестирование - проверка соответствия продукта функциональным требованиям и спецификациям.
Интеграционное тестирование - это совместное выполнение двух или более классов, пакетов, компонентов или подсистем, созданных несколькими программистами или группами.
Регрессионное тестирование - повторное тестирование после внесения изменений, чтобы убедиться в том, что функции, которые работали в предыдущей версии системы, по-прежнему работают так, как ожидалось, а найденные дефекты успешно исправлены.
Компонентное тестирование - испытание отдельных программных компонентов информационной системы, в ходе которых подтверждается корректность проводимых этими компонентами вычислений.
Способы тестирования программного обеспечения "Информационной системы бонусных программ лояльности":
Тестирование интерфейса: тестирование интерфейса производится по таким критериям, как: естественность, согласованность, дружественность, принцип "обратной связи", простота, гибкость, эстетическая привлекательность;
Базовое тестирование: информационная система тестируется на ввод корректных данных, которые вводит пользователь и показывает результат работы системы;
Тестирование на ошибочные данные: информационная система оценивается при вводе пользователем заведомо ошибочных данных. Если при использовании различных наборов данных ожидаемый и реальный результат не соответствуют полученному результату то, в системе присутствуют ошибки.