histry release

4.4
Serik.Uvaissov 2020-07-04 17:13:28 +06:00
parent 4fddf634e9
commit 4be3bafe92
13 changed files with 389 additions and 106 deletions

View File

@ -1,5 +1,3 @@
import 'package:sqflite/sqflite.dart';
const String Service_tableName = 'services'; const String Service_tableName = 'services';
const String Service_columnId = 'id'; const String Service_columnId = 'id';
const String Service_columnArticul = 'articul'; const String Service_columnArticul = 'articul';

View File

@ -0,0 +1,63 @@
const String Voucher_tableName = 'vouches';
const String Voucher_columnId = 'id';
const String Voucher_columnName = 'name';
const String Voucher_columnTotal = 'total';
const String Voucher_columnBase64Data = 'base64Data';
const String Voucher_columnData = 'data';
const String Voucher_columnDateTime = 'dateTime';
const String Voucher_columnAppCompanyId = 'app_company_id';
const String Voucher_columnKassaId = 'kassaId';
const String Voucher_columnType = 'type';
const String Voucher_columnUrl = 'url';
const String VoucherTypePayment = 'payment';
const String VoucherTypeReport = 'report';
class Voucher {
int id;
String name;
double total;
String data;
String base64Data;
DateTime dateTime;
int appCompanyId;
int kassaId;
String type;
String url;
Voucher();
Map<String, dynamic> toMap() {
var map = <String, dynamic>{
Voucher_columnName: name,
Voucher_columnTotal: total,
Voucher_columnData: data,
Voucher_columnBase64Data: base64Data,
Voucher_columnDateTime: dateTime.toIso8601String(),
Voucher_columnKassaId: kassaId,
Voucher_columnAppCompanyId: appCompanyId,
Voucher_columnType: type,
Voucher_columnUrl: url,
};
if (id != null) {
map[Voucher_columnId] = id;
}
return map;
}
Voucher.fromMap(Map<String, dynamic> map) {
id = map[Voucher_columnId];
name = map[Voucher_columnName];
total = map[Voucher_columnTotal]?.toDouble();
data = map[Voucher_columnData];
base64Data = map[Voucher_columnBase64Data];
dateTime = DateTime.parse(map[Voucher_columnDateTime]);
appCompanyId= map[Voucher_columnAppCompanyId];
kassaId = map[Voucher_columnKassaId];
type = map[Voucher_columnType];
url = map[Voucher_columnUrl];
}
}

View File

@ -2,4 +2,5 @@ const String LoginViewRoute = "LoginView";
const String HomeViewRoute = "HomeView"; const String HomeViewRoute = "HomeView";
const String ImageShowRoute = "ImageShowRoute"; const String ImageShowRoute = "ImageShowRoute";
const String PaymentViewRoute = "PaymentView"; const String PaymentViewRoute = "PaymentView";
const String HistoryViewRoute = "HistoryView";
// Generate the views here // Generate the views here

View File

@ -1,4 +1,5 @@
import 'package:aman_kassa_flutter/views/check/image_show_container.dart'; import 'package:aman_kassa_flutter/views/check/image_show_container.dart';
import 'package:aman_kassa_flutter/views/history/history_view.dart';
import 'package:aman_kassa_flutter/views/payment/payment_view.dart'; import 'package:aman_kassa_flutter/views/payment/payment_view.dart';
import './route_names.dart'; import './route_names.dart';
@ -12,7 +13,7 @@ Route<dynamic> generateRoute(RouteSettings settings) {
return _getPageRoute( return _getPageRoute(
routeName: settings.name, routeName: settings.name,
viewToShow: LoginView(), viewToShow: LoginView(),
); );
case HomeViewRoute: case HomeViewRoute:
return _getPageRoute( return _getPageRoute(
routeName: settings.name, routeName: settings.name,
@ -24,9 +25,14 @@ Route<dynamic> generateRoute(RouteSettings settings) {
routeName: settings.name, routeName: settings.name,
viewToShow: PaymentView(model: model), viewToShow: PaymentView(model: model),
); );
case ImageShowRoute: case HistoryViewRoute:
ImageShowModel data = settings.arguments as ImageShowModel; return _getPageRoute(
return SlideRightRoute(widget:ImageShowContainer(data)); routeName: settings.name,
viewToShow: HistoryView(),
);
case ImageShowRoute:
ImageShowModel data = settings.arguments as ImageShowModel;
return SlideRightRoute(widget: ImageShowContainer(data));
default: default:
return MaterialPageRoute( return MaterialPageRoute(
builder: (_) => Scaffold( builder: (_) => Scaffold(
@ -48,21 +54,21 @@ class SlideRightRoute extends PageRouteBuilder {
final Widget widget; final Widget widget;
SlideRightRoute({this.widget}) SlideRightRoute({this.widget})
: super( : super(
pageBuilder: (BuildContext context, Animation<double> animation, pageBuilder: (BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation) { Animation<double> secondaryAnimation) {
return widget; return widget;
}, },
transitionsBuilder: (BuildContext context, transitionsBuilder: (BuildContext context,
Animation<double> animation, Animation<double> animation,
Animation<double> secondaryAnimation, Animation<double> secondaryAnimation,
Widget child) { Widget child) {
return new SlideTransition( return new SlideTransition(
position: new Tween<Offset>( position: new Tween<Offset>(
begin: const Offset(1.0, 0.0), begin: const Offset(1.0, 0.0),
end: Offset.zero, end: Offset.zero,
).animate(animation), ).animate(animation),
child: child, child: child,
); );
}, },
); );
} }

View File

@ -4,6 +4,7 @@ import 'package:aman_kassa_flutter/core/base/base_service.dart';
import 'package:aman_kassa_flutter/core/entity/Category.dart'; import 'package:aman_kassa_flutter/core/entity/Category.dart';
import 'package:aman_kassa_flutter/core/entity/Goods.dart'; import 'package:aman_kassa_flutter/core/entity/Goods.dart';
import 'package:aman_kassa_flutter/core/entity/Service.dart'; import 'package:aman_kassa_flutter/core/entity/Service.dart';
import 'package:aman_kassa_flutter/core/entity/Voucher.dart';
import 'package:aman_kassa_flutter/core/locator.dart'; import 'package:aman_kassa_flutter/core/locator.dart';
import 'package:aman_kassa_flutter/core/models/calc_model.dart'; import 'package:aman_kassa_flutter/core/models/calc_model.dart';
import 'package:aman_kassa_flutter/core/models/check_data.dart'; import 'package:aman_kassa_flutter/core/models/check_data.dart';
@ -15,6 +16,7 @@ import 'package:aman_kassa_flutter/core/services/DbService.dart';
import 'package:aman_kassa_flutter/redux/constants/operation_const.dart'; import 'package:aman_kassa_flutter/redux/constants/operation_const.dart';
import 'package:aman_kassa_flutter/redux/constants/setting_const.dart'; import 'package:aman_kassa_flutter/redux/constants/setting_const.dart';
import 'package:aman_kassa_flutter/redux/store.dart'; import 'package:aman_kassa_flutter/redux/store.dart';
import 'package:flutter/material.dart';
import 'ApiService.dart'; import 'ApiService.dart';
@ -76,7 +78,7 @@ class DataService extends BaseService {
CheckItem item = CheckItem( CheckItem item = CheckItem(
name: 'Позиция $iterator', name: 'Позиция $iterator',
cnt: el.num2 != null ? double.parse(el.num2) : 1.0, cnt: el.num2 != null ? double.parse(el.num2) : 1.0,
price: double.parse(el.num1) , price: double.parse(el.num1),
articul: articul); articul: articul);
summ += item.cnt * item.price; summ += item.cnt * item.price;
@ -90,6 +92,34 @@ class DataService extends BaseService {
return checkData; return checkData;
} }
/* save data to db
* data,
* dateTime,
* check,
* appCompanyId,
* kassaId,
* total,
* name,
* type
*/
Future<Response<dynamic>> insertVoucher({ @required User user, String data, String base64Data, @required String name, double total = 0.0, String type = VoucherTypePayment, String url }) {
assert(user != null);
assert(name != null);
Voucher voucher = Voucher()
..name=name
..url=url
..total = total
..appCompanyId = user.appCompanyId
..kassaId = user.kassaId
..data = data
..base64Data = base64Data
..dateTime = DateTime.now()
..type = type;
log.i(
'save to db appCompanyId: ${user.appCompanyId}, kassaId: ${user.kassaId}');
_db.insert(Voucher_tableName, voucher.toMap());
}
Future<Response<dynamic>> sellOrReturn( Future<Response<dynamic>> sellOrReturn(
{String paymentType, {String paymentType,
String tradeType, String tradeType,
@ -100,17 +130,16 @@ class DataService extends BaseService {
String mode}) async { String mode}) async {
try { try {
String data; String data;
if(mode == SettingModeKassa) { if (mode == SettingModeKassa) {
CheckData checkData = _transformProductsToCheckData( CheckData checkData = _transformProductsToCheckData(
paymentType: paymentType, tradeType: tradeType, items: kassaItems); paymentType: paymentType, tradeType: tradeType, items: kassaItems);
data = jsonEncode(checkData.toJson()); data = jsonEncode(checkData.toJson());
} else if(mode == SettingModeCalc) { } else if (mode == SettingModeCalc) {
CheckData checkData = _transformCalcModelToCheckData( CheckData checkData = _transformCalcModelToCheckData(
paymentType: paymentType, tradeType: tradeType, items: calcItems); paymentType: paymentType, tradeType: tradeType, items: calcItems);
data = jsonEncode(checkData.toJson()); data = jsonEncode(checkData.toJson());
} }
log.i('token: $token'); log.i('token: $token');
log.i('data: $data'); log.i('data: $data');
Response<dynamic> response = await (operationType == OperationTypePay Response<dynamic> response = await (operationType == OperationTypePay
@ -119,18 +148,14 @@ class DataService extends BaseService {
log.i('response status: ${response.status}'); log.i('response status: ${response.status}');
log.i('response operation: ${response.operation}'); log.i('response operation: ${response.operation}');
if (response.status == 200 && response.operation == true) { if (response.status == 200 && response.operation == true) {
log.i( User user = Redux.store.state.userState.user;
'save to db appCompanyId: ${Redux.store.state.userState.user.appCompanyId}, kassaId: ${Redux.store.state.userState.user.kassaId}'); String check = response?.body['check'];
/* save data to db dynamic journal = response?.body['journal'];
* data, print(journal);
* dateTime, int checkNum = journal['check_num'];
* check, var summ = journal['summ'];
* appCompanyId, double total = summ!= null ? double.parse(summ.toString()) : 0.0;
* kassaId, this.insertVoucher(user: user, name: 'Чек №$checkNum', data: data , base64Data: check, total: total );
* total,
* name,
* type
*/
} }
return response; return response;
} catch (e) { } catch (e) {
@ -141,9 +166,9 @@ class DataService extends BaseService {
Future<void> checkDbFill(User user) async { Future<void> checkDbFill(User user) async {
int serviceCount = await _db.queryRowCount(Service_tableName); int serviceCount = await _db.queryRowCount(Service_tableName);
if( serviceCount ==0) { if (serviceCount == 0) {
int goodCount = await _db.queryRowCount(Goog_tableName); int goodCount = await _db.queryRowCount(Goog_tableName);
if(goodCount == 0){ if (goodCount == 0) {
await getDataFromServer(user); await getDataFromServer(user);
} else { } else {
log.i('$Goog_tableName is Fill'); log.i('$Goog_tableName is Fill');

View File

@ -4,13 +4,14 @@ import 'package:aman_kassa_flutter/core/base/base_service.dart';
import 'package:aman_kassa_flutter/core/entity/Goods.dart'; import 'package:aman_kassa_flutter/core/entity/Goods.dart';
import 'package:aman_kassa_flutter/core/entity/Category.dart'; import 'package:aman_kassa_flutter/core/entity/Category.dart';
import 'package:aman_kassa_flutter/core/entity/Service.dart'; import 'package:aman_kassa_flutter/core/entity/Service.dart';
import 'package:aman_kassa_flutter/core/entity/Voucher.dart';
import 'package:sqflite/sqflite.dart'; import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart'; import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
class DbService extends BaseService { class DbService extends BaseService {
static final _databaseName = "AmanFlutterDb.db"; static final _databaseName = "AmanFlutterDb.db";
static final _databaseVersion = 15; static final _databaseVersion = 16;
// make this a singleton class // make this a singleton class
DbService._privateConstructor(); DbService._privateConstructor();
@ -32,18 +33,21 @@ class DbService extends BaseService {
Directory documentsDirectory = await getApplicationDocumentsDirectory(); Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, _databaseName); String path = join(documentsDirectory.path, _databaseName);
return await openDatabase(path, return await openDatabase(path,
version: _databaseVersion, version: _databaseVersion, onUpgrade: _onUpdate, onCreate: _onCreate);
onUpgrade: _onUpdate,
onCreate: _onCreate
);
} }
Future _onUpdate(Database db, int oldVersion, int newVersion) async { Future _onUpdate(Database db, int oldVersion, int newVersion) async {
log.i('update from $oldVersion to $newVersion'); log.i('update from $oldVersion to $newVersion');
//Goods table //Goods table
await db.execute('DROP TABLE IF EXISTS $Goog_tableName;'); await db.execute('DROP TABLE IF EXISTS $Goog_tableName;');
await db.execute('DROP TABLE IF EXISTS $Category_tableName;'); await db.execute('DROP TABLE IF EXISTS $Category_tableName;');
await db.execute('DROP TABLE IF EXISTS $Service_tableName;'); await db.execute('DROP TABLE IF EXISTS $Service_tableName;');
//await db.execute('DROP TABLE IF EXISTS $Voucher_tableName;');
log.i('dropped tables'); log.i('dropped tables');
if (newVersion > 16) {
//Не удалять таблицу с чеками
}
_onCreate(db, newVersion); _onCreate(db, newVersion);
} }
@ -87,7 +91,21 @@ class DbService extends BaseService {
$Service_columnDiscount real $Service_columnDiscount real
); );
'''); ''');
//Voucher
await db.execute('''
CREATE TABLE IF NOT EXISTS $Voucher_tableName (
$Voucher_columnId integer primary key AUTOINCREMENT,
$Voucher_columnName text not null,
$Voucher_columnTotal real,
$Voucher_columnData text,
$Voucher_columnBase64Data text,
$Voucher_columnDateTime text not null,
$Service_columnAppCompanyId integer,
$Voucher_columnKassaId integer,
$Voucher_columnType text not null,
$Voucher_columnUrl text
);
''');
} }
// Inserts a row in the database where each key in the Map is a column name // Inserts a row in the database where each key in the Map is a column name
@ -105,9 +123,15 @@ class DbService extends BaseService {
return await db.query(table); return await db.query(table);
} }
Future<List<Map<String, dynamic>>> queryRowsWithWhere(String table, String where, List<dynamic> args ) async { Future<List<Map<String, dynamic>>> queryAllRowsOrderBy(String table, String orderBy) async {
Database db = await instance.database; Database db = await instance.database;
return await db.query(table, where: where, whereArgs: args ); return await db.query(table, orderBy: orderBy);
}
Future<List<Map<String, dynamic>>> queryRowsWithWhere(
String table, String where, List<dynamic> args) async {
Database db = await instance.database;
return await db.query(table, where: where, whereArgs: args);
} }
// All of the methods (insert, query, update, delete) can also be done using // All of the methods (insert, query, update, delete) can also be done using

View File

@ -1,11 +1,14 @@
import 'dart:convert'; import 'dart:convert';
import 'package:aman_kassa_flutter/core/locator.dart';
import 'package:aman_kassa_flutter/core/models/dialog_models.dart';
import 'package:aman_kassa_flutter/core/services/dialog_service.dart';
import 'package:aman_kassa_flutter/shared/app_colors.dart'; import 'package:aman_kassa_flutter/shared/app_colors.dart';
import 'package:aman_kassa_flutter/shared/ui_helpers.dart'; import 'package:aman_kassa_flutter/shared/ui_helpers.dart';
import 'package:aman_kassa_flutter/widgets/fields/busy_button.dart'; import 'package:aman_kassa_flutter/widgets/fields/busy_button.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:esys_flutter_share/esys_flutter_share.dart'; import 'package:esys_flutter_share/esys_flutter_share.dart';
//import 'package:flutter/services.dart'; import 'package:flutter_open_whatsapp/flutter_open_whatsapp.dart';
class ImageShowContainer extends StatelessWidget { class ImageShowContainer extends StatelessWidget {
final ImageShowModel data; final ImageShowModel data;
@ -51,6 +54,7 @@ class MyFloatingActionButton extends StatefulWidget {
class _MyFloatingActionButtonState extends State<MyFloatingActionButton> { class _MyFloatingActionButtonState extends State<MyFloatingActionButton> {
bool showFab = true; bool showFab = true;
DialogService _dialog = locator<DialogService>();
// String _batteryLevel = 'Unknown battery level.'; // String _batteryLevel = 'Unknown battery level.';
// static const platform = const MethodChannel('samples.flutter.dev/battery'); // static const platform = const MethodChannel('samples.flutter.dev/battery');
// //
@ -77,7 +81,7 @@ class _MyFloatingActionButtonState extends State<MyFloatingActionButton> {
onPressed: () { onPressed: () {
var bottomSheetController = showBottomSheet( var bottomSheetController = showBottomSheet(
context: context, context: context,
builder: (context) => Container( builder: (bottomSheetContext) => Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0 ), padding: const EdgeInsets.symmetric(horizontal: 10.0 ),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
@ -87,13 +91,13 @@ class _MyFloatingActionButtonState extends State<MyFloatingActionButton> {
blurRadius: 10, color: Colors.grey[300], spreadRadius: 5) blurRadius: 10, color: Colors.grey[300], spreadRadius: 5)
]), ]),
//color: Colors.grey[900], //color: Colors.grey[900],
height: 280, height: 200,
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
//verticalSpaceSmall,
//BusyButton(title: 'Электронная почта', onPressed: shareFile , mainColor: primaryColor, icon: Icons.mail, enabled: false, ),
verticalSpaceSmall, verticalSpaceSmall,
BusyButton(title: 'Электронная почта', onPressed: shareFile , mainColor: primaryColor, icon: Icons.mail, enabled: false, ), BusyButton(title: 'WhatsApp', onPressed: callWhatsApp , mainColor: greenColor, icon: MdiIcons.whatsapp,),
verticalSpaceSmall,
BusyButton(title: 'WhatsApp', onPressed: shareFile , mainColor: greenColor, icon: MdiIcons.whatsapp, enabled: false,),
verticalSpaceSmall, verticalSpaceSmall,
BusyButton(title: '', onPressed: shareFile , mainColor: yellowColor, icon: Icons.share,), BusyButton(title: '', onPressed: shareFile , mainColor: yellowColor, icon: Icons.share,),
], ],
@ -116,6 +120,17 @@ class _MyFloatingActionButtonState extends State<MyFloatingActionButton> {
print('error: $e'); print('error: $e');
} }
} }
void callWhatsApp() async {
DialogResponse response = await _dialog.showConfirmationDialogInput(
description: 'Номер телефона',
cancelTitle: 'Отмена',
confirmationTitle: 'Отправить',
);
if (response.confirmed) {
String phoneNumber = response.responseText;
FlutterOpenWhatsapp.sendSingleMessage(phoneNumber, "Спасибо что выбераете нас \r\n https://picsum.photos/200/300 ");
}
}
void showFoatingActionButton(bool value) { void showFoatingActionButton(bool value) {
setState(() { setState(() {
showFab = value; showFab = value;

View File

@ -0,0 +1,80 @@
import 'package:aman_kassa_flutter/core/entity/Voucher.dart';
import 'package:aman_kassa_flutter/core/locator.dart';
import 'package:aman_kassa_flutter/core/route_names.dart';
import 'package:aman_kassa_flutter/core/services/DbService.dart';
import 'package:aman_kassa_flutter/core/services/navigator_service.dart';
import 'package:aman_kassa_flutter/shared/app_colors.dart';
import 'package:aman_kassa_flutter/views/check/image_show_container.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
class HistoryView extends StatefulWidget {
HistoryView();
@override
_HistoryViewState createState() => _HistoryViewState();
}
class _HistoryViewState extends State<HistoryView> {
DateFormat dateFormat = DateFormat("dd.MM.yyyy HH:mm:ss");
DbService _dbService = locator<DbService>();
NavigatorService _navigatorService = locator<NavigatorService>();
List<Voucher> data = [];
@override
void initState() {
super.initState();
load();
}
load() async {
List<Map> list = await _dbService.queryAllRowsOrderBy(Voucher_tableName, '$Voucher_columnDateTime desc');
print(list);
setState(() {
data = list.map((e) => Voucher.fromMap(e)).toList();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('История чеков'),
actions: <Widget>[
FlatButton(
child: Text('Очистить', style: TextStyle(color: whiteColor, fontSize: 15, fontWeight: FontWeight.bold),),
onPressed: () async {
await _dbService.deleteAll(Voucher_tableName);
await this.load();
})
],
),
body: ListView.separated(
itemCount: data.length,
separatorBuilder: (BuildContext context, int index) {
return Divider();
},
itemBuilder: (BuildContext context, int index) {
Voucher voucher = data[index];
return ListTile(
onTap: (){
_navigatorService.push(ImageShowRoute,
arguments: ImageShowModel(voucher.base64Data, voucher.name));
},
title: buildText(voucher),
subtitle: Text(dateFormat.format(voucher.dateTime)),
trailing: Icon(Icons.arrow_right),
leading: voucher.type == VoucherTypePayment ? Icon(MdiIcons.cashRegister, size: 40,) : Icon(Icons.description, size: 40,),
);
},
),
);
}
Text buildText(Voucher voucher) {
if( voucher.type == VoucherTypePayment ){
return Text('${voucher.name} на сумму: ${voucher.total.toStringAsFixed(2)}');
}
return Text('${voucher.name}');
}
}

View File

@ -24,15 +24,6 @@ import './tabs/CalculatorTab.dart';
import './components/popup_menu.dart'; import './components/popup_menu.dart';
import 'components/bottom_bar.dart'; import 'components/bottom_bar.dart';
const List<Choice> choices = const <Choice>[
const Choice(
title: 'Обновить номенклатуру', icon: Icons.update, command: 'update'),
const Choice(title: 'Помощь', icon: Icons.help, command: 'help'),
const Choice(title: 'О Программе', icon: Icons.info_outline, command: 'info'),
const Choice(title: 'Язык', icon: Icons.language, command: 'language'),
const Choice(title: 'Выйти', icon: Icons.exit_to_app, command: 'exit')
];
class HomeView extends StatefulWidget { class HomeView extends StatefulWidget {
@override @override
_HomeViewState createState() => _HomeViewState(); _HomeViewState createState() => _HomeViewState();

View File

@ -1,7 +1,9 @@
import 'package:aman_kassa_flutter/core/entity/Voucher.dart';
import 'package:aman_kassa_flutter/core/locator.dart'; import 'package:aman_kassa_flutter/core/locator.dart';
import 'package:aman_kassa_flutter/core/models/money.dart'; import 'package:aman_kassa_flutter/core/models/money.dart';
import 'package:aman_kassa_flutter/core/models/response.dart'; import 'package:aman_kassa_flutter/core/models/response.dart';
import 'package:aman_kassa_flutter/core/models/dialog_models.dart'; import 'package:aman_kassa_flutter/core/models/dialog_models.dart';
import 'package:aman_kassa_flutter/core/models/user.dart';
import 'package:aman_kassa_flutter/core/route_names.dart'; import 'package:aman_kassa_flutter/core/route_names.dart';
import 'package:aman_kassa_flutter/core/services/ApiService.dart'; import 'package:aman_kassa_flutter/core/services/ApiService.dart';
import 'package:aman_kassa_flutter/core/services/DataService.dart'; import 'package:aman_kassa_flutter/core/services/DataService.dart';
@ -83,11 +85,13 @@ class _AdditionalTabState extends State<AdditionalTab> {
setState(() { setState(() {
xReportBusy = true; xReportBusy = true;
}); });
User user = Redux.store.state.userState.user;
Response response = Response response =
await _api.xReport(Redux.store.state.userState.user.token); await _api.xReport(user.token);
if (response.operation) { if (response.operation) {
_navigator.push(ImageShowRoute, _navigator.push(ImageShowRoute,
arguments: ImageShowModel(response.body['check'], 'X Отчет')); arguments: ImageShowModel(response.body['check'], 'X Отчет'));
_dataService.insertVoucher(user: user, name: 'X Отчет', base64Data: response.body['check'], type: VoucherTypeReport);
} else { } else {
_dialog.showDialog(description: response.body['message']); _dialog.showDialog(description: response.body['message']);
} }
@ -302,7 +306,7 @@ class _AdditionalTabState extends State<AdditionalTab> {
), ),
verticalSpaceTiny, verticalSpaceTiny,
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
AmanIconButton( AmanIconButton(
@ -312,6 +316,14 @@ class _AdditionalTabState extends State<AdditionalTab> {
mainColor: primaryColor, mainColor: primaryColor,
icon: Icons.description, icon: Icons.description,
), ),
AmanIconButton(
title: 'История чеков',
onPressed: (){
_navigator.push(HistoryViewRoute);
},
mainColor: yellowColor,
icon: MdiIcons.history,
),
AmanIconButton( AmanIconButton(
title: 'Обновить номенклатуру', title: 'Обновить номенклатуру',
onPressed: _updateCatalog, onPressed: _updateCatalog,
@ -319,6 +331,7 @@ class _AdditionalTabState extends State<AdditionalTab> {
mainColor: greenColor, mainColor: greenColor,
icon: MdiIcons.databaseRefresh, icon: MdiIcons.databaseRefresh,
), ),
], ],
), ),
verticalSpaceMedium, verticalSpaceMedium,

View File

@ -1,6 +1,7 @@
import 'package:aman_kassa_flutter/core/locator.dart'; import 'package:aman_kassa_flutter/core/locator.dart';
import 'package:aman_kassa_flutter/core/models/dialog_models.dart'; import 'package:aman_kassa_flutter/core/models/dialog_models.dart';
import 'package:aman_kassa_flutter/core/services/dialog_service.dart'; import 'package:aman_kassa_flutter/core/services/dialog_service.dart';
import 'package:aman_kassa_flutter/shared/app_colors.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@ -67,37 +68,67 @@ class _DialogManagerState extends State<DialogManager> {
showDialog( showDialog(
context: context, context: context,
builder: (context) => AlertDialog( builder: (context) => AlertDialog(
title: Text(request.title), shape: RoundedRectangleBorder(
content: Column( borderRadius: BorderRadius.circular(5.0),
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(request.description),
TextField(
controller: controller,
keyboardType: TextInputType.number,
inputFormatters: <TextInputFormatter>[
WhitelistingTextInputFormatter(RegExp("^[0-9.]*")),
],
)
],
),
actions: <Widget>[
if (isConfirmationDialog)
FlatButton(
child: Text(request.cancelTitle),
onPressed: () {
_dialogService
.dialogComplete(DialogResponse(confirmed: false));
},
), ),
FlatButton( actionsPadding: const EdgeInsets.only(right: 15, bottom: 5),
child: Text(request.buttonTitle), title: Column(
onPressed: () { crossAxisAlignment: CrossAxisAlignment.start,
_dialogService children: <Widget>[
.dialogComplete(DialogResponse(confirmed: true, responseText: controller.text)); Text(
}, request.title,
), style: TextStyle(fontWeight: FontWeight.bold),
], ),
)); //Divider(),
],
),
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
//Text(request.description),
TextField(
autofocus: true,
decoration: InputDecoration(labelText: request.description ),
controller: controller,
onSubmitted: (value) {
_dialogService
.dialogComplete(DialogResponse(confirmed: false));
},
keyboardType: TextInputType.phone,
inputFormatters: <TextInputFormatter>[
WhitelistingTextInputFormatter(RegExp("^[0-9.]*")),
],
)
],
),
actions: <Widget>[
if (isConfirmationDialog)
RaisedButton(
color: redColor,
child: Text(
request.cancelTitle,
style: TextStyle(fontSize: 18),
),
onPressed: () {
_dialogService
.dialogComplete(DialogResponse(confirmed: false));
},
),
SizedBox(
width: 5,
),
RaisedButton(
color: primaryColor,
child: Text(
request.buttonTitle,
style: TextStyle(fontSize: 18),
),
onPressed: () {
_dialogService.dialogComplete(DialogResponse(
confirmed: true, responseText: controller.text));
},
),
],
));
} }
} }

View File

@ -91,7 +91,7 @@ packages:
name: equatable name: equatable
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.1" version: "1.2.0"
esys_flutter_share: esys_flutter_share:
dependency: "direct main" dependency: "direct main"
description: description:
@ -99,6 +99,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.2" version: "1.0.2"
file:
dependency: transitive
description:
name: file
url: "https://pub.dartlang.org"
source: hosted
version: "5.2.1"
fixnum: fixnum:
dependency: transitive dependency: transitive
description: description:
@ -111,6 +118,13 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_open_whatsapp:
dependency: "direct main"
description:
name: flutter_open_whatsapp
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.2"
flutter_redux: flutter_redux:
dependency: "direct main" dependency: "direct main"
description: description:
@ -218,7 +232,14 @@ packages:
name: path_provider name: path_provider
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.6.9" version: "1.6.11"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
url: "https://pub.dartlang.org"
source: hosted
version: "0.0.1+2"
path_provider_macos: path_provider_macos:
dependency: transitive dependency: transitive
description: description:
@ -239,7 +260,7 @@ packages:
name: pedantic name: pedantic
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0+1" version: "1.9.0"
petitparser: petitparser:
dependency: transitive dependency: transitive
description: description:
@ -261,6 +282,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.2" version: "1.0.2"
process:
dependency: transitive
description:
name: process
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.13"
protobuf: protobuf:
dependency: transitive dependency: transitive
description: description:
@ -274,7 +302,7 @@ packages:
name: provider name: provider
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.1.2" version: "4.1.3"
quiver: quiver:
dependency: transitive dependency: transitive
description: description:
@ -363,14 +391,14 @@ packages:
name: sqflite name: sqflite
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.0+2" version: "1.3.1"
sqflite_common: sqflite_common:
dependency: transitive dependency: transitive
description: description:
name: sqflite_common name: sqflite_common
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.1" version: "1.0.2+1"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@ -398,7 +426,7 @@ packages:
name: synchronized name: synchronized
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.0" version: "2.2.0+1"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
@ -427,6 +455,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.8" version: "2.0.8"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.0"
xml: xml:
dependency: transitive dependency: transitive
description: description:
@ -435,5 +470,5 @@ packages:
source: hosted source: hosted
version: "3.6.1" version: "3.6.1"
sdks: sdks:
dart: ">=2.7.0 <3.0.0" dart: ">=2.8.0 <3.0.0"
flutter: ">=1.17.0 <2.0.0" flutter: ">=1.17.0 <2.0.0"

View File

@ -27,6 +27,7 @@ dependencies:
device_info: ^0.4.2+4 device_info: ^0.4.2+4
esys_flutter_share: ^1.0.2 esys_flutter_share: ^1.0.2
auto_size_text: ^2.1.0 auto_size_text: ^2.1.0
flutter_open_whatsapp: ^0.1.2
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter